0000: 2f 2a 0a 20 2a 20 43 6f 70 79 72 69 67 68 74 20  /*. * Copyright 
0010: 28 43 29 20 31 39 39 37 2d 31 39 39 39 20 4d 61  (C) 1997-1999 Ma
0020: 74 74 20 4e 65 77 6d 61 6e 20 3c 6d 61 74 74 40  tt Newman <matt@
0030: 6e 6f 76 61 64 69 67 6d 2e 63 6f 6d 3e 0a 20 2a  novadigm.com>. *
0040: 20 73 6f 6d 65 20 6d 6f 64 69 66 69 63 61 74 69   some modificati
0050: 6f 6e 73 3a 0a 20 2a 09 43 6f 70 79 72 69 67 68  ons:. *.Copyrigh
0060: 74 20 28 43 29 20 32 30 30 30 20 41 6a 75 62 61  t (C) 2000 Ajuba
0070: 20 53 6f 6c 75 74 69 6f 6e 73 0a 20 2a 09 43 6f   Solutions. *.Co
0080: 70 79 72 69 67 68 74 20 28 43 29 20 32 30 30 32  pyright (C) 2002
0090: 20 41 63 74 69 76 65 53 74 61 74 65 20 43 6f 72   ActiveState Cor
00a0: 70 6f 72 61 74 69 6f 6e 0a 20 2a 09 43 6f 70 79  poration. *.Copy
00b0: 72 69 67 68 74 20 28 43 29 20 32 30 30 34 20 53  right (C) 2004 S
00c0: 74 61 72 66 69 73 68 20 53 79 73 74 65 6d 73 0a  tarfish Systems.
00d0: 20 2a 09 43 6f 70 79 72 69 67 68 74 20 28 43 29   *.Copyright (C)
00e0: 20 32 30 32 33 20 42 72 69 61 6e 20 4f 27 48 61   2023 Brian O'Ha
00f0: 67 61 6e 0a 20 2a 0a 20 2a 20 54 4c 53 20 28 61  gan. *. * TLS (a
0100: 6b 61 20 53 53 4c 29 20 43 68 61 6e 6e 65 6c 20  ka SSL) Channel 
0110: 2d 20 63 61 6e 20 62 65 20 6c 61 79 65 72 65 64  - can be layered
0120: 20 6f 6e 20 61 6e 79 20 62 69 2d 64 69 72 65 63   on any bi-direc
0130: 74 69 6f 6e 61 6c 0a 20 2a 20 54 63 6c 5f 43 68  tional. * Tcl_Ch
0140: 61 6e 6e 65 6c 20 28 4e 6f 74 65 3a 20 52 65 71  annel (Note: Req
0150: 75 69 72 65 73 20 54 72 66 20 43 6f 72 65 20 50  uires Trf Core P
0160: 61 74 63 68 29 0a 20 2a 0a 20 2a 20 54 68 69 73  atch). *. * This
0170: 20 77 61 73 20 62 75 69 6c 74 20 28 61 6c 6d 6f   was built (almo
0180: 73 74 29 20 66 72 6f 6d 20 73 63 72 61 74 63 68  st) from scratch
0190: 20 62 61 73 65 64 20 75 70 6f 6e 20 6f 62 73 65   based upon obse
01a0: 72 76 61 74 69 6f 6e 20 6f 66 0a 20 2a 20 4f 70  rvation of. * Op
01b0: 65 6e 53 53 4c 20 30 2e 39 2e 32 42 0a 20 2a 0a  enSSL 0.9.2B. *.
01c0: 20 2a 20 41 64 64 69 74 69 6f 6e 20 63 72 65 64   * Addition cred
01d0: 69 74 20 69 73 20 64 75 65 20 66 6f 72 20 41 6e  it is due for An
01e0: 64 72 65 61 73 20 4b 75 70 72 69 65 73 20 28 61  dreas Kupries (a
01f0: 2e 6b 75 70 72 69 65 73 40 77 65 73 74 65 6e 64  .kupries@westend
0200: 2e 63 6f 6d 29 2c 20 66 6f 72 0a 20 2a 20 70 72  .com), for. * pr
0210: 6f 76 69 64 69 6e 67 20 74 68 65 20 54 63 6c 5f  oviding the Tcl_
0220: 52 65 70 6c 61 63 65 43 68 61 6e 6e 65 6c 20 6d  ReplaceChannel m
0230: 65 63 68 61 6e 69 73 6d 20 61 6e 64 20 77 6f 72  echanism and wor
0240: 6b 69 6e 67 20 63 6c 6f 73 65 6c 79 20 77 69 74  king closely wit
0250: 68 20 6d 65 0a 20 2a 20 74 6f 20 65 6e 68 61 6e  h me. * to enhan
0260: 63 65 20 69 74 20 74 6f 20 73 75 70 70 6f 72 74  ce it to support
0270: 20 66 75 6c 6c 20 66 69 6c 65 65 76 65 6e 74 20   full fileevent 
0280: 73 65 6d 61 6e 74 69 63 73 2e 0a 20 2a 0a 20 2a  semantics.. *. *
0290: 20 41 6c 73 6f 20 77 6f 72 6b 20 64 6f 6e 65 20   Also work done 
02a0: 62 79 20 74 68 65 20 66 6f 6c 6c 6f 77 20 70 65  by the follow pe
02b0: 6f 70 6c 65 20 70 72 6f 76 69 64 65 64 20 74 68  ople provided th
02c0: 65 20 69 6d 70 65 74 75 73 20 74 6f 20 64 6f 20  e impetus to do 
02d0: 74 68 69 73 20 22 72 69 67 68 74 22 3a 0a 20 2a  this "right":. *
02e0: 09 74 63 6c 53 53 4c 20 28 43 6f 6c 69 6e 20 4d  .tclSSL (Colin M
02f0: 63 43 6f 72 6d 61 63 6b 2c 20 53 68 61 72 65 64  cCormack, Shared
0300: 20 54 65 63 68 6e 6f 6c 6f 67 79 29 0a 20 2a 09   Technology). *.
0310: 53 53 4c 74 63 6c 20 28 50 65 74 65 72 20 41 6e  SSLtcl (Peter An
0320: 74 6d 61 6e 29 0a 20 2a 0a 20 2a 2f 0a 0a 23 69  tman). *. */..#i
0330: 6e 63 6c 75 64 65 20 22 74 6c 73 49 6e 74 2e 68  nclude "tlsInt.h
0340: 22 0a 23 69 6e 63 6c 75 64 65 20 22 74 63 6c 4f  ".#include "tclO
0350: 70 74 73 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  pts.h".#include 
0360: 22 74 6c 73 55 75 69 64 2e 68 22 0a 23 69 6e 63  "tlsUuid.h".#inc
0370: 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a 23  lude <stdio.h>.#
0380: 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e  include <stdlib.
0390: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65  h>.#include <ope
03a0: 6e 73 73 6c 2f 73 73 6c 2e 68 3e 0a 23 69 6e 63  nssl/ssl.h>.#inc
03b0: 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f 63 72  lude <openssl/cr
03c0: 79 70 74 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  ypto.h>.#include
03d0: 20 3c 6f 70 65 6e 73 73 6c 2f 6f 70 65 6e 73 73   <openssl/openss
03e0: 6c 63 6f 6e 66 2e 68 3e 0a 23 69 6e 63 6c 75 64  lconf.h>.#includ
03f0: 65 20 3c 6f 70 65 6e 73 73 6c 2f 72 73 61 2e 68  e <openssl/rsa.h
0400: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65 6e  >.#include <open
0410: 73 73 6c 2f 73 61 66 65 73 74 61 63 6b 2e 68 3e  ssl/safestack.h>
0420: 0a 0a 2f 2a 20 4d 69 6e 20 4f 70 65 6e 53 53 4c  ../* Min OpenSSL
0430: 20 76 65 72 73 69 6f 6e 20 2a 2f 0a 23 69 66 20   version */.#if 
0440: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f  OPENSSL_VERSION_
0450: 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 31  NUMBER < 0x10101
0460: 30 30 30 4c 0a 23 65 72 72 6f 72 20 22 4f 6e 6c  000L.#error "Onl
0470: 79 20 4f 70 65 6e 53 53 4c 20 76 31 2e 31 2e 31  y OpenSSL v1.1.1
0480: 20 6f 72 20 6c 61 74 65 72 20 69 73 20 73 75 70   or later is sup
0490: 70 6f 72 74 65 64 22 0a 23 65 6e 64 69 66 0a 0a  ported".#endif..
04a0: 0a 2f 2a 0a 20 2a 20 46 6f 72 77 61 72 64 20 64  ./*. * Forward d
04b0: 65 63 6c 61 72 61 74 69 6f 6e 73 0a 20 2a 2f 0a  eclarations. */.
04c0: 0a 23 64 65 66 69 6e 65 20 46 32 4e 28 6b 65 79  .#define F2N(key
04d0: 2c 20 64 73 70 29 20 5c 0a 09 28 28 28 6b 65 79  , dsp) \..(((key
04e0: 29 20 3d 3d 20 4e 55 4c 4c 29 20 3f 20 28 63 68  ) == NULL) ? (ch
04f0: 61 72 20 2a 29 20 4e 55 4c 4c 20 3a 20 5c 0a 09  ar *) NULL : \..
0500: 09 54 63 6c 5f 54 72 61 6e 73 6c 61 74 65 46 69  .Tcl_TranslateFi
0510: 6c 65 4e 61 6d 65 28 69 6e 74 65 72 70 2c 20 28  leName(interp, (
0520: 6b 65 79 29 2c 20 28 64 73 70 29 29 29 0a 0a 73  key), (dsp)))..s
0530: 74 61 74 69 63 20 53 53 4c 5f 43 54 58 20 2a 43  tatic SSL_CTX *C
0540: 54 58 5f 49 6e 69 74 28 53 74 61 74 65 20 2a 73  TX_Init(State *s
0550: 74 61 74 65 50 74 72 2c 20 69 6e 74 20 69 73 53  tatePtr, int isS
0560: 65 72 76 65 72 2c 20 69 6e 74 20 70 72 6f 74 6f  erver, int proto
0570: 2c 20 63 68 61 72 20 2a 6b 65 79 2c 0a 09 09 63  , char *key,...c
0580: 68 61 72 20 2a 63 65 72 74 66 69 6c 65 2c 20 75  har *certfile, u
0590: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6b 65  nsigned char *ke
05a0: 79 5f 61 73 6e 31 2c 20 75 6e 73 69 67 6e 65 64  y_asn1, unsigned
05b0: 20 63 68 61 72 20 2a 63 65 72 74 5f 61 73 6e 31   char *cert_asn1
05c0: 2c 0a 09 09 54 63 6c 5f 53 69 7a 65 20 6b 65 79  ,...Tcl_Size key
05d0: 5f 61 73 6e 31 5f 6c 65 6e 2c 20 54 63 6c 5f 53  _asn1_len, Tcl_S
05e0: 69 7a 65 20 63 65 72 74 5f 61 73 6e 31 5f 6c 65  ize cert_asn1_le
05f0: 6e 2c 20 63 68 61 72 20 2a 43 41 70 61 74 68 2c  n, char *CApath,
0600: 20 63 68 61 72 20 2a 43 41 73 74 6f 72 65 2c 0a   char *CAstore,.
0610: 09 09 63 68 61 72 20 2a 43 41 66 69 6c 65 2c 20  ..char *CAfile, 
0620: 63 68 61 72 20 2a 63 69 70 68 65 72 73 2c 20 63  char *ciphers, c
0630: 68 61 72 20 2a 63 69 70 68 65 72 73 75 69 74 65  har *ciphersuite
0640: 73 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 63 68  s, int level, ch
0650: 61 72 20 2a 44 48 70 61 72 61 6d 73 29 3b 0a 0a  ar *DHparams);..
0660: 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54  #define TLS_PROT
0670: 4f 5f 53 53 4c 32 09 09 30 78 30 31 0a 23 64 65  O_SSL2..0x01.#de
0680: 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53  fine TLS_PROTO_S
0690: 53 4c 33 09 09 30 78 30 32 0a 23 64 65 66 69 6e  SL3..0x02.#defin
06a0: 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31  e TLS_PROTO_TLS1
06b0: 09 09 30 78 30 34 0a 23 64 65 66 69 6e 65 20 54  ..0x04.#define T
06c0: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 09  LS_PROTO_TLS1_1.
06d0: 30 78 30 38 0a 23 64 65 66 69 6e 65 20 54 4c 53  0x08.#define TLS
06e0: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 09 30 78  _PROTO_TLS1_2.0x
06f0: 31 30 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50  10.#define TLS_P
0700: 52 4f 54 4f 5f 54 4c 53 31 5f 33 09 30 78 32 30  ROTO_TLS1_3.0x20
0710: 0a 23 64 65 66 69 6e 65 20 45 4e 41 42 4c 45 44  .#define ENABLED
0720: 28 66 6c 61 67 2c 20 6d 61 73 6b 29 09 28 28 28  (flag, mask).(((
0730: 66 6c 61 67 29 20 26 20 28 6d 61 73 6b 29 29 20  flag) & (mask)) 
0740: 3d 3d 20 28 6d 61 73 6b 29 29 0a 0a 23 64 65 66  == (mask))..#def
0750: 69 6e 65 20 53 53 4c 4b 45 59 4c 4f 47 46 49 4c  ine SSLKEYLOGFIL
0760: 45 09 09 22 53 53 4c 4b 45 59 4c 4f 47 46 49 4c  E.."SSLKEYLOGFIL
0770: 45 22 0a 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  E"..../*********
0780: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20  ***********/./* 
0790: 43 61 6c 6c 62 61 63 6b 73 20 20 20 20 20 20 20  Callbacks       
07a0: 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   */./***********
07b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20  *********/../*. 
07c0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
07d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
07e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
07f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0800: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 45 76 61 6c 20  ----. *. * Eval 
0810: 43 61 6c 6c 62 61 63 6b 20 43 6f 6d 6d 61 6e 64  Callback Command
0820: 20 2d 2d 0a 20 2a 0a 20 2a 09 45 76 61 6c 20 63   --. *. *.Eval c
0830: 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20  allback command 
0840: 61 6e 64 20 63 61 74 63 68 20 61 6e 79 20 65 72  and catch any er
0850: 72 6f 72 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  rors. *. * Resul
0860: 74 73 3a 0a 20 2a 09 30 20 3d 20 43 6f 6d 6d 61  ts:. *.0 = Comma
0870: 6e 64 20 72 65 74 75 72 6e 65 64 20 66 61 69 6c  nd returned fail
0880: 20 6f 72 20 65 76 61 6c 20 72 65 74 75 72 6e 65   or eval returne
0890: 64 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 09 31  d TCL_ERROR. *.1
08a0: 20 3d 20 43 6f 6d 6d 61 6e 64 20 72 65 74 75 72   = Command retur
08b0: 6e 65 64 20 73 75 63 63 65 73 73 20 6f 72 20 65  ned success or e
08c0: 76 61 6c 20 72 65 74 75 72 6e 65 64 20 54 43 4c  val returned TCL
08d0: 5f 4f 4b 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  _OK. *. * Side e
08e0: 66 66 65 63 74 73 3a 0a 20 2a 09 45 76 61 6c 75  ffects:. *.Evalu
08f0: 61 74 65 73 20 63 61 6c 6c 62 61 63 6b 20 63 6f  ates callback co
0900: 6d 6d 61 6e 64 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  mmand. *. *-----
0910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
0950: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 45 76  */.static int.Ev
0960: 61 6c 43 61 6c 6c 62 61 63 6b 28 54 63 6c 5f 49  alCallback(Tcl_I
0970: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 53  nterp *interp, S
0980: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 2c 20  tate *statePtr, 
0990: 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 29  Tcl_Obj *cmdPtr)
09a0: 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 2c   {.    int code,
09b0: 20 6f 6b 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70   ok = 0;..    dp
09c0: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
09d0: 0a 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72  ..    Tcl_Preser
09e0: 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20  ve((ClientData) 
09f0: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c  interp);.    Tcl
0a00: 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e  _Preserve((Clien
0a10: 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29  tData) statePtr)
0a20: 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63  ;..    /* Eval c
0a30: 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 73 75 63  allback with suc
0a40: 63 65 73 73 20 66 6f 72 20 6f 6b 20 6f 72 20 72  cess for ok or r
0a50: 65 74 75 72 6e 20 76 61 6c 75 65 20 31 2c 20 66  eturn value 1, f
0a60: 61 69 6c 20 66 6f 72 20 65 72 72 6f 72 20 6f 72  ail for error or
0a70: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 30 20   return value 0 
0a80: 2a 2f 0a 20 20 20 20 54 63 6c 5f 52 65 73 65 74  */.    Tcl_Reset
0a90: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a  Result(interp);.
0aa0: 20 20 20 20 63 6f 64 65 20 3d 20 54 63 6c 5f 45      code = Tcl_E
0ab0: 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c  valObjEx(interp,
0ac0: 20 63 6d 64 50 74 72 2c 20 54 43 4c 5f 45 56 41   cmdPtr, TCL_EVA
0ad0: 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 20 20 64  L_GLOBAL);.    d
0ae0: 70 72 69 6e 74 66 28 22 45 76 61 6c 43 61 6c 6c  printf("EvalCall
0af0: 62 61 63 6b 3a 20 25 64 22 2c 20 63 6f 64 65 29  back: %d", code)
0b00: 3b 0a 20 20 20 20 69 66 20 28 63 6f 64 65 20 3d  ;.    if (code =
0b10: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 2f 2a 20  = TCL_OK) {../* 
0b20: 43 68 65 63 6b 20 72 65 73 75 6c 74 20 66 6f 72  Check result for
0b30: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f   return value */
0b40: 0a 09 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c  ..Tcl_Obj *resul
0b50: 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65  t = Tcl_GetObjRe
0b60: 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 69  sult(interp);..i
0b70: 66 20 28 72 65 73 75 6c 74 20 3d 3d 20 4e 55 4c  f (result == NUL
0b80: 4c 20 7c 7c 20 54 63 6c 5f 47 65 74 49 6e 74 46  L || Tcl_GetIntF
0b90: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 72  romObj(interp, r
0ba0: 65 73 75 6c 74 2c 20 26 6f 6b 29 20 21 3d 20 54  esult, &ok) != T
0bb0: 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 6f 6b  CL_OK) {..    ok
0bc0: 20 3d 20 31 3b 0a 09 7d 0a 09 64 70 72 69 6e 74   = 1;..}..dprint
0bd0: 66 28 22 52 65 73 75 6c 74 3a 20 25 64 22 2c 20  f("Result: %d", 
0be0: 6f 6b 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  ok);.    } else 
0bf0: 7b 0a 09 2f 2a 20 45 72 72 6f 72 20 2d 20 72 65  {../* Error - re
0c00: 6a 65 63 74 20 74 68 65 20 63 65 72 74 69 66 69  ject the certifi
0c10: 63 61 74 65 20 2a 2f 0a 09 64 70 72 69 6e 74 66  cate */..dprintf
0c20: 28 22 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64  ("Tcl_Background
0c30: 45 72 72 6f 72 22 29 3b 0a 23 69 66 20 28 54 43  Error");.#if (TC
0c40: 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20  L_MAJOR_VERSION 
0c50: 3d 3d 20 38 29 20 26 26 20 28 54 43 4c 5f 4d 49  == 8) && (TCL_MI
0c60: 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20 36 29  NOR_VERSION < 6)
0c70: 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64  ..Tcl_Background
0c80: 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a 23  Error(interp);.#
0c90: 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63 6b 67 72  else..Tcl_Backgr
0ca0: 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e 28 69 6e  oundException(in
0cb0: 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a 23 65 6e  terp, code);.#en
0cc0: 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54  dif.    }..    T
0cd0: 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65  cl_Release((Clie
0ce0: 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72  ntData) statePtr
0cf0: 29 3b 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61  );.    Tcl_Relea
0d00: 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20  se((ClientData) 
0d10: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 72 65 74  interp);.    ret
0d20: 75 72 6e 20 6f 6b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  urn ok;.}.../*. 
0d30: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
0d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d70: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 49 6e 66 6f 43  ----. *. * InfoC
0d80: 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a  allback --. *. *
0d90: 09 4d 6f 6e 69 74 6f 72 73 20 53 53 4c 20 63 6f  .Monitors SSL co
0da0: 6e 6e 65 63 74 69 6f 6e 20 70 72 6f 63 65 73 73  nnection process
0db0: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
0dc0: 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69   *.None. *. * Si
0dd0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43  de effects:. *.C
0de0: 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69  alls callback (i
0df0: 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a  f defined). *. *
0e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e40: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76  ---. */.static v
0e50: 6f 69 64 0a 49 6e 66 6f 43 61 6c 6c 62 61 63 6b  oid.InfoCallback
0e60: 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c  (const SSL *ssl,
0e70: 20 69 6e 74 20 77 68 65 72 65 2c 20 69 6e 74 20   int where, int 
0e80: 72 65 74 29 20 7b 0a 20 20 20 20 53 74 61 74 65  ret) {.    State
0e90: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74   *statePtr = (St
0ea0: 61 74 65 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70  ate*)SSL_get_app
0eb0: 5f 64 61 74 61 28 28 53 53 4c 20 2a 29 73 73 6c  _data((SSL *)ssl
0ec0: 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72  );.    Tcl_Inter
0ed0: 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74  p *interp.= stat
0ee0: 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20  ePtr->interp;.  
0ef0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74    Tcl_Obj *cmdPt
0f00: 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  r;.    const cha
0f10: 72 20 2a 6d 61 6a 6f 72 2c 20 2a 6d 69 6e 6f 72  r *major, *minor
0f20: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
0f30: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69  Called");..    i
0f40: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c  f (statePtr->cal
0f50: 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62  lback == (Tcl_Ob
0f60: 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75  j*)NULL) {..retu
0f70: 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  rn;.    }..    i
0f80: 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43  f (where & SSL_C
0f90: 42 5f 48 41 4e 44 53 48 41 4b 45 5f 53 54 41 52  B_HANDSHAKE_STAR
0fa0: 54 29 20 7b 0a 09 6d 61 6a 6f 72 20 3d 20 22 68  T) {..major = "h
0fb0: 61 6e 64 73 68 61 6b 65 22 3b 0a 09 6d 69 6e 6f  andshake";..mino
0fc0: 72 20 3d 20 22 73 74 61 72 74 22 3b 0a 20 20 20  r = "start";.   
0fd0: 20 7d 20 65 6c 73 65 20 69 66 20 28 77 68 65 72   } else if (wher
0fe0: 65 20 26 20 53 53 4c 5f 43 42 5f 48 41 4e 44 53  e & SSL_CB_HANDS
0ff0: 48 41 4b 45 5f 44 4f 4e 45 29 20 7b 0a 09 6d 61  HAKE_DONE) {..ma
1000: 6a 6f 72 20 3d 20 22 68 61 6e 64 73 68 61 6b 65  jor = "handshake
1010: 22 3b 0a 09 6d 69 6e 6f 72 20 3d 20 22 64 6f 6e  ";..minor = "don
1020: 65 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  e";.    } else {
1030: 0a 09 69 66 20 28 77 68 65 72 65 20 26 20 53 53  ..if (where & SS
1040: 4c 5f 43 42 5f 41 4c 45 52 54 29 09 09 6d 61 6a  L_CB_ALERT)..maj
1050: 6f 72 20 3d 20 22 61 6c 65 72 74 22 3b 0a 09 65  or = "alert";..e
1060: 6c 73 65 20 69 66 20 28 77 68 65 72 65 20 26 20  lse if (where & 
1070: 53 53 4c 5f 53 54 5f 43 4f 4e 4e 45 43 54 29 09  SSL_ST_CONNECT).
1080: 6d 61 6a 6f 72 20 3d 20 22 63 6f 6e 6e 65 63 74  major = "connect
1090: 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65  ";..else if (whe
10a0: 72 65 20 26 20 53 53 4c 5f 53 54 5f 41 43 43 45  re & SSL_ST_ACCE
10b0: 50 54 29 09 09 6d 61 6a 6f 72 20 3d 20 22 61 63  PT)..major = "ac
10c0: 63 65 70 74 22 3b 0a 09 65 6c 73 65 09 09 09 09  cept";..else....
10d0: 09 6d 61 6a 6f 72 20 3d 20 22 75 6e 6b 6e 6f 77  .major = "unknow
10e0: 6e 22 3b 0a 0a 09 69 66 20 28 77 68 65 72 65 20  n";...if (where 
10f0: 26 20 53 53 4c 5f 43 42 5f 52 45 41 44 29 09 09  & SSL_CB_READ)..
1100: 6d 69 6e 6f 72 20 3d 20 22 72 65 61 64 22 3b 0a  minor = "read";.
1110: 09 65 6c 73 65 20 69 66 20 28 77 68 65 72 65 20  .else if (where 
1120: 26 20 53 53 4c 5f 43 42 5f 57 52 49 54 45 29 09  & SSL_CB_WRITE).
1130: 09 6d 69 6e 6f 72 20 3d 20 22 77 72 69 74 65 22  .minor = "write"
1140: 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65 72  ;..else if (wher
1150: 65 20 26 20 53 53 4c 5f 43 42 5f 4c 4f 4f 50 29  e & SSL_CB_LOOP)
1160: 09 09 6d 69 6e 6f 72 20 3d 20 22 6c 6f 6f 70 22  ..minor = "loop"
1170: 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65 72  ;..else if (wher
1180: 65 20 26 20 53 53 4c 5f 43 42 5f 45 58 49 54 29  e & SSL_CB_EXIT)
1190: 09 09 6d 69 6e 6f 72 20 3d 20 22 65 78 69 74 22  ..minor = "exit"
11a0: 3b 0a 09 65 6c 73 65 09 09 09 09 09 6d 69 6e 6f  ;..else.....mino
11b0: 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 20  r = "unknown";. 
11c0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65     }..    /* Cre
11d0: 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65  ate command to e
11e0: 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 63 68 61  val with fn, cha
11f0: 6e 2c 20 6d 61 6a 6f 72 2c 20 6d 69 6e 6f 72 2c  n, major, minor,
1200: 20 6d 65 73 73 61 67 65 2c 20 61 6e 64 20 74 79   message, and ty
1210: 70 65 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 63  pe args */.    c
1220: 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c  mdPtr = Tcl_Dupl
1230: 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74  icateObj(statePt
1240: 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 20  r->callback);.  
1250: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
1260: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
1270: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e  p, cmdPtr, Tcl_N
1280: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 69 6e 66  ewStringObj("inf
1290: 6f 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63  o", -1));.    Tc
12a0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
12b0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
12c0: 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f  mdPtr,..    Tcl_
12d0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c  NewStringObj(Tcl
12e0: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28  _GetChannelName(
12f0: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c  statePtr->self),
1300: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c   -1));.    Tcl_L
1310: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
1320: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
1330: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
1340: 67 4f 62 6a 28 6d 61 6a 6f 72 2c 20 2d 31 29 29  gObj(major, -1))
1350: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
1360: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
1370: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54  nterp, cmdPtr, T
1380: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
1390: 6d 69 6e 6f 72 2c 20 2d 31 29 29 3b 0a 0a 20 20  minor, -1));..  
13a0: 20 20 69 66 20 28 77 68 65 72 65 20 26 20 53 53    if (where & SS
13b0: 4c 5f 43 42 5f 41 4c 45 52 54 29 20 7b 0a 09 54  L_CB_ALERT) {..T
13c0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
13d0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
13e0: 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c  cmdPtr,..    Tcl
13f0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53  _NewStringObj(SS
1400: 4c 5f 61 6c 65 72 74 5f 64 65 73 63 5f 73 74 72  L_alert_desc_str
1410: 69 6e 67 5f 6c 6f 6e 67 28 72 65 74 29 2c 20 2d  ing_long(ret), -
1420: 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62  1));..Tcl_ListOb
1430: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
1440: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09  nterp, cmdPtr,..
1450: 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e      Tcl_NewStrin
1460: 67 4f 62 6a 28 53 53 4c 5f 61 6c 65 72 74 5f 74  gObj(SSL_alert_t
1470: 79 70 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28  ype_string_long(
1480: 72 65 74 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20  ret), -1));.    
1490: 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 4c 69  } else {..Tcl_Li
14a0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
14b0: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
14c0: 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53  r,..    Tcl_NewS
14d0: 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 73 74 61  tringObj(SSL_sta
14e0: 74 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 73  te_string_long(s
14f0: 73 6c 29 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f  sl), -1));..Tcl_
1500: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
1510: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
1520: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
1530: 6e 67 4f 62 6a 28 22 69 6e 66 6f 22 2c 20 2d 31  ngObj("info", -1
1540: 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ));.    }..    /
1550: 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20  * Eval callback 
1560: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54  command */.    T
1570: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
1580: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 45 76 61  cmdPtr);.    Eva
1590: 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70  lCallback(interp
15a0: 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50  , statePtr, cmdP
15b0: 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63  tr);.    Tcl_Dec
15c0: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72  rRefCount(cmdPtr
15d0: 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  );.}.../*. *----
15e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
1620: 20 2a 0a 20 2a 20 4d 65 73 73 61 67 65 43 61 6c   *. * MessageCal
1630: 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 4d  lback --. *. *.M
1640: 6f 6e 69 74 6f 72 73 20 53 53 4c 20 70 72 6f 74  onitors SSL prot
1650: 6f 63 6f 6c 20 6d 65 73 73 61 67 65 73 0a 20 2a  ocol messages. *
1660: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
1670: 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20  None. *. * Side 
1680: 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c  effects:. *.Call
1690: 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64  s callback (if d
16a0: 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 2d 2d 2d  efined). *. *---
16b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16f0: 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 50 45  . */.#ifndef OPE
1700: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 5f 54 52 41 43  NSSL_NO_SSL_TRAC
1710: 45 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 4d 65  E.static void.Me
1720: 73 73 61 67 65 43 61 6c 6c 62 61 63 6b 28 69 6e  ssageCallback(in
1730: 74 20 77 72 69 74 65 5f 70 2c 20 69 6e 74 20 76  t write_p, int v
1740: 65 72 73 69 6f 6e 2c 20 69 6e 74 20 63 6f 6e 74  ersion, int cont
1750: 65 6e 74 5f 74 79 70 65 2c 20 63 6f 6e 73 74 20  ent_type, const 
1760: 76 6f 69 64 20 2a 62 75 66 2c 20 73 69 7a 65 5f  void *buf, size_
1770: 74 20 6c 65 6e 2c 20 53 53 4c 20 2a 73 73 6c 2c  t len, SSL *ssl,
1780: 20 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a 20 20   void *arg) {.  
1790: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74    State *statePt
17a0: 72 20 3d 20 28 53 74 61 74 65 2a 29 61 72 67 3b  r = (State*)arg;
17b0: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  .    Tcl_Interp 
17c0: 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50  *interp.= stateP
17d0: 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20  tr->interp;.    
17e0: 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b  Tcl_Obj *cmdPtr;
17f0: 0a 20 20 20 20 63 68 61 72 20 2a 76 65 72 2c 20  .    char *ver, 
1800: 2a 74 79 70 65 3b 0a 20 20 20 20 42 49 4f 20 2a  *type;.    BIO *
1810: 62 69 6f 3b 0a 20 20 20 20 63 68 61 72 20 62 75  bio;.    char bu
1820: 66 66 65 72 5b 31 35 30 30 30 5d 3b 0a 20 20 20  ffer[15000];.   
1830: 20 62 75 66 66 65 72 5b 30 5d 20 3d 20 30 3b 0a   buffer[0] = 0;.
1840: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
1850: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20  lled");..    if 
1860: 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62  (statePtr->callb
1870: 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a  ack == (Tcl_Obj*
1880: 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e  )NULL) {..return
1890: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 77 69  ;.    }..    swi
18a0: 74 63 68 28 76 65 72 73 69 6f 6e 29 20 7b 0a 23  tch(version) {.#
18b0: 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49  if OPENSSL_VERSI
18c0: 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30  ON_NUMBER < 0x10
18d0: 31 30 30 30 30 30 4c 20 26 26 20 21 64 65 66 69  100000L && !defi
18e0: 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20  ned(NO_SSL2) && 
18f0: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
1900: 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20 63 61  _NO_SSL2).    ca
1910: 73 65 20 53 53 4c 32 5f 56 45 52 53 49 4f 4e 3a  se SSL2_VERSION:
1920: 0a 09 76 65 72 20 3d 20 22 53 53 4c 76 32 22 3b  ..ver = "SSLv2";
1930: 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a  ..break;.#endif.
1940: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f  #if !defined(NO_
1950: 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65  SSL3) && !define
1960: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c  d(OPENSSL_NO_SSL
1970: 33 29 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33  3).    case SSL3
1980: 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3d  _VERSION:..ver =
1990: 20 22 53 53 4c 76 33 22 3b 0a 09 62 72 65 61 6b   "SSLv3";..break
19a0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73  ;.#endif.    cas
19b0: 65 20 54 4c 53 31 5f 56 45 52 53 49 4f 4e 3a 0a  e TLS1_VERSION:.
19c0: 09 76 65 72 20 3d 20 22 54 4c 53 76 31 22 3b 0a  .ver = "TLSv1";.
19d0: 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65  .break;.    case
19e0: 20 54 4c 53 31 5f 31 5f 56 45 52 53 49 4f 4e 3a   TLS1_1_VERSION:
19f0: 0a 09 76 65 72 20 3d 20 22 54 4c 53 76 31 2e 31  ..ver = "TLSv1.1
1a00: 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63  ";..break;.    c
1a10: 61 73 65 20 54 4c 53 31 5f 32 5f 56 45 52 53 49  ase TLS1_2_VERSI
1a20: 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 54 4c 53 76  ON:..ver = "TLSv
1a30: 31 2e 32 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20  1.2";..break;.  
1a40: 20 20 63 61 73 65 20 54 4c 53 31 5f 33 5f 56 45    case TLS1_3_VE
1a50: 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 54  RSION:..ver = "T
1a60: 4c 53 76 31 2e 33 22 3b 0a 09 62 72 65 61 6b 3b  LSv1.3";..break;
1a70: 0a 20 20 20 20 63 61 73 65 20 30 3a 0a 09 76 65  .    case 0:..ve
1a80: 72 20 3d 20 22 6e 6f 6e 65 22 3b 0a 09 62 72 65  r = "none";..bre
1a90: 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  ak;.    default:
1aa0: 0a 09 76 65 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e  ..ver = "unknown
1ab0: 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d  ";..break;.    }
1ac0: 0a 0a 20 20 20 20 73 77 69 74 63 68 20 28 63 6f  ..    switch (co
1ad0: 6e 74 65 6e 74 5f 74 79 70 65 29 20 7b 0a 20 20  ntent_type) {.  
1ae0: 20 20 63 61 73 65 20 53 53 4c 33 5f 52 54 5f 48    case SSL3_RT_H
1af0: 45 41 44 45 52 3a 0a 09 74 79 70 65 20 3d 20 22  EADER:..type = "
1b00: 48 65 61 64 65 72 22 3b 0a 09 62 72 65 61 6b 3b  Header";..break;
1b10: 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52  .    case SSL3_R
1b20: 54 5f 49 4e 4e 45 52 5f 43 4f 4e 54 45 4e 54 5f  T_INNER_CONTENT_
1b30: 54 59 50 45 3a 0a 09 74 79 70 65 20 3d 20 22 49  TYPE:..type = "I
1b40: 6e 6e 65 72 20 43 6f 6e 74 65 6e 74 20 54 79 70  nner Content Typ
1b50: 65 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20  e";..break;.    
1b60: 63 61 73 65 20 53 53 4c 33 5f 52 54 5f 43 48 41  case SSL3_RT_CHA
1b70: 4e 47 45 5f 43 49 50 48 45 52 5f 53 50 45 43 3a  NGE_CIPHER_SPEC:
1b80: 0a 09 74 79 70 65 20 3d 20 22 43 68 61 6e 67 65  ..type = "Change
1b90: 20 43 69 70 68 65 72 22 3b 0a 09 62 72 65 61 6b   Cipher";..break
1ba0: 3b 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f  ;.    case SSL3_
1bb0: 52 54 5f 41 4c 45 52 54 3a 0a 09 74 79 70 65 20  RT_ALERT:..type 
1bc0: 3d 20 22 41 6c 65 72 74 22 3b 0a 09 62 72 65 61  = "Alert";..brea
1bd0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33  k;.    case SSL3
1be0: 5f 52 54 5f 48 41 4e 44 53 48 41 4b 45 3a 0a 09  _RT_HANDSHAKE:..
1bf0: 74 79 70 65 20 3d 20 22 48 61 6e 64 73 68 61 6b  type = "Handshak
1c00: 65 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20  e";..break;.    
1c10: 63 61 73 65 20 53 53 4c 33 5f 52 54 5f 41 50 50  case SSL3_RT_APP
1c20: 4c 49 43 41 54 49 4f 4e 5f 44 41 54 41 3a 0a 09  LICATION_DATA:..
1c30: 74 79 70 65 20 3d 20 22 41 70 70 20 44 61 74 61  type = "App Data
1c40: 22 3b 0a 09 62 72 65 61 6b 3b 0a 23 69 66 20 4f  ";..break;.#if O
1c50: 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e  PENSSL_VERSION_N
1c60: 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30  UMBER < 0x300000
1c70: 30 30 4c 0a 20 20 20 20 63 61 73 65 20 44 54 4c  00L.    case DTL
1c80: 53 31 5f 52 54 5f 48 45 41 52 54 42 45 41 54 3a  S1_RT_HEARTBEAT:
1c90: 0a 09 74 79 70 65 20 3d 20 22 48 65 61 72 74 62  ..type = "Heartb
1ca0: 65 61 74 22 3b 0a 09 62 72 65 61 6b 3b 0a 23 65  eat";..break;.#e
1cb0: 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74  ndif.    default
1cc0: 3a 0a 09 74 79 70 65 20 3d 20 22 75 6e 6b 6e 6f  :..type = "unkno
1cd0: 77 6e 22 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  wn";.    }..    
1ce0: 2f 2a 20 4e 65 65 64 73 20 63 6f 6d 70 69 6c 65  /* Needs compile
1cf0: 20 74 69 6d 65 20 6f 70 74 69 6f 6e 20 22 65 6e   time option "en
1d00: 61 62 6c 65 2d 73 73 6c 2d 74 72 61 63 65 22 2e  able-ssl-trace".
1d10: 20 2a 2f 0a 20 20 20 20 69 66 20 28 28 62 69 6f   */.    if ((bio
1d20: 20 3d 20 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73   = BIO_new(BIO_s
1d30: 5f 6d 65 6d 28 29 29 29 20 21 3d 20 4e 55 4c 4c  _mem())) != NULL
1d40: 29 20 7b 0a 09 69 6e 74 20 6e 3b 0a 09 53 53 4c  ) {..int n;..SSL
1d50: 5f 74 72 61 63 65 28 77 72 69 74 65 5f 70 2c 20  _trace(write_p, 
1d60: 76 65 72 73 69 6f 6e 2c 20 63 6f 6e 74 65 6e 74  version, content
1d70: 5f 74 79 70 65 2c 20 62 75 66 2c 20 6c 65 6e 2c  _type, buf, len,
1d80: 20 73 73 6c 2c 20 28 76 6f 69 64 20 2a 29 62 69   ssl, (void *)bi
1d90: 6f 29 3b 0a 09 6e 20 3d 20 42 49 4f 5f 72 65 61  o);..n = BIO_rea
1da0: 64 28 62 69 6f 2c 20 62 75 66 66 65 72 2c 20 42  d(bio, buffer, B
1db0: 49 4f 5f 70 65 6e 64 69 6e 67 28 62 69 6f 29 20  IO_pending(bio) 
1dc0: 3c 20 31 35 30 30 30 20 3f 20 42 49 4f 5f 70 65  < 15000 ? BIO_pe
1dd0: 6e 64 69 6e 67 28 62 69 6f 29 20 3a 20 31 34 39  nding(bio) : 149
1de0: 39 39 29 3b 0a 09 6e 20 3d 20 28 6e 3c 30 29 20  99);..n = (n<0) 
1df0: 3f 20 30 20 3a 20 6e 3b 0a 09 62 75 66 66 65 72  ? 0 : n;..buffer
1e00: 5b 6e 5d 20 3d 20 30 3b 0a 09 28 76 6f 69 64 29  [n] = 0;..(void)
1e10: 42 49 4f 5f 66 6c 75 73 68 28 62 69 6f 29 3b 0a  BIO_flush(bio);.
1e20: 09 42 49 4f 5f 66 72 65 65 28 62 69 6f 29 3b 0a  .BIO_free(bio);.
1e30: 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74     }..    dprint
1e40: 66 28 22 4d 65 73 73 61 67 65 20 64 69 72 65 63  f("Message direc
1e50: 74 69 6f 6e 3d 25 64 2c 20 76 65 72 3d 25 73 2c  tion=%d, ver=%s,
1e60: 20 74 79 70 65 3d 25 73 2c 20 6d 65 73 73 61 67   type=%s, messag
1e70: 65 3d 25 73 22 2c 20 77 72 69 74 65 5f 70 2c 20  e=%s", write_p, 
1e80: 76 65 72 2c 20 74 79 70 65 2c 20 26 62 75 66 66  ver, type, &buff
1e90: 65 72 5b 30 5d 29 3b 0a 0a 20 20 20 20 2f 2a 20  er[0]);..    /* 
1ea0: 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74  Create command t
1eb0: 6f 20 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20  o eval with fn, 
1ec0: 63 68 61 6e 2c 20 64 69 72 65 63 74 69 6f 6e 2c  chan, direction,
1ed0: 20 76 65 72 73 69 6f 6e 2c 20 74 79 70 65 2c 20   version, type, 
1ee0: 61 6e 64 20 6d 65 73 73 61 67 65 20 61 72 67 73  and message args
1ef0: 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d   */.    cmdPtr =
1f00: 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62   Tcl_DuplicateOb
1f10: 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c  j(statePtr->call
1f20: 62 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f 4c  back);.    Tcl_L
1f30: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
1f40: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
1f50: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
1f60: 67 4f 62 6a 28 22 6d 65 73 73 61 67 65 22 2c 20  gObj("message", 
1f70: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  -1));.    Tcl_Li
1f80: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
1f90: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
1fa0: 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53  r,..    Tcl_NewS
1fb0: 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74  tringObj(Tcl_Get
1fc0: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74  ChannelName(stat
1fd0: 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29  ePtr->self), -1)
1fe0: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
1ff0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
2000: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
2010: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
2020: 28 77 72 69 74 65 5f 70 20 3f 20 22 53 65 6e 74  (write_p ? "Sent
2030: 22 20 3a 20 22 52 65 63 65 69 76 65 64 22 2c 20  " : "Received", 
2040: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  -1));.    Tcl_Li
2050: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
2060: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
2070: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
2080: 4f 62 6a 28 76 65 72 2c 20 2d 31 29 29 3b 0a 20  Obj(ver, -1));. 
2090: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
20a0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
20b0: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
20c0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 74 79 70  NewStringObj(typ
20d0: 65 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c  e, -1));.    Tcl
20e0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
20f0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
2100: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  dPtr, Tcl_NewStr
2110: 69 6e 67 4f 62 6a 28 62 75 66 66 65 72 2c 20 2d  ingObj(buffer, -
2120: 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61  1));..    /* Eva
2130: 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61  l callback comma
2140: 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e  nd */.    Tcl_In
2150: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74  crRefCount(cmdPt
2160: 72 29 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c 6c  r);.    EvalCall
2170: 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61  back(interp, sta
2180: 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a  tePtr, cmdPtr);.
2190: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
21a0: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 7d 0a  ount(cmdPtr);.}.
21b0: 23 65 6e 64 69 66 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  #endif.../*. *--
21c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2200: 2d 0a 20 2a 0a 20 2a 20 56 65 72 69 66 79 43 61  -. *. * VerifyCa
2210: 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09  llback --. *. *.
2220: 4d 6f 6e 69 74 6f 72 73 20 53 53 4c 20 63 65 72  Monitors SSL cer
2230: 74 69 66 69 63 61 74 65 20 76 61 6c 69 64 61 74  tificate validat
2240: 69 6f 6e 20 70 72 6f 63 65 73 73 2e 20 55 73 65  ion process. Use
2250: 64 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 65  d to control the
2260: 0a 20 2a 09 62 65 68 61 76 69 6f 72 20 77 68 65  . *.behavior whe
2270: 6e 20 74 68 65 20 53 53 4c 5f 56 45 52 49 46 59  n the SSL_VERIFY
2280: 5f 50 45 45 52 20 66 6c 61 67 20 69 73 20 73 65  _PEER flag is se
2290: 74 2e 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65  t. This is calle
22a0: 64 0a 20 2a 09 77 68 65 6e 65 76 65 72 20 61 20  d. *.whenever a 
22b0: 63 65 72 74 69 66 69 63 61 74 65 20 69 73 20 69  certificate is i
22c0: 6e 73 70 65 63 74 65 64 20 6f 72 20 64 65 63 69  nspected or deci
22d0: 64 65 64 20 69 6e 76 61 6c 69 64 2e 20 43 61 6c  ded invalid. Cal
22e0: 6c 65 64 20 66 6f 72 0a 20 2a 09 65 61 63 68 20  led for. *.each 
22f0: 63 65 72 74 69 66 69 63 61 74 65 20 69 6e 20 74  certificate in t
2300: 68 65 20 63 65 72 74 20 63 68 61 69 6e 2e 0a 20  he cert chain.. 
2310: 2a 0a 20 2a 20 43 68 65 63 6b 73 3a 0a 20 2a 09  *. * Checks:. *.
2320: 54 68 65 20 63 65 72 74 69 66 69 63 61 74 65 20  The certificate 
2330: 63 68 61 69 6e 20 69 73 20 63 68 65 63 6b 65 64  chain is checked
2340: 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 20 74   starting with t
2350: 68 65 20 64 65 65 70 65 73 74 20 6e 65 73 74 69  he deepest nesti
2360: 6e 67 20 6c 65 76 65 6c 0a 20 2a 09 20 20 28 74  ng level. *.  (t
2370: 68 65 20 72 6f 6f 74 20 43 41 20 63 65 72 74 69  he root CA certi
2380: 66 69 63 61 74 65 29 20 61 6e 64 20 77 6f 72 6b  ficate) and work
2390: 65 64 20 75 70 77 61 72 64 20 74 6f 20 74 68 65  ed upward to the
23a0: 20 70 65 65 72 27 73 20 63 65 72 74 69 66 69 63   peer's certific
23b0: 61 74 65 2e 0a 20 2a 09 41 6c 6c 20 73 69 67 6e  ate.. *.All sign
23c0: 61 74 75 72 65 73 20 61 72 65 20 76 61 6c 69 64  atures are valid
23d0: 2c 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 69  , current time i
23e0: 73 20 77 69 74 68 69 6e 20 66 69 72 73 74 20 61  s within first a
23f0: 6e 64 20 6c 61 73 74 20 76 61 6c 69 64 69 74 79  nd last validity
2400: 20 74 69 6d 65 2e 0a 20 2a 09 43 68 65 63 6b 20   time.. *.Check 
2410: 74 68 61 74 20 74 68 65 20 63 65 72 74 69 66 69  that the certifi
2420: 63 61 74 65 20 69 73 20 69 73 73 75 65 64 20 62  cate is issued b
2430: 79 20 74 68 65 20 69 73 73 75 65 72 20 63 65 72  y the issuer cer
2440: 74 69 66 69 63 61 74 65 20 69 73 73 75 65 72 2e  tificate issuer.
2450: 0a 20 2a 09 43 68 65 63 6b 20 74 68 65 20 72 65  . *.Check the re
2460: 76 6f 63 61 74 69 6f 6e 20 73 74 61 74 75 73 20  vocation status 
2470: 66 6f 72 20 65 61 63 68 20 63 65 72 74 69 66 69  for each certifi
2480: 63 61 74 65 2e 0a 20 2a 09 43 68 65 63 6b 20 74  cate.. *.Check t
2490: 68 65 20 76 61 6c 69 64 69 74 79 20 6f 66 20 74  he validity of t
24a0: 68 65 20 67 69 76 65 6e 20 43 52 4c 20 61 6e 64  he given CRL and
24b0: 20 74 68 65 20 63 65 72 74 20 72 65 76 6f 63 61   the cert revoca
24c0: 74 69 6f 6e 20 73 74 61 74 75 73 2e 0a 20 2a 09  tion status.. *.
24d0: 43 68 65 63 6b 20 74 68 65 20 70 6f 6c 69 63 69  Check the polici
24e0: 65 73 20 6f 66 20 61 6c 6c 20 74 68 65 20 63 65  es of all the ce
24f0: 72 74 69 66 69 63 61 74 65 73 0a 20 2a 0a 20 2a  rtificates. *. *
2500: 20 41 72 67 73 0a 20 2a 09 70 72 65 76 65 72 69   Args. *.preveri
2510: 66 79 5f 6f 6b 20 69 6e 64 69 63 61 74 65 73 20  fy_ok indicates 
2520: 77 68 65 74 68 65 72 20 74 68 65 20 63 65 72 74  whether the cert
2530: 69 66 69 63 61 74 65 20 76 65 72 69 66 69 63 61  ificate verifica
2540: 74 69 6f 6e 20 70 61 73 73 65 64 20 28 31 29 20  tion passed (1) 
2550: 6f 72 20 6e 6f 74 20 28 30 29 0a 20 2a 0a 20 2a  or not (0). *. *
2560: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 63   Results:. *.A c
2570: 61 6c 6c 62 61 63 6b 20 62 6f 75 6e 64 20 74 6f  allback bound to
2580: 20 74 68 65 20 73 6f 63 6b 65 74 20 6d 61 79 20   the socket may 
2590: 72 65 74 75 72 6e 20 6f 6e 65 20 6f 66 3a 0a 20  return one of:. 
25a0: 2a 09 20 20 20 20 30 09 09 09 2d 20 74 68 65 20  *.    0...- the 
25b0: 63 65 72 74 69 66 69 63 61 74 65 20 69 73 20 64  certificate is d
25c0: 65 65 6d 65 64 20 69 6e 76 61 6c 69 64 2c 20 73  eemed invalid, s
25d0: 65 6e 64 20 76 65 72 69 66 69 63 61 74 69 6f 6e  end verification
25e0: 0a 20 2a 09 09 09 09 20 20 66 61 69 6c 75 72 65  . *....  failure
25f0: 20 61 6c 65 72 74 20 74 6f 20 70 65 65 72 2c 20   alert to peer, 
2600: 61 6e 64 20 74 65 72 6d 69 6e 61 74 65 20 68 61  and terminate ha
2610: 6e 64 73 68 61 6b 65 2e 0a 20 2a 09 20 20 20 20  ndshake.. *.    
2620: 31 09 09 09 2d 20 74 68 65 20 63 65 72 74 69 66  1...- the certif
2630: 69 63 61 74 65 20 69 73 20 64 65 65 6d 65 64 20  icate is deemed 
2640: 76 61 6c 69 64 2c 20 63 6f 6e 74 69 6e 75 65 20  valid, continue 
2650: 77 69 74 68 20 68 61 6e 64 73 68 61 6b 65 2e 0a  with handshake..
2660: 20 2a 09 20 20 20 20 65 6d 70 74 79 20 73 74 72   *.    empty str
2670: 69 6e 67 09 2d 20 6e 6f 20 63 68 61 6e 67 65 20  ing.- no change 
2680: 74 6f 20 63 65 72 74 69 66 69 63 61 74 65 20 76  to certificate v
2690: 61 6c 69 64 61 74 69 6f 6e 0a 20 2a 0a 20 2a 20  alidation. *. * 
26a0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
26b0: 09 54 68 65 20 65 72 72 20 66 69 65 6c 64 20 6f  .The err field o
26c0: 66 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20  f the currently 
26d0: 6f 70 65 72 61 74 69 76 65 20 53 74 61 74 65 20  operative State 
26e0: 69 73 20 73 65 74 0a 20 2a 09 20 20 74 6f 20 61  is set. *.  to a
26f0: 20 73 74 72 69 6e 67 20 64 65 73 63 72 69 62 69   string describi
2700: 6e 67 20 74 68 65 20 53 53 4c 20 6e 65 67 6f 74  ng the SSL negot
2710: 69 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 20 72  iation failure r
2720: 65 61 73 6f 6e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  eason. *. *-----
2730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
2770: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 56 65  */.static int.Ve
2780: 72 69 66 79 43 61 6c 6c 62 61 63 6b 28 69 6e 74  rifyCallback(int
2790: 20 6f 6b 2c 20 58 35 30 39 5f 53 54 4f 52 45 5f   ok, X509_STORE_
27a0: 43 54 58 20 2a 63 74 78 29 20 7b 0a 20 20 20 20  CTX *ctx) {.    
27b0: 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b  Tcl_Obj *cmdPtr;
27c0: 0a 20 20 20 20 53 53 4c 20 20 20 2a 73 73 6c 09  .    SSL   *ssl.
27d0: 09 3d 20 28 53 53 4c 2a 29 58 35 30 39 5f 53 54  .= (SSL*)X509_ST
27e0: 4f 52 45 5f 43 54 58 5f 67 65 74 5f 65 78 5f 64  ORE_CTX_get_ex_d
27f0: 61 74 61 28 63 74 78 2c 20 53 53 4c 5f 67 65 74  ata(ctx, SSL_get
2800: 5f 65 78 5f 64 61 74 61 5f 58 35 30 39 5f 53 54  _ex_data_X509_ST
2810: 4f 52 45 5f 43 54 58 5f 69 64 78 28 29 29 3b 0a  ORE_CTX_idx());.
2820: 20 20 20 20 58 35 30 39 20 20 2a 63 65 72 74 09      X509  *cert.
2830: 09 3d 20 58 35 30 39 5f 53 54 4f 52 45 5f 43 54  .= X509_STORE_CT
2840: 58 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 63 65  X_get_current_ce
2850: 72 74 28 63 74 78 29 3b 0a 20 20 20 20 53 74 61  rt(ctx);.    Sta
2860: 74 65 20 2a 73 74 61 74 65 50 74 72 09 3d 20 28  te *statePtr.= (
2870: 53 74 61 74 65 2a 29 53 53 4c 5f 67 65 74 5f 61  State*)SSL_get_a
2880: 70 70 5f 64 61 74 61 28 73 73 6c 29 3b 0a 20 20  pp_data(ssl);.  
2890: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
28a0: 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d  terp.= statePtr-
28b0: 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 69 6e 74  >interp;.    int
28c0: 20 64 65 70 74 68 09 09 3d 20 58 35 30 39 5f 53   depth..= X509_S
28d0: 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f 65 72 72  TORE_CTX_get_err
28e0: 6f 72 5f 64 65 70 74 68 28 63 74 78 29 3b 0a 20  or_depth(ctx);. 
28f0: 20 20 20 69 6e 74 20 65 72 72 09 09 3d 20 58 35     int err..= X5
2900: 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 74  09_STORE_CTX_get
2910: 5f 65 72 72 6f 72 28 63 74 78 29 3b 0a 0a 20 20  _error(ctx);..  
2920: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
2930: 64 22 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66  d");.    dprintf
2940: 28 22 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b  ("VerifyCallback
2950: 3a 20 25 64 22 2c 20 6f 6b 29 3b 0a 0a 20 20 20  : %d", ok);..   
2960: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76   if (statePtr->v
2970: 63 6d 64 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a  cmd == (Tcl_Obj*
2980: 29 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 20 55 73 65  )NULL) {../* Use
2990: 20 6f 6b 20 76 61 6c 75 65 20 69 66 20 76 65 72   ok value if ver
29a0: 69 66 69 63 61 74 69 6f 6e 20 69 73 20 72 65 71  ification is req
29b0: 75 69 72 65 64 20 2a 2f 0a 09 69 66 20 28 73 74  uired */..if (st
29c0: 61 74 65 50 74 72 2d 3e 76 66 6c 61 67 73 20 26  atePtr->vflags &
29d0: 20 53 53 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c   SSL_VERIFY_FAIL
29e0: 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54  _IF_NO_PEER_CERT
29f0: 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  ) {..    return 
2a00: 6f 6b 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20  ok;..} else {.. 
2a10: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 09 7d 0a     return 1;..}.
2a20: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63      } else if (c
2a30: 65 72 74 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 73  ert == NULL || s
2a40: 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72  sl == NULL) {..r
2a50: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a  eturn 0;.    }..
2a60: 20 20 20 20 64 70 72 69 6e 74 66 28 22 56 65 72      dprintf("Ver
2a70: 69 66 79 43 61 6c 6c 62 61 63 6b 3a 20 63 72 65  ifyCallback: cre
2a80: 61 74 65 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d  ate callback com
2a90: 6d 61 6e 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 20  mand");..    /* 
2aa0: 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74  Create command t
2ab0: 6f 20 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20  o eval with fn, 
2ac0: 63 68 61 6e 2c 20 64 65 70 74 68 2c 20 63 65 72  chan, depth, cer
2ad0: 74 20 69 6e 66 6f 20 6c 69 73 74 2c 20 73 74 61  t info list, sta
2ae0: 74 75 73 2c 20 61 6e 64 20 65 72 72 6f 72 20 61  tus, and error a
2af0: 72 67 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74  rgs */.    cmdPt
2b00: 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74  r = Tcl_Duplicat
2b10: 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 76  eObj(statePtr->v
2b20: 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  cmd);.    Tcl_Li
2b30: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
2b40: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
2b50: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
2b60: 4f 62 6a 28 22 76 65 72 69 66 79 22 2c 20 2d 31  Obj("verify", -1
2b70: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
2b80: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
2b90: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
2ba0: 0a 09 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  ..Tcl_NewStringO
2bb0: 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  bj(Tcl_GetChanne
2bc0: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e  lName(statePtr->
2bd0: 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20  self), -1));.   
2be0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
2bf0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
2c00: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
2c10: 77 49 6e 74 4f 62 6a 28 64 65 70 74 68 29 29 3b  wIntObj(depth));
2c20: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
2c30: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
2c40: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 6c  terp, cmdPtr, Tl
2c50: 73 5f 4e 65 77 58 35 30 39 4f 62 6a 28 69 6e 74  s_NewX509Obj(int
2c60: 65 72 70 2c 20 63 65 72 74 2c 20 30 29 29 3b 0a  erp, cert, 0));.
2c70: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
2c80: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
2c90: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c  erp, cmdPtr, Tcl
2ca0: 5f 4e 65 77 49 6e 74 4f 62 6a 28 6f 6b 29 29 3b  _NewIntObj(ok));
2cb0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
2cc0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
2cd0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 54  terp, cmdPtr,..T
2ce0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
2cf0: 28 63 68 61 72 2a 29 58 35 30 39 5f 76 65 72 69  (char*)X509_veri
2d00: 66 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73 74  fy_cert_error_st
2d10: 72 69 6e 67 28 65 72 72 29 2c 20 2d 31 29 29 3b  ring(err), -1));
2d20: 0a 0a 20 20 20 20 2f 2a 20 50 72 65 76 65 6e 74  ..    /* Prevent
2d30: 20 49 2f 4f 20 77 68 69 6c 65 20 63 61 6c 6c 62   I/O while callb
2d40: 61 63 6b 20 69 73 20 69 6e 20 70 72 6f 67 72 65  ack is in progre
2d50: 73 73 20 2a 2f 0a 20 20 20 20 2f 2a 20 73 74 61  ss */.    /* sta
2d60: 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20  tePtr->flags |= 
2d70: 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42 41 43 4b  TLS_TCL_CALLBACK
2d80: 3b 20 2a 2f 0a 0a 20 20 20 20 64 70 72 69 6e 74  ; */..    dprint
2d90: 66 28 22 56 65 72 69 66 79 43 61 6c 6c 62 61 63  f("VerifyCallbac
2da0: 6b 3a 20 65 76 61 6c 20 63 61 6c 6c 62 61 63 6b  k: eval callback
2db0: 22 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c  ");..    /* Eval
2dc0: 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e   callback comman
2dd0: 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63  d */.    Tcl_Inc
2de0: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72  rRefCount(cmdPtr
2df0: 29 3b 0a 20 20 20 20 6f 6b 20 3d 20 45 76 61 6c  );.    ok = Eval
2e00: 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c  Callback(interp,
2e10: 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74   statePtr, cmdPt
2e20: 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72  r);.    Tcl_Decr
2e30: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29  RefCount(cmdPtr)
2e40: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
2e50: 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b 3a 20  VerifyCallback: 
2e60: 63 6f 6d 6d 61 6e 64 20 72 65 73 75 6c 74 20 3d  command result =
2e70: 20 25 64 22 2c 20 6f 6b 29 3b 0a 0a 20 20 20 20   %d", ok);..    
2e80: 2f 2a 20 73 74 61 74 65 50 74 72 2d 3e 66 6c 61  /* statePtr->fla
2e90: 67 73 20 26 3d 20 7e 28 54 4c 53 5f 54 43 4c 5f  gs &= ~(TLS_TCL_
2ea0: 43 41 4c 4c 42 41 43 4b 29 3b 20 2a 2f 0a 20 20  CALLBACK); */.  
2eb0: 20 20 72 65 74 75 72 6e 20 6f 6b 3b 09 2f 2a 20    return ok;./* 
2ec0: 42 79 20 64 65 66 61 75 6c 74 2c 20 6c 65 61 76  By default, leav
2ed0: 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 75  e verification u
2ee0: 6e 63 68 61 6e 67 65 64 2e 20 2a 2f 0a 7d 0a 0c  nchanged. */.}..
2ef0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
2f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
2f40: 54 6c 73 5f 45 72 72 6f 72 20 2d 2d 0a 20 2a 0a  Tls_Error --. *.
2f50: 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63   *.Calls callbac
2f60: 6b 20 77 69 74 68 20 65 72 72 6f 72 20 6d 65 73  k with error mes
2f70: 73 61 67 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65  sage.. *. * Side
2f80: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 54 68 65   effects:. *.The
2f90: 20 65 72 72 20 66 69 65 6c 64 20 6f 66 20 74 68   err field of th
2fa0: 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 72  e currently oper
2fb0: 61 74 69 76 65 20 53 74 61 74 65 20 69 73 20 73  ative State is s
2fc0: 65 74 0a 20 2a 09 20 20 74 6f 20 61 20 73 74 72  et. *.  to a str
2fd0: 69 6e 67 20 64 65 73 63 72 69 62 69 6e 67 20 74  ing describing t
2fe0: 68 65 20 53 53 4c 20 6e 65 67 6f 74 69 61 74 69  he SSL negotiati
2ff0: 6f 6e 20 66 61 69 6c 75 72 65 20 72 65 61 73 6f  on failure reaso
3000: 6e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  n. *. *---------
3010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76  ----------. */.v
3050: 6f 69 64 0a 54 6c 73 5f 45 72 72 6f 72 28 53 74  oid.Tls_Error(St
3060: 61 74 65 20 2a 73 74 61 74 65 50 74 72 2c 20 63  ate *statePtr, c
3070: 6f 6e 73 74 20 63 68 61 72 20 2a 6d 73 67 29 20  onst char *msg) 
3080: 7b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70  {.    Tcl_Interp
3090: 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65   *interp.= state
30a0: 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20  Ptr->interp;.   
30b0: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72   Tcl_Obj *cmdPtr
30c0: 2c 20 2a 6c 69 73 74 50 74 72 3b 0a 20 20 20 20  , *listPtr;.    
30d0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 65 72  unsigned long er
30e0: 72 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d  r;.    statePtr-
30f0: 3e 65 72 72 20 3d 20 6d 73 67 3b 0a 0a 20 20 20  >err = msg;..   
3100: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
3110: 20 77 69 74 68 20 6d 65 73 73 61 67 65 20 25 73   with message %s
3120: 22 2c 20 6d 73 67 29 3b 0a 0a 20 20 20 20 69 66  ", msg);..    if
3130: 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c   (statePtr->call
3140: 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a  back == (Tcl_Obj
3150: 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  *)NULL) {..retur
3160: 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70  n;.    }..    dp
3170: 72 69 6e 74 66 28 22 54 6c 73 5f 45 72 72 6f 72  rintf("Tls_Error
3180: 3a 20 63 72 65 61 74 65 20 63 61 6c 6c 62 61 63  : create callbac
3190: 6b 20 63 6f 6d 6d 61 6e 64 22 29 3b 0a 0a 20 20  k command");..  
31a0: 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d    /* Create comm
31b0: 61 6e 64 20 74 6f 20 65 76 61 6c 20 77 69 74 68  and to eval with
31c0: 20 66 6e 2c 20 63 68 61 6e 2c 20 61 6e 64 20 6d   fn, chan, and m
31d0: 65 73 73 61 67 65 20 61 72 67 73 20 2a 2f 0a 20  essage args */. 
31e0: 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f     cmdPtr = Tcl_
31f0: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61  DuplicateObj(sta
3200: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29  tePtr->callback)
3210: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
3220: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
3230: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54  nterp, cmdPtr, T
3240: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
3250: 22 65 72 72 6f 72 22 2c 20 2d 31 29 29 3b 0a 20  "error", -1));. 
3260: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
3270: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
3280: 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20  rp, cmdPtr,..   
3290: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
32a0: 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  j(Tcl_GetChannel
32b0: 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73  Name(statePtr->s
32c0: 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20  elf), -1));.    
32d0: 69 66 20 28 6d 73 67 20 21 3d 20 4e 55 4c 4c 29  if (msg != NULL)
32e0: 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41   {..Tcl_ListObjA
32f0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
3300: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c  erp, cmdPtr, Tcl
3310: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d 73  _NewStringObj(ms
3320: 67 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 7d 20  g, -1));..    } 
3330: 65 6c 73 65 20 69 66 20 28 28 6d 73 67 20 3d 20  else if ((msg = 
3340: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 54 63  Tcl_GetString(Tc
3350: 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_GetObjResult(i
3360: 6e 74 65 72 70 29 29 29 20 21 3d 20 4e 55 4c 4c  nterp))) != NULL
3370: 29 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a  ) {..Tcl_ListObj
3380: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
3390: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
33a0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d  l_NewStringObj(m
33b0: 73 67 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 7d  sg, -1));..    }
33c0: 20 65 6c 73 65 20 7b 0a 09 6c 69 73 74 50 74 72   else {..listPtr
33d0: 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62   = Tcl_NewListOb
33e0: 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 09 77 68 69  j(0, NULL);..whi
33f0: 6c 65 20 28 28 65 72 72 20 3d 20 45 52 52 5f 67  le ((err = ERR_g
3400: 65 74 5f 65 72 72 6f 72 28 29 29 20 21 3d 20 30  et_error()) != 0
3410: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73  ) {..    Tcl_Lis
3420: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
3430: 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 50 74  t(interp, listPt
3440: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
3450: 4f 62 6a 28 45 52 52 5f 72 65 61 73 6f 6e 5f 65  Obj(ERR_reason_e
3460: 72 72 6f 72 5f 73 74 72 69 6e 67 28 65 72 72 29  rror_string(err)
3470: 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 54 63 6c 5f  , -1));..}..Tcl_
3480: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
3490: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
34a0: 50 74 72 2c 20 6c 69 73 74 50 74 72 29 3b 0a 20  Ptr, listPtr);. 
34b0: 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74     }..    dprint
34c0: 66 28 22 54 6c 73 5f 45 72 72 6f 72 3a 20 65 76  f("Tls_Error: ev
34d0: 61 6c 20 63 61 6c 6c 62 61 63 6b 22 29 3b 0a 0a  al callback");..
34e0: 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c      /* Eval call
34f0: 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  back command */.
3500: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
3510: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20  ount(cmdPtr);.  
3520: 20 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69    EvalCallback(i
3530: 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c  nterp, statePtr,
3540: 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63   cmdPtr);.    Tc
3550: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63  l_DecrRefCount(c
3560: 6d 64 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  mdPtr);.}.../*. 
3570: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
3580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35b0: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4b 65 79 4c 6f  ----. *. * KeyLo
35c0: 67 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a  gCallback --. *.
35d0: 20 2a 09 57 72 69 74 65 20 72 65 63 65 69 76 65   *.Write receive
35e0: 64 20 6b 65 79 20 64 61 74 61 20 74 6f 20 6c 6f  d key data to lo
35f0: 67 20 66 69 6c 65 2e 0a 20 2a 0a 20 2a 20 53 69  g file.. *. * Si
3600: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 6e  de effects:. *.n
3610: 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  one. *. *-------
3620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
3660: 0a 76 6f 69 64 20 4b 65 79 4c 6f 67 43 61 6c 6c  .void KeyLogCall
3670: 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a  back(const SSL *
3680: 73 73 6c 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ssl, const char 
3690: 2a 6c 69 6e 65 29 20 7b 0a 20 20 20 20 63 68 61  *line) {.    cha
36a0: 72 20 2a 73 74 72 20 3d 20 67 65 74 65 6e 76 28  r *str = getenv(
36b0: 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 29 3b 0a  SSLKEYLOGFILE);.
36c0: 20 20 20 20 46 49 4c 45 20 2a 66 64 3b 0a 0a 20      FILE *fd;.. 
36d0: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
36e0: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73  ed");..    if (s
36f0: 74 72 29 20 7b 0a 09 66 64 20 3d 20 66 6f 70 65  tr) {..fd = fope
3700: 6e 28 73 74 72 2c 20 22 61 22 29 3b 0a 09 66 70  n(str, "a");..fp
3710: 72 69 6e 74 66 28 66 64 2c 20 22 25 73 5c 6e 22  rintf(fd, "%s\n"
3720: 2c 6c 69 6e 65 29 3b 0a 09 66 63 6c 6f 73 65 28  ,line);..fclose(
3730: 66 64 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0c 0a 2f  fd);.    }.}.../
3740: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
3750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3780: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 50 61  -------. *. * Pa
3790: 73 73 77 6f 72 64 20 43 61 6c 6c 62 61 63 6b 20  ssword Callback 
37a0: 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20  --. *. *.Called 
37b0: 77 68 65 6e 20 61 20 70 61 73 73 77 6f 72 64 20  when a password 
37c0: 69 73 20 6e 65 65 64 65 64 20 66 6f 72 20 61 20  is needed for a 
37d0: 70 72 69 76 61 74 65 20 6b 65 79 20 77 68 65 6e  private key when
37e0: 20 6c 6f 61 64 69 6e 67 0a 20 2a 09 6f 72 20 73   loading. *.or s
37f0: 74 6f 72 69 6e 67 20 61 20 50 45 4d 20 63 65 72  toring a PEM cer
3800: 74 69 66 69 63 61 74 65 20 77 69 74 68 20 65 6e  tificate with en
3810: 63 72 79 70 74 69 6f 6e 2e 20 45 76 61 6c 73 20  cryption. Evals 
3820: 63 61 6c 6c 62 61 63 6b 0a 20 2a 09 73 63 72 69  callback. *.scri
3830: 70 74 20 61 6e 64 20 72 65 74 75 72 6e 73 20 74  pt and returns t
3840: 68 65 20 72 65 73 75 6c 74 20 61 73 20 74 68 65  he result as the
3850: 20 70 61 73 73 77 6f 72 64 20 73 74 72 69 6e 67   password string
3860: 20 69 6e 20 62 75 66 2e 0a 20 2a 0a 20 2a 20 52   in buf.. *. * R
3870: 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a  esults:. *.None.
3880: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
3890: 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c  ts:. *.Calls cal
38a0: 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65  lback (if define
38b0: 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73  d). *. * Returns
38c0: 3a 0a 20 2a 09 50 61 73 73 77 6f 72 64 20 73 69  :. *.Password si
38d0: 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 72 20 2d  ze in bytes or -
38e0: 31 20 66 6f 72 20 61 6e 20 65 72 72 6f 72 2e 0a  1 for an error..
38f0: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
3900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3930: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61  --------. */.sta
3940: 74 69 63 20 69 6e 74 0a 50 61 73 73 77 6f 72 64  tic int.Password
3950: 43 61 6c 6c 62 61 63 6b 28 63 68 61 72 20 2a 62  Callback(char *b
3960: 75 66 2c 20 69 6e 74 20 73 69 7a 65 2c 20 69 6e  uf, int size, in
3970: 74 20 72 77 66 6c 61 67 2c 20 76 6f 69 64 20 2a  t rwflag, void *
3980: 75 64 61 74 61 29 20 7b 0a 20 20 20 20 53 74 61  udata) {.    Sta
3990: 74 65 20 2a 73 74 61 74 65 50 74 72 09 3d 20 28  te *statePtr.= (
39a0: 53 74 61 74 65 20 2a 29 20 75 64 61 74 61 3b 0a  State *) udata;.
39b0: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a      Tcl_Interp *
39c0: 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 74  interp.= statePt
39d0: 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54  r->interp;.    T
39e0: 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a  cl_Obj *cmdPtr;.
39f0: 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20      int code;.  
3a00: 20 20 54 63 6c 5f 53 69 7a 65 20 6c 65 6e 3b 0a    Tcl_Size len;.
3a10: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
3a20: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 20  lled");..    /* 
3a30: 49 66 20 6e 6f 20 63 61 6c 6c 62 61 63 6b 2c 20  If no callback, 
3a40: 75 73 65 20 64 65 66 61 75 6c 74 20 63 61 6c 6c  use default call
3a50: 62 61 63 6b 20 2a 2f 0a 20 20 20 20 69 66 20 28  back */.    if (
3a60: 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f  statePtr->passwo
3a70: 72 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69  rd == NULL) {..i
3a80: 66 20 28 54 63 6c 5f 45 76 61 6c 45 78 28 69 6e  f (Tcl_EvalEx(in
3a90: 74 65 72 70 2c 20 22 74 6c 73 3a 3a 70 61 73 73  terp, "tls::pass
3aa0: 77 6f 72 64 22 2c 20 2d 31 2c 20 54 43 4c 5f 45  word", -1, TCL_E
3ab0: 56 41 4c 5f 47 4c 4f 42 41 4c 29 20 3d 3d 20 54  VAL_GLOBAL) == T
3ac0: 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 63 68  CL_OK) {..    ch
3ad0: 61 72 20 2a 72 65 74 20 3d 20 28 63 68 61 72 20  ar *ret = (char 
3ae0: 2a 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  *) Tcl_GetString
3af0: 46 72 6f 6d 4f 62 6a 28 54 63 6c 5f 47 65 74 4f  FromObj(Tcl_GetO
3b00: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  bjResult(interp)
3b10: 2c 20 26 6c 65 6e 29 3b 0a 09 20 20 20 20 69 66  , &len);..    if
3b20: 20 28 6c 65 6e 20 3e 20 28 54 63 6c 5f 53 69 7a   (len > (Tcl_Siz
3b30: 65 29 20 73 69 7a 65 2d 31 29 20 7b 0a 09 09 6c  e) size-1) {...l
3b40: 65 6e 20 3d 20 28 54 63 6c 5f 53 69 7a 65 29 20  en = (Tcl_Size) 
3b50: 73 69 7a 65 2d 31 3b 0a 09 20 20 20 20 7d 0a 09  size-1;..    }..
3b60: 20 20 20 20 73 74 72 6e 63 70 79 28 62 75 66 2c      strncpy(buf,
3b70: 20 72 65 74 2c 20 28 73 69 7a 65 5f 74 29 20 6c   ret, (size_t) l
3b80: 65 6e 29 3b 0a 09 20 20 20 20 62 75 66 5b 6c 65  en);..    buf[le
3b90: 6e 5d 20 3d 20 27 5c 30 27 3b 0a 09 20 20 20 20  n] = '\0';..    
3ba0: 72 65 74 75 72 6e 20 28 69 6e 74 29 20 6c 65 6e  return (int) len
3bb0: 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20  ;..} else {..   
3bc0: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 09 7d 0a 20   return -1;..}. 
3bd0: 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74     }..    dprint
3be0: 66 28 22 50 61 73 73 77 6f 72 64 43 61 6c 6c 62  f("PasswordCallb
3bf0: 61 63 6b 3a 20 63 72 65 61 74 65 20 63 61 6c 6c  ack: create call
3c00: 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 22 29 3b 0a  back command");.
3c10: 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63  .    /* Create c
3c20: 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 77  ommand to eval w
3c30: 69 74 68 20 66 6e 2c 20 72 77 66 6c 61 67 2c 20  ith fn, rwflag, 
3c40: 61 6e 64 20 73 69 7a 65 20 61 72 67 73 20 2a 2f  and size args */
3c50: 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63  .    cmdPtr = Tc
3c60: 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73  l_DuplicateObj(s
3c70: 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72  tatePtr->passwor
3c80: 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  d);.    Tcl_List
3c90: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
3ca0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
3cb0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
3cc0: 6a 28 22 70 61 73 73 77 6f 72 64 22 2c 20 2d 31  j("password", -1
3cd0: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
3ce0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
3cf0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
3d00: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72   Tcl_NewIntObj(r
3d10: 77 66 6c 61 67 29 29 3b 0a 20 20 20 20 54 63 6c  wflag));.    Tcl
3d20: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
3d30: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
3d40: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  dPtr, Tcl_NewInt
3d50: 4f 62 6a 28 73 69 7a 65 29 29 3b 0a 0a 20 20 20  Obj(size));..   
3d60: 20 64 70 72 69 6e 74 66 28 22 50 61 73 73 77 6f   dprintf("Passwo
3d70: 72 64 43 61 6c 6c 62 61 63 6b 3a 20 65 76 61 6c  rdCallback: eval
3d80: 20 63 61 6c 6c 62 61 63 6b 22 29 3b 0a 0a 20 20   callback");..  
3d90: 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28    Tcl_Preserve((
3da0: 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74 65  ClientData) inte
3db0: 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 50 72 65  rp);.    Tcl_Pre
3dc0: 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74  serve((ClientDat
3dd0: 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a 0a 20  a) statePtr);.. 
3de0: 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62     /* Eval callb
3df0: 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  ack command */. 
3e00: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
3e10: 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20  unt(cmdPtr);.   
3e20: 20 63 6f 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c   code = Tcl_Eval
3e30: 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 63 6d  ObjEx(interp, cm
3e40: 64 50 74 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47  dPtr, TCL_EVAL_G
3e50: 4c 4f 42 41 4c 29 3b 0a 20 20 20 20 69 66 20 28  LOBAL);.    if (
3e60: 63 6f 64 65 20 21 3d 20 54 43 4c 5f 4f 4b 29 20  code != TCL_OK) 
3e70: 7b 0a 23 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52  {.#if (TCL_MAJOR
3e80: 5f 56 45 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26  _VERSION == 8) &
3e90: 26 20 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52  & (TCL_MINOR_VER
3ea0: 53 49 4f 4e 20 3c 20 36 29 0a 09 54 63 6c 5f 42  SION < 6)..Tcl_B
3eb0: 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 69  ackgroundError(i
3ec0: 6e 74 65 72 70 29 3b 0a 23 65 6c 73 65 0a 09 54  nterp);.#else..T
3ed0: 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 78 63  cl_BackgroundExc
3ee0: 65 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63  eption(interp, c
3ef0: 6f 64 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  ode);.#endif.   
3f00: 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52   }.    Tcl_DecrR
3f10: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b  efCount(cmdPtr);
3f20: 0a 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73  ..    Tcl_Releas
3f30: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73  e((ClientData) s
3f40: 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f  tatePtr);..    /
3f50: 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
3f60: 20 70 61 73 73 20 62 61 63 6b 20 70 61 73 73 77   pass back passw
3f70: 6f 72 64 20 73 74 72 69 6e 67 20 61 6e 64 20 74  ord string and t
3f80: 72 75 6e 63 61 74 65 20 69 66 20 74 6f 6f 20 6c  runcate if too l
3f90: 6f 6e 67 20 2a 2f 0a 20 20 20 20 69 66 20 28 63  ong */.    if (c
3fa0: 6f 64 65 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b  ode == TCL_OK) {
3fb0: 0a 09 63 68 61 72 20 2a 72 65 74 20 3d 20 28 63  ..char *ret = (c
3fc0: 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 53 74  har *) Tcl_GetSt
3fd0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 54 63 6c 5f  ringFromObj(Tcl_
3fe0: 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  GetObjResult(int
3ff0: 65 72 70 29 2c 20 26 6c 65 6e 29 3b 0a 09 69 66  erp), &len);..if
4000: 20 28 6c 65 6e 20 3e 20 28 54 63 6c 5f 53 69 7a   (len > (Tcl_Siz
4010: 65 29 20 73 69 7a 65 2d 31 29 20 7b 0a 09 20 20  e) size-1) {..  
4020: 20 20 6c 65 6e 20 3d 20 28 54 63 6c 5f 53 69 7a    len = (Tcl_Siz
4030: 65 29 20 73 69 7a 65 2d 31 3b 0a 09 7d 0a 09 73  e) size-1;..}..s
4040: 74 72 6e 63 70 79 28 62 75 66 2c 20 72 65 74 2c  trncpy(buf, ret,
4050: 20 28 73 69 7a 65 5f 74 29 20 6c 65 6e 29 3b 0a   (size_t) len);.
4060: 09 62 75 66 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27  .buf[len] = '\0'
4070: 3b 0a 09 54 63 6c 5f 52 65 6c 65 61 73 65 28 28  ;..Tcl_Release((
4080: 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74 65  ClientData) inte
4090: 72 70 29 3b 0a 09 72 65 74 75 72 6e 20 28 69 6e  rp);..return (in
40a0: 74 29 20 6c 65 6e 3b 0a 20 20 20 20 7d 0a 20 20  t) len;.    }.  
40b0: 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43    Tcl_Release((C
40c0: 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74 65 72  lientData) inter
40d0: 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d  p);.    return -
40e0: 31 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  1;.}.../*. *----
40f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
4130: 20 2a 0a 20 2a 20 53 65 73 73 69 6f 6e 20 43 61   *. * Session Ca
4140: 6c 6c 62 61 63 6b 20 66 6f 72 20 43 6c 69 65 6e  llback for Clien
4150: 74 73 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c  ts --. *. *.Call
4160: 65 64 20 77 68 65 6e 20 61 20 6e 65 77 20 73 65  ed when a new se
4170: 73 73 69 6f 6e 20 69 73 20 61 64 64 65 64 20 74  ssion is added t
4180: 6f 20 74 68 65 20 63 61 63 68 65 2e 20 49 6e 20  o the cache. In 
4190: 54 4c 53 20 31 2e 33 0a 20 2a 09 74 68 69 73 20  TLS 1.3. *.this 
41a0: 6d 61 79 20 62 65 20 72 65 63 65 69 76 65 64 20  may be received 
41b0: 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20 61  multiple times a
41c0: 66 74 65 72 20 74 68 65 20 68 61 6e 64 73 68 61  fter the handsha
41d0: 6b 65 2e 20 46 6f 72 0a 20 2a 09 65 61 72 6c 69  ke. For. *.earli
41e0: 65 72 20 76 65 72 73 69 6f 6e 73 2c 20 74 68 69  er versions, thi
41f0: 73 20 77 69 6c 6c 20 62 65 20 72 65 63 65 69 76  s will be receiv
4200: 65 64 20 64 75 72 69 6e 67 20 74 68 65 20 68 61  ed during the ha
4210: 6e 64 73 68 61 6b 65 2e 0a 20 2a 09 54 68 69 73  ndshake.. *.This
4220: 20 69 73 20 74 68 65 20 70 72 65 66 65 72 72 65   is the preferre
4230: 64 20 77 61 79 20 74 6f 20 6f 62 74 61 69 6e 20  d way to obtain 
4240: 61 20 72 65 73 75 6d 61 62 6c 65 20 73 65 73 73  a resumable sess
4250: 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  ion.. *. * Resul
4260: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20  ts:. *.None. *. 
4270: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
4280: 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63   *.Calls callbac
4290: 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20  k (if defined). 
42a0: 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 65  *. * Return code
42b0: 73 3a 0a 20 2a 09 30 20 3d 20 65 72 72 6f 72 20  s:. *.0 = error 
42c0: 77 68 65 72 65 20 73 65 73 73 69 6f 6e 20 77 69  where session wi
42d0: 6c 6c 20 62 65 20 69 6d 6d 65 64 69 61 74 65 6c  ll be immediatel
42e0: 79 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74  y removed from t
42f0: 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 61 63 68  he internal cach
4300: 65 2e 0a 20 2a 09 31 20 3d 20 73 75 63 63 65 73  e.. *.1 = succes
4310: 73 20 77 68 65 72 65 20 61 70 70 20 72 65 74 61  s where app reta
4320: 69 6e 73 20 73 65 73 73 69 6f 6e 20 69 6e 20 73  ins session in s
4330: 65 73 73 69 6f 6e 20 63 61 63 68 65 2c 20 61 6e  ession cache, an
4340: 64 20 6d 75 73 74 20 63 61 6c 6c 20 53 53 4c 5f  d must call SSL_
4350: 53 45 53 53 49 4f 4e 5f 66 72 65 65 28 29 20 77  SESSION_free() w
4360: 68 65 6e 20 64 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d  hen done.. *. *-
4370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
43a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
43b0: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  --. */.static in
43c0: 74 0a 53 65 73 73 69 6f 6e 43 61 6c 6c 62 61 63  t.SessionCallbac
43d0: 6b 28 53 53 4c 20 2a 73 73 6c 2c 20 53 53 4c 5f  k(SSL *ssl, SSL_
43e0: 53 45 53 53 49 4f 4e 20 2a 73 65 73 73 69 6f 6e  SESSION *session
43f0: 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73  ) {.    State *s
4400: 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65  tatePtr = (State
4410: 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70 5f 64 61  *)SSL_get_app_da
4420: 74 61 28 28 53 53 4c 20 2a 29 73 73 6c 29 3b 0a  ta((SSL *)ssl);.
4430: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a      Tcl_Interp *
4440: 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 74  interp.= statePt
4450: 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54  r->interp;.    T
4460: 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a  cl_Obj *cmdPtr;.
4470: 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e      const unsign
4480: 65 64 20 63 68 61 72 20 2a 74 69 63 6b 65 74 3b  ed char *ticket;
4490: 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  .    const unsig
44a0: 6e 65 64 20 63 68 61 72 20 2a 73 65 73 73 69 6f  ned char *sessio
44b0: 6e 5f 69 64 3b 0a 20 20 20 20 73 69 7a 65 5f 74  n_id;.    size_t
44c0: 20 6c 65 6e 32 3b 0a 20 20 20 20 75 6e 73 69 67   len2;.    unsig
44d0: 6e 65 64 20 69 6e 74 20 75 6c 65 6e 3b 0a 0a 20  ned int ulen;.. 
44e0: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
44f0: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73  ed");..    if (s
4500: 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63  tatePtr->callbac
4510: 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e  k == (Tcl_Obj*)N
4520: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53  ULL) {..return S
4530: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b  SL_TLSEXT_ERR_OK
4540: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ;.    } else if 
4550: 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  (ssl == NULL) {.
4560: 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45  .return SSL_TLSE
4570: 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20  XT_ERR_NOACK;.  
4580: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61    }..    /* Crea
4590: 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76  te command to ev
45a0: 61 6c 20 77 69 74 68 20 66 6e 2c 20 63 68 61 6e  al with fn, chan
45b0: 2c 20 73 65 73 73 69 6f 6e 20 69 64 2c 20 73 65  , session id, se
45c0: 73 73 69 6f 6e 20 74 69 63 6b 65 74 2c 20 61 6e  ssion ticket, an
45d0: 64 20 6c 69 66 65 74 69 6d 65 20 61 72 67 73 20  d lifetime args 
45e0: 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20  */.    cmdPtr = 
45f0: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a  Tcl_DuplicateObj
4600: 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62  (statePtr->callb
4610: 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  ack);.    Tcl_Li
4620: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
4630: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
4640: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
4650: 4f 62 6a 28 22 73 65 73 73 69 6f 6e 22 2c 20 2d  Obj("session", -
4660: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1));.    Tcl_Lis
4670: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
4680: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
4690: 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74  ,..    Tcl_NewSt
46a0: 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43  ringObj(Tcl_GetC
46b0: 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65  hannelName(state
46c0: 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29  Ptr->self), -1))
46d0: 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 73 73 69 6f  ;..    /* Sessio
46e0: 6e 20 69 64 20 2a 2f 0a 20 20 20 20 73 65 73 73  n id */.    sess
46f0: 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53  ion_id = SSL_SES
4700: 53 49 4f 4e 5f 67 65 74 5f 69 64 28 73 65 73 73  SION_get_id(sess
4710: 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a 20 20 20  ion, &ulen);.   
4720: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
4730: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
4740: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
4750: 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 73 65  wByteArrayObj(se
4760: 73 73 69 6f 6e 5f 69 64 2c 20 28 54 63 6c 5f 53  ssion_id, (Tcl_S
4770: 69 7a 65 29 20 75 6c 65 6e 29 29 3b 0a 0a 20 20  ize) ulen));..  
4780: 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69 63    /* Session tic
4790: 6b 65 74 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 53  ket */.    SSL_S
47a0: 45 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63 6b  ESSION_get0_tick
47b0: 65 74 28 73 65 73 73 69 6f 6e 2c 20 26 74 69 63  et(session, &tic
47c0: 6b 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 20 20 20  ket, &len2);.   
47d0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
47e0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
47f0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
4800: 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 74 69  wByteArrayObj(ti
4810: 63 6b 65 74 2c 20 28 54 63 6c 5f 53 69 7a 65 29  cket, (Tcl_Size)
4820: 20 6c 65 6e 32 29 29 3b 0a 0a 20 20 20 20 2f 2a   len2));..    /*
4830: 20 4c 69 66 65 74 69 6d 65 20 2d 20 6e 75 6d 62   Lifetime - numb
4840: 65 72 20 6f 66 20 73 65 63 6f 6e 64 73 20 2a 2f  er of seconds */
4850: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
4860: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
4870: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 54  terp, cmdPtr,..T
4880: 63 6c 5f 4e 65 77 4c 6f 6e 67 4f 62 6a 28 28 6c  cl_NewLongObj((l
4890: 6f 6e 67 29 20 53 53 4c 5f 53 45 53 53 49 4f 4e  ong) SSL_SESSION
48a0: 5f 67 65 74 5f 74 69 63 6b 65 74 5f 6c 69 66 65  _get_ticket_life
48b0: 74 69 6d 65 5f 68 69 6e 74 28 73 65 73 73 69 6f  time_hint(sessio
48c0: 6e 29 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76  n)));..    /* Ev
48d0: 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d  al callback comm
48e0: 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49  and */.    Tcl_I
48f0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50  ncrRefCount(cmdP
4900: 74 72 29 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c  tr);.    EvalCal
4910: 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74  lback(interp, st
4920: 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b  atePtr, cmdPtr);
4930: 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66  .    Tcl_DecrRef
4940: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a  Count(cmdPtr);..
4950: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 30 20      /* Return 0 
4960: 66 6f 72 20 6e 6f 77 20 75 6e 74 69 6c 20 73 65  for now until se
4970: 73 73 69 6f 6e 20 68 61 6e 64 6c 69 6e 67 20 69  ssion handling i
4980: 73 20 63 6f 6d 70 6c 65 74 65 20 2a 2f 0a 20 20  s complete */.  
4990: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0c 0a    return 0;.}...
49a0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
49b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
49c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
49d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
49e0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 41  --------. *. * A
49f0: 4c 50 4e 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72  LPN Callback for
4a00: 20 53 65 72 76 65 72 73 20 61 6e 64 20 4e 50 4e   Servers and NPN
4a10: 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 43 6c   Callback for Cl
4a20: 69 65 6e 74 73 20 2d 2d 0a 20 2a 0a 20 2a 09 50  ients --. *. *.P
4a30: 65 72 66 6f 72 6d 20 70 72 6f 74 6f 63 6f 6c 20  erform protocol 
4a40: 28 68 74 74 70 2f 31 2e 31 2c 20 68 32 2c 20 68  (http/1.1, h2, h
4a50: 33 2c 20 65 74 63 2e 29 20 73 65 6c 65 63 74 69  3, etc.) selecti
4a60: 6f 6e 20 66 6f 72 20 74 68 65 0a 20 2a 09 69 6e  on for the. *.in
4a70: 63 6f 6d 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f  coming connectio
4a80: 6e 2e 20 43 61 6c 6c 65 64 20 61 66 74 65 72 20  n. Called after 
4a90: 48 65 6c 6c 6f 20 61 6e 64 20 73 65 72 76 65 72  Hello and server
4aa0: 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 2a 09 57   callbacks.. *.W
4ab0: 68 65 72 65 20 27 6f 75 74 27 20 69 73 20 73 65  here 'out' is se
4ac0: 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20  lected protocol 
4ad0: 61 6e 64 20 27 69 6e 27 20 69 73 20 74 68 65 20  and 'in' is the 
4ae0: 70 65 65 72 20 61 64 76 65 72 74 69 73 65 64 20  peer advertised 
4af0: 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  list.. *. * Resu
4b00: 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a  lts:. *.None. *.
4b10: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
4b20: 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61  . *.Calls callba
4b30: 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a  ck (if defined).
4b40: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64   *. * Return cod
4b50: 65 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58  es:. *.SSL_TLSEX
4b60: 54 5f 45 52 52 5f 4f 4b 3a 20 41 4c 50 4e 20 70  T_ERR_OK: ALPN p
4b70: 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64  rotocol selected
4b80: 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  . The connection
4b90: 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53   continues.. *.S
4ba0: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c  SL_TLSEXT_ERR_AL
4bb0: 45 52 54 5f 46 41 54 41 4c 3a 20 54 68 65 72 65  ERT_FATAL: There
4bc0: 20 77 61 73 20 6e 6f 20 6f 76 65 72 6c 61 70 20   was no overlap 
4bd0: 62 65 74 77 65 65 6e 20 74 68 65 20 63 6c 69 65  between the clie
4be0: 6e 74 27 73 0a 20 2a 09 20 20 20 20 73 75 70 70  nt's. *.    supp
4bf0: 6c 69 65 64 20 6c 69 73 74 20 61 6e 64 20 74 68  lied list and th
4c00: 65 20 73 65 72 76 65 72 20 63 6f 6e 66 69 67 75  e server configu
4c10: 72 61 74 69 6f 6e 2e 20 54 68 65 20 63 6f 6e 6e  ration. The conn
4c20: 65 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 61  ection will be a
4c30: 62 6f 72 74 65 64 2e 0a 20 2a 09 53 53 4c 5f 54  borted.. *.SSL_T
4c40: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a  LSEXT_ERR_NOACK:
4c50: 20 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e   ALPN protocol n
4c60: 6f 74 20 73 65 6c 65 63 74 65 64 2c 20 65 2e 67  ot selected, e.g
4c70: 2e 2c 20 62 65 63 61 75 73 65 20 6e 6f 20 41 4c  ., because no AL
4c80: 50 4e 0a 20 2a 09 20 20 20 20 70 72 6f 74 6f 63  PN. *.    protoc
4c90: 6f 6c 73 20 61 72 65 20 63 6f 6e 66 69 67 75 72  ols are configur
4ca0: 65 64 20 66 6f 72 20 74 68 69 73 20 63 6f 6e 6e  ed for this conn
4cb0: 65 63 74 69 6f 6e 2e 20 54 68 65 20 63 6f 6e 6e  ection. The conn
4cc0: 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73  ection continues
4cd0: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  .. *. *---------
4ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73  ----------. */.s
4d20: 74 61 74 69 63 20 69 6e 74 0a 41 4c 50 4e 43 61  tatic int.ALPNCa
4d30: 6c 6c 62 61 63 6b 28 53 53 4c 20 2a 73 73 6c 2c  llback(SSL *ssl,
4d40: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
4d50: 63 68 61 72 20 2a 2a 6f 75 74 2c 20 75 6e 73 69  char **out, unsi
4d60: 67 6e 65 64 20 63 68 61 72 20 2a 6f 75 74 6c 65  gned char *outle
4d70: 6e 2c 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e  n,..const unsign
4d80: 65 64 20 63 68 61 72 20 2a 69 6e 2c 20 75 6e 73  ed char *in, uns
4d90: 69 67 6e 65 64 20 69 6e 74 20 69 6e 6c 65 6e 2c  igned int inlen,
4da0: 20 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a 20 20   void *arg) {.  
4db0: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74    State *statePt
4dc0: 72 20 3d 20 28 53 74 61 74 65 2a 29 61 72 67 3b  r = (State*)arg;
4dd0: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  .    Tcl_Interp 
4de0: 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50  *interp.= stateP
4df0: 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20  tr->interp;.    
4e00: 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b  Tcl_Obj *cmdPtr;
4e10: 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 2c 20 72  .    int code, r
4e20: 65 73 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66  es;..    dprintf
4e30: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20  ("Called");..   
4e40: 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c   if (ssl == NULL
4e50: 20 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 4c 4c 29   || arg == NULL)
4e60: 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54   {..return SSL_T
4e70: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b  LSEXT_ERR_NOACK;
4e80: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  .    }..    /* S
4e90: 65 6c 65 63 74 20 70 72 6f 74 6f 63 6f 6c 20 2a  elect protocol *
4ea0: 2f 0a 20 20 20 20 69 66 20 28 53 53 4c 5f 73 65  /.    if (SSL_se
4eb0: 6c 65 63 74 5f 6e 65 78 74 5f 70 72 6f 74 6f 28  lect_next_proto(
4ec0: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
4ed0: 2a 29 20 6f 75 74 2c 20 6f 75 74 6c 65 6e 2c 20  *) out, outlen, 
4ee0: 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73  statePtr->protos
4ef0: 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74  , statePtr->prot
4f00: 6f 73 5f 6c 65 6e 2c 0a 09 69 6e 2c 20 69 6e 6c  os_len,..in, inl
4f10: 65 6e 29 20 3d 3d 20 4f 50 45 4e 53 53 4c 5f 4e  en) == OPENSSL_N
4f20: 50 4e 5f 4e 45 47 4f 54 49 41 54 45 44 29 20 7b  PN_NEGOTIATED) {
4f30: 0a 09 2f 2a 20 4d 61 74 63 68 20 66 6f 75 6e 64  ../* Match found
4f40: 20 2a 2f 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54   */..res = SSL_T
4f50: 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20  LSEXT_ERR_OK;.  
4f60: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 4f    } else {../* O
4f70: 50 45 4e 53 53 4c 5f 4e 50 4e 5f 4e 4f 5f 4f 56  PENSSL_NPN_NO_OV
4f80: 45 52 4c 41 50 20 3d 20 4e 6f 20 6f 76 65 72 6c  ERLAP = No overl
4f90: 61 70 2c 20 73 6f 20 75 73 65 20 66 69 72 73 74  ap, so use first
4fa0: 20 69 74 65 6d 20 66 72 6f 6d 20 63 6c 69 65 6e   item from clien
4fb0: 74 20 70 72 6f 74 6f 63 6f 6c 20 6c 69 73 74 20  t protocol list 
4fc0: 2a 2f 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c  */..res = SSL_TL
4fd0: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a  SEXT_ERR_NOACK;.
4fe0: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73      }..    if (s
4ff0: 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 3d  tatePtr->vcmd ==
5000: 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29   (Tcl_Obj*)NULL)
5010: 20 7b 0a 09 72 65 74 75 72 6e 20 72 65 73 3b 0a   {..return res;.
5020: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72      }..    /* Cr
5030: 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20  eate command to 
5040: 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 63 68  eval with fn, ch
5050: 61 6e 2c 20 64 65 70 74 68 2c 20 63 65 72 74 20  an, depth, cert 
5060: 69 6e 66 6f 20 6c 69 73 74 2c 20 73 74 61 74 75  info list, statu
5070: 73 2c 20 61 6e 64 20 65 72 72 6f 72 20 61 72 67  s, and error arg
5080: 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20  s */.    cmdPtr 
5090: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f  = Tcl_DuplicateO
50a0: 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d  bj(statePtr->vcm
50b0: 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  d);.    Tcl_List
50c0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
50d0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
50e0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
50f0: 6a 28 22 61 6c 70 6e 22 2c 20 2d 31 29 29 3b 0a  j("alpn", -1));.
5100: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
5110: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
5120: 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20  erp, cmdPtr,..  
5130: 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f    Tcl_NewStringO
5140: 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  bj(Tcl_GetChanne
5150: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e  lName(statePtr->
5160: 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20  self), -1));.   
5170: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
5180: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
5190: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
51a0: 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 6f 6e 73  wStringObj((cons
51b0: 74 20 63 68 61 72 20 2a 29 20 2a 6f 75 74 2c 20  t char *) *out, 
51c0: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  -1));.    Tcl_Li
51d0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
51e0: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
51f0: 72 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61  r, Tcl_NewBoolea
5200: 6e 4f 62 6a 28 72 65 73 20 3d 3d 20 53 53 4c 5f  nObj(res == SSL_
5210: 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 29 29 3b  TLSEXT_ERR_OK));
5220: 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61  ..    /* Eval ca
5230: 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a  llback command *
5240: 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  /.    Tcl_IncrRe
5250: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a  fCount(cmdPtr);.
5260: 20 20 20 20 69 66 20 28 28 63 6f 64 65 20 3d 20      if ((code = 
5270: 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74  EvalCallback(int
5280: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63  erp, statePtr, c
5290: 6d 64 50 74 72 29 29 20 3e 20 31 29 20 7b 0a 09  mdPtr)) > 1) {..
52a0: 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54  res = SSL_TLSEXT
52b0: 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20  _ERR_NOACK;.    
52c0: 7d 20 65 6c 73 65 20 69 66 20 28 63 6f 64 65 20  } else if (code 
52d0: 3d 3d 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53  == 1) {..res = S
52e0: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b  SL_TLSEXT_ERR_OK
52f0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
5300: 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54  res = SSL_TLSEXT
5310: 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 54 41 4c  _ERR_ALERT_FATAL
5320: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f  ;.    }.    Tcl_
5330: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64  DecrRefCount(cmd
5340: 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Ptr);.    return
5350: 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d   res;.}.../*. *-
5360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
53a0: 2d 2d 0a 20 2a 0a 20 2a 20 41 64 76 65 72 74 69  --. *. * Adverti
53b0: 73 65 20 50 72 6f 74 6f 63 6f 6c 73 20 43 61 6c  se Protocols Cal
53c0: 6c 62 61 63 6b 20 66 6f 72 20 4e 65 78 74 20 50  lback for Next P
53d0: 72 6f 74 6f 63 6f 6c 20 4e 65 67 6f 74 69 61 74  rotocol Negotiat
53e0: 69 6f 6e 20 28 4e 50 4e 29 20 69 6e 20 53 65 72  ion (NPN) in Ser
53f0: 76 65 72 48 65 6c 6c 6f 20 2d 2d 0a 20 2a 0a 20  verHello --. *. 
5400: 2a 09 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20  *.called when a 
5410: 54 4c 53 20 73 65 72 76 65 72 20 6e 65 65 64 73  TLS server needs
5420: 20 61 20 6c 69 73 74 20 6f 66 20 73 75 70 70 6f   a list of suppo
5430: 72 74 65 64 20 70 72 6f 74 6f 63 6f 6c 73 20 66  rted protocols f
5440: 6f 72 20 4e 65 78 74 0a 20 2a 09 50 72 6f 74 6f  or Next. *.Proto
5450: 63 6f 6c 20 4e 65 67 6f 74 69 61 74 69 6f 6e 2e  col Negotiation.
5460: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
5470: 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69   *.None. *. * Si
5480: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 0a 20  de effects:. *. 
5490: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a  * Return codes:.
54a0: 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52   *.SSL_TLSEXT_ER
54b0: 52 5f 4f 4b 3a 20 4e 50 4e 20 70 72 6f 74 6f 63  R_OK: NPN protoc
54c0: 6f 6c 20 73 65 6c 65 63 74 65 64 2e 20 54 68 65  ol selected. The
54d0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74   connection cont
54e0: 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c  inues.. *.SSL_TL
54f0: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20  SEXT_ERR_NOACK: 
5500: 4e 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74  NPN protocol not
5510: 20 73 65 6c 65 63 74 65 64 2e 20 54 68 65 20 63   selected. The c
5520: 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e  onnection contin
5530: 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  ues.. *. *------
5540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
5580: 2f 0a 23 69 66 64 65 66 20 55 53 45 5f 4e 50 4e  /.#ifdef USE_NPN
5590: 0a 73 74 61 74 69 63 20 69 6e 74 0a 4e 50 4e 43  .static int.NPNC
55a0: 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53  allback(const SS
55b0: 4c 20 2a 73 73 6c 2c 20 63 6f 6e 73 74 20 75 6e  L *ssl, const un
55c0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 2a 6f 75  signed char **ou
55d0: 74 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  t, unsigned int 
55e0: 2a 6f 75 74 6c 65 6e 2c 20 76 6f 69 64 20 2a 61  *outlen, void *a
55f0: 72 67 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20  rg) {.    State 
5600: 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61  *statePtr = (Sta
5610: 74 65 2a 29 61 72 67 3b 0a 0a 20 20 20 20 64 70  te*)arg;..    dp
5620: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
5630: 0a 0a 20 20 20 20 69 66 20 28 73 73 6c 20 3d 3d  ..    if (ssl ==
5640: 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d 20   NULL || arg == 
5650: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20  NULL) {..return 
5660: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e  SSL_TLSEXT_ERR_N
5670: 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  OACK;.    }..   
5680: 20 2f 2a 20 53 65 74 20 70 72 6f 74 6f 63 6f 6c   /* Set protocol
5690: 73 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20 69 66  s list */.    if
56a0: 20 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74   (statePtr->prot
56b0: 6f 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 2a  os != NULL) {..*
56c0: 6f 75 74 20 3d 20 73 74 61 74 65 50 74 72 2d 3e  out = statePtr->
56d0: 70 72 6f 74 6f 73 3b 0a 09 2a 6f 75 74 6c 65 6e  protos;..*outlen
56e0: 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f   = statePtr->pro
56f0: 74 6f 73 5f 6c 65 6e 3b 0a 20 20 20 20 7d 20 65  tos_len;.    } e
5700: 6c 73 65 20 7b 0a 09 2a 6f 75 74 20 3d 20 4e 55  lse {..*out = NU
5710: 4c 4c 3b 0a 09 2a 6f 75 74 6c 65 6e 20 3d 20 30  LL;..*outlen = 0
5720: 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c  ;..return SSL_TL
5730: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a  SEXT_ERR_NOACK;.
5740: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
5750: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f   SSL_TLSEXT_ERR_
5760: 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0c 0a 2f  OK;.}.#endif.../
5770: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
5780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
57a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
57b0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 4e  -------. *. * SN
57c0: 49 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 53  I Callback for S
57d0: 65 72 76 65 72 73 20 2d 2d 0a 20 2a 0a 20 2a 09  ervers --. *. *.
57e0: 50 65 72 66 6f 72 6d 20 73 65 72 76 65 72 2d 73  Perform server-s
57f0: 69 64 65 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65  ide SNI hostname
5800: 20 73 65 6c 65 63 74 69 6f 6e 20 61 66 74 65 72   selection after
5810: 20 72 65 63 65 69 76 69 6e 67 20 53 4e 49 20 65   receiving SNI e
5820: 78 74 65 6e 73 69 6f 6e 0a 20 2a 09 69 6e 20 43  xtension. *.in C
5830: 6c 69 65 6e 74 20 48 65 6c 6c 6f 2e 20 43 61 6c  lient Hello. Cal
5840: 6c 65 64 20 61 66 74 65 72 20 68 65 6c 6c 6f 20  led after hello 
5850: 63 61 6c 6c 62 61 63 6b 20 62 75 74 20 62 65 66  callback but bef
5860: 6f 72 65 20 41 4c 50 4e 20 63 61 6c 6c 62 61 63  ore ALPN callbac
5870: 6b 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  k.. *. * Results
5880: 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20  :. *.None. *. * 
5890: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
58a0: 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20  .Calls callback 
58b0: 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a  (if defined). *.
58c0: 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a   * Return codes:
58d0: 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45  . *.SSL_TLSEXT_E
58e0: 52 52 5f 4f 4b 3a 20 53 4e 49 20 68 6f 73 74 6e  RR_OK: SNI hostn
58f0: 61 6d 65 20 69 73 20 61 63 63 65 70 74 65 64 2e  ame is accepted.
5900: 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   The connection 
5910: 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53  continues.. *.SS
5920: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45  L_TLSEXT_ERR_ALE
5930: 52 54 5f 46 41 54 41 4c 3a 20 53 4e 49 20 68 6f  RT_FATAL: SNI ho
5940: 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74 20 61 63  stname is not ac
5950: 63 65 70 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e  cepted. The conn
5960: 65 63 74 69 6f 6e 0a 20 2a 09 20 20 20 20 69 73  ection. *.    is
5970: 20 61 62 6f 72 74 65 64 2e 20 44 65 66 61 75 6c   aborted. Defaul
5980: 74 20 66 6f 72 20 61 6c 65 72 74 20 69 73 20 53  t for alert is S
5990: 53 4c 5f 41 44 5f 55 4e 52 45 43 4f 47 4e 49 5a  SL_AD_UNRECOGNIZ
59a0: 45 44 5f 4e 41 4d 45 2e 0a 20 2a 09 53 53 4c 5f  ED_NAME.. *.SSL_
59b0: 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54  TLSEXT_ERR_ALERT
59c0: 5f 57 41 52 4e 49 4e 47 3a 20 53 4e 49 20 68 6f  _WARNING: SNI ho
59d0: 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74 20 61 63  stname is not ac
59e0: 63 65 70 74 65 64 2c 20 77 61 72 6e 69 6e 67 20  cepted, warning 
59f0: 61 6c 65 72 74 0a 20 2a 09 20 20 20 20 73 65 6e  alert. *.    sen
5a00: 74 20 28 6e 6f 74 20 73 75 70 70 6f 72 74 65 64  t (not supported
5a10: 20 69 6e 20 54 4c 53 76 31 2e 33 29 2e 20 54 68   in TLSv1.3). Th
5a20: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e  e connection con
5a30: 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54  tinues.. *.SSL_T
5a40: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a  LSEXT_ERR_NOACK:
5a50: 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69 73   SNI hostname is
5a60: 20 6e 6f 74 20 61 63 63 65 70 74 65 64 20 61 6e   not accepted an
5a70: 64 20 6e 6f 74 20 61 63 6b 6e 6f 77 6c 65 64 67  d not acknowledg
5a80: 65 64 2c 0a 20 2a 09 20 20 20 20 65 2e 67 2e 20  ed,. *.    e.g. 
5a90: 69 66 20 53 4e 49 20 68 61 73 20 6e 6f 74 20 62  if SNI has not b
5aa0: 65 65 6e 20 63 6f 6e 66 69 67 75 72 65 64 2e 20  een configured. 
5ab0: 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63  The connection c
5ac0: 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 0a 20 2a 2d  ontinues.. *. *-
5ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5b10: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  --. */.static in
5b20: 74 0a 53 4e 49 43 61 6c 6c 62 61 63 6b 28 63 6f  t.SNICallback(co
5b30: 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 69 6e  nst SSL *ssl, in
5b40: 74 20 2a 61 6c 65 72 74 2c 20 76 6f 69 64 20 2a  t *alert, void *
5b50: 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61 74 65  arg) {.    State
5b60: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74   *statePtr = (St
5b70: 61 74 65 2a 29 61 72 67 3b 0a 20 20 20 20 54 63  ate*)arg;.    Tc
5b80: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
5b90: 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74  .= statePtr->int
5ba0: 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  erp;.    Tcl_Obj
5bb0: 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e   *cmdPtr;.    in
5bc0: 74 20 63 6f 64 65 2c 20 72 65 73 3b 0a 20 20 20  t code, res;.   
5bd0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 72   const char *ser
5be0: 76 65 72 6e 61 6d 65 20 3d 20 4e 55 4c 4c 3b 0a  vername = NULL;.
5bf0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
5c00: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20  lled");..    if 
5c10: 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20  (ssl == NULL || 
5c20: 61 72 67 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  arg == NULL) {..
5c30: 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58  return SSL_TLSEX
5c40: 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20  T_ERR_NOACK;.   
5c50: 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20   }..    /* Only 
5c60: 77 6f 72 6b 73 20 66 6f 72 20 54 4c 53 20 31 2e  works for TLS 1.
5c70: 32 20 61 6e 64 20 65 61 72 6c 69 65 72 20 2a 2f  2 and earlier */
5c80: 0a 20 20 20 20 73 65 72 76 65 72 6e 61 6d 65 20  .    servername 
5c90: 3d 20 53 53 4c 5f 67 65 74 5f 73 65 72 76 65 72  = SSL_get_server
5ca0: 6e 61 6d 65 28 73 73 6c 2c 20 54 4c 53 45 58 54  name(ssl, TLSEXT
5cb0: 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f 6e  _NAMETYPE_host_n
5cc0: 61 6d 65 29 3b 0a 20 20 20 20 69 66 20 28 21 73  ame);.    if (!s
5cd0: 65 72 76 65 72 6e 61 6d 65 20 7c 7c 20 73 65 72  ervername || ser
5ce0: 76 65 72 6e 61 6d 65 5b 30 5d 20 3d 3d 20 27 5c  vername[0] == '\
5cf0: 30 27 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53  0') {..return SS
5d00: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41  L_TLSEXT_ERR_NOA
5d10: 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  CK;.    }..    i
5d20: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d  f (statePtr->vcm
5d30: 64 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e  d == (Tcl_Obj*)N
5d40: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53  ULL) {..return S
5d50: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b  SL_TLSEXT_ERR_OK
5d60: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
5d70: 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74  Create command t
5d80: 6f 20 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20  o eval with fn, 
5d90: 63 68 61 6e 2c 20 61 6e 64 20 73 65 72 76 65 72  chan, and server
5da0: 20 6e 61 6d 65 20 61 72 67 73 20 2a 2f 0a 20 20   name args */.  
5db0: 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44    cmdPtr = Tcl_D
5dc0: 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74  uplicateObj(stat
5dd0: 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20  ePtr->vcmd);.   
5de0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
5df0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
5e00: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
5e10: 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 6e 69 22  wStringObj("sni"
5e20: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f  , -1));.    Tcl_
5e30: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
5e40: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
5e50: 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65  Ptr,..    Tcl_Ne
5e60: 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47  wStringObj(Tcl_G
5e70: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74  etChannelName(st
5e80: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d  atePtr->self), -
5e90: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1));.    Tcl_Lis
5ea0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
5eb0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
5ec0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
5ed0: 62 6a 28 73 65 72 76 65 72 6e 61 6d 65 20 2c 20  bj(servername , 
5ee0: 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76  -1));..    /* Ev
5ef0: 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d  al callback comm
5f00: 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49  and */.    Tcl_I
5f10: 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50  ncrRefCount(cmdP
5f20: 74 72 29 3b 0a 20 20 20 20 69 66 20 28 28 63 6f  tr);.    if ((co
5f30: 64 65 20 3d 20 45 76 61 6c 43 61 6c 6c 62 61 63  de = EvalCallbac
5f40: 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50  k(interp, stateP
5f50: 74 72 2c 20 63 6d 64 50 74 72 29 29 20 3e 20 31  tr, cmdPtr)) > 1
5f60: 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54  ) {..res = SSL_T
5f70: 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f  LSEXT_ERR_ALERT_
5f80: 57 41 52 4e 49 4e 47 3b 0a 09 2a 61 6c 65 72 74  WARNING;..*alert
5f90: 20 3d 20 53 53 4c 5f 41 44 5f 55 4e 52 45 43 4f   = SSL_AD_UNRECO
5fa0: 47 4e 49 5a 45 44 5f 4e 41 4d 45 3b 20 2f 2a 20  GNIZED_NAME; /* 
5fb0: 4e 6f 74 20 73 75 70 70 6f 72 74 65 64 20 62 79  Not supported by
5fc0: 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 20 20 20   TLS 1.3 */.    
5fd0: 7d 20 65 6c 73 65 20 69 66 20 28 63 6f 64 65 20  } else if (code 
5fe0: 3d 3d 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53  == 1) {..res = S
5ff0: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b  SL_TLSEXT_ERR_OK
6000: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
6010: 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54  res = SSL_TLSEXT
6020: 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 54 41 4c  _ERR_ALERT_FATAL
6030: 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f  ;..*alert = SSL_
6040: 41 44 5f 55 4e 52 45 43 4f 47 4e 49 5a 45 44 5f  AD_UNRECOGNIZED_
6050: 4e 41 4d 45 3b 20 2f 2a 20 4e 6f 74 20 73 75 70  NAME; /* Not sup
6060: 70 6f 72 74 65 64 20 62 79 20 54 4c 53 20 31 2e  ported by TLS 1.
6070: 33 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 54  3 */.    }.    T
6080: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
6090: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 65 74  cmdPtr);.    ret
60a0: 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 0a  urn res;.}.../*.
60b0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
60c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
60d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
60e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
60f0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 6c 69 65  -----. *. * Clie
6100: 6e 74 48 65 6c 6c 6f 20 48 61 6e 64 73 68 61 6b  ntHello Handshak
6110: 65 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 53  e Callback for S
6120: 65 72 76 65 72 73 20 2d 2d 0a 20 2a 0a 20 2a 09  ervers --. *. *.
6130: 55 73 65 64 20 62 79 20 73 65 72 76 65 72 20 74  Used by server t
6140: 6f 20 65 78 61 6d 69 6e 65 20 74 68 65 20 73 65  o examine the se
6150: 72 76 65 72 20 6e 61 6d 65 20 69 6e 64 69 63 61  rver name indica
6160: 74 69 6f 6e 20 28 53 4e 49 29 20 65 78 74 65 6e  tion (SNI) exten
6170: 73 69 6f 6e 0a 20 2a 09 70 72 6f 76 69 64 65 64  sion. *.provided
6180: 20 62 79 20 74 68 65 20 63 6c 69 65 6e 74 20 69   by the client i
6190: 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 6c 65 63  n order to selec
61a0: 74 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  t an appropriate
61b0: 20 63 65 72 74 69 66 69 63 61 74 65 20 74 6f 0a   certificate to.
61c0: 20 2a 09 70 72 65 73 65 6e 74 2c 20 61 6e 64 20   *.present, and 
61d0: 6d 61 6b 65 20 6f 74 68 65 72 20 63 6f 6e 66 69  make other confi
61e0: 67 75 72 61 74 69 6f 6e 20 61 64 6a 75 73 74 6d  guration adjustm
61f0: 65 6e 74 73 20 72 65 6c 65 76 61 6e 74 20 74 6f  ents relevant to
6200: 20 74 68 61 74 20 73 65 72 76 65 72 0a 20 2a 09   that server. *.
6210: 6e 61 6d 65 20 61 6e 64 20 69 74 73 20 63 6f 6e  name and its con
6220: 66 69 67 75 72 61 74 69 6f 6e 2e 20 54 68 69 73  figuration. This
6230: 20 69 6e 63 6c 75 64 65 73 20 73 77 61 70 70 69   includes swappi
6240: 6e 67 20 6f 75 74 20 74 68 65 20 61 73 73 6f 63  ng out the assoc
6250: 69 61 74 65 64 0a 20 2a 09 53 53 4c 5f 43 54 58  iated. *.SSL_CTX
6260: 20 70 6f 69 6e 74 65 72 2c 20 6d 6f 64 69 66 79   pointer, modify
6270: 69 6e 67 20 74 68 65 20 73 65 72 76 65 72 27 73  ing the server's
6280: 20 6c 69 73 74 20 6f 66 20 70 65 72 6d 69 74 74   list of permitt
6290: 65 64 20 54 4c 53 20 76 65 72 73 69 6f 6e 73 2c  ed TLS versions,
62a0: 0a 20 2a 09 63 68 61 6e 67 69 6e 67 20 74 68 65  . *.changing the
62b0: 20 73 65 72 76 65 72 27 73 20 63 69 70 68 65 72   server's cipher
62c0: 20 6c 69 73 74 20 69 6e 20 72 65 73 70 6f 6e 73   list in respons
62d0: 65 20 74 6f 20 74 68 65 20 63 6c 69 65 6e 74 27  e to the client'
62e0: 73 20 63 69 70 68 65 72 20 6c 69 73 74 2c 20 65  s cipher list, e
62f0: 74 63 2e 0a 20 2a 09 43 61 6c 6c 65 64 20 62 65  tc.. *.Called be
6300: 66 6f 72 65 20 53 4e 49 20 61 6e 64 20 41 4c 50  fore SNI and ALP
6310: 4e 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 2a 0a  N callbacks.. *.
6320: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e   * Results:. *.N
6330: 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  one. *. * Side e
6340: 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73  ffects:. *.Calls
6350: 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65   callback (if de
6360: 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74  fined). *. * Ret
6370: 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53  urn codes:. *.SS
6380: 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 52  L_CLIENT_HELLO_R
6390: 45 54 52 59 3a 20 73 75 73 70 65 6e 64 20 74 68  ETRY: suspend th
63a0: 65 20 68 61 6e 64 73 68 61 6b 65 2c 20 61 6e 64  e handshake, and
63b0: 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65 20 66   the handshake f
63c0: 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72 65 74  unction will ret
63d0: 75 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a  urn immediately.
63e0: 20 2a 09 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45   *.SSL_CLIENT_HE
63f0: 4c 4c 4f 5f 45 52 52 4f 52 3a 20 66 61 69 6c 75  LLO_ERROR: failu
6400: 72 65 2c 20 74 65 72 6d 69 6e 61 74 65 20 63 6f  re, terminate co
6410: 6e 6e 65 63 74 69 6f 6e 2e 20 53 65 74 20 61 6c  nnection. Set al
6420: 65 72 74 20 74 6f 20 65 72 72 6f 72 20 63 6f 64  ert to error cod
6430: 65 2e 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 4e 54  e.. *.SSL_CLIENT
6440: 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53 3a 20  _HELLO_SUCCESS: 
6450: 73 75 63 63 65 73 73 0a 20 2a 0a 20 2a 2d 2d 2d  success. *. *---
6460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
64a0: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a  . */.static int.
64b0: 48 65 6c 6c 6f 43 61 6c 6c 62 61 63 6b 28 53 53  HelloCallback(SS
64c0: 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 2a 61 6c 65  L *ssl, int *ale
64d0: 72 74 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b  rt, void *arg) {
64e0: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74  .    State *stat
64f0: 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61  ePtr = (State*)a
6500: 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65  rg;.    Tcl_Inte
6510: 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61  rp *interp.= sta
6520: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20  tePtr->interp;. 
6530: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50     Tcl_Obj *cmdP
6540: 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65  tr;.    int code
6550: 2c 20 72 65 73 3b 0a 20 20 20 20 63 6f 6e 73 74  , res;.    const
6560: 20 63 68 61 72 20 2a 73 65 72 76 65 72 6e 61 6d   char *servernam
6570: 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73  e;.    const uns
6580: 69 67 6e 65 64 20 63 68 61 72 20 2a 70 3b 0a 20  igned char *p;. 
6590: 20 20 20 73 69 7a 65 5f 74 20 6c 65 6e 2c 20 72     size_t len, r
65a0: 65 6d 61 69 6e 69 6e 67 3b 0a 0a 20 20 20 20 64  emaining;..    d
65b0: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
65c0: 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65  ;..    if (state
65d0: 50 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63  Ptr->vcmd == (Tc
65e0: 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09  l_Obj*)NULL) {..
65f0: 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e  return SSL_CLIEN
6600: 54 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53 3b  T_HELLO_SUCCESS;
6610: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
6620: 73 73 6c 20 3d 3d 20 28 63 6f 6e 73 74 20 53 53  ssl == (const SS
6630: 4c 20 2a 29 4e 55 4c 4c 20 7c 7c 20 61 72 67 20  L *)NULL || arg 
6640: 3d 3d 20 28 76 6f 69 64 20 2a 29 4e 55 4c 4c 29  == (void *)NULL)
6650: 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43   {..return SSL_C
6660: 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f  LIENT_HELLO_ERRO
6670: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  R;.    }..    /*
6680: 20 47 65 74 20 6e 61 6d 65 73 20 2a 2f 0a 20 20   Get names */.  
6690: 20 20 69 66 20 28 21 53 53 4c 5f 63 6c 69 65 6e    if (!SSL_clien
66a0: 74 5f 68 65 6c 6c 6f 5f 67 65 74 30 5f 65 78 74  t_hello_get0_ext
66b0: 28 73 73 6c 2c 20 54 4c 53 45 58 54 5f 54 59 50  (ssl, TLSEXT_TYP
66c0: 45 5f 73 65 72 76 65 72 5f 6e 61 6d 65 2c 20 26  E_server_name, &
66d0: 70 2c 20 26 72 65 6d 61 69 6e 69 6e 67 29 20 7c  p, &remaining) |
66e0: 7c 20 72 65 6d 61 69 6e 69 6e 67 20 3c 3d 20 32  | remaining <= 2
66f0: 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53  ) {..*alert = SS
6700: 4c 5f 52 5f 53 53 4c 56 33 5f 41 4c 45 52 54 5f  L_R_SSLV3_ALERT_
6710: 49 4c 4c 45 47 41 4c 5f 50 41 52 41 4d 45 54 45  ILLEGAL_PARAMETE
6720: 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43  R;..return SSL_C
6730: 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f  LIENT_HELLO_ERRO
6740: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  R;.    }..    /*
6750: 20 45 78 74 72 61 63 74 20 74 68 65 20 6c 65 6e   Extract the len
6760: 67 74 68 20 6f 66 20 74 68 65 20 73 75 70 70 6c  gth of the suppl
6770: 69 65 64 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65  ied list of name
6780: 73 2e 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20  s. */.    len = 
6790: 28 2a 28 70 2b 2b 29 20 3c 3c 20 38 29 3b 0a 20  (*(p++) << 8);. 
67a0: 20 20 20 6c 65 6e 20 2b 3d 20 2a 28 70 2b 2b 29     len += *(p++)
67b0: 3b 0a 20 20 20 20 69 66 20 28 6c 65 6e 20 2b 20  ;.    if (len + 
67c0: 32 20 21 3d 20 72 65 6d 61 69 6e 69 6e 67 29 20  2 != remaining) 
67d0: 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f  {..*alert = SSL_
67e0: 52 5f 53 53 4c 56 33 5f 41 4c 45 52 54 5f 49 4c  R_SSLV3_ALERT_IL
67f0: 4c 45 47 41 4c 5f 50 41 52 41 4d 45 54 45 52 3b  LEGAL_PARAMETER;
6800: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49  ..return SSL_CLI
6810: 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b  ENT_HELLO_ERROR;
6820: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 69  .    }.    remai
6830: 6e 69 6e 67 20 3d 20 6c 65 6e 3b 0a 0a 20 20 20  ning = len;..   
6840: 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 6e 20   /* The list in 
6850: 70 72 61 63 74 69 63 65 20 6f 6e 6c 79 20 68 61  practice only ha
6860: 73 20 61 20 73 69 6e 67 6c 65 20 65 6c 65 6d 65  s a single eleme
6870: 6e 74 2c 20 73 6f 20 77 65 20 6f 6e 6c 79 20 63  nt, so we only c
6880: 6f 6e 73 69 64 65 72 20 74 68 65 20 66 69 72 73  onsider the firs
6890: 74 20 6f 6e 65 2e 20 2a 2f 0a 20 20 20 20 69 66  t one. */.    if
68a0: 20 28 72 65 6d 61 69 6e 69 6e 67 20 3d 3d 20 30   (remaining == 0
68b0: 20 7c 7c 20 2a 70 2b 2b 20 21 3d 20 54 4c 53 45   || *p++ != TLSE
68c0: 58 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74  XT_NAMETYPE_host
68d0: 5f 6e 61 6d 65 29 20 7b 0a 09 2a 61 6c 65 72 74  _name) {..*alert
68e0: 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41   = SSL_R_TLSV1_A
68f0: 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52  LERT_INTERNAL_ER
6900: 52 4f 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c  ROR;..return SSL
6910: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52  _CLIENT_HELLO_ER
6920: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  ROR;.    }.    r
6930: 65 6d 61 69 6e 69 6e 67 2d 2d 3b 0a 0a 20 20 20  emaining--;..   
6940: 20 2f 2a 20 4e 6f 77 20 77 65 20 63 61 6e 20 66   /* Now we can f
6950: 69 6e 61 6c 6c 79 20 70 75 6c 6c 20 6f 75 74 20  inally pull out 
6960: 74 68 65 20 62 79 74 65 20 61 72 72 61 79 20 77  the byte array w
6970: 69 74 68 20 74 68 65 20 61 63 74 75 61 6c 20 68  ith the actual h
6980: 6f 73 74 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20  ostname. */.    
6990: 69 66 20 28 72 65 6d 61 69 6e 69 6e 67 20 3c 3d  if (remaining <=
69a0: 20 32 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20   2) {..*alert = 
69b0: 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52  SSL_R_TLSV1_ALER
69c0: 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52  T_INTERNAL_ERROR
69d0: 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c  ;..return SSL_CL
69e0: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52  IENT_HELLO_ERROR
69f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20  ;.    }.    len 
6a00: 3d 20 28 2a 28 70 2b 2b 29 20 3c 3c 20 38 29 3b  = (*(p++) << 8);
6a10: 0a 20 20 20 20 6c 65 6e 20 2b 3d 20 2a 28 70 2b  .    len += *(p+
6a20: 2b 29 3b 0a 20 20 20 20 69 66 20 28 6c 65 6e 20  +);.    if (len 
6a30: 2b 20 32 20 3e 20 72 65 6d 61 69 6e 69 6e 67 29  + 2 > remaining)
6a40: 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c   {..*alert = SSL
6a50: 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49  _R_TLSV1_ALERT_I
6a60: 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09  NTERNAL_ERROR;..
6a70: 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e  return SSL_CLIEN
6a80: 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20  T_HELLO_ERROR;. 
6a90: 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e 69     }.    remaini
6aa0: 6e 67 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 73 65  ng = len;.    se
6ab0: 72 76 65 72 6e 61 6d 65 20 3d 20 28 63 6f 6e 73  rvername = (cons
6ac0: 74 20 63 68 61 72 20 2a 29 70 3b 0a 0a 20 20 20  t char *)p;..   
6ad0: 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61   /* Create comma
6ae0: 6e 64 20 74 6f 20 65 76 61 6c 20 77 69 74 68 20  nd to eval with 
6af0: 66 6e 2c 20 63 68 61 6e 2c 20 61 6e 64 20 73 65  fn, chan, and se
6b00: 72 76 65 72 20 6e 61 6d 65 20 61 72 67 73 20 2a  rver name args *
6b10: 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54  /.    cmdPtr = T
6b20: 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28  cl_DuplicateObj(
6b30: 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b  statePtr->vcmd);
6b40: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
6b50: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
6b60: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
6b70: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
6b80: 68 65 6c 6c 6f 22 2c 20 2d 31 29 29 3b 0a 20 20  hello", -1));.  
6b90: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
6ba0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
6bb0: 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20  p, cmdPtr,..    
6bc0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
6bd0: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e  (Tcl_GetChannelN
6be0: 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65  ame(statePtr->se
6bf0: 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54  lf), -1));.    T
6c00: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
6c10: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
6c20: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  cmdPtr, Tcl_NewS
6c30: 74 72 69 6e 67 4f 62 6a 28 73 65 72 76 65 72 6e  tringObj(servern
6c40: 61 6d 65 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20  ame, (Tcl_Size) 
6c50: 6c 65 6e 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45  len));..    /* E
6c60: 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d  val callback com
6c70: 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f  mand */.    Tcl_
6c80: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64  IncrRefCount(cmd
6c90: 50 74 72 29 3b 0a 20 20 20 20 69 66 20 28 28 63  Ptr);.    if ((c
6ca0: 6f 64 65 20 3d 20 45 76 61 6c 43 61 6c 6c 62 61  ode = EvalCallba
6cb0: 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65  ck(interp, state
6cc0: 50 74 72 2c 20 63 6d 64 50 74 72 29 29 20 3e 20  Ptr, cmdPtr)) > 
6cd0: 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f  1) {..res = SSL_
6ce0: 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 52 45 54  CLIENT_HELLO_RET
6cf0: 52 59 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53  RY;..*alert = SS
6d00: 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f  L_R_TLSV1_ALERT_
6d10: 55 53 45 52 5f 43 41 4e 43 45 4c 4c 45 44 3b 0a  USER_CANCELLED;.
6d20: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63      } else if (c
6d30: 6f 64 65 20 3d 3d 20 31 29 20 7b 0a 09 72 65 73  ode == 1) {..res
6d40: 20 3d 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45   = SSL_CLIENT_HE
6d50: 4c 4c 4f 5f 53 55 43 43 45 53 53 3b 0a 20 20 20  LLO_SUCCESS;.   
6d60: 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d   } else {..res =
6d70: 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c   SSL_CLIENT_HELL
6d80: 4f 5f 45 52 52 4f 52 3b 0a 09 2a 61 6c 65 72 74  O_ERROR;..*alert
6d90: 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41   = SSL_R_TLSV1_A
6da0: 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52  LERT_INTERNAL_ER
6db0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54  ROR;.    }.    T
6dc0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
6dd0: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 65 74  cmdPtr);.    ret
6de0: 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 2a  urn res;.}.../**
6df0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6e00: 2a 2a 2f 0a 2f 2a 20 43 6f 6d 6d 61 6e 64 73 20  **/./* Commands 
6e10: 20 20 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a          */./****
6e20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6e30: 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  /../*. *--------
6e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
6e80: 2a 20 43 69 70 68 65 72 73 4f 62 6a 43 6d 64 20  * CiphersObjCmd 
6e90: 2d 2d 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c  -- list availabl
6ea0: 65 20 63 69 70 68 65 72 73 0a 20 2a 0a 20 2a 09  e ciphers. *. *.
6eb0: 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69  This procedure i
6ec0: 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f  s invoked to pro
6ed0: 63 65 73 73 20 74 68 65 20 22 74 6c 73 3a 3a 63  cess the "tls::c
6ee0: 69 70 68 65 72 73 22 20 63 6f 6d 6d 61 6e 64 0a  iphers" command.
6ef0: 20 2a 09 74 6f 20 6c 69 73 74 20 61 76 61 69 6c   *.to list avail
6f00: 61 62 6c 65 20 63 69 70 68 65 72 73 2c 20 62 61  able ciphers, ba
6f10: 73 65 64 20 75 70 6f 6e 20 70 72 6f 74 6f 63 6f  sed upon protoco
6f20: 6c 20 73 65 6c 65 63 74 65 64 2e 0a 20 2a 0a 20  l selected.. *. 
6f30: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20  * Results:. *.A 
6f40: 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73  standard Tcl res
6f50: 75 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20  ult list.. *. * 
6f60: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
6f70: 09 63 6f 6e 73 74 72 75 63 74 73 20 61 6e 64 20  .constructs and 
6f80: 64 65 73 74 72 6f 79 73 20 53 53 4c 20 63 6f 6e  destroys SSL con
6f90: 74 65 78 74 20 28 43 54 58 29 0a 20 2a 0a 20 2a  text (CTX). *. *
6fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6fe0: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63  ---. */.static c
6ff0: 6f 6e 73 74 20 63 68 61 72 20 2a 70 72 6f 74 6f  onst char *proto
7000: 63 6f 6c 73 5b 5d 20 3d 20 7b 0a 09 22 73 73 6c  cols[] = {.."ssl
7010: 32 22 2c 20 22 73 73 6c 33 22 2c 20 22 74 6c 73  2", "ssl3", "tls
7020: 31 22 2c 20 22 74 6c 73 31 2e 31 22 2c 20 22 74  1", "tls1.1", "t
7030: 6c 73 31 2e 32 22 2c 20 22 74 6c 73 31 2e 33 22  ls1.2", "tls1.3"
7040: 2c 20 4e 55 4c 4c 0a 7d 3b 0a 65 6e 75 6d 20 70  , NULL.};.enum p
7050: 72 6f 74 6f 63 6f 6c 20 7b 0a 20 20 20 20 54 4c  rotocol {.    TL
7060: 53 5f 53 53 4c 32 2c 20 54 4c 53 5f 53 53 4c 33  S_SSL2, TLS_SSL3
7070: 2c 20 54 4c 53 5f 54 4c 53 31 2c 20 54 4c 53 5f  , TLS_TLS1, TLS_
7080: 54 4c 53 31 5f 31 2c 20 54 4c 53 5f 54 4c 53 31  TLS1_1, TLS_TLS1
7090: 5f 32 2c 20 54 4c 53 5f 54 4c 53 31 5f 33 2c 20  _2, TLS_TLS1_3, 
70a0: 54 4c 53 5f 4e 4f 4e 45 0a 7d 3b 0a 0a 73 74 61  TLS_NONE.};..sta
70b0: 74 69 63 20 69 6e 74 0a 43 69 70 68 65 72 73 4f  tic int.CiphersO
70c0: 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61  bjCmd(ClientData
70d0: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c   clientData, Tcl
70e0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
70f0: 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f   int objc, Tcl_O
7100: 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d  bj *const objv[]
7110: 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  ) {.    Tcl_Obj 
7120: 2a 6f 62 6a 50 74 72 20 3d 20 4e 55 4c 4c 3b 0a  *objPtr = NULL;.
7130: 20 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 74 78      SSL_CTX *ctx
7140: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 53 4c   = NULL;.    SSL
7150: 20 2a 73 73 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20   *ssl = NULL;.  
7160: 20 20 53 54 41 43 4b 5f 4f 46 28 53 53 4c 5f 43    STACK_OF(SSL_C
7170: 49 50 48 45 52 29 20 2a 73 6b 3b 0a 20 20 20 20  IPHER) *sk;.    
7180: 63 68 61 72 20 62 75 66 5b 42 55 46 53 49 5a 5d  char buf[BUFSIZ]
7190: 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 69  ;.    Tcl_Size i
71a0: 6e 64 65 78 3b 0a 20 20 20 20 69 6e 74 20 76 65  ndex;.    int ve
71b0: 72 62 6f 73 65 20 3d 20 30 2c 20 75 73 65 5f 73  rbose = 0, use_s
71c0: 75 70 70 6f 72 74 65 64 20 3d 20 30 3b 0a 20 20  upported = 0;.  
71d0: 20 20 63 6f 6e 73 74 20 53 53 4c 5f 4d 45 54 48    const SSL_METH
71e0: 4f 44 20 2a 6d 65 74 68 6f 64 3b 0a 20 20 20 20  OD *method;.    
71f0: 28 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 74  (void) clientDat
7200: 61 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  a;..    dprintf(
7210: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20  "Called");..    
7220: 69 66 20 28 28 6f 62 6a 63 20 3c 20 32 29 20 7c  if ((objc < 2) |
7230: 7c 20 28 6f 62 6a 63 20 3e 20 34 29 29 20 7b 0a  | (objc > 4)) {.
7240: 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67  .Tcl_WrongNumArg
7250: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
7260: 76 2c 20 22 70 72 6f 74 6f 63 6f 6c 20 3f 76 65  v, "protocol ?ve
7270: 72 62 6f 73 65 3f 20 3f 73 75 70 70 6f 72 74 65  rbose? ?supporte
7280: 64 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43  d?");..return TC
7290: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
72a0: 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e     if (Tcl_GetIn
72b0: 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  dexFromObj(inter
72c0: 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 70 72 6f 74  p, objv[1], prot
72d0: 6f 63 6f 6c 73 2c 20 22 70 72 6f 74 6f 63 6f 6c  ocols, "protocol
72e0: 22 2c 20 30 2c 20 26 69 6e 64 65 78 29 20 21 3d  ", 0, &index) !=
72f0: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75   TCL_OK) {..retu
7300: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
7310: 20 20 7d 0a 20 20 20 20 69 66 20 28 28 6f 62 6a    }.    if ((obj
7320: 63 20 3e 20 32 29 20 26 26 20 54 63 6c 5f 47 65  c > 2) && Tcl_Ge
7330: 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28  tBooleanFromObj(
7340: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
7350: 20 26 76 65 72 62 6f 73 65 29 20 21 3d 20 54 43   &verbose) != TC
7360: 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20  L_OK) {..return 
7370: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
7380: 0a 20 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3e  .    if ((objc >
7390: 20 33 29 20 26 26 20 54 63 6c 5f 47 65 74 42 6f   3) && Tcl_GetBo
73a0: 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74  oleanFromObj(int
73b0: 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 75  erp, objv[3], &u
73c0: 73 65 5f 73 75 70 70 6f 72 74 65 64 29 20 21 3d  se_supported) !=
73d0: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75   TCL_OK) {..retu
73e0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
73f0: 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65    }..    ERR_cle
7400: 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20  ar_error();..   
7410: 20 73 77 69 74 63 68 20 28 28 65 6e 75 6d 20 70   switch ((enum p
7420: 72 6f 74 6f 63 6f 6c 29 69 6e 64 65 78 29 20 7b  rotocol)index) {
7430: 0a 09 63 61 73 65 20 54 4c 53 5f 53 53 4c 32 3a  ..case TLS_SSL2:
7440: 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52  .#if OPENSSL_VER
7450: 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 30  SION_NUMBER >= 0
7460: 78 31 30 31 30 30 30 30 30 4c 20 7c 7c 20 64 65  x10100000L || de
7470: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 7c  fined(NO_SSL2) |
7480: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  | defined(OPENSS
7490: 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 09 20 20 20 20  L_NO_SSL2)..    
74a0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
74b0: 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f  (interp, protoco
74c0: 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72  ls[index], ": pr
74d0: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f  otocol not suppo
74e0: 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20  rted", (char *) 
74f0: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75  NULL);..    retu
7500: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65  rn TCL_ERROR;.#e
7510: 6c 73 65 0a 09 20 20 20 20 6d 65 74 68 6f 64 20  lse..    method 
7520: 3d 20 53 53 4c 76 32 5f 6d 65 74 68 6f 64 28 29  = SSLv2_method()
7530: 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a  ; break;.#endif.
7540: 09 63 61 73 65 20 54 4c 53 5f 53 53 4c 33 3a 0a  .case TLS_SSL3:.
7550: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53  #if defined(NO_S
7560: 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  SL3) || defined(
7570: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29  OPENSSL_NO_SSL3)
7580: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e   || defined(OPEN
7590: 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48  SSL_NO_SSL3_METH
75a0: 4f 44 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 70  OD)..    Tcl_App
75b0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
75c0: 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65  , protocols[inde
75d0: 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20  x], ": protocol 
75e0: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20  not supported", 
75f0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
7600: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
7610: 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20  ERROR;.#else..  
7620: 20 20 6d 65 74 68 6f 64 20 3d 20 53 53 4c 76 33    method = SSLv3
7630: 5f 6d 65 74 68 6f 64 28 29 3b 20 62 72 65 61 6b  _method(); break
7640: 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 20 54  ;.#endif..case T
7650: 4c 53 5f 54 4c 53 31 3a 0a 23 69 66 20 64 65 66  LS_TLS1:.#if def
7660: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c  ined(NO_TLS1) ||
7670: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
7680: 5f 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66  _NO_TLS1) || def
7690: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
76a0: 54 4c 53 31 5f 4d 45 54 48 4f 44 29 0a 09 20 20  TLS1_METHOD)..  
76b0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
76c0: 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f  lt(interp, proto
76d0: 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20  cols[index], ": 
76e0: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70  protocol not sup
76f0: 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a  ported", (char *
7700: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65  ) NULL);..    re
7710: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
7720: 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 74 68 6f  #else..    metho
7730: 64 20 3d 20 54 4c 53 76 31 5f 6d 65 74 68 6f 64  d = TLSv1_method
7740: 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69  (); break;.#endi
7750: 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c 53 31  f..case TLS_TLS1
7760: 5f 31 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  _1:.#if defined(
7770: 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65  NO_TLS1_1) || de
7780: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
7790: 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69  _TLS1_1) || defi
77a0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
77b0: 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 09 20  LS1_1_METHOD).. 
77c0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
77d0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74  ult(interp, prot
77e0: 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a  ocols[index], ":
77f0: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75   protocol not su
7800: 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20  pported", (char 
7810: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72  *) NULL);..    r
7820: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
7830: 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 74 68  .#else..    meth
7840: 6f 64 20 3d 20 54 4c 53 76 31 5f 31 5f 6d 65 74  od = TLSv1_1_met
7850: 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65  hod(); break;.#e
7860: 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 54  ndif..case TLS_T
7870: 4c 53 31 5f 32 3a 0a 23 69 66 20 64 65 66 69 6e  LS1_2:.#if defin
7880: 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c  ed(NO_TLS1_2) ||
7890: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
78a0: 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64  _NO_TLS1_2) || d
78b0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
78c0: 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29  O_TLS1_2_METHOD)
78d0: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ..    Tcl_Append
78e0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70  Result(interp, p
78f0: 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c  rotocols[index],
7900: 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74   ": protocol not
7910: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68   supported", (ch
7920: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20  ar *) NULL);..  
7930: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
7940: 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d  OR;.#else..    m
7950: 65 74 68 6f 64 20 3d 20 54 4c 53 76 31 5f 32 5f  ethod = TLSv1_2_
7960: 6d 65 74 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b  method(); break;
7970: 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c  .#endif..case TL
7980: 53 5f 54 4c 53 31 5f 33 3a 0a 23 69 66 20 64 65  S_TLS1_3:.#if de
7990: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29  fined(NO_TLS1_3)
79a0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e   || defined(OPEN
79b0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 09  SSL_NO_TLS1_3)..
79c0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
79d0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f  sult(interp, pro
79e0: 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22  tocols[index], "
79f0: 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73  : protocol not s
7a00: 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72  upported", (char
7a10: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20   *) NULL);..    
7a20: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
7a30: 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 74  ;.#else..    met
7a40: 68 6f 64 20 3d 20 54 4c 53 5f 6d 65 74 68 6f 64  hod = TLS_method
7a50: 28 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58  ();..    SSL_CTX
7a60: 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76  _set_min_proto_v
7a70: 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31  ersion(ctx, TLS1
7a80: 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 09 20 20  _3_VERSION);..  
7a90: 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 61    SSL_CTX_set_ma
7aa0: 78 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28  x_proto_version(
7ab0: 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53  ctx, TLS1_3_VERS
7ac0: 49 4f 4e 29 3b 0a 09 20 20 20 20 62 72 65 61 6b  ION);..    break
7ad0: 3b 0a 23 65 6e 64 69 66 0a 09 64 65 66 61 75 6c  ;.#endif..defaul
7ae0: 74 3a 0a 09 20 20 20 20 6d 65 74 68 6f 64 20 3d  t:..    method =
7af0: 20 54 4c 53 5f 6d 65 74 68 6f 64 28 29 3b 0a 09   TLS_method();..
7b00: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
7b10: 0a 0a 20 20 20 20 63 74 78 20 3d 20 53 53 4c 5f  ..    ctx = SSL_
7b20: 43 54 58 5f 6e 65 77 28 6d 65 74 68 6f 64 29 3b  CTX_new(method);
7b30: 0a 20 20 20 20 69 66 20 28 63 74 78 20 3d 3d 20  .    if (ctx == 
7b40: 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70  NULL) {..Tcl_App
7b50: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
7b60: 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e  , GET_ERR_REASON
7b70: 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  (), (char *) NUL
7b80: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  L);..return TCL_
7b90: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
7ba0: 20 20 73 73 6c 20 3d 20 53 53 4c 5f 6e 65 77 28    ssl = SSL_new(
7bb0: 63 74 78 29 3b 0a 20 20 20 20 69 66 20 28 73 73  ctx);.    if (ss
7bc0: 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63  l == NULL) {..Tc
7bd0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
7be0: 6e 74 65 72 70 2c 20 47 45 54 5f 45 52 52 5f 52  nterp, GET_ERR_R
7bf0: 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a  EASON(), (char *
7c00: 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54  ) NULL);..SSL_CT
7c10: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65  X_free(ctx);..re
7c20: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
7c30: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 73      }..    /* Us
7c40: 65 20 6c 69 73 74 20 61 6e 64 20 6f 72 64 65 72  e list and order
7c50: 20 61 73 20 77 6f 75 6c 64 20 62 65 20 73 65 6e   as would be sen
7c60: 74 20 69 6e 20 61 20 43 6c 69 65 6e 74 48 65 6c  t in a ClientHel
7c70: 6c 6f 20 6f 72 20 61 6c 6c 20 61 76 61 69 6c 61  lo or all availa
7c80: 62 6c 65 20 63 69 70 68 65 72 73 20 2a 2f 0a 20  ble ciphers */. 
7c90: 20 20 20 69 66 20 28 75 73 65 5f 73 75 70 70 6f     if (use_suppo
7ca0: 72 74 65 64 29 20 7b 0a 09 73 6b 20 3d 20 53 53  rted) {..sk = SS
7cb0: 4c 5f 67 65 74 31 5f 73 75 70 70 6f 72 74 65 64  L_get1_supported
7cc0: 5f 63 69 70 68 65 72 73 28 73 73 6c 29 3b 0a 20  _ciphers(ssl);. 
7cd0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 73 6b 20     } else {..sk 
7ce0: 3d 20 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72  = SSL_get_cipher
7cf0: 73 28 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20  s(ssl);.    }.. 
7d00: 20 20 20 69 66 20 28 73 6b 20 21 3d 20 4e 55 4c     if (sk != NUL
7d10: 4c 29 20 7b 0a 09 69 66 20 28 21 76 65 72 62 6f  L) {..if (!verbo
7d20: 73 65 29 20 7b 0a 09 20 20 20 20 63 6f 6e 73 74  se) {..    const
7d30: 20 63 68 61 72 20 2a 63 70 3b 0a 09 20 20 20 20   char *cp;..    
7d40: 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77  objPtr = Tcl_New
7d50: 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29  ListObj(0, NULL)
7d60: 3b 0a 09 20 20 20 20 66 6f 72 20 28 69 6e 74 20  ;..    for (int 
7d70: 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 53 53  i = 0; i < sk_SS
7d80: 4c 5f 43 49 50 48 45 52 5f 6e 75 6d 28 73 6b 29  L_CIPHER_num(sk)
7d90: 3b 20 69 2b 2b 29 20 7b 0a 09 09 63 6f 6e 73 74  ; i++) {...const
7da0: 20 53 53 4c 5f 43 49 50 48 45 52 20 2a 63 20 3d   SSL_CIPHER *c =
7db0: 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 76   sk_SSL_CIPHER_v
7dc0: 61 6c 75 65 28 73 6b 2c 20 69 29 3b 0a 09 09 69  alue(sk, i);...i
7dd0: 66 20 28 63 20 3d 3d 20 4e 55 4c 4c 29 20 63 6f  f (c == NULL) co
7de0: 6e 74 69 6e 75 65 3b 0a 0a 09 09 2f 2a 20 63 69  ntinue;..../* ci
7df0: 70 68 65 72 20 6e 61 6d 65 20 6f 72 20 28 4e 4f  pher name or (NO
7e00: 4e 45 29 20 2a 2f 0a 09 09 63 70 20 3d 20 53 53  NE) */...cp = SS
7e10: 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 6e 61 6d  L_CIPHER_get_nam
7e20: 65 28 63 29 3b 0a 09 09 69 66 20 28 63 70 20 3d  e(c);...if (cp =
7e30: 3d 20 4e 55 4c 4c 29 20 62 72 65 61 6b 3b 0a 09  = NULL) break;..
7e40: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
7e50: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
7e60: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
7e70: 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72  wStringObj((char
7e80: 20 2a 29 20 63 70 2c 20 2d 31 29 29 3b 0a 09 20   *) cp, -1));.. 
7e90: 20 20 20 7d 0a 0a 09 7d 20 65 6c 73 65 20 7b 0a     }...} else {.
7ea0: 09 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63  .    objPtr = Tc
7eb0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
7ec0: 22 2c 30 29 3b 0a 09 20 20 20 20 66 6f 72 20 28  ",0);..    for (
7ed0: 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 73  int i = 0; i < s
7ee0: 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 6e 75 6d  k_SSL_CIPHER_num
7ef0: 28 73 6b 29 3b 20 69 2b 2b 29 20 7b 0a 09 09 63  (sk); i++) {...c
7f00: 6f 6e 73 74 20 53 53 4c 5f 43 49 50 48 45 52 20  onst SSL_CIPHER 
7f10: 2a 63 20 3d 20 73 6b 5f 53 53 4c 5f 43 49 50 48  *c = sk_SSL_CIPH
7f20: 45 52 5f 76 61 6c 75 65 28 73 6b 2c 20 69 29 3b  ER_value(sk, i);
7f30: 0a 09 09 69 66 20 28 63 20 3d 3d 20 4e 55 4c 4c  ...if (c == NULL
7f40: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 09 09 2f  ) continue;..../
7f50: 2a 20 74 65 78 74 75 61 6c 20 64 65 73 63 72 69  * textual descri
7f60: 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 69 70  ption of the cip
7f70: 68 65 72 20 2a 2f 0a 09 09 69 66 20 28 53 53 4c  her */...if (SSL
7f80: 5f 43 49 50 48 45 52 5f 64 65 73 63 72 69 70 74  _CIPHER_descript
7f90: 69 6f 6e 28 63 2c 20 62 75 66 2c 20 73 69 7a 65  ion(c, buf, size
7fa0: 6f 66 28 62 75 66 29 29 20 21 3d 20 4e 55 4c 4c  of(buf)) != NULL
7fb0: 29 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 41 70  ) {...    Tcl_Ap
7fc0: 70 65 6e 64 54 6f 4f 62 6a 28 6f 62 6a 50 74 72  pendToObj(objPtr
7fd0: 2c 20 62 75 66 2c 20 28 54 63 6c 5f 53 69 7a 65  , buf, (Tcl_Size
7fe0: 29 20 73 74 72 6c 65 6e 28 62 75 66 29 29 3b 0a  ) strlen(buf));.
7ff0: 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 20  ..} else {...   
8000: 20 54 63 6c 5f 41 70 70 65 6e 64 54 6f 4f 62 6a   Tcl_AppendToObj
8010: 28 6f 62 6a 50 74 72 2c 20 22 55 4e 4b 4e 4f 57  (objPtr, "UNKNOW
8020: 4e 5c 6e 22 2c 20 38 29 3b 0a 09 09 7d 0a 09 20  N\n", 8);...}.. 
8030: 20 20 20 7d 0a 09 7d 0a 09 69 66 20 28 75 73 65     }..}..if (use
8040: 5f 73 75 70 70 6f 72 74 65 64 29 20 7b 0a 09 20  _supported) {.. 
8050: 20 20 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52     sk_SSL_CIPHER
8060: 5f 66 72 65 65 28 73 6b 29 3b 0a 09 7d 0a 20 20  _free(sk);..}.  
8070: 20 20 7d 0a 20 20 20 20 53 53 4c 5f 66 72 65 65    }.    SSL_free
8080: 28 73 73 6c 29 3b 0a 20 20 20 20 53 53 4c 5f 43  (ssl);.    SSL_C
8090: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 0a 20  TX_free(ctx);.. 
80a0: 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
80b0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ult(interp, objP
80c0: 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  tr);.    return 
80d0: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  TCL_OK;.}.../*. 
80e0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
80f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8120: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 50 72 6f 74 6f  ----. *. * Proto
8130: 63 6f 6c 73 4f 62 6a 43 6d 64 20 2d 2d 20 6c 69  colsObjCmd -- li
8140: 73 74 20 61 76 61 69 6c 61 62 6c 65 20 70 72 6f  st available pro
8150: 74 6f 63 6f 6c 73 0a 20 2a 0a 20 2a 09 54 68 69  tocols. *. *.Thi
8160: 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 69  s procedure is i
8170: 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73  nvoked to proces
8180: 73 20 74 68 65 20 22 74 6c 73 3a 3a 70 72 6f 74  s the "tls::prot
8190: 6f 63 6f 6c 73 22 20 63 6f 6d 6d 61 6e 64 0a 20  ocols" command. 
81a0: 2a 09 74 6f 20 6c 69 73 74 20 61 76 61 69 6c 61  *.to list availa
81b0: 62 6c 65 20 70 72 6f 74 6f 63 6f 6c 73 2e 0a 20  ble protocols.. 
81c0: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
81d0: 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20  .A standard Tcl 
81e0: 72 65 73 75 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a  result list.. *.
81f0: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
8200: 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d  . *.none. *. *--
8210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8250: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  -. */.static int
8260: 0a 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64  .ProtocolsObjCmd
8270: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65  (ClientData clie
8280: 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65  ntData, Tcl_Inte
8290: 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20  rp *interp, int 
82a0: 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63  objc, Tcl_Obj *c
82b0: 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20  onst objv[]) {. 
82c0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50     Tcl_Obj *objP
82d0: 74 72 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 63  tr;.    (void) c
82e0: 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20  lientData;..    
82f0: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
8300: 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63  );..    if (objc
8310: 20 21 3d 20 31 29 20 7b 0a 09 54 63 6c 5f 57 72   != 1) {..Tcl_Wr
8320: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
8330: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 22 29 3b  p, 1, objv, "");
8340: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
8350: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45  OR;.    }..    E
8360: 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29  RR_clear_error()
8370: 3b 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20 3d 20  ;..    objPtr = 
8380: 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30  Tcl_NewListObj(0
8390: 2c 20 4e 55 4c 4c 29 3b 0a 0a 23 69 66 20 4f 50  , NULL);..#if OP
83a0: 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55  ENSSL_VERSION_NU
83b0: 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 30 30  MBER < 0x1010000
83c0: 30 4c 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e  0L && !defined(N
83d0: 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 65 66 69  O_SSL2) && !defi
83e0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53  ned(OPENSSL_NO_S
83f0: 53 4c 32 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73  SL2).    Tcl_Lis
8400: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
8410: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
8420: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
8430: 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53  bj(protocols[TLS
8440: 5f 53 53 4c 32 5d 2c 20 2d 31 29 29 3b 0a 23 65  _SSL2], -1));.#e
8450: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65  ndif.#if !define
8460: 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64  d(NO_SSL3) && !d
8470: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
8480: 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 69  O_SSL3) && !defi
8490: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53  ned(OPENSSL_NO_S
84a0: 53 4c 33 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20  SL3_METHOD).    
84b0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
84c0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
84d0: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
84e0: 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63  StringObj(protoc
84f0: 6f 6c 73 5b 54 4c 53 5f 53 53 4c 33 5d 2c 20 2d  ols[TLS_SSL3], -
8500: 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  1));.#endif.#if 
8510: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31  !defined(NO_TLS1
8520: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
8530: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 26  ENSSL_NO_TLS1) &
8540: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
8550: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f  SL_NO_TLS1_METHO
8560: 44 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  D).    Tcl_ListO
8570: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
8580: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
8590: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
85a0: 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54  (protocols[TLS_T
85b0: 4c 53 31 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64  LS1], -1));.#end
85c0: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  if.#if !defined(
85d0: 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64  NO_TLS1_1) && !d
85e0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
85f0: 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65  O_TLS1_1) && !de
8600: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
8610: 5f 54 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a  _TLS1_1_METHOD).
8620: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
8630: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
8640: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
8650: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72  _NewStringObj(pr
8660: 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31  otocols[TLS_TLS1
8670: 5f 31 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69  _1], -1));.#endi
8680: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  f.#if !defined(N
8690: 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65  O_TLS1_2) && !de
86a0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
86b0: 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66  _TLS1_2) && !def
86c0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
86d0: 54 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 20  TLS1_2_METHOD). 
86e0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
86f0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
8700: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
8710: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f  NewStringObj(pro
8720: 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f  tocols[TLS_TLS1_
8730: 32 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66  2], -1));.#endif
8740: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f  .#if !defined(NO
8750: 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66  _TLS1_3) && !def
8760: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
8770: 54 4c 53 31 5f 33 29 0a 20 20 20 20 54 63 6c 5f  TLS1_3).    Tcl_
8780: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
8790: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
87a0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
87b0: 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b  ngObj(protocols[
87c0: 54 4c 53 5f 54 4c 53 31 5f 33 5d 2c 20 2d 31 29  TLS_TLS1_3], -1)
87d0: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 54  );.#endif..    T
87e0: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
87f0: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b  interp, objPtr);
8800: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
8810: 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d  OK;.}.../*. *---
8820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8860: 0a 20 2a 0a 20 2a 20 48 61 6e 64 73 68 61 6b 65  . *. * Handshake
8870: 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09  ObjCmd --. *. *.
8880: 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69 73 20  This command is 
8890: 75 73 65 64 20 74 6f 20 76 65 72 69 66 79 20 77  used to verify w
88a0: 68 65 74 68 65 72 20 74 68 65 20 68 61 6e 64 73  hether the hands
88b0: 68 61 6b 65 20 69 73 20 63 6f 6d 70 6c 65 74 65  hake is complete
88c0: 0a 20 2a 09 6f 72 20 6e 6f 74 2e 0a 20 2a 0a 20  . *.or not.. *. 
88d0: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20  * Results:. *.A 
88e0: 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73  standard Tcl res
88f0: 75 6c 74 2e 20 31 20 6d 65 61 6e 73 20 68 61 6e  ult. 1 means han
8900: 64 73 68 61 6b 65 20 63 6f 6d 70 6c 65 74 65 2c  dshake complete,
8910: 20 30 20 6d 65 61 6e 73 20 70 65 6e 64 69 6e 67   0 means pending
8920: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  .. *. * Side eff
8930: 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 66 6f 72  ects:. *.May for
8940: 63 65 20 53 53 4c 20 6e 65 67 6f 74 69 61 74 69  ce SSL negotiati
8950: 6f 6e 20 74 6f 20 74 61 6b 65 20 70 6c 61 63 65  on to take place
8960: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  .. *. *---------
8970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
89a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73  ----------. */.s
89b0: 74 61 74 69 63 20 69 6e 74 20 48 61 6e 64 73 68  tatic int Handsh
89c0: 61 6b 65 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74  akeObjCmd(Client
89d0: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
89e0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
89f0: 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54  erp, int objc, T
8a00: 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62  cl_Obj *const ob
8a10: 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f  jv[]) {.    Tcl_
8a20: 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 20 20 20  Channel chan;   
8a30: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 68 61 6e       /* The chan
8a40: 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64  nel to set a mod
8a50: 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53 74 61  e on. */.    Sta
8a60: 74 65 20 2a 73 74 61 74 65 50 74 72 3b 20 20 20  te *statePtr;   
8a70: 20 20 20 20 20 2f 2a 20 63 6c 69 65 6e 74 20 73       /* client s
8a80: 74 61 74 65 20 66 6f 72 20 73 73 6c 20 73 6f 63  tate for ssl soc
8a90: 6b 65 74 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74  ket */.    const
8aa0: 20 63 68 61 72 20 2a 65 72 72 53 74 72 20 3d 20   char *errStr = 
8ab0: 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 72 65  NULL;.    int re
8ac0: 74 20 3d 20 31 3b 0a 20 20 20 20 69 6e 74 20 65  t = 1;.    int e
8ad0: 72 72 20 3d 20 30 3b 0a 20 20 20 20 28 76 6f 69  rr = 0;.    (voi
8ae0: 64 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a  d) clientData;..
8af0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
8b00: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28  led");..    if (
8b10: 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 63  objc != 2) {..Tc
8b20: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
8b30: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
8b40: 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74  "channel");..ret
8b50: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
8b60: 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c     }..    ERR_cl
8b70: 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20  ear_error();..  
8b80: 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74    chan = Tcl_Get
8b90: 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20  Channel(interp, 
8ba0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
8bb0: 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a 20  jv[1]), NULL);. 
8bc0: 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28     if (chan == (
8bd0: 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c  Tcl_Channel) NUL
8be0: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c  L) {..return TCL
8bf0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
8c00: 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
8c10: 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68  to operate on th
8c20: 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65  e topmost channe
8c30: 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20  l */.    chan = 
8c40: 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65  Tcl_GetTopChanne
8c50: 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 20  l(chan);.    if 
8c60: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54  (Tcl_GetChannelT
8c70: 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73  ype(chan) != Tls
8c80: 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20  _ChannelType()) 
8c90: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
8ca0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64  ult(interp, "bad
8cb0: 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63   channel \"", Tc
8cc0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65  l_GetChannelName
8cd0: 28 63 68 61 6e 29 2c 0a 09 20 20 20 20 22 5c 22  (chan),..    "\"
8ce0: 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e  : not a TLS chan
8cf0: 6e 65 6c 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  nel", (char *) N
8d00: 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72  ULL);..Tcl_SetEr
8d10: 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  rorCode(interp, 
8d20: 22 54 4c 53 22 2c 20 22 48 41 4e 44 53 48 41 4b  "TLS", "HANDSHAK
8d30: 45 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22  E", "CHANNEL", "
8d40: 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20  INVALID", (char 
8d50: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72  *) NULL);..retur
8d60: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
8d70: 20 7d 0a 20 20 20 20 73 74 61 74 65 50 74 72 20   }.    statePtr 
8d80: 3d 20 28 53 74 61 74 65 20 2a 29 54 63 6c 5f 47  = (State *)Tcl_G
8d90: 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63  etChannelInstanc
8da0: 65 44 61 74 61 28 63 68 61 6e 29 3b 0a 0a 20 20  eData(chan);..  
8db0: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 69    dprintf("Calli
8dc0: 6e 67 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f  ng Tls_WaitForCo
8dd0: 6e 6e 65 63 74 22 29 3b 0a 20 20 20 20 72 65 74  nnect");.    ret
8de0: 20 3d 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f   = Tls_WaitForCo
8df0: 6e 6e 65 63 74 28 73 74 61 74 65 50 74 72 2c 20  nnect(statePtr, 
8e00: 26 65 72 72 2c 20 31 29 3b 0a 20 20 20 20 64 70  &err, 1);.    dp
8e10: 72 69 6e 74 66 28 22 54 6c 73 5f 57 61 69 74 46  rintf("Tls_WaitF
8e20: 6f 72 43 6f 6e 6e 65 63 74 20 72 65 74 75 72 6e  orConnect return
8e30: 65 64 3a 20 25 69 22 2c 20 72 65 74 29 3b 0a 0a  ed: %i", ret);..
8e40: 20 20 20 20 69 66 20 28 72 65 74 20 3c 20 30 20      if (ret < 0 
8e50: 26 26 20 28 28 73 74 61 74 65 50 74 72 2d 3e 66  && ((statePtr->f
8e60: 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f 41  lags & TLS_TCL_A
8e70: 53 59 4e 43 29 20 26 26 20 28 65 72 72 20 3d 3d  SYNC) && (err ==
8e80: 20 45 41 47 41 49 4e 29 29 29 20 7b 0a 09 64 70   EAGAIN))) {..dp
8e90: 72 69 6e 74 66 28 22 41 73 79 6e 63 20 73 65 74  rintf("Async set
8ea0: 20 61 6e 64 20 65 72 72 20 3d 20 45 41 47 41 49   and err = EAGAI
8eb0: 4e 22 29 3b 0a 09 72 65 74 20 3d 20 30 3b 0a 20  N");..ret = 0;. 
8ec0: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 72 65     } else if (re
8ed0: 74 20 3c 20 30 29 20 7b 0a 09 6c 6f 6e 67 20 72  t < 0) {..long r
8ee0: 65 73 75 6c 74 3b 0a 09 65 72 72 53 74 72 20 3d  esult;..errStr =
8ef0: 20 73 74 61 74 65 50 74 72 2d 3e 65 72 72 3b 0a   statePtr->err;.
8f00: 09 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74  .Tcl_ResetResult
8f10: 28 69 6e 74 65 72 70 29 3b 0a 09 54 63 6c 5f 53  (interp);..Tcl_S
8f20: 65 74 45 72 72 6e 6f 28 65 72 72 29 3b 0a 0a 09  etErrno(err);...
8f30: 69 66 20 28 21 65 72 72 53 74 72 20 7c 7c 20 28  if (!errStr || (
8f40: 2a 65 72 72 53 74 72 20 3d 3d 20 30 29 29 20 7b  *errStr == 0)) {
8f50: 0a 09 20 20 20 20 65 72 72 53 74 72 20 3d 20 54  ..    errStr = T
8f60: 63 6c 5f 50 6f 73 69 78 45 72 72 6f 72 28 69 6e  cl_PosixError(in
8f70: 74 65 72 70 29 3b 0a 09 7d 0a 0a 09 54 63 6c 5f  terp);..}...Tcl_
8f80: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
8f90: 65 72 70 2c 20 22 68 61 6e 64 73 68 61 6b 65 20  erp, "handshake 
8fa0: 66 61 69 6c 65 64 3a 20 22 2c 20 65 72 72 53 74  failed: ", errSt
8fb0: 72 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  r, (char *) NULL
8fc0: 29 3b 0a 09 69 66 20 28 28 72 65 73 75 6c 74 20  );..if ((result 
8fd0: 3d 20 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79  = SSL_get_verify
8fe0: 5f 72 65 73 75 6c 74 28 73 74 61 74 65 50 74 72  _result(statePtr
8ff0: 2d 3e 73 73 6c 29 29 20 21 3d 20 58 35 30 39 5f  ->ssl)) != X509_
9000: 56 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 54 63 6c  V_OK) {..    Tcl
9010: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
9020: 74 65 72 70 2c 20 22 20 64 75 65 20 74 6f 20 5c  terp, " due to \
9030: 22 22 2c 20 58 35 30 39 5f 76 65 72 69 66 79 5f  "", X509_verify_
9040: 63 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e  cert_error_strin
9050: 67 28 72 65 73 75 6c 74 29 2c 20 22 5c 22 22 2c  g(result), "\"",
9060: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
9070: 0a 09 7d 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f  ..}..Tcl_SetErro
9080: 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54  rCode(interp, "T
9090: 4c 53 22 2c 20 22 48 41 4e 44 53 48 41 4b 45 22  LS", "HANDSHAKE"
90a0: 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61  , "FAILED", (cha
90b0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 64 70 72  r *) NULL);..dpr
90c0: 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20  intf("Returning 
90d0: 54 43 4c 5f 45 52 52 4f 52 20 77 69 74 68 20 68  TCL_ERROR with h
90e0: 61 6e 64 73 68 61 6b 65 20 66 61 69 6c 65 64 3a  andshake failed:
90f0: 20 25 73 22 2c 20 65 72 72 53 74 72 29 3b 0a 09   %s", errStr);..
9100: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
9110: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
9120: 69 66 20 28 65 72 72 20 21 3d 20 30 29 20 7b 0a  if (err != 0) {.
9130: 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 47 6f  .    dprintf("Go
9140: 74 20 61 6e 20 65 72 72 6f 72 20 77 69 74 68 20  t an error with 
9150: 61 20 63 6f 6d 70 6c 65 74 65 64 20 68 61 6e 64  a completed hand
9160: 73 68 61 6b 65 3a 20 65 72 72 20 3d 20 25 69 22  shake: err = %i"
9170: 2c 20 65 72 72 29 3b 0a 09 7d 0a 09 72 65 74 20  , err);..}..ret 
9180: 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 1;.    }..    
9190: 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69  dprintf("Returni
91a0: 6e 67 20 54 43 4c 5f 4f 4b 20 77 69 74 68 20 64  ng TCL_OK with d
91b0: 61 74 61 20 5c 22 25 69 5c 22 22 2c 20 72 65 74  ata \"%i\"", ret
91c0: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62  );.    Tcl_SetOb
91d0: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
91e0: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 65  Tcl_NewIntObj(re
91f0: 74 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  t));.    return 
9200: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  TCL_OK;.}.../*. 
9210: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
9220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9250: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 49 6d 70 6f 72  ----. *. * Impor
9260: 74 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a  tObjCmd --. *. *
9270: 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20  .This procedure 
9280: 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72  is invoked to pr
9290: 6f 63 65 73 73 20 74 68 65 20 22 73 73 6c 22 20  ocess the "ssl" 
92a0: 63 6f 6d 6d 61 6e 64 0a 20 2a 0a 20 2a 09 54 68  command. *. *.Th
92b0: 65 20 73 73 6c 20 63 6f 6d 6d 61 6e 64 20 70 75  e ssl command pu
92c0: 73 68 65 73 20 53 53 4c 20 6f 76 65 72 20 61 20  shes SSL over a 
92d0: 28 6e 65 77 6c 79 20 63 6f 6e 6e 65 63 74 65 64  (newly connected
92e0: 29 20 74 63 70 20 73 6f 63 6b 65 74 0a 20 2a 0a  ) tcp socket. *.
92f0: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41   * Results:. *.A
9300: 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65   standard Tcl re
9310: 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65  sult.. *. * Side
9320: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79   effects:. *.May
9330: 20 6d 6f 64 69 66 79 20 74 68 65 20 62 65 68 61   modify the beha
9340: 76 69 6f 72 20 6f 66 20 61 6e 20 49 4f 20 63 68  vior of an IO ch
9350: 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d  annel.. *. *----
9360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
93a0: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 49   */.static int.I
93b0: 6d 70 6f 72 74 4f 62 6a 43 6d 64 28 43 6c 69 65  mportObjCmd(Clie
93c0: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
93d0: 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  a, Tcl_Interp *i
93e0: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c  nterp, int objc,
93f0: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20   Tcl_Obj *const 
9400: 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63  objv[]) {.    Tc
9410: 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09  l_Channel chan;.
9420: 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20  ./* The channel 
9430: 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e  to set a mode on
9440: 2e 20 2a 2f 0a 20 20 20 20 53 74 61 74 65 20 2a  . */.    State *
9450: 73 74 61 74 65 50 74 72 3b 09 09 2f 2a 20 63 6c  statePtr;../* cl
9460: 69 65 6e 74 20 73 74 61 74 65 20 66 6f 72 20 73  ient state for s
9470: 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20  sl socket */.   
9480: 20 53 53 4c 5f 43 54 58 20 2a 63 74 78 09 09 3d   SSL_CTX *ctx..=
9490: 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f   NULL;.    Tcl_O
94a0: 62 6a 20 2a 73 63 72 69 70 74 09 09 3d 20 4e 55  bj *script..= NU
94b0: 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  LL;.    Tcl_Obj 
94c0: 2a 70 61 73 73 77 6f 72 64 09 09 3d 20 4e 55 4c  *password..= NUL
94d0: 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  L;.    Tcl_Obj *
94e0: 76 63 6d 64 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20  vcmd..= NULL;.  
94f0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 75 70    Tcl_DString up
9500: 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c  perChannelTransl
9510: 61 74 69 6f 6e 2c 20 75 70 70 65 72 43 68 61 6e  ation, upperChan
9520: 6e 65 6c 42 6c 6f 63 6b 69 6e 67 2c 20 75 70 70  nelBlocking, upp
9530: 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e  erChannelEncodin
9540: 67 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 45  g, upperChannelE
9550: 4f 46 43 68 61 72 3b 0a 20 20 20 20 69 6e 74 20  OFChar;.    int 
9560: 69 64 78 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a  idx;.    Tcl_Siz
9570: 65 20 6c 65 6e 3b 0a 20 20 20 20 69 6e 74 20 66  e len;.    int f
9580: 6c 61 67 73 09 09 09 3d 20 54 4c 53 5f 54 43 4c  lags...= TLS_TCL
9590: 5f 49 4e 49 54 3b 0a 20 20 20 20 69 6e 74 20 73  _INIT;.    int s
95a0: 65 72 76 65 72 09 09 09 3d 20 30 3b 09 2f 2a 20  erver...= 0;./* 
95b0: 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e  is connection in
95c0: 63 6f 6d 69 6e 67 20 6f 72 20 6f 75 74 67 6f 69  coming or outgoi
95d0: 6e 67 3f 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  ng? */.    char 
95e0: 2a 6b 65 79 66 69 6c 65 09 09 3d 20 4e 55 4c 4c  *keyfile..= NULL
95f0: 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 65 72 74  ;.    char *cert
9600: 66 69 6c 65 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20  file..= NULL;.  
9610: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
9620: 2a 6b 65 79 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20  *key..= NULL;.  
9630: 20 20 54 63 6c 5f 53 69 7a 65 20 6b 65 79 5f 6c    Tcl_Size key_l
9640: 65 6e 09 09 3d 20 30 3b 0a 20 20 20 20 75 6e 73  en..= 0;.    uns
9650: 69 67 6e 65 64 20 63 68 61 72 20 2a 63 65 72 74  igned char *cert
9660: 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63  ..= NULL;.    Tc
9670: 6c 5f 53 69 7a 65 20 63 65 72 74 5f 6c 65 6e 09  l_Size cert_len.
9680: 09 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20 2a  .= 0;.    char *
9690: 63 69 70 68 65 72 73 09 09 3d 20 4e 55 4c 4c 3b  ciphers..= NULL;
96a0: 0a 20 20 20 20 63 68 61 72 20 2a 63 69 70 68 65  .    char *ciphe
96b0: 72 73 75 69 74 65 73 09 09 3d 20 4e 55 4c 4c 3b  rsuites..= NULL;
96c0: 0a 20 20 20 20 63 68 61 72 20 2a 43 41 66 69 6c  .    char *CAfil
96d0: 65 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63  e..= NULL;.    c
96e0: 68 61 72 20 2a 43 41 70 61 74 68 09 09 3d 20 4e  har *CApath..= N
96f0: 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 43  ULL;.    char *C
9700: 41 73 74 6f 72 65 09 09 3d 20 4e 55 4c 4c 3b 0a  Astore..= NULL;.
9710: 20 20 20 20 63 68 61 72 20 2a 44 48 70 61 72 61      char *DHpara
9720: 6d 73 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  ms..= NULL;.    
9730: 63 68 61 72 20 2a 6d 6f 64 65 6c 09 09 09 3d 20  char *model...= 
9740: 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a  NULL;.    char *
9750: 73 65 72 76 65 72 6e 61 6d 65 09 09 3d 20 4e 55  servername..= NU
9760: 4c 4c 3b 09 2f 2a 20 68 6f 73 74 6e 61 6d 65 20  LL;./* hostname 
9770: 66 6f 72 20 53 65 72 76 65 72 20 4e 61 6d 65 20  for Server Name 
9780: 49 6e 64 69 63 61 74 69 6f 6e 20 2a 2f 0a 20 20  Indication */.  
9790: 20 20 63 68 61 72 20 2a 73 65 73 73 69 6f 6e 5f    char *session_
97a0: 69 64 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  id..= NULL;.    
97b0: 54 63 6c 5f 4f 62 6a 20 2a 61 6c 70 6e 09 09 3d  Tcl_Obj *alpn..=
97c0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 73   NULL;.    int s
97d0: 73 6c 32 20 3d 20 30 2c 20 73 73 6c 33 20 3d 20  sl2 = 0, ssl3 = 
97e0: 30 3b 0a 20 20 20 20 69 6e 74 20 74 6c 73 31 20  0;.    int tls1 
97f0: 3d 20 31 2c 20 74 6c 73 31 5f 31 20 3d 20 31 2c  = 1, tls1_1 = 1,
9800: 20 74 6c 73 31 5f 32 20 3d 20 31 2c 20 74 6c 73   tls1_2 = 1, tls
9810: 31 5f 33 20 3d 20 31 3b 0a 20 20 20 20 69 6e 74  1_3 = 1;.    int
9820: 20 70 72 6f 74 6f 20 3d 20 30 2c 20 6c 65 76 65   proto = 0, leve
9830: 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 69 6e 74 20  l = -1;.    int 
9840: 76 65 72 69 66 79 20 3d 20 30 2c 20 72 65 71 75  verify = 0, requ
9850: 69 72 65 20 3d 20 30 2c 20 72 65 71 75 65 73 74  ire = 0, request
9860: 20 3d 20 31 2c 20 70 6f 73 74 5f 68 61 6e 64 73   = 1, post_hands
9870: 68 61 6b 65 20 3d 20 30 3b 0a 20 20 20 20 28 76  hake = 0;.    (v
9880: 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 74 61 3b  oid) clientData;
9890: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
98a0: 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 20 64 65  alled");..#if de
98b0: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 7c  fined(NO_TLS1) |
98c0: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  | defined(OPENSS
98d0: 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 20 20 20 20 74  L_NO_TLS1).    t
98e0: 6c 73 31 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  ls1 = 0;.#endif.
98f0: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54  #if defined(NO_T
9900: 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65  LS1_1) || define
9910: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
9920: 31 5f 31 29 0a 20 20 20 20 74 6c 73 31 5f 31 20  1_1).    tls1_1 
9930: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  = 0;.#endif.#if 
9940: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f  defined(NO_TLS1_
9950: 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50  2) || defined(OP
9960: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29  ENSSL_NO_TLS1_2)
9970: 0a 20 20 20 20 74 6c 73 31 5f 32 20 3d 20 30 3b  .    tls1_2 = 0;
9980: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
9990: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c  ned(NO_TLS1_3) |
99a0: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  | defined(OPENSS
99b0: 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20  L_NO_TLS1_3).   
99c0: 20 74 6c 73 31 5f 33 20 3d 20 30 3b 0a 23 65 6e   tls1_3 = 0;.#en
99d0: 64 69 66 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a  dif..    if (obj
99e0: 63 20 3c 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72  c < 2) {..Tcl_Wr
99f0: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
9a00: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61  p, 1, objv, "cha
9a10: 6e 6e 65 6c 20 3f 6f 70 74 69 6f 6e 73 3f 22 29  nnel ?options?")
9a20: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
9a30: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
9a40: 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28  ERR_clear_error(
9a50: 29 3b 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54  );..    chan = T
9a60: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e  cl_GetChannel(in
9a70: 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
9a80: 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55  ing(objv[1]), NU
9a90: 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61  LL);.    if (cha
9aa0: 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65  n == (Tcl_Channe
9ab0: 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75  l) NULL) {..retu
9ac0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
9ad0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65    }..    /* Make
9ae0: 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65   sure to operate
9af0: 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20   on the topmost 
9b00: 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63  channel */.    c
9b10: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70  han = Tcl_GetTop
9b20: 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a  Channel(chan);..
9b30: 20 20 20 20 66 6f 72 20 28 69 64 78 20 3d 20 32      for (idx = 2
9b40: 3b 20 69 64 78 20 3c 20 6f 62 6a 63 3b 20 69 64  ; idx < objc; id
9b50: 78 2b 2b 29 20 7b 0a 09 63 68 61 72 20 2a 6f 70  x++) {..char *op
9b60: 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  t = Tcl_GetStrin
9b70: 67 28 6f 62 6a 76 5b 69 64 78 5d 29 3b 0a 0a 09  g(objv[idx]);...
9b80: 69 66 20 28 6f 70 74 5b 30 5d 20 21 3d 20 27 2d  if (opt[0] != '-
9b90: 27 29 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a  ')..    break;..
9ba0: 09 4f 50 54 4f 42 4a 28 22 2d 61 6c 70 6e 22 2c  .OPTOBJ("-alpn",
9bb0: 20 61 6c 70 6e 29 3b 0a 09 4f 50 54 53 54 52 28   alpn);..OPTSTR(
9bc0: 22 2d 63 61 64 69 72 22 2c 20 43 41 70 61 74 68  "-cadir", CApath
9bd0: 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 61 66  );..OPTSTR("-caf
9be0: 69 6c 65 22 2c 20 43 41 66 69 6c 65 29 3b 0a 09  ile", CAfile);..
9bf0: 4f 50 54 53 54 52 28 22 2d 63 61 73 74 6f 72 65  OPTSTR("-castore
9c00: 22 2c 20 43 41 73 74 6f 72 65 29 3b 0a 09 4f 50  ", CAstore);..OP
9c10: 54 42 59 54 45 28 22 2d 63 65 72 74 22 2c 20 63  TBYTE("-cert", c
9c20: 65 72 74 2c 20 63 65 72 74 5f 6c 65 6e 29 3b 0a  ert, cert_len);.
9c30: 09 4f 50 54 53 54 52 28 22 2d 63 65 72 74 66 69  .OPTSTR("-certfi
9c40: 6c 65 22 2c 20 63 65 72 74 66 69 6c 65 29 3b 0a  le", certfile);.
9c50: 09 4f 50 54 53 54 52 28 22 2d 63 69 70 68 65 72  .OPTSTR("-cipher
9c60: 22 2c 20 63 69 70 68 65 72 73 29 3b 0a 09 4f 50  ", ciphers);..OP
9c70: 54 53 54 52 28 22 2d 63 69 70 68 65 72 73 22 2c  TSTR("-ciphers",
9c80: 20 63 69 70 68 65 72 73 29 3b 0a 09 4f 50 54 53   ciphers);..OPTS
9c90: 54 52 28 22 2d 63 69 70 68 65 72 73 75 69 74 65  TR("-ciphersuite
9ca0: 73 22 2c 20 63 69 70 68 65 72 73 75 69 74 65 73  s", ciphersuites
9cb0: 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 63 6f 6d  );..OPTOBJ("-com
9cc0: 6d 61 6e 64 22 2c 20 73 63 72 69 70 74 29 3b 0a  mand", script);.
9cd0: 09 4f 50 54 53 54 52 28 22 2d 64 68 70 61 72 61  .OPTSTR("-dhpara
9ce0: 6d 73 22 2c 20 44 48 70 61 72 61 6d 73 29 3b 0a  ms", DHparams);.
9cf0: 09 4f 50 54 42 59 54 45 28 22 2d 6b 65 79 22 2c  .OPTBYTE("-key",
9d00: 20 6b 65 79 2c 20 6b 65 79 5f 6c 65 6e 29 3b 0a   key, key_len);.
9d10: 09 4f 50 54 53 54 52 28 22 2d 6b 65 79 66 69 6c  .OPTSTR("-keyfil
9d20: 65 22 2c 20 6b 65 79 66 69 6c 65 29 3b 0a 09 4f  e", keyfile);..O
9d30: 50 54 53 54 52 28 22 2d 6d 6f 64 65 6c 22 2c 20  PTSTR("-model", 
9d40: 6d 6f 64 65 6c 29 3b 0a 09 4f 50 54 4f 42 4a 28  model);..OPTOBJ(
9d50: 22 2d 70 61 73 73 77 6f 72 64 22 2c 20 70 61 73  "-password", pas
9d60: 73 77 6f 72 64 29 3b 0a 09 4f 50 54 42 4f 4f 4c  sword);..OPTBOOL
9d70: 28 22 2d 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b  ("-post_handshak
9d80: 65 22 2c 20 70 6f 73 74 5f 68 61 6e 64 73 68 61  e", post_handsha
9d90: 6b 65 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d  ke);..OPTBOOL("-
9da0: 72 65 71 75 65 73 74 22 2c 20 72 65 71 75 65 73  request", reques
9db0: 74 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 72  t);..OPTBOOL("-r
9dc0: 65 71 75 69 72 65 22 2c 20 72 65 71 75 69 72 65  equire", require
9dd0: 29 3b 0a 09 4f 50 54 49 4e 54 28 22 2d 73 65 63  );..OPTINT("-sec
9de0: 75 72 69 74 79 5f 6c 65 76 65 6c 22 2c 20 6c 65  urity_level", le
9df0: 76 65 6c 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22  vel);..OPTBOOL("
9e00: 2d 73 65 72 76 65 72 22 2c 20 73 65 72 76 65 72  -server", server
9e10: 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 73 65 72  );..OPTSTR("-ser
9e20: 76 65 72 6e 61 6d 65 22 2c 20 73 65 72 76 65 72  vername", server
9e30: 6e 61 6d 65 29 3b 0a 09 4f 50 54 53 54 52 28 22  name);..OPTSTR("
9e40: 2d 73 65 73 73 69 6f 6e 5f 69 64 22 2c 20 73 65  -session_id", se
9e50: 73 73 69 6f 6e 5f 69 64 29 3b 0a 09 4f 50 54 42  ssion_id);..OPTB
9e60: 4f 4f 4c 28 22 2d 73 73 6c 32 22 2c 20 73 73 6c  OOL("-ssl2", ssl
9e70: 32 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 73  2);..OPTBOOL("-s
9e80: 73 6c 33 22 2c 20 73 73 6c 33 29 3b 0a 09 4f 50  sl3", ssl3);..OP
9e90: 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 22 2c 20 74  TBOOL("-tls1", t
9ea0: 6c 73 31 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22  ls1);..OPTBOOL("
9eb0: 2d 74 6c 73 31 2e 31 22 2c 20 74 6c 73 31 5f 31  -tls1.1", tls1_1
9ec0: 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c  );..OPTBOOL("-tl
9ed0: 73 31 2e 32 22 2c 20 74 6c 73 31 5f 32 29 3b 0a  s1.2", tls1_2);.
9ee0: 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e  .OPTBOOL("-tls1.
9ef0: 33 22 2c 20 74 6c 73 31 5f 33 29 3b 0a 09 4f 50  3", tls1_3);..OP
9f00: 54 4f 42 4a 28 22 2d 76 61 6c 69 64 61 74 65 63  TOBJ("-validatec
9f10: 6f 6d 6d 61 6e 64 22 2c 20 76 63 6d 64 29 3b 0a  ommand", vcmd);.
9f20: 09 4f 50 54 4f 42 4a 28 22 2d 76 63 6d 64 22 2c  .OPTOBJ("-vcmd",
9f30: 20 76 63 6d 64 29 3b 0a 0a 09 4f 50 54 42 41 44   vcmd);...OPTBAD
9f40: 28 22 6f 70 74 69 6f 6e 22 2c 20 22 2d 61 6c 70  ("option", "-alp
9f50: 6e 2c 20 2d 63 61 64 69 72 2c 20 2d 63 61 66 69  n, -cadir, -cafi
9f60: 6c 65 2c 20 2d 63 61 73 74 6f 72 65 2c 20 2d 63  le, -castore, -c
9f70: 65 72 74 2c 20 2d 63 65 72 74 66 69 6c 65 2c 20  ert, -certfile, 
9f80: 2d 63 69 70 68 65 72 2c 20 2d 63 69 70 68 65 72  -cipher, -cipher
9f90: 73 75 69 74 65 73 2c 20 2d 63 6f 6d 6d 61 6e 64  suites, -command
9fa0: 2c 20 2d 64 68 70 61 72 61 6d 73 2c 20 2d 6b 65  , -dhparams, -ke
9fb0: 79 2c 20 2d 6b 65 79 66 69 6c 65 2c 20 2d 6d 6f  y, -keyfile, -mo
9fc0: 64 65 6c 2c 20 2d 70 61 73 73 77 6f 72 64 2c 20  del, -password, 
9fd0: 2d 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 2c  -post_handshake,
9fe0: 20 2d 72 65 71 75 65 73 74 2c 20 2d 72 65 71 75   -request, -requ
9ff0: 69 72 65 2c 20 2d 73 65 63 75 72 69 74 79 5f 6c  ire, -security_l
a000: 65 76 65 6c 2c 20 2d 73 65 72 76 65 72 2c 20 2d  evel, -server, -
a010: 73 65 72 76 65 72 6e 61 6d 65 2c 20 2d 73 65 73  servername, -ses
a020: 73 69 6f 6e 5f 69 64 2c 20 2d 73 73 6c 32 2c 20  sion_id, -ssl2, 
a030: 2d 73 73 6c 33 2c 20 2d 74 6c 73 31 2c 20 2d 74  -ssl3, -tls1, -t
a040: 6c 73 31 2e 31 2c 20 2d 74 6c 73 31 2e 32 2c 20  ls1.1, -tls1.2, 
a050: 2d 74 6c 73 31 2e 33 2c 20 6f 72 20 2d 76 61 6c  -tls1.3, or -val
a060: 69 64 61 74 65 63 6f 6d 6d 61 6e 64 22 29 3b 0a  idatecommand");.
a070: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
a080: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OR;.    }.    if
a090: 20 28 72 65 71 75 65 73 74 29 09 09 76 65 72 69   (request)..veri
a0a0: 66 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59  fy |= SSL_VERIFY
a0b0: 5f 43 4c 49 45 4e 54 5f 4f 4e 43 45 20 7c 20 53  _CLIENT_ONCE | S
a0c0: 53 4c 5f 56 45 52 49 46 59 5f 50 45 45 52 3b 0a  SL_VERIFY_PEER;.
a0d0: 20 20 20 20 69 66 20 28 72 65 71 75 65 73 74 20      if (request 
a0e0: 26 26 20 72 65 71 75 69 72 65 29 09 76 65 72 69  && require).veri
a0f0: 66 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59  fy |= SSL_VERIFY
a100: 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52  _FAIL_IF_NO_PEER
a110: 5f 43 45 52 54 3b 0a 20 20 20 20 69 66 20 28 72  _CERT;.    if (r
a120: 65 71 75 65 73 74 20 26 26 20 70 6f 73 74 5f 68  equest && post_h
a130: 61 6e 64 73 68 61 6b 65 29 09 76 65 72 69 66 79  andshake).verify
a140: 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 50   |= SSL_VERIFY_P
a150: 4f 53 54 5f 48 41 4e 44 53 48 41 4b 45 3b 0a 20  OST_HANDSHAKE;. 
a160: 20 20 20 69 66 20 28 76 65 72 69 66 79 20 3d 3d     if (verify ==
a170: 20 30 29 09 09 76 65 72 69 66 79 20 3d 20 53 53   0)..verify = SS
a180: 4c 5f 56 45 52 49 46 59 5f 4e 4f 4e 45 3b 0a 0a  L_VERIFY_NONE;..
a190: 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 73 73      proto |= (ss
a1a0: 6c 32 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 53  l2 ? TLS_PROTO_S
a1b0: 53 4c 32 20 3a 20 30 29 3b 0a 20 20 20 20 70 72  SL2 : 0);.    pr
a1c0: 6f 74 6f 20 7c 3d 20 28 73 73 6c 33 20 3f 20 54  oto |= (ssl3 ? T
a1d0: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 20 3a 20  LS_PROTO_SSL3 : 
a1e0: 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d  0);.    proto |=
a1f0: 20 28 74 6c 73 31 20 3f 20 54 4c 53 5f 50 52 4f   (tls1 ? TLS_PRO
a200: 54 4f 5f 54 4c 53 31 20 3a 20 30 29 3b 0a 20 20  TO_TLS1 : 0);.  
a210: 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31    proto |= (tls1
a220: 5f 31 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54  _1 ? TLS_PROTO_T
a230: 4c 53 31 5f 31 20 3a 20 30 29 3b 0a 20 20 20 20  LS1_1 : 0);.    
a240: 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 32  proto |= (tls1_2
a250: 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53   ? TLS_PROTO_TLS
a260: 31 5f 32 20 3a 20 30 29 3b 0a 20 20 20 20 70 72  1_2 : 0);.    pr
a270: 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 33 20 3f  oto |= (tls1_3 ?
a280: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f   TLS_PROTO_TLS1_
a290: 33 20 3a 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20  3 : 0);..    /* 
a2a0: 72 65 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69 66  reset to NULL if
a2b0: 20 62 6c 61 6e 6b 20 73 74 72 69 6e 67 20 70 72   blank string pr
a2c0: 6f 76 69 64 65 64 20 2a 2f 0a 20 20 20 20 69 66  ovided */.    if
a2d0: 20 28 63 65 72 74 20 26 26 20 21 2a 63 65 72 74   (cert && !*cert
a2e0: 29 09 09 20 20 20 20 20 20 20 20 63 65 72 74 09  )..        cert.
a2f0: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a          = NULL;.
a300: 20 20 20 20 69 66 20 28 6b 65 79 20 26 26 20 21      if (key && !
a310: 2a 6b 65 79 29 09 09 20 20 20 20 20 20 20 20 6b  *key)..        k
a320: 65 79 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c  ey.        = NUL
a330: 4c 3b 0a 20 20 20 20 69 66 20 28 63 65 72 74 66  L;.    if (certf
a340: 69 6c 65 20 26 26 20 21 2a 63 65 72 74 66 69 6c  ile && !*certfil
a350: 65 29 20 20 20 20 20 20 20 20 20 63 65 72 74 66  e)         certf
a360: 69 6c 65 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  ile.= NULL;.    
a370: 69 66 20 28 6b 65 79 66 69 6c 65 20 26 26 20 21  if (keyfile && !
a380: 2a 6b 65 79 66 69 6c 65 29 09 09 6b 65 79 66 69  *keyfile)..keyfi
a390: 6c 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c  le.        = NUL
a3a0: 4c 3b 0a 20 20 20 20 69 66 20 28 63 69 70 68 65  L;.    if (ciphe
a3b0: 72 73 20 26 26 20 21 2a 63 69 70 68 65 72 73 29  rs && !*ciphers)
a3c0: 09 20 20 20 20 20 20 20 20 63 69 70 68 65 72 73  .        ciphers
a3d0: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b  .        = NULL;
a3e0: 0a 20 20 20 20 69 66 20 28 63 69 70 68 65 72 73  .    if (ciphers
a3f0: 75 69 74 65 73 20 26 26 20 21 2a 63 69 70 68 65  uites && !*ciphe
a400: 72 73 75 69 74 65 73 29 20 63 69 70 68 65 72 73  rsuites) ciphers
a410: 75 69 74 65 73 20 20 20 20 3d 20 4e 55 4c 4c 3b  uites    = NULL;
a420: 0a 20 20 20 20 69 66 20 28 43 41 66 69 6c 65 20  .    if (CAfile 
a430: 26 26 20 21 2a 43 41 66 69 6c 65 29 09 20 20 20  && !*CAfile).   
a440: 20 20 20 20 20 43 41 66 69 6c 65 09 20 20 20 20       CAfile.    
a450: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20      = NULL;.    
a460: 69 66 20 28 43 41 70 61 74 68 20 26 26 20 21 2a  if (CApath && !*
a470: 43 41 70 61 74 68 29 09 20 20 20 20 20 20 20 20  CApath).        
a480: 43 41 70 61 74 68 09 20 20 20 20 20 20 20 20 3d  CApath.        =
a490: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 43   NULL;.    if (C
a4a0: 41 73 74 6f 72 65 20 26 26 20 21 2a 43 41 73 74  Astore && !*CAst
a4b0: 6f 72 65 29 09 20 20 20 20 20 20 20 20 43 41 73  ore).        CAs
a4c0: 74 6f 72 65 09 20 20 20 20 20 20 20 20 3d 20 4e  tore.        = N
a4d0: 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 44 48 70  ULL;.    if (DHp
a4e0: 61 72 61 6d 73 20 26 26 20 21 2a 44 48 70 61 72  arams && !*DHpar
a4f0: 61 6d 73 29 09 20 20 20 20 20 20 20 20 44 48 70  ams).        DHp
a500: 61 72 61 6d 73 20 20 20 20 20 20 20 20 3d 20 4e  arams        = N
a510: 55 4c 4c 3b 0a 0a 20 20 20 20 2f 2a 20 6e 65 77  ULL;..    /* new
a520: 20 53 53 4c 20 73 74 61 74 65 20 2a 2f 0a 20 20   SSL state */.  
a530: 20 20 73 74 61 74 65 50 74 72 09 09 3d 20 28 53    statePtr..= (S
a540: 74 61 74 65 20 2a 29 20 63 6b 61 6c 6c 6f 63 28  tate *) ckalloc(
a550: 28 75 6e 73 69 67 6e 65 64 29 20 73 69 7a 65 6f  (unsigned) sizeo
a560: 66 28 53 74 61 74 65 29 29 3b 0a 20 20 20 20 6d  f(State));.    m
a570: 65 6d 73 65 74 28 73 74 61 74 65 50 74 72 2c 20  emset(statePtr, 
a580: 30 2c 20 73 69 7a 65 6f 66 28 53 74 61 74 65 29  0, sizeof(State)
a590: 29 3b 0a 0a 20 20 20 20 73 74 61 74 65 50 74 72  );..    statePtr
a5a0: 2d 3e 66 6c 61 67 73 09 3d 20 66 6c 61 67 73 3b  ->flags.= flags;
a5b0: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 69  .    statePtr->i
a5c0: 6e 74 65 72 70 09 3d 20 69 6e 74 65 72 70 3b 0a  nterp.= interp;.
a5d0: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 77 61      statePtr->wa
a5e0: 6e 74 09 3d 20 30 3b 0a 20 20 20 20 73 74 61 74  nt.= 0;.    stat
a5f0: 65 50 74 72 2d 3e 76 66 6c 61 67 73 09 3d 20 76  ePtr->vflags.= v
a600: 65 72 69 66 79 3b 0a 20 20 20 20 73 74 61 74 65  erify;.    state
a610: 50 74 72 2d 3e 65 72 72 09 3d 20 22 22 3b 0a 0a  Ptr->err.= "";..
a620: 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20      /* allocate 
a630: 73 63 72 69 70 74 20 2a 2f 0a 20 20 20 20 69 66  script */.    if
a640: 20 28 73 63 72 69 70 74 29 20 7b 0a 09 28 76 6f   (script) {..(vo
a650: 69 64 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  id) Tcl_GetStrin
a660: 67 46 72 6f 6d 4f 62 6a 28 73 63 72 69 70 74 2c  gFromObj(script,
a670: 20 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e   &len);..if (len
a680: 29 20 7b 0a 09 20 20 20 20 73 74 61 74 65 50 74  ) {..    statePt
a690: 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 20 73 63  r->callback = sc
a6a0: 72 69 70 74 3b 0a 09 20 20 20 20 54 63 6c 5f 49  ript;..    Tcl_I
a6b0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74  ncrRefCount(stat
a6c0: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b  ePtr->callback);
a6d0: 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ..}.    }..    /
a6e0: 2a 20 61 6c 6c 6f 63 61 74 65 20 70 61 73 73 77  * allocate passw
a6f0: 6f 72 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 70  ord */.    if (p
a700: 61 73 73 77 6f 72 64 29 20 7b 0a 09 28 76 6f 69  assword) {..(voi
a710: 64 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  d) Tcl_GetString
a720: 46 72 6f 6d 4f 62 6a 28 70 61 73 73 77 6f 72 64  FromObj(password
a730: 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65  , &len);..if (le
a740: 6e 29 20 7b 0a 09 20 20 20 20 73 74 61 74 65 50  n) {..    stateP
a750: 74 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d 20 70  tr->password = p
a760: 61 73 73 77 6f 72 64 3b 0a 09 20 20 20 20 54 63  assword;..    Tc
a770: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 73  l_IncrRefCount(s
a780: 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72  tatePtr->passwor
a790: 64 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20  d);..}.    }..  
a7a0: 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 76 61    /* allocate va
a7b0: 6c 69 64 61 74 65 20 63 6f 6d 6d 61 6e 64 20 2a  lidate command *
a7c0: 2f 0a 20 20 20 20 69 66 20 28 76 63 6d 64 29 20  /.    if (vcmd) 
a7d0: 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c 5f 47 65  {..(void) Tcl_Ge
a7e0: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 76  tStringFromObj(v
a7f0: 63 6d 64 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20  cmd, &len);..if 
a800: 28 6c 65 6e 29 20 7b 0a 09 20 20 20 20 73 74 61  (len) {..    sta
a810: 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 20 76 63  tePtr->vcmd = vc
a820: 6d 64 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63  md;..    Tcl_Inc
a830: 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50  rRefCount(stateP
a840: 74 72 2d 3e 76 63 6d 64 29 3b 0a 09 7d 0a 20 20  tr->vcmd);..}.  
a850: 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 6d 6f 64    }..    if (mod
a860: 65 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69  el != NULL) {..i
a870: 6e 74 20 6d 6f 64 65 3b 0a 09 2f 2a 20 47 65 74  nt mode;../* Get
a880: 20 74 68 65 20 22 6d 6f 64 65 6c 22 20 63 6f 6e   the "model" con
a890: 74 65 78 74 20 2a 2f 0a 09 63 68 61 6e 20 3d 20  text */..chan = 
a8a0: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69  Tcl_GetChannel(i
a8b0: 6e 74 65 72 70 2c 20 6d 6f 64 65 6c 2c 20 26 6d  nterp, model, &m
a8c0: 6f 64 65 29 3b 0a 09 69 66 20 28 63 68 61 6e 20  ode);..if (chan 
a8d0: 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29  == (Tcl_Channel)
a8e0: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 6c   NULL) {..    Tl
a8f0: 73 5f 46 72 65 65 28 28 74 6c 73 5f 66 72 65 65  s_Free((tls_free
a900: 5f 74 79 70 65 20 2a 29 20 73 74 61 74 65 50 74  _type *) statePt
a910: 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  r);..    return 
a920: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09  TCL_ERROR;..}...
a930: 2f 2a 0a 09 20 2a 20 4d 61 6b 65 20 73 75 72 65  /*.. * Make sure
a940: 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74   to operate on t
a950: 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e  he topmost chann
a960: 65 6c 0a 09 20 2a 2f 0a 09 63 68 61 6e 20 3d 20  el.. */..chan = 
a970: 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65  Tcl_GetTopChanne
a980: 6c 28 63 68 61 6e 29 3b 0a 09 69 66 20 28 54 63  l(chan);..if (Tc
a990: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65  l_GetChannelType
a9a0: 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68  (chan) != Tls_Ch
a9b0: 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09  annelType()) {..
a9c0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
a9d0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61  sult(interp, "ba
a9e0: 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54  d channel \"", T
a9f0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d  cl_GetChannelNam
aa00: 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20  e(chan),..."\": 
aa10: 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65  not a TLS channe
aa20: 6c 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  l", (char *) NUL
aa30: 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74  L);..    Tcl_Set
aa40: 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70  ErrorCode(interp
aa50: 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54  , "TLS", "IMPORT
aa60: 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49  ", "CHANNEL", "I
aa70: 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a  NVALID", (char *
aa80: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c  ) NULL);..    Tl
aa90: 73 5f 46 72 65 65 28 28 74 6c 73 5f 66 72 65 65  s_Free((tls_free
aaa0: 5f 74 79 70 65 20 2a 29 20 73 74 61 74 65 50 74  _type *) statePt
aab0: 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  r);..    return 
aac0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 09 63  TCL_ERROR;..}..c
aad0: 74 78 20 3d 20 28 28 53 74 61 74 65 20 2a 29 54  tx = ((State *)T
aae0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73  cl_GetChannelIns
aaf0: 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29 29  tanceData(chan))
ab00: 2d 3e 63 74 78 3b 0a 20 20 20 20 7d 20 65 6c 73  ->ctx;.    } els
ab10: 65 20 7b 0a 09 69 66 20 28 28 63 74 78 20 3d 20  e {..if ((ctx = 
ab20: 43 54 58 5f 49 6e 69 74 28 73 74 61 74 65 50 74  CTX_Init(statePt
ab30: 72 2c 20 73 65 72 76 65 72 2c 20 70 72 6f 74 6f  r, server, proto
ab40: 2c 20 6b 65 79 66 69 6c 65 2c 20 63 65 72 74 66  , keyfile, certf
ab50: 69 6c 65 2c 20 6b 65 79 2c 20 63 65 72 74 2c 20  ile, key, cert, 
ab60: 6b 65 79 5f 6c 65 6e 2c 0a 09 20 20 20 20 63 65  key_len,..    ce
ab70: 72 74 5f 6c 65 6e 2c 20 43 41 70 61 74 68 2c 20  rt_len, CApath, 
ab80: 43 41 73 74 6f 72 65 2c 20 43 41 66 69 6c 65 2c  CAstore, CAfile,
ab90: 20 63 69 70 68 65 72 73 2c 20 63 69 70 68 65 72   ciphers, cipher
aba0: 73 75 69 74 65 73 2c 20 6c 65 76 65 6c 2c 20 44  suites, level, D
abb0: 48 70 61 72 61 6d 73 29 29 20 3d 3d 20 4e 55 4c  Hparams)) == NUL
abc0: 4c 29 20 7b 0a 09 20 20 20 20 54 6c 73 5f 46 72  L) {..    Tls_Fr
abd0: 65 65 28 28 74 6c 73 5f 66 72 65 65 5f 74 79 70  ee((tls_free_typ
abe0: 65 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a  e *) statePtr);.
abf0: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
ac00: 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a  ERROR;..}.    }.
ac10: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 63  .    statePtr->c
ac20: 74 78 20 3d 20 63 74 78 3b 0a 0a 20 20 20 20 2f  tx = ctx;..    /
ac30: 2a 20 50 72 65 73 65 72 76 65 20 63 68 61 6e 6e  * Preserve chann
ac40: 65 6c 20 63 6f 6e 66 69 67 20 2a 2f 0a 20 20 20  el config */.   
ac50: 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74   Tcl_DStringInit
ac60: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72  (&upperChannelTr
ac70: 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20  anslation);.    
ac80: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28  Tcl_DStringInit(
ac90: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f  &upperChannelBlo
aca0: 63 6b 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f  cking);.    Tcl_
acb0: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70  DStringInit(&upp
acc0: 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72  erChannelEOFChar
acd0: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69  );.    Tcl_DStri
ace0: 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 68 61  ngInit(&upperCha
acf0: 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20  nnelEncoding);. 
ad00: 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65     Tcl_GetChanne
ad10: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20  lOption(interp, 
ad20: 63 68 61 6e 2c 20 22 2d 65 6f 66 63 68 61 72 22  chan, "-eofchar"
ad30: 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45  , &upperChannelE
ad40: 4f 46 43 68 61 72 29 3b 0a 20 20 20 20 54 63 6c  OFChar);.    Tcl
ad50: 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f  _GetChannelOptio
ad60: 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20  n(interp, chan, 
ad70: 22 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 26 75 70  "-encoding", &up
ad80: 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69  perChannelEncodi
ad90: 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74  ng);.    Tcl_Get
ada0: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e  ChannelOption(in
adb0: 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72  terp, chan, "-tr
adc0: 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 26 75 70 70  anslation", &upp
add0: 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61  erChannelTransla
ade0: 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 47  tion);.    Tcl_G
adf0: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28  etChannelOption(
ae00: 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d  interp, chan, "-
ae10: 62 6c 6f 63 6b 69 6e 67 22 2c 20 26 75 70 70 65  blocking", &uppe
ae20: 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67  rChannelBlocking
ae30: 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 6e 73 75 72  );..    /* Ensur
ae40: 65 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 77 6f  e the channel wo
ae50: 72 6b 73 20 69 6e 20 62 69 6e 61 72 79 20 6d 6f  rks in binary mo
ae60: 64 65 20 28 66 6f 72 20 74 68 65 20 65 6e 63 72  de (for the encr
ae70: 79 70 74 69 6f 6e 20 6e 6f 74 20 74 6f 20 67 65  yption not to ge
ae80: 74 20 67 6f 6f 66 65 64 20 75 70 29 2e 20 2a 2f  t goofed up). */
ae90: 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e  .    Tcl_SetChan
aea0: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70  nelOption(interp
aeb0: 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61 6e 73 6c  , chan, "-transl
aec0: 61 74 69 6f 6e 22 2c 20 22 62 69 6e 61 72 79 22  ation", "binary"
aed0: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68  );.    Tcl_SetCh
aee0: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65  annelOption(inte
aef0: 72 70 2c 20 63 68 61 6e 2c 20 22 2d 62 6c 6f 63  rp, chan, "-bloc
af00: 6b 69 6e 67 22 2c 20 22 74 72 75 65 22 29 3b 0a  king", "true");.
af10: 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 73  .    /* Create s
af20: 74 61 63 6b 65 64 20 63 68 61 6e 6e 65 6c 20 2a  tacked channel *
af30: 2f 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  /.    dprintf("C
af40: 6f 6e 73 75 6d 69 6e 67 20 54 63 6c 20 63 68 61  onsuming Tcl cha
af50: 6e 6e 65 6c 20 25 73 22 2c 20 54 63 6c 5f 47 65  nnel %s", Tcl_Ge
af60: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61  tChannelName(cha
af70: 6e 29 29 3b 0a 20 20 20 20 73 74 61 74 65 50 74  n));.    statePt
af80: 72 2d 3e 73 65 6c 66 20 3d 20 54 63 6c 5f 53 74  r->self = Tcl_St
af90: 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72  ackChannel(inter
afa0: 70 2c 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79  p, Tls_ChannelTy
afb0: 70 65 28 29 2c 20 28 43 6c 69 65 6e 74 44 61 74  pe(), (ClientDat
afc0: 61 29 20 73 74 61 74 65 50 74 72 2c 0a 09 28 54  a) statePtr,..(T
afd0: 43 4c 5f 52 45 41 44 41 42 4c 45 20 7c 20 54 43  CL_READABLE | TC
afe0: 4c 5f 57 52 49 54 41 42 4c 45 29 2c 20 63 68 61  L_WRITABLE), cha
aff0: 6e 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28  n);.    dprintf(
b000: 22 43 72 65 61 74 65 64 20 63 68 61 6e 6e 65 6c  "Created channel
b010: 20 6e 61 6d 65 64 20 25 73 22 2c 20 54 63 6c 5f   named %s", Tcl_
b020: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73  GetChannelName(s
b030: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 29 3b  tatePtr->self));
b040: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
b050: 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 63 6c 5f  r->self == (Tcl_
b060: 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b  Channel) NULL) {
b070: 0a 09 2f 2a 0a 09 20 2a 20 4e 6f 20 75 73 65 20  ../*.. * No use 
b080: 6f 66 20 54 63 6c 5f 45 76 65 6e 74 75 61 6c 6c  of Tcl_Eventuall
b090: 79 46 72 65 65 20 62 65 63 61 75 73 65 20 6e 6f  yFree because no
b0a0: 20 70 6f 73 73 69 62 6c 65 20 54 63 6c 5f 50 72   possible Tcl_Pr
b0b0: 65 73 65 72 76 65 2e 0a 09 20 2a 2f 0a 09 54 6c  eserve... */..Tl
b0c0: 73 5f 46 72 65 65 28 28 74 6c 73 5f 66 72 65 65  s_Free((tls_free
b0d0: 5f 74 79 70 65 20 2a 29 20 73 74 61 74 65 50 74  _type *) statePt
b0e0: 72 29 3b 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67  r);..Tcl_DString
b0f0: 46 72 65 65 28 26 75 70 70 65 72 43 68 61 6e 6e  Free(&upperChann
b100: 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a  elTranslation);.
b110: 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65  .Tcl_DStringFree
b120: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e  (&upperChannelEn
b130: 63 6f 64 69 6e 67 29 3b 0a 09 54 63 6c 5f 44 53  coding);..Tcl_DS
b140: 74 72 69 6e 67 46 72 65 65 28 26 75 70 70 65 72  tringFree(&upper
b150: 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b  ChannelEOFChar);
b160: 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65  ..Tcl_DStringFre
b170: 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42  e(&upperChannelB
b180: 6c 6f 63 6b 69 6e 67 29 3b 0a 09 72 65 74 75 72  locking);..retur
b190: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
b1a0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 74 6f   }..    /* Resto
b1b0: 72 65 20 63 68 61 6e 6e 65 6c 20 63 6f 6e 66 69  re channel confi
b1c0: 67 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 53 65 74  g */.    Tcl_Set
b1d0: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e  ChannelOption(in
b1e0: 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e  terp, statePtr->
b1f0: 73 65 6c 66 2c 20 22 2d 74 72 61 6e 73 6c 61 74  self, "-translat
b200: 69 6f 6e 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e  ion", Tcl_DStrin
b210: 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 61  gValue(&upperCha
b220: 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29  nnelTranslation)
b230: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68  );.    Tcl_SetCh
b240: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65  annelOption(inte
b250: 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65  rp, statePtr->se
b260: 6c 66 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 22 2c  lf, "-encoding",
b270: 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75   Tcl_DStringValu
b280: 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45  e(&upperChannelE
b290: 6e 63 6f 64 69 6e 67 29 29 3b 0a 20 20 20 20 54  ncoding));.    T
b2a0: 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74  cl_SetChannelOpt
b2b0: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74  ion(interp, stat
b2c0: 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 65 6f  ePtr->self, "-eo
b2d0: 66 63 68 61 72 22 2c 20 54 63 6c 5f 44 53 74 72  fchar", Tcl_DStr
b2e0: 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 43  ingValue(&upperC
b2f0: 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 29 3b  hannelEOFChar));
b300: 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e  .    Tcl_SetChan
b310: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70  nelOption(interp
b320: 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66  , statePtr->self
b330: 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 54  , "-blocking", T
b340: 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28  cl_DStringValue(
b350: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f  &upperChannelBlo
b360: 63 6b 69 6e 67 29 29 3b 0a 20 20 20 20 54 63 6c  cking));.    Tcl
b370: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 75 70  _DStringFree(&up
b380: 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c  perChannelTransl
b390: 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f  ation);.    Tcl_
b3a0: 44 53 74 72 69 6e 67 46 72 65 65 28 26 75 70 70  DStringFree(&upp
b3b0: 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e  erChannelEncodin
b3c0: 67 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72  g);.    Tcl_DStr
b3d0: 69 6e 67 46 72 65 65 28 26 75 70 70 65 72 43 68  ingFree(&upperCh
b3e0: 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20  annelEOFChar);. 
b3f0: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72     Tcl_DStringFr
b400: 65 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c  ee(&upperChannel
b410: 42 6c 6f 63 6b 69 6e 67 29 3b 0a 0a 20 20 20 20  Blocking);..    
b420: 2f 2a 0a 20 20 20 20 20 2a 20 53 53 4c 20 49 6e  /*.     * SSL In
b430: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 20  itialization.   
b440: 20 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74    */.    statePt
b450: 72 2d 3e 73 73 6c 20 3d 20 53 53 4c 5f 6e 65 77  r->ssl = SSL_new
b460: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29 3b  (statePtr->ctx);
b470: 0a 20 20 20 20 69 66 20 28 21 73 74 61 74 65 50  .    if (!stateP
b480: 74 72 2d 3e 73 73 6c 29 20 7b 0a 09 2f 2a 20 53  tr->ssl) {../* S
b490: 53 4c 20 6c 69 62 72 61 72 79 20 65 72 72 6f 72  SL library error
b4a0: 20 2a 2f 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52   */..Tcl_AppendR
b4b0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63  esult(interp, "c
b4c0: 6f 75 6c 64 6e 27 74 20 63 6f 6e 73 74 72 75 63  ouldn't construc
b4d0: 74 20 73 73 6c 20 73 65 73 73 69 6f 6e 3a 20 22  t ssl session: "
b4e0: 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e  , GET_ERR_REASON
b4f0: 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  (), (char *) NUL
b500: 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74  L);..    Tcl_Set
b510: 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70  ErrorCode(interp
b520: 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54  , "TLS", "IMPORT
b530: 22 2c 20 22 49 4e 49 54 22 2c 20 22 46 41 49 4c  ", "INIT", "FAIL
b540: 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  ED", (char *) NU
b550: 4c 4c 29 3b 0a 09 54 6c 73 5f 46 72 65 65 28 28  LL);..Tls_Free((
b560: 74 6c 73 5f 66 72 65 65 5f 74 79 70 65 20 2a 29  tls_free_type *)
b570: 20 73 74 61 74 65 50 74 72 29 3b 0a 09 72 65 74   statePtr);..ret
b580: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
b590: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74     }..    /* Set
b5a0: 20 68 6f 73 74 20 73 65 72 76 65 72 20 6e 61 6d   host server nam
b5b0: 65 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 65 72  e */.    if (ser
b5c0: 76 65 72 6e 61 6d 65 29 20 7b 0a 09 2f 2a 20 53  vername) {../* S
b5d0: 65 74 73 20 74 68 65 20 73 65 72 76 65 72 20 6e  ets the server n
b5e0: 61 6d 65 20 69 6e 64 69 63 61 74 69 6f 6e 20 28  ame indication (
b5f0: 53 4e 49 29 20 69 6e 20 43 6c 69 65 6e 74 48 65  SNI) in ClientHe
b600: 6c 6c 6f 20 65 78 74 65 6e 73 69 6f 6e 20 2a 2f  llo extension */
b610: 0a 09 2f 2a 20 50 65 72 20 52 46 43 20 36 30 36  ../* Per RFC 606
b620: 36 2c 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 61  6, hostname is a
b630: 20 41 53 43 49 49 20 65 6e 63 6f 64 65 64 20 73   ASCII encoded s
b640: 74 72 69 6e 67 2c 20 74 68 6f 75 67 68 20 52 46  tring, though RF
b650: 43 20 34 33 36 36 20 73 61 79 73 20 55 54 46 2d  C 4366 says UTF-
b660: 38 2e 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f  8. */..if (!SSL_
b670: 73 65 74 5f 74 6c 73 65 78 74 5f 68 6f 73 74 5f  set_tlsext_host_
b680: 6e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73  name(statePtr->s
b690: 73 6c 2c 20 73 65 72 76 65 72 6e 61 6d 65 29 20  sl, servername) 
b6a0: 26 26 20 72 65 71 75 69 72 65 29 20 7b 0a 09 20  && require) {.. 
b6b0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
b6c0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74  ult(interp, "Set
b6d0: 20 53 4e 49 20 65 78 74 65 6e 73 69 6f 6e 20 66   SNI extension f
b6e0: 61 69 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45 52  ailed: ", GET_ER
b6f0: 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61  R_REASON(), (cha
b700: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20  r *) NULL);..   
b710: 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64   Tcl_SetErrorCod
b720: 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c  e(interp, "TLS",
b730: 20 22 49 4d 50 4f 52 54 22 2c 20 22 53 4e 49 22   "IMPORT", "SNI"
b740: 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61  , "FAILED", (cha
b750: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20  r *) NULL);..   
b760: 20 54 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f 66   Tls_Free((tls_f
b770: 72 65 65 5f 74 79 70 65 20 2a 29 20 73 74 61 74  ree_type *) stat
b780: 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75  ePtr);..    retu
b790: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d  rn TCL_ERROR;..}
b7a0: 0a 0a 09 2f 2a 20 53 65 74 20 68 6f 73 74 6e 61  .../* Set hostna
b7b0: 6d 65 20 66 6f 72 20 70 65 65 72 20 63 65 72 74  me for peer cert
b7c0: 69 66 69 63 61 74 65 20 68 6f 73 74 6e 61 6d 65  ificate hostname
b7d0: 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 69 6e   verification in
b7e0: 20 63 6c 69 65 6e 74 73 2e 0a 09 20 20 20 44 6f   clients...   Do
b7f0: 6e 27 74 20 75 73 65 20 53 53 4c 5f 73 65 74 31  n't use SSL_set1
b800: 5f 68 6f 73 74 20 73 69 6e 63 65 20 69 74 20 68  _host since it h
b810: 61 73 20 6c 69 6d 69 74 61 74 69 6f 6e 73 2e 20  as limitations. 
b820: 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 61 64 64  */..if (!SSL_add
b830: 31 5f 68 6f 73 74 28 73 74 61 74 65 50 74 72 2d  1_host(statePtr-
b840: 3e 73 73 6c 2c 20 73 65 72 76 65 72 6e 61 6d 65  >ssl, servername
b850: 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70  )) {..    Tcl_Ap
b860: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
b870: 70 2c 20 22 53 65 74 20 44 4e 53 20 68 6f 73 74  p, "Set DNS host
b880: 6e 61 6d 65 20 66 61 69 6c 65 64 3a 20 22 2c 20  name failed: ", 
b890: 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29  GET_ERR_REASON()
b8a0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
b8b0: 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72  ;..    Tcl_SetEr
b8c0: 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  rorCode(interp, 
b8d0: 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c  "TLS", "IMPORT",
b8e0: 20 22 48 4f 53 54 4e 41 4d 45 22 2c 20 22 46 41   "HOSTNAME", "FA
b8f0: 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20  ILED", (char *) 
b900: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f  NULL);..    Tls_
b910: 46 72 65 65 28 28 74 6c 73 5f 66 72 65 65 5f 74  Free((tls_free_t
b920: 79 70 65 20 2a 29 20 73 74 61 74 65 50 74 72 29  ype *) statePtr)
b930: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  ;..    return TC
b940: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20  L_ERROR;..}.    
b950: 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 75 6d 65  }..    /* Resume
b960: 20 73 65 73 73 69 6f 6e 20 69 64 20 2a 2f 0a 20   session id */. 
b970: 20 20 20 69 66 20 28 73 65 73 73 69 6f 6e 5f 69     if (session_i
b980: 64 20 26 26 20 73 74 72 6c 65 6e 28 73 65 73 73  d && strlen(sess
b990: 69 6f 6e 5f 69 64 29 20 3c 3d 20 53 53 4c 5f 4d  ion_id) <= SSL_M
b9a0: 41 58 5f 53 49 44 5f 43 54 58 5f 4c 45 4e 47 54  AX_SID_CTX_LENGT
b9b0: 48 29 20 7b 0a 09 2f 2a 20 53 53 4c 5f 73 65 74  H) {../* SSL_set
b9c0: 5f 73 65 73 73 69 6f 6e 28 29 20 2a 2f 0a 09 69  _session() */..i
b9d0: 66 20 28 21 53 53 4c 5f 53 45 53 53 49 4f 4e 5f  f (!SSL_SESSION_
b9e0: 73 65 74 31 5f 69 64 5f 63 6f 6e 74 65 78 74 28  set1_id_context(
b9f0: 53 53 4c 5f 67 65 74 5f 73 65 73 73 69 6f 6e 28  SSL_get_session(
ba00: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c 0a  statePtr->ssl),.
ba10: 09 09 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  ..(const unsigne
ba20: 64 20 63 68 61 72 20 2a 29 20 73 65 73 73 69 6f  d char *) sessio
ba30: 6e 5f 69 64 2c 20 28 75 6e 73 69 67 6e 65 64 20  n_id, (unsigned 
ba40: 69 6e 74 29 20 73 74 72 6c 65 6e 28 73 65 73 73  int) strlen(sess
ba50: 69 6f 6e 5f 69 64 29 29 29 20 7b 0a 09 20 20 20  ion_id))) {..   
ba60: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
ba70: 74 28 69 6e 74 65 72 70 2c 20 22 52 65 73 75 6d  t(interp, "Resum
ba80: 65 20 73 65 73 73 69 6f 6e 20 66 61 69 6c 65 64  e session failed
ba90: 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41  : ", GET_ERR_REA
baa0: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20  SON(), (char *) 
bab0: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f  NULL);..    Tcl_
bac0: 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74  SetErrorCode(int
bad0: 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50  erp, "TLS", "IMP
bae0: 4f 52 54 22 2c 20 22 53 45 53 53 49 4f 4e 22 2c  ORT", "SESSION",
baf0: 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72   "FAILED", (char
bb00: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20   *) NULL);..    
bb10: 54 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f 66 72  Tls_Free((tls_fr
bb20: 65 65 5f 74 79 70 65 20 2a 29 20 73 74 61 74 65  ee_type *) state
bb30: 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72  Ptr);..    retur
bb40: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a  n TCL_ERROR;..}.
bb50: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 6e      }..    /* En
bb60: 61 62 6c 65 20 41 70 70 6c 69 63 61 74 69 6f 6e  able Application
bb70: 2d 4c 61 79 65 72 20 50 72 6f 74 6f 63 6f 6c 20  -Layer Protocol 
bb80: 4e 65 67 6f 74 69 61 74 69 6f 6e 2e 20 45 78 61  Negotiation. Exa
bb90: 6d 70 6c 65 73 20 61 72 65 3a 20 68 74 74 70 2f  mples are: http/
bba0: 31 2e 30 2c 0a 09 68 74 74 70 2f 31 2e 31 2c 20  1.0,..http/1.1, 
bbb0: 68 32 2c 20 68 33 2c 20 66 74 70 2c 20 69 6d 61  h2, h3, ftp, ima
bbc0: 70 2c 20 70 6f 70 33 2c 20 78 6d 70 70 2d 63 6c  p, pop3, xmpp-cl
bbd0: 69 65 6e 74 2c 20 78 6d 70 70 2d 73 65 72 76 65  ient, xmpp-serve
bbe0: 72 2c 20 6d 71 74 74 2c 20 69 72 63 2c 20 65 74  r, mqtt, irc, et
bbf0: 63 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 61 6c  c. */.    if (al
bc00: 70 6e 29 20 7b 0a 09 2f 2a 20 43 6f 6e 76 65 72  pn) {../* Conver
bc10: 74 20 61 20 54 43 4c 20 6c 69 73 74 20 69 6e 74  t a TCL list int
bc20: 6f 20 61 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73  o a protocol-lis
bc30: 74 20 69 6e 20 77 69 72 65 2d 66 6f 72 6d 61 74  t in wire-format
bc40: 20 2a 2f 0a 09 75 6e 73 69 67 6e 65 64 20 63 68   */..unsigned ch
bc50: 61 72 20 2a 70 72 6f 74 6f 73 2c 20 2a 70 3b 0a  ar *protos, *p;.
bc60: 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 70 72  .unsigned int pr
bc70: 6f 74 6f 73 5f 6c 65 6e 20 3d 20 30 3b 0a 09 54  otos_len = 0;..T
bc80: 63 6c 5f 53 69 7a 65 20 63 6e 74 2c 20 69 3b 0a  cl_Size cnt, i;.
bc90: 09 69 6e 74 20 6a 3b 0a 09 54 63 6c 5f 4f 62 6a  .int j;..Tcl_Obj
bca0: 20 2a 2a 6c 69 73 74 3b 0a 0a 09 69 66 20 28 54   **list;...if (T
bcb0: 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65  cl_ListObjGetEle
bcc0: 6d 65 6e 74 73 28 69 6e 74 65 72 70 2c 20 61 6c  ments(interp, al
bcd0: 70 6e 2c 20 26 63 6e 74 2c 20 26 6c 69 73 74 29  pn, &cnt, &list)
bce0: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20   != TCL_OK) {.. 
bcf0: 20 20 20 54 6c 73 5f 46 72 65 65 28 28 74 6c 73     Tls_Free((tls
bd00: 5f 66 72 65 65 5f 74 79 70 65 20 2a 29 20 73 74  _free_type *) st
bd10: 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65  atePtr);..    re
bd20: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
bd30: 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e  .}.../* Determin
bd40: 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 72 65 71  e the memory req
bd50: 75 69 72 65 64 20 66 6f 72 20 74 68 65 20 70 72  uired for the pr
bd60: 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09  otocol-list */..
bd70: 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 3c 20  for (i = 0; i < 
bd80: 63 6e 74 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20  cnt; i++) {..   
bd90: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
bda0: 6f 6d 4f 62 6a 28 6c 69 73 74 5b 69 5d 2c 20 26  omObj(list[i], &
bdb0: 6c 65 6e 29 3b 0a 09 20 20 20 20 69 66 20 28 6c  len);..    if (l
bdc0: 65 6e 20 3e 20 32 35 35 29 20 7b 0a 09 09 54 63  en > 255) {...Tc
bdd0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
bde0: 6e 74 65 72 70 2c 20 22 41 4c 50 4e 20 70 72 6f  nterp, "ALPN pro
bdf0: 74 6f 63 6f 6c 20 6e 61 6d 65 73 20 74 6f 6f 20  tocol names too 
be00: 6c 6f 6e 67 22 2c 20 28 63 68 61 72 20 2a 29 20  long", (char *) 
be10: 4e 55 4c 4c 29 3b 0a 09 09 54 63 6c 5f 53 65 74  NULL);...Tcl_Set
be20: 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70  ErrorCode(interp
be30: 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54  , "TLS", "IMPORT
be40: 22 2c 20 22 41 4c 50 4e 22 2c 20 22 46 41 49 4c  ", "ALPN", "FAIL
be50: 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  ED", (char *) NU
be60: 4c 4c 29 3b 0a 09 09 54 6c 73 5f 46 72 65 65 28  LL);...Tls_Free(
be70: 28 74 6c 73 5f 66 72 65 65 5f 74 79 70 65 20 2a  (tls_free_type *
be80: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 09 72  ) statePtr);...r
be90: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
bea0: 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 70 72 6f  ..    }..    pro
beb0: 74 6f 73 5f 6c 65 6e 20 2b 3d 20 31 20 2b 20 28  tos_len += 1 + (
bec0: 69 6e 74 29 20 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f  int) len;..}.../
bed0: 2a 20 42 75 69 6c 64 20 74 68 65 20 63 6f 6d 70  * Build the comp
bee0: 6c 65 74 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69  lete protocol-li
bef0: 73 74 20 2a 2f 0a 09 70 72 6f 74 6f 73 20 3d 20  st */..protos = 
bf00: 63 6b 61 6c 6c 6f 63 28 70 72 6f 74 6f 73 5f 6c  ckalloc(protos_l
bf10: 65 6e 29 3b 0a 09 2f 2a 20 70 72 6f 74 6f 63 6f  en);../* protoco
bf20: 6c 2d 6c 69 73 74 73 20 63 6f 6e 73 69 73 74 20  l-lists consist 
bf30: 6f 66 20 38 2d 62 69 74 20 6c 65 6e 67 74 68 2d  of 8-bit length-
bf40: 70 72 65 66 69 78 65 64 2c 20 62 79 74 65 20 73  prefixed, byte s
bf50: 74 72 69 6e 67 73 20 2a 2f 0a 09 66 6f 72 20 28  trings */..for (
bf60: 6a 20 3d 20 30 2c 20 70 20 3d 20 70 72 6f 74 6f  j = 0, p = proto
bf70: 73 3b 20 6a 20 3c 20 63 6e 74 3b 20 6a 2b 2b 29  s; j < cnt; j++)
bf80: 20 7b 0a 09 20 20 20 20 63 68 61 72 20 2a 73 74   {..    char *st
bf90: 72 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  r = Tcl_GetStrin
bfa0: 67 46 72 6f 6d 4f 62 6a 28 6c 69 73 74 5b 6a 5d  gFromObj(list[j]
bfb0: 2c 20 26 6c 65 6e 29 3b 0a 09 20 20 20 20 2a 70  , &len);..    *p
bfc0: 2b 2b 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63  ++ = (unsigned c
bfd0: 68 61 72 29 20 6c 65 6e 3b 0a 09 20 20 20 20 6d  har) len;..    m
bfe0: 65 6d 63 70 79 28 70 2c 20 73 74 72 2c 20 28 73  emcpy(p, str, (s
bff0: 69 7a 65 5f 74 29 20 6c 65 6e 29 3b 0a 09 20 20  ize_t) len);..  
c000: 20 20 70 20 2b 3d 20 6c 65 6e 3b 0a 09 7d 0a 0a    p += len;..}..
c010: 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 61 6c 70 6e  ./* SSL_set_alpn
c020: 5f 70 72 6f 74 6f 73 20 6d 61 6b 65 73 20 61 20  _protos makes a 
c030: 63 6f 70 79 20 6f 66 20 74 68 65 20 70 72 6f 74  copy of the prot
c040: 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 2f 2a  ocol-list */../*
c050: 20 4e 6f 74 65 3a 20 54 68 69 73 20 66 75 6e 63   Note: This func
c060: 74 69 6f 6e 20 72 65 76 65 72 73 65 73 20 74 68  tion reverses th
c070: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 63  e return value c
c080: 6f 6e 76 65 6e 74 69 6f 6e 20 2a 2f 0a 09 69 66  onvention */..if
c090: 20 28 53 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f 70   (SSL_set_alpn_p
c0a0: 72 6f 74 6f 73 28 73 74 61 74 65 50 74 72 2d 3e  rotos(statePtr->
c0b0: 73 73 6c 2c 20 70 72 6f 74 6f 73 2c 20 70 72 6f  ssl, protos, pro
c0c0: 74 6f 73 5f 6c 65 6e 29 29 20 7b 0a 09 20 20 20  tos_len)) {..   
c0d0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
c0e0: 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20 41  t(interp, "Set A
c0f0: 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 73 20 66 61  LPN protocols fa
c100: 69 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45 52 52  iled: ", GET_ERR
c110: 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72  _REASON(), (char
c120: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20   *) NULL);..    
c130: 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65  Tcl_SetErrorCode
c140: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20  (interp, "TLS", 
c150: 22 49 4d 50 4f 52 54 22 2c 20 22 41 4c 50 4e 22  "IMPORT", "ALPN"
c160: 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61  , "FAILED", (cha
c170: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20  r *) NULL);..   
c180: 20 54 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f 66   Tls_Free((tls_f
c190: 72 65 65 5f 74 79 70 65 20 2a 29 20 73 74 61 74  ree_type *) stat
c1a0: 65 50 74 72 29 3b 0a 09 20 20 20 20 63 6b 66 72  ePtr);..    ckfr
c1b0: 65 65 28 70 72 6f 74 6f 73 29 3b 0a 09 20 20 20  ee(protos);..   
c1c0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
c1d0: 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 74 6f 72 65  R;..}.../* Store
c1e0: 20 70 72 6f 74 6f 63 6f 6c 73 20 6c 69 73 74 20   protocols list 
c1f0: 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72  */..statePtr->pr
c200: 6f 74 6f 73 20 3d 20 70 72 6f 74 6f 73 3b 0a 09  otos = protos;..
c210: 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73  statePtr->protos
c220: 5f 6c 65 6e 20 3d 20 70 72 6f 74 6f 73 5f 6c 65  _len = protos_le
c230: 6e 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  n;.    } else {.
c240: 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f  .statePtr->proto
c250: 73 20 3d 20 4e 55 4c 4c 3b 0a 09 73 74 61 74 65  s = NULL;..state
c260: 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 20  Ptr->protos_len 
c270: 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 0;.    }..    
c280: 2f 2a 0a 20 20 20 20 20 2a 20 53 53 4c 20 43 61  /*.     * SSL Ca
c290: 6c 6c 62 61 63 6b 73 0a 20 20 20 20 20 2a 2f 0a  llbacks.     */.
c2a0: 20 20 20 20 53 53 4c 5f 73 65 74 5f 61 70 70 5f      SSL_set_app_
c2b0: 64 61 74 61 28 73 74 61 74 65 50 74 72 2d 3e 73  data(statePtr->s
c2c0: 73 6c 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74  sl, (void *)stat
c2d0: 65 50 74 72 29 3b 09 2f 2a 20 70 6f 69 6e 74 20  ePtr);./* point 
c2e0: 62 61 63 6b 20 74 6f 20 75 73 20 2a 2f 0a 20 20  back to us */.  
c2f0: 20 20 53 53 4c 5f 73 65 74 5f 76 65 72 69 66 79    SSL_set_verify
c300: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20  (statePtr->ssl, 
c310: 76 65 72 69 66 79 2c 20 56 65 72 69 66 79 43 61  verify, VerifyCa
c320: 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 2f 2a 53  llback);.    /*S
c330: 53 4c 5f 73 65 74 5f 76 65 72 69 66 79 5f 64 65  SL_set_verify_de
c340: 70 74 68 28 53 53 4c 5f 73 65 74 5f 76 65 72 69  pth(SSL_set_veri
c350: 66 79 5f 64 65 70 74 68 2c 20 30 29 3b 2a 2f 0a  fy_depth, 0);*/.
c360: 20 20 20 20 53 53 4c 5f 73 65 74 5f 69 6e 66 6f      SSL_set_info
c370: 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 50  _callback(stateP
c380: 74 72 2d 3e 73 73 6c 2c 20 49 6e 66 6f 43 61 6c  tr->ssl, InfoCal
c390: 6c 62 61 63 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20  lback);..    /* 
c3a0: 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 6f 62 73  Callback for obs
c3b0: 65 72 76 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20  erving protocol 
c3c0: 6d 65 73 73 61 67 65 73 20 2a 2f 0a 23 69 66 6e  messages */.#ifn
c3d0: 64 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53  def OPENSSL_NO_S
c3e0: 53 4c 5f 54 52 41 43 45 0a 20 20 20 20 2f 2a 20  SL_TRACE.    /* 
c3f0: 76 6f 69 64 20 53 53 4c 5f 43 54 58 5f 73 65 74  void SSL_CTX_set
c400: 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 5f 61 72  _msg_callback_ar
c410: 67 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c  g(statePtr->ctx,
c420: 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74   (void *)statePt
c430: 72 29 3b 0a 20 20 20 20 76 6f 69 64 20 53 53 4c  r);.    void SSL
c440: 5f 43 54 58 5f 73 65 74 5f 6d 73 67 5f 63 61 6c  _CTX_set_msg_cal
c450: 6c 62 61 63 6b 28 73 74 61 74 65 50 74 72 2d 3e  lback(statePtr->
c460: 63 74 78 2c 20 4d 65 73 73 61 67 65 43 61 6c 6c  ctx, MessageCall
c470: 62 61 63 6b 29 3b 20 2a 2f 0a 20 20 20 20 53 53  back); */.    SS
c480: 4c 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61  L_set_msg_callba
c490: 63 6b 5f 61 72 67 28 73 74 61 74 65 50 74 72 2d  ck_arg(statePtr-
c4a0: 3e 73 73 6c 2c 20 28 76 6f 69 64 20 2a 29 73 74  >ssl, (void *)st
c4b0: 61 74 65 50 74 72 29 3b 0a 20 20 20 20 53 53 4c  atePtr);.    SSL
c4c0: 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63  _set_msg_callbac
c4d0: 6b 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c  k(statePtr->ssl,
c4e0: 20 4d 65 73 73 61 67 65 43 61 6c 6c 62 61 63 6b   MessageCallback
c4f0: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f  );.#endif..    /
c500: 2a 20 43 72 65 61 74 65 20 54 63 6c 5f 43 68 61  * Create Tcl_Cha
c510: 6e 6e 65 6c 20 42 49 4f 20 48 61 6e 64 6c 65 72  nnel BIO Handler
c520: 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72   */.    statePtr
c530: 2d 3e 70 5f 62 69 6f 09 3d 20 42 49 4f 5f 6e 65  ->p_bio.= BIO_ne
c540: 77 5f 74 63 6c 28 73 74 61 74 65 50 74 72 2c 20  w_tcl(statePtr, 
c550: 42 49 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a 20 20  BIO_NOCLOSE);.  
c560: 20 20 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 09    statePtr->bio.
c570: 3d 20 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 66 5f  = BIO_new(BIO_f_
c580: 73 73 6c 28 29 29 3b 0a 0a 20 20 20 20 69 66 20  ssl());..    if 
c590: 28 73 65 72 76 65 72 29 20 7b 0a 09 2f 2a 20 53  (server) {../* S
c5a0: 65 72 76 65 72 20 63 61 6c 6c 62 61 63 6b 73 20  erver callbacks 
c5b0: 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f  */..SSL_CTX_set_
c5c0: 74 6c 73 65 78 74 5f 73 65 72 76 65 72 6e 61 6d  tlsext_servernam
c5d0: 65 5f 61 72 67 28 73 74 61 74 65 50 74 72 2d 3e  e_arg(statePtr->
c5e0: 63 74 78 2c 20 28 76 6f 69 64 20 2a 29 73 74 61  ctx, (void *)sta
c5f0: 74 65 50 74 72 29 3b 0a 09 53 53 4c 5f 43 54 58  tePtr);..SSL_CTX
c600: 5f 73 65 74 5f 74 6c 73 65 78 74 5f 73 65 72 76  _set_tlsext_serv
c610: 65 72 6e 61 6d 65 5f 63 61 6c 6c 62 61 63 6b 28  ername_callback(
c620: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 53  statePtr->ctx, S
c630: 4e 49 43 61 6c 6c 62 61 63 6b 29 3b 0a 09 53 53  NICallback);..SS
c640: 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74  L_CTX_set_client
c650: 5f 68 65 6c 6c 6f 5f 63 62 28 73 74 61 74 65 50  _hello_cb(stateP
c660: 74 72 2d 3e 63 74 78 2c 20 48 65 6c 6c 6f 43 61  tr->ctx, HelloCa
c670: 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29  llback, (void *)
c680: 73 74 61 74 65 50 74 72 29 3b 0a 09 69 66 20 28  statePtr);..if (
c690: 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73  statePtr->protos
c6a0: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20   != NULL) {..   
c6b0: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 61 6c 70   SSL_CTX_set_alp
c6c0: 6e 5f 73 65 6c 65 63 74 5f 63 62 28 73 74 61 74  n_select_cb(stat
c6d0: 65 50 74 72 2d 3e 63 74 78 2c 20 41 4c 50 4e 43  ePtr->ctx, ALPNC
c6e0: 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a  allback, (void *
c6f0: 29 73 74 61 74 65 50 74 72 29 3b 0a 23 69 66 64  )statePtr);.#ifd
c700: 65 66 20 55 53 45 5f 4e 50 4e 0a 09 20 20 20 20  ef USE_NPN..    
c710: 69 66 20 28 74 6c 73 31 5f 32 20 3d 3d 20 30 20  if (tls1_2 == 0 
c720: 26 26 20 74 6c 73 31 5f 33 20 3d 3d 20 30 29 20  && tls1_3 == 0) 
c730: 7b 0a 09 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f  {...SSL_CTX_set_
c740: 6e 65 78 74 5f 70 72 6f 74 6f 73 5f 61 64 76 65  next_protos_adve
c750: 72 74 69 73 65 64 5f 63 62 28 73 74 61 74 65 50  rtised_cb(stateP
c760: 74 72 2d 3e 63 74 78 2c 20 4e 50 4e 43 61 6c 6c  tr->ctx, NPNCall
c770: 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74  back, (void *)st
c780: 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 7d 0a  atePtr);..    }.
c790: 23 65 6e 64 69 66 0a 09 7d 0a 0a 09 2f 2a 20 45  #endif..}.../* E
c7a0: 6e 61 62 6c 65 20 73 65 72 76 65 72 20 74 6f 20  nable server to 
c7b0: 73 65 6e 64 20 63 65 72 74 20 72 65 71 75 65 73  send cert reques
c7c0: 74 20 61 66 74 65 72 20 68 61 6e 64 73 68 61 6b  t after handshak
c7d0: 65 20 28 54 4c 53 20 31 2e 33 20 6f 6e 6c 79 29  e (TLS 1.3 only)
c7e0: 20 2a 2f 0a 09 2f 2a 20 41 20 77 72 69 74 65 20   */../* A write 
c7f0: 6f 70 65 72 61 74 69 6f 6e 20 6d 75 73 74 20 74  operation must t
c800: 61 6b 65 20 70 6c 61 63 65 20 66 6f 72 20 74 68  ake place for th
c810: 65 20 43 65 72 74 69 66 69 63 61 74 65 20 52 65  e Certificate Re
c820: 71 75 65 73 74 20 74 6f 20 62 65 0a 09 20 20 20  quest to be..   
c830: 73 65 6e 74 20 74 6f 20 74 68 65 20 63 6c 69 65  sent to the clie
c840: 6e 74 2c 20 74 68 69 73 20 63 61 6e 20 62 65 20  nt, this can be 
c850: 64 6f 6e 65 20 77 69 74 68 20 53 53 4c 5f 64 6f  done with SSL_do
c860: 5f 68 61 6e 64 73 68 61 6b 65 28 29 2e 20 2a 2f  _handshake(). */
c870: 0a 09 69 66 20 28 72 65 71 75 65 73 74 20 26 26  ..if (request &&
c880: 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 20   post_handshake 
c890: 26 26 20 74 6c 73 31 5f 33 29 20 7b 0a 09 20 20  && tls1_3) {..  
c8a0: 20 20 53 53 4c 5f 76 65 72 69 66 79 5f 63 6c 69    SSL_verify_cli
c8b0: 65 6e 74 5f 70 6f 73 74 5f 68 61 6e 64 73 68 61  ent_post_handsha
c8c0: 6b 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  ke(statePtr->ssl
c8d0: 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65 74 20 73  );..}.../* Set s
c8e0: 65 72 76 65 72 20 6d 6f 64 65 20 2a 2f 0a 09 73  erver mode */..s
c8f0: 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c  tatePtr->flags |
c900: 3d 20 54 4c 53 5f 54 43 4c 5f 53 45 52 56 45 52  = TLS_TCL_SERVER
c910: 3b 0a 09 53 53 4c 5f 73 65 74 5f 61 63 63 65 70  ;..SSL_set_accep
c920: 74 5f 73 74 61 74 65 28 73 74 61 74 65 50 74 72  t_state(statePtr
c930: 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 20 65 6c  ->ssl);.    } el
c940: 73 65 20 7b 0a 09 2f 2a 20 43 6c 69 65 6e 74 20  se {../* Client 
c950: 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 23 69 66  callbacks */.#if
c960: 64 65 66 20 55 53 45 5f 4e 50 4e 0a 09 69 66 20  def USE_NPN..if 
c970: 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f  (statePtr->proto
c980: 73 20 21 3d 20 4e 55 4c 4c 20 26 26 20 74 6c 73  s != NULL && tls
c990: 31 5f 32 20 3d 3d 20 30 20 26 26 20 74 6c 73 31  1_2 == 0 && tls1
c9a0: 5f 33 20 3d 3d 20 30 29 20 7b 0a 09 20 20 20 20  _3 == 0) {..    
c9b0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6e 65 78 74  SSL_CTX_set_next
c9c0: 5f 70 72 6f 74 6f 5f 73 65 6c 65 63 74 5f 63 62  _proto_select_cb
c9d0: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20  (statePtr->ctx, 
c9e0: 41 4c 50 4e 43 61 6c 6c 62 61 63 6b 2c 20 28 76  ALPNCallback, (v
c9f0: 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b  oid *)statePtr);
ca00: 0a 09 7d 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a 20  ..}.#endif.../* 
ca10: 53 65 73 73 69 6f 6e 20 63 61 63 68 69 6e 67 20  Session caching 
ca20: 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f  */..SSL_CTX_set_
ca30: 73 65 73 73 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f  session_cache_mo
ca40: 64 65 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78  de(statePtr->ctx
ca50: 2c 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45  , SSL_SESS_CACHE
ca60: 5f 43 4c 49 45 4e 54 20 7c 20 53 53 4c 5f 53 45  _CLIENT | SSL_SE
ca70: 53 53 5f 43 41 43 48 45 5f 4e 4f 5f 49 4e 54 45  SS_CACHE_NO_INTE
ca80: 52 4e 41 4c 5f 53 54 4f 52 45 29 3b 0a 09 53 53  RNAL_STORE);..SS
ca90: 4c 5f 43 54 58 5f 73 65 73 73 5f 73 65 74 5f 6e  L_CTX_sess_set_n
caa0: 65 77 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e  ew_cb(statePtr->
cab0: 63 74 78 2c 20 53 65 73 73 69 6f 6e 43 61 6c 6c  ctx, SessionCall
cac0: 62 61 63 6b 29 3b 0a 0a 09 2f 2a 20 45 6e 61 62  back);.../* Enab
cad0: 6c 65 20 70 6f 73 74 20 68 61 6e 64 73 68 61 6b  le post handshak
cae0: 65 20 41 75 74 68 65 6e 74 69 63 61 74 69 6f 6e  e Authentication
caf0: 20 65 78 74 65 6e 73 69 6f 6e 2e 20 54 4c 53 20   extension. TLS 
cb00: 31 2e 33 20 6f 6e 6c 79 2c 20 6e 6f 74 20 68 74  1.3 only, not ht
cb10: 74 70 2f 32 2e 20 2a 2f 0a 09 69 66 20 28 72 65  tp/2. */..if (re
cb20: 71 75 65 73 74 20 26 26 20 70 6f 73 74 5f 68 61  quest && post_ha
cb30: 6e 64 73 68 61 6b 65 29 20 7b 0a 09 20 20 20 20  ndshake) {..    
cb40: 53 53 4c 5f 73 65 74 5f 70 6f 73 74 5f 68 61 6e  SSL_set_post_han
cb50: 64 73 68 61 6b 65 5f 61 75 74 68 28 73 74 61 74  dshake_auth(stat
cb60: 65 50 74 72 2d 3e 73 73 6c 2c 20 31 29 3b 0a 09  ePtr->ssl, 1);..
cb70: 7d 0a 0a 09 2f 2a 20 53 65 74 20 63 6c 69 65 6e  }.../* Set clien
cb80: 74 20 6d 6f 64 65 20 2a 2f 0a 09 53 53 4c 5f 73  t mode */..SSL_s
cb90: 65 74 5f 63 6f 6e 6e 65 63 74 5f 73 74 61 74 65  et_connect_state
cba0: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b  (statePtr->ssl);
cbb0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  .    }..    /* S
cbc0: 65 74 20 42 49 4f 20 66 6f 72 20 72 65 61 64 20  et BIO for read 
cbd0: 61 6e 64 20 77 72 69 74 65 20 6f 70 65 72 61 74  and write operat
cbe0: 69 6f 6e 73 20 6f 6e 20 53 53 4c 20 6f 62 6a 65  ions on SSL obje
cbf0: 63 74 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65  ct */.    SSL_se
cc00: 74 5f 62 69 6f 28 73 74 61 74 65 50 74 72 2d 3e  t_bio(statePtr->
cc10: 73 73 6c 2c 20 73 74 61 74 65 50 74 72 2d 3e 70  ssl, statePtr->p
cc20: 5f 62 69 6f 2c 20 73 74 61 74 65 50 74 72 2d 3e  _bio, statePtr->
cc30: 70 5f 62 69 6f 29 3b 0a 20 20 20 20 42 49 4f 5f  p_bio);.    BIO_
cc40: 73 65 74 5f 73 73 6c 28 73 74 61 74 65 50 74 72  set_ssl(statePtr
cc50: 2d 3e 62 69 6f 2c 20 73 74 61 74 65 50 74 72 2d  ->bio, statePtr-
cc60: 3e 73 73 6c 2c 20 42 49 4f 5f 4e 4f 43 4c 4f 53  >ssl, BIO_NOCLOS
cc70: 45 29 3b 0a 20 20 20 20 42 49 4f 5f 73 65 74 5f  E);.    BIO_set_
cc80: 73 73 6c 5f 6d 6f 64 65 28 73 74 61 74 65 50 74  ssl_mode(statePt
cc90: 72 2d 3e 62 69 6f 2c 20 28 6c 6f 6e 67 29 20 21  r->bio, (long) !
cca0: 73 65 72 76 65 72 29 3b 0a 0a 20 20 20 20 2f 2a  server);..    /*
ccb0: 0a 20 20 20 20 20 2a 20 45 6e 64 20 6f 66 20 53  .     * End of S
ccc0: 53 4c 20 49 6e 69 74 0a 20 20 20 20 20 2a 2f 0a  SL Init.     */.
ccd0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 52 65 74      dprintf("Ret
cce0: 75 72 6e 69 6e 67 20 25 73 22 2c 20 54 63 6c 5f  urning %s", Tcl_
ccf0: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73  GetChannelName(s
cd00: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 29 3b  tatePtr->self));
cd10: 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75  .    Tcl_SetResu
cd20: 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
cd30: 20 2a 29 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e   *) Tcl_GetChann
cd40: 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d  elName(statePtr-
cd50: 3e 73 65 6c 66 29 2c 20 54 43 4c 5f 56 4f 4c 41  >self), TCL_VOLA
cd60: 54 49 4c 45 29 3b 0a 0a 20 20 20 20 72 65 74 75  TILE);..    retu
cd70: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f  rn TCL_OK;.}.../
cd80: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
cd90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cda0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cdb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cdc0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 55 6e  -------. *. * Un
cdd0: 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 20 2d 2d 0a  importObjCmd --.
cde0: 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65   *. *.This proce
cdf0: 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20  dure is invoked 
ce00: 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 74 6f  to remove the to
ce10: 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 66 69  pmost channel fi
ce20: 6c 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  lter.. *. * Resu
ce30: 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61  lts:. *.A standa
ce40: 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20  rd Tcl result.. 
ce50: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
ce60: 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64 69 66 79  s:. *.May modify
ce70: 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66   the behavior of
ce80: 20 61 6e 20 49 4f 20 63 68 61 6e 6e 65 6c 2e 0a   an IO channel..
ce90: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
cea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ceb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ced0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61  --------. */.sta
cee0: 74 69 63 20 69 6e 74 0a 55 6e 69 6d 70 6f 72 74  tic int.Unimport
cef0: 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74  ObjCmd(ClientDat
cf00: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63  a clientData, Tc
cf10: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
cf20: 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f  , int objc, Tcl_
cf30: 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b  Obj *const objv[
cf40: 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61  ]) {.    Tcl_Cha
cf50: 6e 6e 65 6c 20 63 68 61 6e 2c 20 70 61 72 65 6e  nnel chan, paren
cf60: 74 3b 09 2f 2a 20 54 68 65 20 73 74 61 63 6b 65  t;./* The stacke
cf70: 64 20 61 6e 64 20 75 6e 64 65 72 6c 79 69 6e 67  d and underlying
cf80: 20 63 68 61 6e 6e 65 6c 73 20 2a 2f 0a 20 20 20   channels */.   
cf90: 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 75 70 70   Tcl_DString upp
cfa0: 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61  erChannelTransla
cfb0: 74 69 6f 6e 2c 20 75 70 70 65 72 43 68 61 6e 6e  tion, upperChann
cfc0: 65 6c 42 6c 6f 63 6b 69 6e 67 2c 20 75 70 70 65  elBlocking, uppe
cfd0: 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67  rChannelEncoding
cfe0: 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f  , upperChannelEO
cff0: 46 43 68 61 72 3b 0a 20 20 20 20 69 6e 74 20 72  FChar;.    int r
d000: 65 73 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20  es = TCL_OK;.   
d010: 20 28 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 61   (void) clientDa
d020: 74 61 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66  ta;..    dprintf
d030: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20  ("Called");..   
d040: 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20   if (objc != 2) 
d050: 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41  {..Tcl_WrongNumA
d060: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
d070: 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b  bjv, "channel");
d080: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
d090: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  OR;.    }..    /
d0a0: 2a 20 56 61 6c 69 64 61 74 65 20 63 68 61 6e 6e  * Validate chann
d0b0: 65 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 63  el name */.    c
d0c0: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61  han = Tcl_GetCha
d0d0: 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c  nnel(interp, Tcl
d0e0: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
d0f0: 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  1]), NULL);.    
d100: 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c  if (chan == (Tcl
d110: 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20  _Channel) NULL) 
d120: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  {..return TCL_ER
d130: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
d140: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20  /* Make sure to 
d150: 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74  operate on the t
d160: 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a  opmost channel *
d170: 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c  /.    chan = Tcl
d180: 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63  _GetTopChannel(c
d190: 68 61 6e 29 3b 0a 20 20 20 20 70 61 72 65 6e 74  han);.    parent
d1a0: 20 3d 20 54 63 6c 5f 47 65 74 53 74 61 63 6b 65   = Tcl_GetStacke
d1b0: 64 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a  dChannel(chan);.
d1c0: 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 69  .    /* Verify i
d1d0: 73 20 61 20 73 74 61 63 6b 65 64 20 63 68 61 6e  s a stacked chan
d1e0: 6e 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 70  nel */.    if (p
d1f0: 61 72 65 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b  arent == NULL) {
d200: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
d210: 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20  lt(interp, "bad 
d220: 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c  channel \"", Tcl
d230: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28  _GetChannelName(
d240: 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f  chan),..."\": no
d250: 74 20 61 20 73 74 61 63 6b 65 64 20 63 68 61 6e  t a stacked chan
d260: 6e 65 6c 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  nel", (char *) N
d270: 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53  ULL);..    Tcl_S
d280: 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65  etErrorCode(inte
d290: 72 70 2c 20 22 54 4c 53 22 2c 20 22 55 4e 49 4d  rp, "TLS", "UNIM
d2a0: 50 4f 52 54 22 2c 20 22 43 48 41 4e 4e 45 4c 22  PORT", "CHANNEL"
d2b0: 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68  , "INVALID", (ch
d2c0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65  ar *) NULL);..re
d2d0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
d2e0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 6c      }..    /* Fl
d2f0: 75 73 68 20 61 6e 79 20 70 65 6e 64 69 6e 67 20  ush any pending 
d300: 64 61 74 61 20 2a 2f 0a 20 20 20 20 69 66 20 28  data */.    if (
d310: 54 63 6c 5f 4f 75 74 70 75 74 42 75 66 66 65 72  Tcl_OutputBuffer
d320: 65 64 28 63 68 61 6e 29 20 3e 20 30 20 26 26 20  ed(chan) > 0 && 
d330: 54 63 6c 5f 46 6c 75 73 68 28 63 68 61 6e 29 20  Tcl_Flush(chan) 
d340: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 54 63  != TCL_OK) {..Tc
d350: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
d360: 6e 74 65 72 70 2c 20 22 63 61 6e 27 74 20 66 6c  nterp, "can't fl
d370: 75 73 68 20 63 68 61 6e 6e 65 6c 22 2c 20 28 63  ush channel", (c
d380: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72  har *) NULL);..r
d390: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
d3a0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
d3b0: 6e 69 74 20 73 74 6f 72 61 67 65 20 2a 2f 0a 20  nit storage */. 
d3c0: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e     Tcl_DStringIn
d3d0: 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c  it(&upperChannel
d3e0: 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 20  Translation);.  
d3f0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69    Tcl_DStringIni
d400: 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42  t(&upperChannelB
d410: 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 20 54 63  locking);.    Tc
d420: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75  l_DStringInit(&u
d430: 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68  pperChannelEOFCh
d440: 61 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74  ar);.    Tcl_DSt
d450: 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43  ringInit(&upperC
d460: 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b  hannelEncoding);
d470: 0a 0a 20 20 20 20 2f 2a 20 50 72 65 73 65 72 76  ..    /* Preserv
d480: 65 20 63 75 72 72 65 6e 74 20 63 68 61 6e 6e 65  e current channe
d490: 6c 20 63 6f 6e 66 69 67 20 2a 2f 0a 20 20 20 20  l config */.    
d4a0: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70  Tcl_GetChannelOp
d4b0: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61  tion(interp, cha
d4c0: 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20  n, "-blocking", 
d4d0: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f  &upperChannelBlo
d4e0: 63 6b 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f  cking);.    Tcl_
d4f0: 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e  GetChannelOption
d500: 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22  (interp, chan, "
d510: 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 26 75 70 70  -encoding", &upp
d520: 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e  erChannelEncodin
d530: 67 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43  g);.    Tcl_GetC
d540: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74  hannelOption(int
d550: 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 65 6f 66  erp, chan, "-eof
d560: 63 68 61 72 22 2c 20 26 75 70 70 65 72 43 68 61  char", &upperCha
d570: 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20  nnelEOFChar);.  
d580: 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c    Tcl_GetChannel
d590: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63  Option(interp, c
d5a0: 68 61 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69  han, "-translati
d5b0: 6f 6e 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e  on", &upperChann
d5c0: 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a  elTranslation);.
d5d0: 0a 20 20 20 20 2f 2a 20 55 6e 73 74 61 63 6b 20  .    /* Unstack 
d5e0: 74 68 65 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20  the channel */. 
d5f0: 20 20 20 69 66 20 28 54 63 6c 5f 55 6e 73 74 61     if (Tcl_Unsta
d600: 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70  ckChannel(interp
d610: 2c 20 63 68 61 6e 29 20 21 3d 20 54 43 4c 5f 4f  , chan) != TCL_O
d620: 4b 29 20 7b 0a 09 72 65 73 20 3d 20 54 43 4c 5f  K) {..res = TCL_
d630: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
d640: 20 20 2f 2a 20 52 65 73 74 6f 72 65 20 63 68 61    /* Restore cha
d650: 6e 6e 65 6c 20 63 6f 6e 66 69 67 20 2a 2f 0a 20  nnel config */. 
d660: 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65     Tcl_SetChanne
d670: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20  lOption(interp, 
d680: 70 61 72 65 6e 74 2c 20 22 2d 65 6e 63 6f 64 69  parent, "-encodi
d690: 6e 67 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67  ng", Tcl_DString
d6a0: 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e  Value(&upperChan
d6b0: 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 29 3b 0a 20  nelEncoding));. 
d6c0: 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65     Tcl_SetChanne
d6d0: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20  lOption(interp, 
d6e0: 70 61 72 65 6e 74 2c 20 22 2d 65 6f 66 63 68 61  parent, "-eofcha
d6f0: 72 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56  r", Tcl_DStringV
d700: 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e  alue(&upperChann
d710: 65 6c 45 4f 46 43 68 61 72 29 29 3b 0a 20 20 20  elEOFChar));.   
d720: 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f   Tcl_SetChannelO
d730: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 70 61  ption(interp, pa
d740: 72 65 6e 74 2c 20 22 2d 74 72 61 6e 73 6c 61 74  rent, "-translat
d750: 69 6f 6e 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e  ion", Tcl_DStrin
d760: 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 61  gValue(&upperCha
d770: 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29  nnelTranslation)
d780: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68  );.    Tcl_SetCh
d790: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65  annelOption(inte
d7a0: 72 70 2c 20 70 61 72 65 6e 74 2c 20 22 2d 62 6c  rp, parent, "-bl
d7b0: 6f 63 6b 69 6e 67 22 2c 20 54 63 6c 5f 44 53 74  ocking", Tcl_DSt
d7c0: 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72  ringValue(&upper
d7d0: 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29  ChannelBlocking)
d7e0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6c 65 61 6e  );..    /* Clean
d7f0: 2d 75 70 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44  -up */.    Tcl_D
d800: 53 74 72 69 6e 67 46 72 65 65 28 26 75 70 70 65  StringFree(&uppe
d810: 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74  rChannelTranslat
d820: 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53  ion);.    Tcl_DS
d830: 74 72 69 6e 67 46 72 65 65 28 26 75 70 70 65 72  tringFree(&upper
d840: 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29  ChannelEncoding)
d850: 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ;.    Tcl_DStrin
d860: 67 46 72 65 65 28 26 75 70 70 65 72 43 68 61 6e  gFree(&upperChan
d870: 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20 20  nelEOFChar);.   
d880: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65   Tcl_DStringFree
d890: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c  (&upperChannelBl
d8a0: 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 20 72 65 74  ocking);.    ret
d8b0: 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 0a  urn res;.}.../*.
d8c0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
d8d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d8e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d8f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d900: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 54 58 5f  -----. *. * CTX_
d910: 49 6e 69 74 20 2d 2d 20 63 6f 6e 73 74 72 75 63  Init -- construc
d920: 74 20 61 20 53 53 4c 5f 43 54 58 20 69 6e 73 74  t a SSL_CTX inst
d930: 61 6e 63 65 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  ance. *. * Resul
d940: 74 73 3a 0a 20 2a 09 41 20 76 61 6c 69 64 20 53  ts:. *.A valid S
d950: 53 4c 5f 43 54 58 20 69 6e 73 74 61 6e 63 65 20  SL_CTX instance 
d960: 6f 72 20 4e 55 4c 4c 2e 0a 20 2a 0a 20 2a 20 53  or NULL.. *. * S
d970: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
d980: 63 6f 6e 73 74 72 75 63 74 73 20 53 53 4c 20 63  constructs SSL c
d990: 6f 6e 74 65 78 74 20 28 43 54 58 29 0a 20 2a 0a  ontext (CTX). *.
d9a0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
d9b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d9c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d9d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d9e0: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63  -----. */.static
d9f0: 20 53 53 4c 5f 43 54 58 20 2a 0a 43 54 58 5f 49   SSL_CTX *.CTX_I
da00: 6e 69 74 28 53 74 61 74 65 20 2a 73 74 61 74 65  nit(State *state
da10: 50 74 72 2c 20 69 6e 74 20 69 73 53 65 72 76 65  Ptr, int isServe
da20: 72 2c 20 69 6e 74 20 70 72 6f 74 6f 2c 20 63 68  r, int proto, ch
da30: 61 72 20 2a 6b 65 79 66 69 6c 65 2c 20 63 68 61  ar *keyfile, cha
da40: 72 20 2a 63 65 72 74 66 69 6c 65 2c 0a 20 20 20  r *certfile,.   
da50: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
da60: 6b 65 79 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  key, unsigned ch
da70: 61 72 20 2a 63 65 72 74 2c 20 54 63 6c 5f 53 69  ar *cert, Tcl_Si
da80: 7a 65 20 6b 65 79 5f 6c 65 6e 2c 20 54 63 6c 5f  ze key_len, Tcl_
da90: 53 69 7a 65 20 63 65 72 74 5f 6c 65 6e 2c 20 63  Size cert_len, c
daa0: 68 61 72 20 2a 43 41 70 61 74 68 2c 0a 20 20 20  har *CApath,.   
dab0: 20 63 68 61 72 20 2a 43 41 73 74 6f 72 65 2c 20   char *CAstore, 
dac0: 63 68 61 72 20 2a 43 41 66 69 6c 65 2c 20 63 68  char *CAfile, ch
dad0: 61 72 20 2a 63 69 70 68 65 72 73 2c 20 63 68 61  ar *ciphers, cha
dae0: 72 20 2a 63 69 70 68 65 72 73 75 69 74 65 73 2c  r *ciphersuites,
daf0: 20 69 6e 74 20 6c 65 76 65 6c 2c 20 63 68 61 72   int level, char
db00: 20 2a 44 48 70 61 72 61 6d 73 29 20 7b 0a 20 20   *DHparams) {.  
db10: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
db20: 74 65 72 70 20 3d 20 73 74 61 74 65 50 74 72 2d  terp = statePtr-
db30: 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 53 53 4c  >interp;.    SSL
db40: 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c  _CTX *ctx = NULL
db50: 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ;.    Tcl_DStrin
db60: 67 20 64 73 3b 0a 20 20 20 20 69 6e 74 20 6f 66  g ds;.    int of
db70: 66 20 3d 20 30 2c 20 61 62 6f 72 74 20 3d 20 30  f = 0, abort = 0
db80: 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 61 64 5f 70  ;.    int load_p
db90: 72 69 76 61 74 65 5f 6b 65 79 3b 0a 20 20 20 20  rivate_key;.    
dba0: 63 6f 6e 73 74 20 53 53 4c 5f 4d 45 54 48 4f 44  const SSL_METHOD
dbb0: 20 2a 6d 65 74 68 6f 64 3b 0a 0a 20 20 20 20 64   *method;..    d
dbc0: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
dbd0: 3b 0a 0a 20 20 20 20 69 66 20 28 21 70 72 6f 74  ;..    if (!prot
dbe0: 6f 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  o) {..Tcl_Append
dbf0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
dc00: 6e 6f 20 76 61 6c 69 64 20 70 72 6f 74 6f 63 6f  no valid protoco
dc10: 6c 20 73 65 6c 65 63 74 65 64 22 2c 20 28 63 68  l selected", (ch
dc20: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65  ar *) NULL);..re
dc30: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  turn NULL;.    }
dc40: 0a 0a 20 20 20 20 2f 2a 20 63 72 65 61 74 65 20  ..    /* create 
dc50: 53 53 4c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 23  SSL context */.#
dc60: 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49  if OPENSSL_VERSI
dc70: 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 78 31  ON_NUMBER >= 0x1
dc80: 30 31 30 30 30 30 30 4c 20 7c 7c 20 64 65 66 69  0100000L || defi
dc90: 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 7c 7c 20  ned(NO_SSL2) || 
dca0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
dcb0: 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20 69 66 20  NO_SSL2).    if 
dcc0: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20  (ENABLED(proto, 
dcd0: 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 29 29  TLS_PROTO_SSL2))
dce0: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65   {..Tcl_AppendRe
dcf0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 53  sult(interp, "SS
dd00: 4c 32 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20  L2 protocol not 
dd10: 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61  supported", (cha
dd20: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74  r *) NULL);..ret
dd30: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a  urn NULL;.    }.
dd40: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
dd50: 65 64 28 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 64  ed(NO_SSL3) || d
dd60: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
dd70: 4f 5f 53 53 4c 33 29 0a 20 20 20 20 69 66 20 28  O_SSL3).    if (
dd80: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54  ENABLED(proto, T
dd90: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 29 29 20  LS_PROTO_SSL3)) 
dda0: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
ddb0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 53 4c  ult(interp, "SSL
ddc0: 33 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73  3 protocol not s
ddd0: 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72  upported", (char
dde0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75   *) NULL);..retu
ddf0: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23  rn NULL;.    }.#
de00: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65  endif.#if define
de10: 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65  d(NO_TLS1) || de
de20: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
de30: 5f 54 4c 53 31 29 0a 20 20 20 20 69 66 20 28 45  _TLS1).    if (E
de40: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c  NABLED(proto, TL
de50: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 29 29 20 7b  S_PROTO_TLS1)) {
de60: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
de70: 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20  lt(interp, "TLS 
de80: 31 2e 30 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74  1.0 protocol not
de90: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68   supported", (ch
dea0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65  ar *) NULL);..re
deb0: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  turn NULL;.    }
dec0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
ded0: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c  ned(NO_TLS1_1) |
dee0: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  | defined(OPENSS
def0: 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 20 20 20  L_NO_TLS1_1).   
df00: 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f   if (ENABLED(pro
df10: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c  to, TLS_PROTO_TL
df20: 53 31 5f 31 29 29 20 7b 0a 09 54 63 6c 5f 41 70  S1_1)) {..Tcl_Ap
df30: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
df40: 70 2c 20 22 54 4c 53 20 31 2e 31 20 70 72 6f 74  p, "TLS 1.1 prot
df50: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74  ocol not support
df60: 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  ed", (char *) NU
df70: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c  LL);..return NUL
df80: 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  L;.    }.#endif.
df90: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54  #if defined(NO_T
dfa0: 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65  LS1_2) || define
dfb0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
dfc0: 31 5f 32 29 0a 20 20 20 20 69 66 20 28 45 4e 41  1_2).    if (ENA
dfd0: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f  BLED(proto, TLS_
dfe0: 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 29 29 20 7b  PROTO_TLS1_2)) {
dff0: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
e000: 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20  lt(interp, "TLS 
e010: 31 2e 32 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74  1.2 protocol not
e020: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68   supported", (ch
e030: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65  ar *) NULL);..re
e040: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  turn NULL;.    }
e050: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
e060: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c  ned(NO_TLS1_3) |
e070: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  | defined(OPENSS
e080: 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20  L_NO_TLS1_3).   
e090: 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f   if (ENABLED(pro
e0a0: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c  to, TLS_PROTO_TL
e0b0: 53 31 5f 33 29 29 20 7b 0a 09 54 63 6c 5f 41 70  S1_3)) {..Tcl_Ap
e0c0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
e0d0: 70 2c 20 22 54 4c 53 20 31 2e 33 20 70 72 6f 74  p, "TLS 1.3 prot
e0e0: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74  ocol not support
e0f0: 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  ed", (char *) NU
e100: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c  LL);..return NUL
e110: 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  L;.    }.#endif.
e120: 20 20 20 20 69 66 20 28 70 72 6f 74 6f 20 3d 3d      if (proto ==
e130: 20 30 29 20 7b 0a 09 2f 2a 20 55 73 65 20 66 75   0) {../* Use fu
e140: 6c 6c 20 72 61 6e 67 65 20 2a 2f 0a 09 53 53 4c  ll range */..SSL
e150: 5f 43 54 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f  _CTX_set_min_pro
e160: 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20  to_version(ctx, 
e170: 30 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74  0);..SSL_CTX_set
e180: 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 72 73 69  _max_proto_versi
e190: 6f 6e 28 63 74 78 2c 20 30 29 3b 0a 20 20 20 20  on(ctx, 0);.    
e1a0: 7d 0a 0a 20 20 20 20 73 77 69 74 63 68 20 28 70  }..    switch (p
e1b0: 72 6f 74 6f 29 20 7b 0a 23 69 66 20 4f 50 45 4e  roto) {.#if OPEN
e1c0: 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42  SSL_VERSION_NUMB
e1d0: 45 52 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c  ER < 0x10100000L
e1e0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f   && !defined(NO_
e1f0: 53 53 4c 32 29 20 26 26 20 21 64 65 66 69 6e 65  SSL2) && !define
e200: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c  d(OPENSSL_NO_SSL
e210: 32 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f  2).    case TLS_
e220: 50 52 4f 54 4f 5f 53 53 4c 32 3a 0a 09 6d 65 74  PROTO_SSL2:..met
e230: 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f  hod = isServer ?
e240: 20 53 53 4c 76 32 5f 73 65 72 76 65 72 5f 6d 65   SSLv2_server_me
e250: 74 68 6f 64 28 29 20 3a 20 53 53 4c 76 32 5f 63  thod() : SSLv2_c
e260: 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a  lient_method();.
e270: 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23  .break;.#endif.#
e280: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53  if !defined(NO_S
e290: 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 64  SL3) && !defined
e2a0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33  (OPENSSL_NO_SSL3
e2b0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
e2c0: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45  ENSSL_NO_SSL3_ME
e2d0: 54 48 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54  THOD).    case T
e2e0: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 3a 0a 09  LS_PROTO_SSL3:..
e2f0: 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65  method = isServe
e300: 72 20 3f 20 53 53 4c 76 33 5f 73 65 72 76 65 72  r ? SSLv3_server
e310: 5f 6d 65 74 68 6f 64 28 29 20 3a 20 53 53 4c 76  _method() : SSLv
e320: 33 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28  3_client_method(
e330: 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69  );..break;.#endi
e340: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  f.#if !defined(N
e350: 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66 69  O_TLS1) && !defi
e360: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
e370: 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 64  LS1) && !defined
e380: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
e390: 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 61 73  _METHOD).    cas
e3a0: 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31  e TLS_PROTO_TLS1
e3b0: 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65  :..method = isSe
e3c0: 72 76 65 72 20 3f 20 54 4c 53 76 31 5f 73 65 72  rver ? TLSv1_ser
e3d0: 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54  ver_method() : T
e3e0: 4c 53 76 31 5f 63 6c 69 65 6e 74 5f 6d 65 74 68  LSv1_client_meth
e3f0: 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65  od();..break;.#e
e400: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65  ndif.#if !define
e410: 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20  d(NO_TLS1_1) && 
e420: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
e430: 5f 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21  _NO_TLS1_1) && !
e440: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
e450: 4e 4f 5f 54 4c 53 31 5f 31 5f 4d 45 54 48 4f 44  NO_TLS1_1_METHOD
e460: 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50  ).    case TLS_P
e470: 52 4f 54 4f 5f 54 4c 53 31 5f 31 3a 0a 09 6d 65  ROTO_TLS1_1:..me
e480: 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20  thod = isServer 
e490: 3f 20 54 4c 53 76 31 5f 31 5f 73 65 72 76 65 72  ? TLSv1_1_server
e4a0: 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 76  _method() : TLSv
e4b0: 31 5f 31 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f  1_1_client_metho
e4c0: 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e  d();..break;.#en
e4d0: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64  dif.#if !defined
e4e0: 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21  (NO_TLS1_2) && !
e4f0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
e500: 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64  NO_TLS1_2) && !d
e510: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
e520: 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29  O_TLS1_2_METHOD)
e530: 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52  .    case TLS_PR
e540: 4f 54 4f 5f 54 4c 53 31 5f 32 3a 0a 09 6d 65 74  OTO_TLS1_2:..met
e550: 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f  hod = isServer ?
e560: 20 54 4c 53 76 31 5f 32 5f 73 65 72 76 65 72 5f   TLSv1_2_server_
e570: 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 76 31  method() : TLSv1
e580: 5f 32 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64  _2_client_method
e590: 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64  ();..break;.#end
e5a0: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  if.#if !defined(
e5b0: 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64  NO_TLS1_3) && !d
e5c0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
e5d0: 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 63 61  O_TLS1_3).    ca
e5e0: 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53  se TLS_PROTO_TLS
e5f0: 31 5f 33 3a 0a 09 2f 2a 20 55 73 65 20 74 68 65  1_3:../* Use the
e600: 20 67 65 6e 65 72 69 63 20 6d 65 74 68 6f 64 20   generic method 
e610: 61 6e 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 72  and constraint r
e620: 61 6e 67 65 20 61 66 74 65 72 20 63 6f 6e 74 65  ange after conte
e630: 78 74 20 69 73 20 63 72 65 61 74 65 64 20 2a 2f  xt is created */
e640: 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72  ..method = isSer
e650: 76 65 72 20 3f 20 54 4c 53 5f 73 65 72 76 65 72  ver ? TLS_server
e660: 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 5f  _method() : TLS_
e670: 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b  client_method();
e680: 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a  ..break;.#endif.
e690: 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 2f 2a      default:../*
e6a0: 20 4e 65 67 6f 74 69 61 74 65 20 68 69 67 68 65   Negotiate highe
e6b0: 73 74 20 61 76 61 69 6c 61 62 6c 65 20 53 53 4c  st available SSL
e6c0: 2f 54 4c 53 20 76 65 72 73 69 6f 6e 20 2a 2f 0a  /TLS version */.
e6d0: 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76  .method = isServ
e6e0: 65 72 20 3f 20 54 4c 53 5f 73 65 72 76 65 72 5f  er ? TLS_server_
e6f0: 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 5f 63  method() : TLS_c
e700: 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a  lient_method();.
e710: 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53  #if OPENSSL_VERS
e720: 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31  ION_NUMBER < 0x1
e730: 30 31 30 30 30 30 30 4c 20 26 26 20 21 64 65 66  0100000L && !def
e740: 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26  ined(NO_SSL2) &&
e750: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
e760: 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 09 6f 66 66 20  L_NO_SSL2)..off 
e770: 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74  |= (ENABLED(prot
e780: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c  o, TLS_PROTO_SSL
e790: 32 29 20 20 20 3f 20 30 20 3a 20 53 53 4c 5f 4f  2)   ? 0 : SSL_O
e7a0: 50 5f 4e 4f 5f 53 53 4c 76 32 29 3b 0a 23 65 6e  P_NO_SSLv2);.#en
e7b0: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64  dif.#if !defined
e7c0: 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65  (NO_SSL3) && !de
e7d0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
e7e0: 5f 53 53 4c 33 29 0a 09 6f 66 66 20 7c 3d 20 28  _SSL3)..off |= (
e7f0: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54  ENABLED(proto, T
e800: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 29 20 20  LS_PROTO_SSL3)  
e810: 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f   ? 0 : SSL_OP_NO
e820: 5f 53 53 4c 76 33 29 3b 0a 23 65 6e 64 69 66 0a  _SSLv3);.#endif.
e830: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f  #if !defined(NO_
e840: 54 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e 65  TLS1) && !define
e850: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
e860: 31 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42  1)..off |= (ENAB
e870: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50  LED(proto, TLS_P
e880: 52 4f 54 4f 5f 54 4c 53 31 29 20 20 20 3f 20 30  ROTO_TLS1)   ? 0
e890: 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53   : SSL_OP_NO_TLS
e8a0: 76 31 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  v1);.#endif.#if 
e8b0: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31  !defined(NO_TLS1
e8c0: 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  _1) && !defined(
e8d0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
e8e0: 31 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42  1)..off |= (ENAB
e8f0: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50  LED(proto, TLS_P
e900: 52 4f 54 4f 5f 54 4c 53 31 5f 31 29 20 3f 20 30  ROTO_TLS1_1) ? 0
e910: 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53   : SSL_OP_NO_TLS
e920: 76 31 5f 31 29 3b 0a 23 65 6e 64 69 66 0a 23 69  v1_1);.#endif.#i
e930: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  f !defined(NO_TL
e940: 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65  S1_2) && !define
e950: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
e960: 31 5f 32 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e  1_2)..off |= (EN
e970: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53  ABLED(proto, TLS
e980: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 29 20 3f  _PROTO_TLS1_2) ?
e990: 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54   0 : SSL_OP_NO_T
e9a0: 4c 53 76 31 5f 32 29 3b 0a 23 65 6e 64 69 66 0a  LSv1_2);.#endif.
e9b0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f  #if !defined(NO_
e9c0: 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66 69  TLS1_3) && !defi
e9d0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
e9e0: 4c 53 31 5f 33 29 0a 09 6f 66 66 20 7c 3d 20 28  LS1_3)..off |= (
e9f0: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54  ENABLED(proto, T
ea00: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29  LS_PROTO_TLS1_3)
ea10: 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f   ? 0 : SSL_OP_NO
ea20: 5f 54 4c 53 76 31 5f 33 29 3b 0a 23 65 6e 64 69  _TLSv1_3);.#endi
ea30: 66 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a  f..break;.    }.
ea40: 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65  .    ERR_clear_e
ea50: 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 63 74 78  rror();..    ctx
ea60: 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 6d   = SSL_CTX_new(m
ea70: 65 74 68 6f 64 29 3b 0a 20 20 20 20 69 66 20 28  ethod);.    if (
ea80: 21 63 74 78 29 20 7b 0a 09 72 65 74 75 72 6e 20  !ctx) {..return 
ea90: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  NULL;.    }..   
eaa0: 20 69 66 20 28 67 65 74 65 6e 76 28 53 53 4c 4b   if (getenv(SSLK
eab0: 45 59 4c 4f 47 46 49 4c 45 29 29 20 7b 0a 09 53  EYLOGFILE)) {..S
eac0: 53 4c 5f 43 54 58 5f 73 65 74 5f 6b 65 79 6c 6f  SL_CTX_set_keylo
ead0: 67 5f 63 61 6c 6c 62 61 63 6b 28 63 74 78 2c 20  g_callback(ctx, 
eae0: 4b 65 79 4c 6f 67 43 61 6c 6c 62 61 63 6b 29 3b  KeyLogCallback);
eaf0: 0a 20 20 20 20 7d 0a 0a 23 69 66 20 21 64 65 66  .    }..#if !def
eb00: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20  ined(NO_TLS1_3) 
eb10: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
eb20: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20  SSL_NO_TLS1_3). 
eb30: 20 20 20 69 66 20 28 70 72 6f 74 6f 20 3d 3d 20     if (proto == 
eb40: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33  TLS_PROTO_TLS1_3
eb50: 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74  ) {..SSL_CTX_set
eb60: 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 69  _min_proto_versi
eb70: 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56  on(ctx, TLS1_3_V
eb80: 45 52 53 49 4f 4e 29 3b 0a 09 53 53 4c 5f 43 54  ERSION);..SSL_CT
eb90: 58 5f 73 65 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f  X_set_max_proto_
eba0: 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53  version(ctx, TLS
ebb0: 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 20 20  1_3_VERSION);.  
ebc0: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
ebd0: 2f 2a 20 46 6f 72 63 65 20 63 69 70 68 65 72 20  /* Force cipher 
ebe0: 73 65 6c 65 63 74 69 6f 6e 20 6f 72 64 65 72 20  selection order 
ebf0: 62 79 20 73 65 72 76 65 72 20 2a 2f 0a 20 20 20  by server */.   
ec00: 20 69 66 20 28 21 69 73 53 65 72 76 65 72 29 20   if (!isServer) 
ec10: 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f  {..SSL_CTX_set_o
ec20: 70 74 69 6f 6e 73 28 63 74 78 2c 20 53 53 4c 5f  ptions(ctx, SSL_
ec30: 4f 50 5f 43 49 50 48 45 52 5f 53 45 52 56 45 52  OP_CIPHER_SERVER
ec40: 5f 50 52 45 46 45 52 45 4e 43 45 29 3b 0a 20 20  _PREFERENCE);.  
ec50: 20 20 7d 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c    }..#if OPENSSL
ec60: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20  _VERSION_NUMBER 
ec70: 3c 20 30 78 31 30 31 30 30 30 30 30 4c 0a 20 20  < 0x10100000L.  
ec80: 20 20 4f 70 65 6e 53 53 4c 5f 61 64 64 5f 61 6c    OpenSSL_add_al
ec90: 6c 5f 61 6c 67 6f 72 69 74 68 6d 73 28 29 3b 20  l_algorithms(); 
eca0: 2f 2a 20 4c 6f 61 64 20 63 69 70 68 65 72 73 20  /* Load ciphers 
ecb0: 61 6e 64 20 64 69 67 65 73 74 73 20 2a 2f 0a 23  and digests */.#
ecc0: 65 6e 64 69 66 0a 0a 20 20 20 20 53 53 4c 5f 43  endif..    SSL_C
ecd0: 54 58 5f 73 65 74 5f 61 70 70 5f 64 61 74 61 28  TX_set_app_data(
ece0: 63 74 78 2c 20 28 76 6f 69 64 2a 29 69 6e 74 65  ctx, (void*)inte
ecf0: 72 70 29 3b 09 2f 2a 20 72 65 6d 65 6d 62 65 72  rp);./* remember
ed00: 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72   the interpreter
ed10: 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f   */.    SSL_CTX_
ed20: 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c  set_options(ctx,
ed30: 20 53 53 4c 5f 4f 50 5f 41 4c 4c 29 3b 09 2f 2a   SSL_OP_ALL);./*
ed40: 20 45 6e 61 62 6c 65 20 61 6c 6c 20 53 53 4c 20   Enable all SSL 
ed50: 62 75 67 20 77 6f 72 6b 61 72 6f 75 6e 64 73 20  bug workarounds 
ed60: 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73  */.    SSL_CTX_s
ed70: 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20  et_options(ctx, 
ed80: 53 53 4c 5f 4f 50 5f 4e 4f 5f 43 4f 4d 50 52 45  SSL_OP_NO_COMPRE
ed90: 53 53 49 4f 4e 29 3b 09 2f 2a 20 44 69 73 61 62  SSION);./* Disab
eda0: 6c 65 20 63 6f 6d 70 72 65 73 73 69 6f 6e 20 65  le compression e
edb0: 76 65 6e 20 69 66 20 73 75 70 70 6f 72 74 65 64  ven if supported
edc0: 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f   */.    SSL_CTX_
edd0: 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c  set_options(ctx,
ede0: 20 6f 66 66 29 3b 09 09 2f 2a 20 44 69 73 61 62   off);../* Disab
edf0: 6c 65 20 73 70 65 63 69 66 69 65 64 20 70 72 6f  le specified pro
ee00: 74 6f 63 6f 6c 20 76 65 72 73 69 6f 6e 73 20 2a  tocol versions *
ee10: 2f 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 77 20  /..    /* Allow 
ee20: 77 72 69 74 65 73 20 74 6f 20 72 65 70 6f 72 74  writes to report
ee30: 20 73 75 63 63 65 73 73 20 77 68 65 6e 20 6c 65   success when le
ee40: 73 73 20 74 68 61 6e 20 61 6c 6c 20 72 65 63 6f  ss than all reco
ee50: 72 64 73 20 68 61 76 65 20 62 65 65 6e 20 77 72  rds have been wr
ee60: 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20 53 53 4c  itten */.    SSL
ee70: 5f 43 54 58 5f 73 65 74 5f 6d 6f 64 65 28 63 74  _CTX_set_mode(ct
ee80: 78 2c 20 53 53 4c 5f 4d 4f 44 45 5f 45 4e 41 42  x, SSL_MODE_ENAB
ee90: 4c 45 5f 50 41 52 54 49 41 4c 5f 57 52 49 54 45  LE_PARTIAL_WRITE
eea0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 69 73 61 62  );..    /* Disab
eeb0: 6c 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 74  le attempts to t
eec0: 72 79 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68  ry to process th
eed0: 65 20 6e 65 78 74 20 72 65 63 6f 72 64 20 69 6e  e next record in
eee0: 73 74 65 61 64 20 6f 66 20 72 65 74 75 72 6e 69  stead of returni
eef0: 6e 67 20 61 66 74 65 72 20 61 0a 20 20 20 20 20  ng after a.     
ef00: 20 20 6e 6f 6e 2d 61 70 70 20 72 65 63 6f 72 64    non-app record
ef10: 2e 20 41 76 6f 69 64 73 20 68 61 6e 67 73 20 69  . Avoids hangs i
ef20: 6e 20 62 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2c  n blocking mode,
ef30: 20 77 68 65 6e 20 75 73 69 6e 67 20 53 53 4c 5f   when using SSL_
ef40: 72 65 61 64 28 29 20 61 6e 64 20 61 0a 20 20 20  read() and a.   
ef50: 20 20 20 20 6e 6f 6e 2d 61 70 70 6c 69 63 61 74      non-applicat
ef60: 69 6f 6e 20 72 65 63 6f 72 64 20 77 61 73 20 73  ion record was s
ef70: 65 6e 74 20 77 69 74 68 6f 75 74 20 61 6e 79 20  ent without any 
ef80: 61 70 70 6c 69 63 61 74 69 6f 6e 20 64 61 74 61  application data
ef90: 2e 20 2a 2f 0a 20 20 20 20 2f 2a 53 53 4c 5f 43  . */.    /*SSL_C
efa0: 54 58 5f 63 6c 65 61 72 5f 6d 6f 64 65 28 63 74  TX_clear_mode(ct
efb0: 78 2c 20 53 53 4c 5f 4d 4f 44 45 5f 41 55 54 4f  x, SSL_MODE_AUTO
efc0: 5f 52 45 54 52 59 29 3b 2a 2f 0a 0a 20 20 20 20  _RETRY);*/..    
efd0: 53 53 4c 5f 43 54 58 5f 73 65 73 73 5f 73 65 74  SSL_CTX_sess_set
efe0: 5f 63 61 63 68 65 5f 73 69 7a 65 28 63 74 78 2c  _cache_size(ctx,
eff0: 20 31 32 38 29 3b 0a 0a 20 20 20 20 2f 2a 20 53   128);..    /* S
f000: 65 74 20 75 73 65 72 20 64 65 66 69 6e 65 64 20  et user defined 
f010: 63 69 70 68 65 72 73 2c 20 63 69 70 68 65 72 20  ciphers, cipher 
f020: 73 75 69 74 65 73 2c 20 61 6e 64 20 73 65 63 75  suites, and secu
f030: 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 20 20  rity level */.  
f040: 20 20 69 66 20 28 28 63 69 70 68 65 72 73 20 21    if ((ciphers !
f050: 3d 20 4e 55 4c 4c 29 20 26 26 20 21 53 53 4c 5f  = NULL) && !SSL_
f060: 43 54 58 5f 73 65 74 5f 63 69 70 68 65 72 5f 6c  CTX_set_cipher_l
f070: 69 73 74 28 63 74 78 2c 20 63 69 70 68 65 72 73  ist(ctx, ciphers
f080: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  )) {..Tcl_Append
f090: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
f0a0: 53 65 74 20 63 69 70 68 65 72 73 20 66 61 69 6c  Set ciphers fail
f0b0: 65 64 3a 20 4e 6f 20 76 61 6c 69 64 20 63 69 70  ed: No valid cip
f0c0: 68 65 72 73 22 2c 20 28 63 68 61 72 20 2a 29 20  hers", (char *) 
f0d0: 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f  NULL);..SSL_CTX_
f0e0: 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75  free(ctx);..retu
f0f0: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20  rn NULL;.    }. 
f100: 20 20 20 69 66 20 28 28 63 69 70 68 65 72 73 75     if ((ciphersu
f110: 69 74 65 73 20 21 3d 20 4e 55 4c 4c 29 20 26 26  ites != NULL) &&
f120: 20 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 69   !SSL_CTX_set_ci
f130: 70 68 65 72 73 75 69 74 65 73 28 63 74 78 2c 20  phersuites(ctx, 
f140: 63 69 70 68 65 72 73 75 69 74 65 73 29 29 20 7b  ciphersuites)) {
f150: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
f160: 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20  lt(interp, "Set 
f170: 63 69 70 68 65 72 20 73 75 69 74 65 73 20 66 61  cipher suites fa
f180: 69 6c 65 64 3a 20 4e 6f 20 76 61 6c 69 64 20 63  iled: No valid c
f190: 69 70 68 65 72 73 22 2c 20 28 63 68 61 72 20 2a  iphers", (char *
f1a0: 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54  ) NULL);..SSL_CT
f1b0: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65  X_free(ctx);..re
f1c0: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  turn NULL;.    }
f1d0: 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 61 75 74  ..    /* set aut
f1e0: 6f 6d 61 74 69 63 20 63 75 72 76 65 20 73 65 6c  omatic curve sel
f1f0: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 53 53  ection */.    SS
f200: 4c 5f 43 54 58 5f 73 65 74 5f 65 63 64 68 5f 61  L_CTX_set_ecdh_a
f210: 75 74 6f 28 63 74 78 2c 20 31 29 3b 0a 0a 20 20  uto(ctx, 1);..  
f220: 20 20 2f 2a 20 53 65 74 20 73 65 63 75 72 69 74    /* Set securit
f230: 79 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69  y level */.    i
f240: 66 20 28 6c 65 76 65 6c 20 3e 20 2d 31 20 26 26  f (level > -1 &&
f250: 20 6c 65 76 65 6c 20 3c 20 36 29 20 7b 0a 09 2f   level < 6) {../
f260: 2a 20 53 53 4c 5f 73 65 74 5f 73 65 63 75 72 69  * SSL_set_securi
f270: 74 79 5f 6c 65 76 65 6c 20 2a 2f 0a 09 53 53 4c  ty_level */..SSL
f280: 5f 43 54 58 5f 73 65 74 5f 73 65 63 75 72 69 74  _CTX_set_securit
f290: 79 5f 6c 65 76 65 6c 28 63 74 78 2c 20 6c 65 76  y_level(ctx, lev
f2a0: 65 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  el);.    }..    
f2b0: 2f 2a 20 73 65 74 20 73 6f 6d 65 20 63 61 6c 6c  /* set some call
f2c0: 62 61 63 6b 73 20 2a 2f 0a 20 20 20 20 53 53 4c  backs */.    SSL
f2d0: 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74  _CTX_set_default
f2e0: 5f 70 61 73 73 77 64 5f 63 62 28 63 74 78 2c 20  _passwd_cb(ctx, 
f2f0: 50 61 73 73 77 6f 72 64 43 61 6c 6c 62 61 63 6b  PasswordCallback
f300: 29 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73  );.    SSL_CTX_s
f310: 65 74 5f 64 65 66 61 75 6c 74 5f 70 61 73 73 77  et_default_passw
f320: 64 5f 63 62 5f 75 73 65 72 64 61 74 61 28 63 74  d_cb_userdata(ct
f330: 78 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65  x, (void *)state
f340: 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 72 65  Ptr);..    /* re
f350: 61 64 20 61 20 44 69 66 66 69 65 2d 48 65 6c 6c  ad a Diffie-Hell
f360: 6d 61 6e 20 70 61 72 61 6d 65 74 65 72 73 20 66  man parameters f
f370: 69 6c 65 2c 20 6f 72 20 75 73 65 20 74 68 65 20  ile, or use the 
f380: 62 75 69 6c 74 2d 69 6e 20 6f 6e 65 20 2a 2f 0a  built-in one */.
f390: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49      Tcl_DStringI
f3a0: 6e 69 74 28 26 64 73 29 3b 0a 23 69 66 64 65 66  nit(&ds);.#ifdef
f3b0: 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 44 48 0a 20   OPENSSL_NO_DH. 
f3c0: 20 20 20 69 66 20 28 44 48 70 61 72 61 6d 73 20     if (DHparams 
f3d0: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f  != NULL) {..Tcl_
f3e0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
f3f0: 65 72 70 2c 20 22 44 48 20 70 61 72 61 6d 65 74  erp, "DH paramet
f400: 65 72 20 73 75 70 70 6f 72 74 20 6e 6f 74 20 61  er support not a
f410: 76 61 69 6c 61 62 6c 65 22 2c 20 28 63 68 61 72  vailable", (char
f420: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f   *) NULL);..SSL_
f430: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09  CTX_free(ctx);..
f440: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20  return NULL;.   
f450: 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 7b 0a 09   }.#else.    {..
f460: 44 48 2a 20 64 68 3b 0a 09 69 66 20 28 44 48 70  DH* dh;..if (DHp
f470: 61 72 61 6d 73 20 21 3d 20 4e 55 4c 4c 29 20 7b  arams != NULL) {
f480: 0a 09 20 20 20 20 42 49 4f 20 2a 62 69 6f 3b 0a  ..    BIO *bio;.
f490: 0a 09 20 20 20 20 62 69 6f 20 3d 20 42 49 4f 5f  ..    bio = BIO_
f4a0: 6e 65 77 5f 66 69 6c 65 28 46 32 4e 28 44 48 70  new_file(F2N(DHp
f4b0: 61 72 61 6d 73 2c 20 26 64 73 29 2c 20 22 72 22  arams, &ds), "r"
f4c0: 29 3b 0a 09 20 20 20 20 69 66 20 28 21 62 69 6f  );..    if (!bio
f4d0: 29 20 7b 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e  ) {...Tcl_DStrin
f4e0: 67 46 72 65 65 28 26 64 73 29 3b 0a 09 09 54 63  gFree(&ds);...Tc
f4f0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
f500: 6e 74 65 72 70 2c 20 22 43 6f 75 6c 64 20 6e 6f  nterp, "Could no
f510: 74 20 66 69 6e 64 20 44 48 20 70 61 72 61 6d 65  t find DH parame
f520: 74 65 72 73 20 66 69 6c 65 22 2c 20 28 63 68 61  ters file", (cha
f530: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53  r *) NULL);...SS
f540: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b  L_CTX_free(ctx);
f550: 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a  ...return NULL;.
f560: 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 64 68 20  .    }...    dh 
f570: 3d 20 50 45 4d 5f 72 65 61 64 5f 62 69 6f 5f 44  = PEM_read_bio_D
f580: 48 70 61 72 61 6d 73 28 62 69 6f 2c 20 4e 55 4c  Hparams(bio, NUL
f590: 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a  L, NULL, NULL);.
f5a0: 09 20 20 20 20 42 49 4f 5f 66 72 65 65 28 62 69  .    BIO_free(bi
f5b0: 6f 29 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74  o);..    Tcl_DSt
f5c0: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09  ringFree(&ds);..
f5d0: 20 20 20 20 69 66 20 28 21 64 68 29 20 7b 0a 09      if (!dh) {..
f5e0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
f5f0: 74 28 69 6e 74 65 72 70 2c 20 22 43 6f 75 6c 64  t(interp, "Could
f600: 20 6e 6f 74 20 72 65 61 64 20 44 48 20 70 61 72   not read DH par
f610: 61 6d 65 74 65 72 73 20 66 72 6f 6d 20 66 69 6c  ameters from fil
f620: 65 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  e", (char *) NUL
f630: 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72  L);...SSL_CTX_fr
f640: 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72  ee(ctx);...retur
f650: 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09  n NULL;..    }..
f660: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f      SSL_CTX_set_
f670: 74 6d 70 5f 64 68 28 63 74 78 2c 20 64 68 29 3b  tmp_dh(ctx, dh);
f680: 0a 09 20 20 20 20 44 48 5f 66 72 65 65 28 64 68  ..    DH_free(dh
f690: 29 3b 0a 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20  );...} else {.. 
f6a0: 20 20 20 2f 2a 20 55 73 65 20 77 65 6c 6c 20 6b     /* Use well k
f6b0: 6e 6f 77 6e 20 44 48 20 70 61 72 61 6d 65 74 65  nown DH paramete
f6c0: 72 73 20 74 68 61 74 20 68 61 76 65 20 62 75 69  rs that have bui
f6d0: 6c 74 2d 69 6e 20 73 75 70 70 6f 72 74 20 69 6e  lt-in support in
f6e0: 20 4f 70 65 6e 53 53 4c 20 2a 2f 0a 09 20 20 20   OpenSSL */..   
f6f0: 20 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 73 65   if (!SSL_CTX_se
f700: 74 5f 64 68 5f 61 75 74 6f 28 63 74 78 2c 20 31  t_dh_auto(ctx, 1
f710: 29 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e  )) {...Tcl_Appen
f720: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
f730: 22 43 6f 75 6c 64 20 6e 6f 74 20 65 6e 61 62 6c  "Could not enabl
f740: 65 20 73 65 74 20 44 48 20 61 75 74 6f 3a 20 22  e set DH auto: "
f750: 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e  , GET_ERR_REASON
f760: 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  (), (char *) NUL
f770: 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72  L);...SSL_CTX_fr
f780: 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72  ee(ctx);...retur
f790: 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09  n NULL;..    }..
f7a0: 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  }.    }.#endif..
f7b0: 20 20 20 20 2f 2a 20 73 65 74 20 6f 75 72 20 63      /* set our c
f7c0: 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 20 20  ertificate */.  
f7d0: 20 20 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b    load_private_k
f7e0: 65 79 20 3d 20 30 3b 0a 20 20 20 20 69 66 20 28  ey = 0;.    if (
f7f0: 63 65 72 74 66 69 6c 65 20 21 3d 20 4e 55 4c 4c  certfile != NULL
f800: 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 69 76 61 74  ) {..load_privat
f810: 65 5f 6b 65 79 20 3d 20 31 3b 0a 0a 09 69 66 20  e_key = 1;...if 
f820: 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72  (SSL_CTX_use_cer
f830: 74 69 66 69 63 61 74 65 5f 66 69 6c 65 28 63 74  tificate_file(ct
f840: 78 2c 20 46 32 4e 28 63 65 72 74 66 69 6c 65 2c  x, F2N(certfile,
f850: 20 26 64 73 29 2c 20 53 53 4c 5f 46 49 4c 45 54   &ds), SSL_FILET
f860: 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b  YPE_PEM) <= 0) {
f870: 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ..    Tcl_DStrin
f880: 67 46 72 65 65 28 26 64 73 29 3b 0a 09 20 20 20  gFree(&ds);..   
f890: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
f8a0: 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c  t(interp, "unabl
f8b0: 65 20 74 6f 20 73 65 74 20 63 65 72 74 69 66 69  e to set certifi
f8c0: 63 61 74 65 20 66 69 6c 65 20 22 2c 20 63 65 72  cate file ", cer
f8d0: 74 66 69 6c 65 2c 20 22 3a 20 22 2c 0a 09 09 47  tfile, ": ",...G
f8e0: 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c  ET_ERR_REASON(),
f8f0: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
f900: 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72  ..    SSL_CTX_fr
f910: 65 65 28 63 74 78 29 3b 0a 09 20 20 20 20 72 65  ee(ctx);..    re
f920: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a 09 54  turn NULL;..}..T
f930: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26  cl_DStringFree(&
f940: 64 73 29 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65  ds);..    } else
f950: 20 69 66 20 28 63 65 72 74 20 21 3d 20 4e 55 4c   if (cert != NUL
f960: 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 69 76 61  L) {..load_priva
f970: 74 65 5f 6b 65 79 20 3d 20 31 3b 0a 09 69 66 20  te_key = 1;..if 
f980: 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72  (SSL_CTX_use_cer
f990: 74 69 66 69 63 61 74 65 5f 41 53 4e 31 28 63 74  tificate_ASN1(ct
f9a0: 78 2c 20 28 69 6e 74 29 20 63 65 72 74 5f 6c 65  x, (int) cert_le
f9b0: 6e 2c 20 63 65 72 74 29 20 3c 3d 20 30 29 20 7b  n, cert) <= 0) {
f9c0: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ..    Tcl_Append
f9d0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
f9e0: 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 63 65  unable to set ce
f9f0: 72 74 69 66 69 63 61 74 65 3a 20 22 2c 0a 09 09  rtificate: ",...
fa00: 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29  GET_ERR_REASON()
fa10: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
fa20: 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 66  ;..    SSL_CTX_f
fa30: 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20 20 72  ree(ctx);..    r
fa40: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a 20  eturn NULL;..}. 
fa50: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 63 65 72     } else {..cer
fa60: 74 66 69 6c 65 20 3d 20 28 63 68 61 72 2a 29 58  tfile = (char*)X
fa70: 35 30 39 5f 67 65 74 5f 64 65 66 61 75 6c 74 5f  509_get_default_
fa80: 63 65 72 74 5f 66 69 6c 65 28 29 3b 0a 0a 09 69  cert_file();...i
fa90: 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63  f (SSL_CTX_use_c
faa0: 65 72 74 69 66 69 63 61 74 65 5f 66 69 6c 65 28  ertificate_file(
fab0: 63 74 78 2c 20 63 65 72 74 66 69 6c 65 2c 20 53  ctx, certfile, S
fac0: 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d 29  SL_FILETYPE_PEM)
fad0: 20 3c 3d 20 30 29 20 7b 0a 23 69 66 20 30 0a 09   <= 0) {.#if 0..
fae0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
faf0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e  sult(interp, "un
fb00: 61 62 6c 65 20 74 6f 20 75 73 65 20 64 65 66 61  able to use defa
fb10: 75 6c 74 20 63 65 72 74 69 66 69 63 61 74 65 20  ult certificate 
fb20: 66 69 6c 65 20 22 2c 20 63 65 72 74 66 69 6c 65  file ", certfile
fb30: 2c 20 22 3a 20 22 2c 0a 09 09 47 45 54 5f 45 52  , ": ",...GET_ER
fb40: 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61  R_REASON(), (cha
fb50: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20  r *) NULL);..   
fb60: 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74   SSL_CTX_free(ct
fb70: 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  x);..    return 
fb80: 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 09 7d 0a  NULL;.#endif..}.
fb90: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 73 65      }..    /* se
fba0: 74 20 6f 75 72 20 70 72 69 76 61 74 65 20 6b 65  t our private ke
fbb0: 79 20 2a 2f 0a 20 20 20 20 69 66 20 28 6c 6f 61  y */.    if (loa
fbc0: 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 29 20 7b  d_private_key) {
fbd0: 0a 09 69 66 20 28 6b 65 79 66 69 6c 65 20 3d 3d  ..if (keyfile ==
fbe0: 20 4e 55 4c 4c 20 26 26 20 6b 65 79 20 3d 3d 20   NULL && key == 
fbf0: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 6b 65 79  NULL) {..    key
fc00: 66 69 6c 65 20 3d 20 63 65 72 74 66 69 6c 65 3b  file = certfile;
fc10: 0a 09 7d 0a 0a 09 69 66 20 28 6b 65 79 66 69 6c  ..}...if (keyfil
fc20: 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20  e != NULL) {..  
fc30: 20 20 2f 2a 20 67 65 74 20 74 68 65 20 70 72 69    /* get the pri
fc40: 76 61 74 65 20 6b 65 79 20 61 73 73 6f 63 69 61  vate key associa
fc50: 74 65 64 20 77 69 74 68 20 74 68 69 73 20 63 65  ted with this ce
fc60: 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 20 20  rtificate */..  
fc70: 20 20 69 66 20 28 6b 65 79 66 69 6c 65 20 3d 3d    if (keyfile ==
fc80: 20 4e 55 4c 4c 29 20 7b 0a 09 09 6b 65 79 66 69   NULL) {...keyfi
fc90: 6c 65 20 3d 20 63 65 72 74 66 69 6c 65 3b 0a 09  le = certfile;..
fca0: 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 28      }...    if (
fcb0: 53 53 4c 5f 43 54 58 5f 75 73 65 5f 50 72 69 76  SSL_CTX_use_Priv
fcc0: 61 74 65 4b 65 79 5f 66 69 6c 65 28 63 74 78 2c  ateKey_file(ctx,
fcd0: 20 46 32 4e 28 6b 65 79 66 69 6c 65 2c 20 26 64   F2N(keyfile, &d
fce0: 73 29 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 45  s), SSL_FILETYPE
fcf0: 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 09  _PEM) <= 0) {...
fd00: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
fd10: 26 64 73 29 3b 0a 09 09 2f 2a 20 66 6c 75 73 68  &ds);.../* flush
fd20: 20 74 68 65 20 70 61 73 73 70 68 72 61 73 65 20   the passphrase 
fd30: 77 68 69 63 68 20 6d 69 67 68 74 20 62 65 20 6c  which might be l
fd40: 65 66 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c  eft in the resul
fd50: 74 20 2a 2f 0a 09 09 54 63 6c 5f 53 65 74 52 65  t */...Tcl_SetRe
fd60: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 4e 55 4c  sult(interp, NUL
fd70: 4c 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a  L, TCL_STATIC);.
fd80: 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
fd90: 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62  lt(interp, "unab
fda0: 6c 65 20 74 6f 20 73 65 74 20 70 75 62 6c 69 63  le to set public
fdb0: 20 6b 65 79 20 66 69 6c 65 20 22 2c 20 6b 65 79   key file ", key
fdc0: 66 69 6c 65 2c 20 22 20 22 2c 0a 09 09 20 20 20  file, " ",...   
fdd0: 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28   GET_ERR_REASON(
fde0: 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ), (char *) NULL
fdf0: 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65  );...SSL_CTX_fre
fe00: 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e  e(ctx);...return
fe10: 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 20   NULL;..    }.. 
fe20: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72     Tcl_DStringFr
fe30: 65 65 28 26 64 73 29 3b 0a 0a 09 7d 20 65 6c 73  ee(&ds);...} els
fe40: 65 20 69 66 20 28 6b 65 79 20 21 3d 20 4e 55 4c  e if (key != NUL
fe50: 4c 29 20 7b 0a 09 20 20 20 20 69 66 20 28 53 53  L) {..    if (SS
fe60: 4c 5f 43 54 58 5f 75 73 65 5f 50 72 69 76 61 74  L_CTX_use_Privat
fe70: 65 4b 65 79 5f 41 53 4e 31 28 45 56 50 5f 50 4b  eKey_ASN1(EVP_PK
fe80: 45 59 5f 52 53 41 2c 20 63 74 78 2c 20 6b 65 79  EY_RSA, ctx, key
fe90: 2c 20 28 69 6e 74 29 20 6b 65 79 5f 6c 65 6e 29  , (int) key_len)
fea0: 20 3c 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 66 6c   <= 0) {.../* fl
feb0: 75 73 68 20 74 68 65 20 70 61 73 73 70 68 72 61  ush the passphra
fec0: 73 65 20 77 68 69 63 68 20 6d 69 67 68 74 20 62  se which might b
fed0: 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 72 65  e left in the re
fee0: 73 75 6c 74 20 2a 2f 0a 09 09 54 63 6c 5f 53 65  sult */...Tcl_Se
fef0: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
ff00: 4e 55 4c 4c 2c 20 54 43 4c 5f 53 54 41 54 49 43  NULL, TCL_STATIC
ff10: 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52  );...Tcl_AppendR
ff20: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75  esult(interp, "u
ff30: 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 70 75 62  nable to set pub
ff40: 6c 69 63 20 6b 65 79 3a 20 22 2c 20 47 45 54 5f  lic key: ", GET_
ff50: 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63  ERR_REASON(), (c
ff60: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09  har *) NULL);...
ff70: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78  SSL_CTX_free(ctx
ff80: 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c  );...return NULL
ff90: 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 2f 2a 20  ;..    }..}../* 
ffa0: 4e 6f 77 20 77 65 20 6b 6e 6f 77 20 74 68 61 74  Now we know that
ffb0: 20 61 20 6b 65 79 20 61 6e 64 20 63 65 72 74 20   a key and cert 
ffc0: 68 61 76 65 20 62 65 65 6e 20 73 65 74 20 61 67  have been set ag
ffd0: 61 69 6e 73 74 0a 09 20 2a 20 74 68 65 20 53 53  ainst.. * the SS
ffe0: 4c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 69 66  L context */..if
fff0: 20 28 21 53 53 4c 5f 43 54 58 5f 63 68 65 63 6b   (!SSL_CTX_check
10000 5f 70 72 69 76 61 74 65 5f 6b 65 79 28 63 74 78  _private_key(ctx
10010 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70  )) {..    Tcl_Ap
10020 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
10030 70 2c 20 22 70 72 69 76 61 74 65 20 6b 65 79 20  p, "private key 
10040 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74  does not match t
10050 68 65 20 63 65 72 74 69 66 69 63 61 74 65 20 70  he certificate p
10060 75 62 6c 69 63 20 6b 65 79 22 2c 0a 09 09 09 20  ublic key",.... 
10070 20 20 20 20 28 63 68 61 72 20 2a 29 20 4e 55 4c      (char *) NUL
10080 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58  L);..    SSL_CTX
10090 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20  _free(ctx);..   
100a0 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d   return NULL;..}
100b0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  .    }..    /* S
100c0 65 74 20 74 6f 20 75 73 65 20 74 68 65 20 64 65  et to use the de
100d0 66 61 75 6c 74 20 6c 6f 63 61 74 69 6f 6e 20 61  fault location a
100e0 6e 64 20 66 69 6c 65 20 66 6f 72 20 43 65 72 74  nd file for Cert
100f0 69 66 69 63 61 74 65 20 41 75 74 68 6f 72 69 74  ificate Authorit
10100 79 20 28 43 41 29 20 63 65 72 74 69 66 69 63 61  y (CA) certifica
10110 74 65 73 2e 0a 20 20 20 20 20 2a 20 54 68 65 20  tes..     * The 
10120 64 65 66 61 75 6c 74 20 43 41 20 63 65 72 74 69  default CA certi
10130 66 69 63 61 74 65 73 20 64 69 72 65 63 74 6f 72  ficates director
10140 79 20 69 73 20 63 61 6c 6c 65 64 20 63 65 72 74  y is called cert
10150 73 20 69 6e 20 74 68 65 20 64 65 66 61 75 6c 74  s in the default
10160 20 4f 70 65 6e 53 53 4c 0a 20 20 20 20 20 2a 20   OpenSSL.     * 
10170 64 69 72 65 63 74 6f 72 79 2e 20 49 74 20 63 6f  directory. It co
10180 6e 74 61 69 6e 73 20 74 68 65 20 43 41 20 63 65  ntains the CA ce
10190 72 74 69 66 69 63 61 74 65 73 20 69 6e 20 50 45  rtificates in PE
101a0 4d 20 66 6f 72 6d 61 74 2c 20 77 69 74 68 20 6f  M format, with o
101b0 6e 65 20 63 65 72 74 69 66 69 63 61 74 65 20 70  ne certificate p
101c0 65 72 0a 20 20 20 20 20 2a 20 66 69 6c 65 2e 20  er.     * file. 
101d0 54 68 65 20 76 65 72 69 66 79 20 70 61 74 68 20  The verify path 
101e0 61 6e 64 20 73 74 6f 72 65 20 63 61 6e 20 62 65  and store can be
101f0 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20 74   overridden by t
10200 68 65 20 53 53 4c 5f 43 45 52 54 5f 44 49 52 20  he SSL_CERT_DIR 
10210 65 6e 76 20 76 61 72 2e 20 54 68 65 0a 20 20 20  env var. The.   
10220 20 20 2a 20 64 65 66 61 75 6c 74 20 43 41 20 63    * default CA c
10230 65 72 74 69 66 69 63 61 74 65 73 20 66 69 6c 65  ertificates file
10240 20 69 73 20 63 61 6c 6c 65 64 20 63 65 72 74 2e   is called cert.
10250 70 65 6d 20 69 6e 20 74 68 65 20 64 65 66 61 75  pem in the defau
10260 6c 74 20 4f 70 65 6e 53 53 4c 20 64 69 72 65 63  lt OpenSSL direc
10270 74 6f 72 79 2e 0a 20 20 20 20 20 2a 20 54 68 65  tory..     * The
10280 20 76 65 72 69 66 79 20 66 69 6c 65 20 63 61 6e   verify file can
10290 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20 62   be overridden b
102a0 79 20 74 68 65 20 53 53 4c 5f 43 45 52 54 5f 46  y the SSL_CERT_F
102b0 49 4c 45 20 65 6e 76 20 76 61 72 2e 20 2a 2f 0a  ILE env var. */.
102c0 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43 54 58      if (!SSL_CTX
102d0 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 76 65 72  _set_default_ver
102e0 69 66 79 5f 70 61 74 68 73 28 63 74 78 29 29 20  ify_paths(ctx)) 
102f0 7b 0a 09 61 62 6f 72 74 2b 2b 3b 0a 20 20 20 20  {..abort++;.    
10300 7d 0a 0a 20 20 20 20 2f 2a 20 4f 76 65 72 72 69  }..    /* Overri
10310 64 65 73 20 66 6f 72 20 74 68 65 20 43 41 20 76  des for the CA v
10320 65 72 69 66 79 20 70 61 74 68 20 61 6e 64 20 66  erify path and f
10330 69 6c 65 20 2a 2f 0a 20 20 20 20 7b 0a 23 69 66  ile */.    {.#if
10340 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e   OPENSSL_VERSION
10350 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30  _NUMBER < 0x3000
10360 30 30 30 30 4c 0a 09 69 66 20 28 43 41 70 61 74  0000L..if (CApat
10370 68 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20 43 41 66  h != NULL || CAf
10380 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ile != NULL) {..
10390 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20      Tcl_DString 
103a0 64 73 31 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53  ds1;..    Tcl_DS
103b0 74 72 69 6e 67 49 6e 69 74 28 26 64 73 31 29 3b  tringInit(&ds1);
103c0 0a 0a 09 20 20 20 20 69 66 20 28 21 53 53 4c 5f  ...    if (!SSL_
103d0 43 54 58 5f 6c 6f 61 64 5f 76 65 72 69 66 79 5f  CTX_load_verify_
103e0 6c 6f 63 61 74 69 6f 6e 73 28 63 74 78 2c 20 46  locations(ctx, F
103f0 32 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29 2c  2N(CAfile, &ds),
10400 20 46 32 4e 28 43 41 70 61 74 68 2c 20 26 64 73   F2N(CApath, &ds
10410 31 29 29 29 20 7b 0a 09 09 61 62 6f 72 74 2b 2b  1))) {...abort++
10420 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b  ;...return NULL;
10430 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54 63 6c  ..    }..    Tcl
10440 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73  _DStringFree(&ds
10450 29 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72  );..    Tcl_DStr
10460 69 6e 67 46 72 65 65 28 26 64 73 31 29 3b 0a 0a  ingFree(&ds1);..
10470 09 20 20 20 20 2f 2a 20 53 65 74 20 6c 69 73 74  .    /* Set list
10480 20 6f 66 20 43 41 73 20 74 6f 20 73 65 6e 64 20   of CAs to send 
10490 74 6f 20 63 6c 69 65 6e 74 20 77 68 65 6e 20 72  to client when r
104a0 65 71 75 65 73 74 69 6e 67 20 61 20 63 6c 69 65  equesting a clie
104b0 6e 74 20 63 65 72 74 69 66 69 63 61 74 65 20 2a  nt certificate *
104c0 2f 0a 09 20 20 20 20 2f 2a 20 68 74 74 70 73 3a  /..    /* https:
104d0 2f 2f 73 6f 75 72 63 65 66 6f 72 67 65 2e 6e 65  //sourceforge.ne
104e0 74 2f 70 2f 74 6c 73 2f 62 75 67 73 2f 35 37 2f  t/p/tls/bugs/57/
104f0 20 2a 2f 0a 09 20 20 20 20 2f 2a 20 58 58 58 3a   */..    /* XXX:
10500 54 4f 44 4f 3a 20 4c 65 74 20 74 68 65 20 75 73  TODO: Let the us
10510 65 72 20 73 75 70 70 6c 79 20 76 61 6c 75 65 73  er supply values
10520 20 68 65 72 65 20 69 6e 73 74 65 61 64 20 6f 66   here instead of
10530 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20   something that 
10540 65 78 69 73 74 73 20 6f 6e 20 74 68 65 20 66 69  exists on the fi
10550 6c 65 73 79 73 74 65 6d 20 2a 2f 0a 09 20 20 20  lesystem */..   
10560 20 53 54 41 43 4b 5f 4f 46 28 58 35 30 39 5f 4e   STACK_OF(X509_N
10570 41 4d 45 29 20 2a 63 65 72 74 4e 61 6d 65 73 20  AME) *certNames 
10580 3d 20 53 53 4c 5f 6c 6f 61 64 5f 63 6c 69 65 6e  = SSL_load_clien
10590 74 5f 43 41 5f 66 69 6c 65 28 46 32 4e 28 43 41  t_CA_file(F2N(CA
105a0 66 69 6c 65 2c 20 26 64 73 29 29 3b 0a 09 20 20  file, &ds));..  
105b0 20 20 69 66 20 28 63 65 72 74 4e 61 6d 65 73 20    if (certNames 
105c0 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 53 53 4c  != NULL) {...SSL
105d0 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f  _CTX_set_client_
105e0 43 41 5f 6c 69 73 74 28 63 74 78 2c 20 63 65 72  CA_list(ctx, cer
105f0 74 4e 61 6d 65 73 29 3b 0a 09 20 20 20 20 7d 0a  tNames);..    }.
10600 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
10610 46 72 65 65 28 26 64 73 29 3b 0a 09 7d 0a 0a 23  Free(&ds);..}..#
10620 65 6c 73 65 0a 09 2f 2a 20 53 65 74 20 64 69 72  else../* Set dir
10630 65 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e  ectory containin
10640 67 20 43 41 20 63 65 72 74 69 66 69 63 61 74 65  g CA certificate
10650 73 20 69 6e 20 50 45 4d 20 66 6f 72 6d 61 74 2e  s in PEM format.
10660 20 2a 2f 0a 09 69 66 20 28 43 41 70 61 74 68 20   */..if (CApath 
10670 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20  != NULL) {..    
10680 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 6c 6f 61  if (!SSL_CTX_loa
10690 64 5f 76 65 72 69 66 79 5f 64 69 72 28 63 74 78  d_verify_dir(ctx
106a0 2c 20 46 32 4e 28 43 41 70 61 74 68 2c 20 26 64  , F2N(CApath, &d
106b0 73 29 29 29 20 7b 0a 09 09 61 62 6f 72 74 2b 2b  s))) {...abort++
106c0 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54 63  ;..    }..    Tc
106d0 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64  l_DStringFree(&d
106e0 73 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65 74 20  s);..}.../* Set 
106f0 55 52 49 20 66 6f 72 20 74 6f 20 61 20 73 74 6f  URI for to a sto
10700 72 65 2c 20 77 68 69 63 68 20 6d 61 79 20 62 65  re, which may be
10710 20 61 20 73 69 6e 67 6c 65 20 63 6f 6e 74 61 69   a single contai
10720 6e 65 72 20 6f 72 20 61 20 63 61 74 61 6c 6f 67  ner or a catalog
10730 20 6f 66 20 63 6f 6e 74 61 69 6e 65 72 73 2e 20   of containers. 
10740 2a 2f 0a 09 69 66 20 28 43 41 73 74 6f 72 65 20  */..if (CAstore 
10750 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20  != NULL) {..    
10760 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 6c 6f 61  if (!SSL_CTX_loa
10770 64 5f 76 65 72 69 66 79 5f 73 74 6f 72 65 28 63  d_verify_store(c
10780 74 78 2c 20 46 32 4e 28 43 41 73 74 6f 72 65 2c  tx, F2N(CAstore,
10790 20 26 64 73 29 29 29 20 7b 0a 09 09 61 62 6f 72   &ds))) {...abor
107a0 74 2b 2b 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20  t++;..    }..   
107b0 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65   Tcl_DStringFree
107c0 28 26 64 73 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 53  (&ds);..}.../* S
107d0 65 74 20 66 69 6c 65 20 6f 66 20 43 41 20 63 65  et file of CA ce
107e0 72 74 69 66 69 63 61 74 65 73 20 69 6e 20 50 45  rtificates in PE
107f0 4d 20 66 6f 72 6d 61 74 2e 20 20 2a 2f 0a 09 69  M format.  */..i
10800 66 20 28 43 41 66 69 6c 65 20 21 3d 20 4e 55 4c  f (CAfile != NUL
10810 4c 29 20 7b 0a 09 20 20 20 20 69 66 20 28 21 53  L) {..    if (!S
10820 53 4c 5f 43 54 58 5f 6c 6f 61 64 5f 76 65 72 69  SL_CTX_load_veri
10830 66 79 5f 66 69 6c 65 28 63 74 78 2c 20 46 32 4e  fy_file(ctx, F2N
10840 28 43 41 66 69 6c 65 2c 20 26 64 73 29 29 29 20  (CAfile, &ds))) 
10850 7b 0a 09 09 61 62 6f 72 74 2b 2b 3b 0a 09 20 20  {...abort++;..  
10860 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 74    }..    Tcl_DSt
10870 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 0a  ringFree(&ds);..
10880 09 20 20 20 20 2f 2a 20 53 65 74 20 6c 69 73 74  .    /* Set list
10890 20 6f 66 20 43 41 73 20 74 6f 20 73 65 6e 64 20   of CAs to send 
108a0 74 6f 20 63 6c 69 65 6e 74 20 77 68 65 6e 20 72  to client when r
108b0 65 71 75 65 73 74 69 6e 67 20 61 20 63 6c 69 65  equesting a clie
108c0 6e 74 20 63 65 72 74 69 66 69 63 61 74 65 20 2a  nt certificate *
108d0 2f 0a 09 20 20 20 20 53 54 41 43 4b 5f 4f 46 28  /..    STACK_OF(
108e0 58 35 30 39 5f 4e 41 4d 45 29 20 2a 63 65 72 74  X509_NAME) *cert
108f0 4e 61 6d 65 73 20 3d 20 53 53 4c 5f 6c 6f 61 64  Names = SSL_load
10900 5f 63 6c 69 65 6e 74 5f 43 41 5f 66 69 6c 65 28  _client_CA_file(
10910 46 32 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29  F2N(CAfile, &ds)
10920 29 3b 0a 09 20 20 20 20 69 66 20 28 63 65 72 74  );..    if (cert
10930 4e 61 6d 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b  Names != NULL) {
10940 0a 09 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63  ...SSL_CTX_set_c
10950 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 74 28 63 74  lient_CA_list(ct
10960 78 2c 20 63 65 72 74 4e 61 6d 65 73 29 3b 0a 09  x, certNames);..
10970 20 20 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44      }..    Tcl_D
10980 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b  StringFree(&ds);
10990 0a 09 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  ..}.#endif.    }
109a0 0a 0a 20 20 20 20 69 66 20 28 61 62 6f 72 74 20  ..    if (abort 
109b0 3e 20 30 29 20 7b 0a 09 2f 2a 20 72 65 74 75 72  > 0) {../* retur
109c0 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 7d  n error */.    }
109d0 0a 20 20 20 20 72 65 74 75 72 6e 20 63 74 78 3b  .    return ctx;
109e0 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
109f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10a00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10a10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10a20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
10a30 0a 20 2a 20 53 74 61 74 75 73 4f 62 6a 43 6d 64  . * StatusObjCmd
10a40 20 2d 2d 20 72 65 74 75 72 6e 20 63 65 72 74 69   -- return certi
10a50 66 69 63 61 74 65 20 66 6f 72 20 63 6f 6e 6e 65  ficate for conne
10a60 63 74 65 64 20 70 65 65 72 20 69 6e 66 6f 2e 0a  cted peer info..
10a70 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
10a80 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c  *.A standard Tcl
10a90 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53   result.. *. * S
10aa0 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
10ab0 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  None.. *. *-----
10ac0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10ad0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10ae0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10af0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
10b00 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 74  */.static int.St
10b10 61 74 75 73 4f 62 6a 43 6d 64 28 43 6c 69 65 6e  atusObjCmd(Clien
10b20 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
10b30 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  , Tcl_Interp *in
10b40 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20  terp, int objc, 
10b50 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f  Tcl_Obj *const o
10b60 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 53 74 61  bjv[]) {.    Sta
10b70 74 65 20 2a 73 74 61 74 65 50 74 72 3b 0a 20 20  te *statePtr;.  
10b80 20 20 58 35 30 39 20 2a 70 65 65 72 3b 0a 20 20    X509 *peer;.  
10b90 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74    Tcl_Obj *objPt
10ba0 72 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e  r;.    Tcl_Chann
10bb0 65 6c 20 63 68 61 6e 3b 0a 20 20 20 20 63 68 61  el chan;.    cha
10bc0 72 20 2a 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c 20  r *channelName, 
10bd0 2a 63 69 70 68 65 72 73 3b 0a 20 20 20 20 69 6e  *ciphers;.    in
10be0 74 20 6d 6f 64 65 3b 0a 20 20 20 20 63 6f 6e 73  t mode;.    cons
10bf0 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
10c00 2a 70 72 6f 74 6f 3b 0a 20 20 20 20 75 6e 73 69  *proto;.    unsi
10c10 67 6e 65 64 20 69 6e 74 20 6c 65 6e 3b 0a 20 20  gned int len;.  
10c20 20 20 69 6e 74 20 6e 69 64 2c 20 72 65 73 3b 0a    int nid, res;.
10c30 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65 6e      (void) clien
10c40 74 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 72 69  tData;..    dpri
10c50 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a  ntf("Called");..
10c60 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 32      if (objc < 2
10c70 20 7c 7c 20 6f 62 6a 63 20 3e 20 33 20 7c 7c 20   || objc > 3 || 
10c80 28 6f 62 6a 63 20 3d 3d 20 33 20 26 26 20 21 73  (objc == 3 && !s
10c90 74 72 63 6d 70 28 54 63 6c 5f 47 65 74 53 74 72  trcmp(Tcl_GetStr
10ca0 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 22 2d  ing(objv[1]), "-
10cb0 6c 6f 63 61 6c 22 29 29 29 20 7b 0a 09 54 63 6c  local"))) {..Tcl
10cc0 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
10cd0 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
10ce0 3f 2d 6c 6f 63 61 6c 3f 20 63 68 61 6e 6e 65 6c  ?-local? channel
10cf0 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  ");..return TCL_
10d00 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
10d10 20 20 2f 2a 20 47 65 74 20 63 68 61 6e 6e 65 6c    /* Get channel
10d20 20 49 64 20 2a 2f 0a 20 20 20 20 63 68 61 6e 6e   Id */.    chann
10d30 65 6c 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74  elName = Tcl_Get
10d40 53 74 72 69 6e 67 28 6f 62 6a 76 5b 28 6f 62 6a  String(objv[(obj
10d50 63 20 3d 3d 20 32 20 3f 20 31 20 3a 20 32 29 5d  c == 2 ? 1 : 2)]
10d60 29 3b 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63  );.    chan = Tc
10d70 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74  l_GetChannel(int
10d80 65 72 70 2c 20 63 68 61 6e 6e 65 6c 4e 61 6d 65  erp, channelName
10d90 2c 20 26 6d 6f 64 65 29 3b 0a 20 20 20 20 69 66  , &mode);.    if
10da0 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43   (chan == (Tcl_C
10db0 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a  hannel) NULL) {.
10dc0 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
10dd0 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  R;.    }..    /*
10de0 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70   Make sure to op
10df0 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70  erate on the top
10e00 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a  most channel */.
10e10 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47      chan = Tcl_G
10e20 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61  etTopChannel(cha
10e30 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f  n);.    if (Tcl_
10e40 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63  GetChannelType(c
10e50 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e  han) != Tls_Chan
10e60 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63  nelType()) {..Tc
10e70 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
10e80 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e  nterp, "bad chan
10e90 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74  nel \"", Tcl_Get
10ea0 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e  ChannelName(chan
10eb0 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20  ),..."\": not a 
10ec0 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 28 63  TLS channel", (c
10ed0 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 54  har *) NULL);..T
10ee0 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28  cl_SetErrorCode(
10ef0 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22  interp, "TLS", "
10f00 53 54 41 54 55 53 22 2c 20 22 43 48 41 4e 4e 45  STATUS", "CHANNE
10f10 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28  L", "INVALID", (
10f20 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
10f30 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
10f40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 61 74  ;.    }.    stat
10f50 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29  ePtr = (State *)
10f60 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49   Tcl_GetChannelI
10f70 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e  nstanceData(chan
10f80 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 63  );..    /* Get c
10f90 65 72 74 69 66 69 63 61 74 65 20 66 6f 72 20 70  ertificate for p
10fa0 65 65 72 20 6f 72 20 73 65 6c 66 20 2a 2f 0a 20  eer or self */. 
10fb0 20 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32     if (objc == 2
10fc0 29 20 7b 0a 09 70 65 65 72 20 3d 20 53 53 4c 5f  ) {..peer = SSL_
10fd0 67 65 74 5f 70 65 65 72 5f 63 65 72 74 69 66 69  get_peer_certifi
10fe0 63 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73  cate(statePtr->s
10ff0 73 6c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  sl);.    } else 
11000 7b 0a 09 70 65 65 72 20 3d 20 53 53 4c 5f 67 65  {..peer = SSL_ge
11010 74 5f 63 65 72 74 69 66 69 63 61 74 65 28 73 74  t_certificate(st
11020 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20  atePtr->ssl);.  
11030 20 20 7d 0a 20 20 20 20 2f 2a 20 47 65 74 20 58    }.    /* Get X
11040 35 30 39 20 63 65 72 74 69 66 69 63 61 74 65 20  509 certificate 
11050 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 69 66 20 28  info */.    if (
11060 70 65 65 72 29 20 7b 0a 09 6f 62 6a 50 74 72 20  peer) {..objPtr 
11070 3d 20 54 6c 73 5f 4e 65 77 58 35 30 39 4f 62 6a  = Tls_NewX509Obj
11080 28 69 6e 74 65 72 70 2c 20 70 65 65 72 2c 20 31  (interp, peer, 1
11090 29 3b 0a 09 69 66 20 28 6f 62 6a 63 20 3d 3d 20  );..if (objc == 
110a0 32 29 20 7b 0a 09 20 20 20 20 58 35 30 39 5f 66  2) {..    X509_f
110b0 72 65 65 28 70 65 65 72 29 3b 0a 09 20 20 20 20  ree(peer);..    
110c0 70 65 65 72 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a  peer = NULL;..}.
110d0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 6f 62      } else {..ob
110e0 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69  jPtr = Tcl_NewLi
110f0 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a  stObj(0, NULL);.
11100 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 50 65      }..    /* Pe
11110 65 72 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 4c  er name */.    L
11120 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
11130 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70 65 65 72  p, objPtr, "peer
11140 6e 61 6d 65 22 2c 20 53 53 4c 5f 67 65 74 30 5f  name", SSL_get0_
11150 70 65 65 72 6e 61 6d 65 28 73 74 61 74 65 50 74  peername(statePt
11160 72 2d 3e 73 73 6c 29 2c 20 2d 31 29 3b 0a 20 20  r->ssl), -1);.  
11170 20 20 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e    LAPPEND_INT(in
11180 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73  terp, objPtr, "s
11190 62 69 74 73 22 2c 20 53 53 4c 5f 67 65 74 5f 63  bits", SSL_get_c
111a0 69 70 68 65 72 5f 62 69 74 73 28 73 74 61 74 65  ipher_bits(state
111b0 50 74 72 2d 3e 73 73 6c 2c 20 4e 55 4c 4c 29 29  Ptr->ssl, NULL))
111c0 3b 0a 0a 20 20 20 20 63 69 70 68 65 72 73 20 3d  ;..    ciphers =
111d0 20 28 63 68 61 72 2a 29 53 53 4c 5f 67 65 74 5f   (char*)SSL_get_
111e0 63 69 70 68 65 72 28 73 74 61 74 65 50 74 72 2d  cipher(statePtr-
111f0 3e 73 73 6c 29 3b 0a 20 20 20 20 4c 41 50 50 45  >ssl);.    LAPPE
11200 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f  ND_STR(interp, o
11210 62 6a 50 74 72 2c 20 22 63 69 70 68 65 72 22 2c  bjPtr, "cipher",
11220 20 63 69 70 68 65 72 73 2c 20 2d 31 29 3b 0a 0a   ciphers, -1);..
11230 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68      /* Verify th
11240 65 20 58 35 30 39 20 63 65 72 74 69 66 69 63 61  e X509 certifica
11250 74 65 20 70 72 65 73 65 6e 74 65 64 20 62 79 20  te presented by 
11260 74 68 65 20 70 65 65 72 20 2a 2f 0a 20 20 20 20  the peer */.    
11270 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65  LAPPEND_STR(inte
11280 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 76 65 72  rp, objPtr, "ver
11290 69 66 79 52 65 73 75 6c 74 22 2c 0a 09 58 35 30  ifyResult",..X50
112a0 39 5f 76 65 72 69 66 79 5f 63 65 72 74 5f 65 72  9_verify_cert_er
112b0 72 6f 72 5f 73 74 72 69 6e 67 28 53 53 4c 5f 67  ror_string(SSL_g
112c0 65 74 5f 76 65 72 69 66 79 5f 72 65 73 75 6c 74  et_verify_result
112d0 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 29  (statePtr->ssl))
112e0 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 56  , -1);..    /* V
112f0 65 72 69 66 79 20 6d 6f 64 65 20 2a 2f 0a 20 20  erify mode */.  
11300 20 20 6d 6f 64 65 20 3d 20 53 53 4c 5f 67 65 74    mode = SSL_get
11310 5f 76 65 72 69 66 79 5f 6d 6f 64 65 28 73 74 61  _verify_mode(sta
11320 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20  tePtr->ssl);.   
11330 20 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f   if (mode & SSL_
11340 56 45 52 49 46 59 5f 4e 4f 4e 45 29 20 7b 0a 09  VERIFY_NONE) {..
11350 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65  LAPPEND_STR(inte
11360 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 76 65 72  rp, objPtr, "ver
11370 69 66 79 4d 6f 64 65 22 2c 20 22 6e 6f 6e 65 22  ifyMode", "none"
11380 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 20 65 6c 73  , -1);.    } els
11390 65 20 7b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 6c 69  e {..Tcl_Obj *li
113a0 73 74 4f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e  stObjPtr = Tcl_N
113b0 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c  ewListObj(0, NUL
113c0 4c 29 3b 0a 09 69 66 20 28 6d 6f 64 65 20 26 20  L);..if (mode & 
113d0 53 53 4c 5f 56 45 52 49 46 59 5f 50 45 45 52 29  SSL_VERIFY_PEER)
113e0 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74   {..    Tcl_List
113f0 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
11400 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a  (interp, listObj
11410 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
11420 6e 67 4f 62 6a 28 22 70 65 65 72 22 2c 20 2d 31  ngObj("peer", -1
11430 29 29 3b 0a 09 7d 0a 09 69 66 20 28 6d 6f 64 65  ));..}..if (mode
11440 20 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 46 41   & SSL_VERIFY_FA
11450 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 45  IL_IF_NO_PEER_CE
11460 52 54 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c  RT) {..    Tcl_L
11470 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
11480 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74  ent(interp, list
11490 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  ObjPtr, Tcl_NewS
114a0 74 72 69 6e 67 4f 62 6a 28 22 66 61 69 6c 20 69  tringObj("fail i
114b0 66 20 6e 6f 20 70 65 65 72 20 63 65 72 74 22 2c  f no peer cert",
114c0 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 6d   -1));..}..if (m
114d0 6f 64 65 20 26 20 53 53 4c 5f 56 45 52 49 46 59  ode & SSL_VERIFY
114e0 5f 43 4c 49 45 4e 54 5f 4f 4e 43 45 29 20 7b 0a  _CLIENT_ONCE) {.
114f0 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
11500 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
11510 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72  terp, listObjPtr
11520 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
11530 62 6a 28 22 63 6c 69 65 6e 74 20 6f 6e 63 65 22  bj("client once"
11540 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28  , -1));..}..if (
11550 6d 6f 64 65 20 26 20 53 53 4c 5f 56 45 52 49 46  mode & SSL_VERIF
11560 59 5f 50 4f 53 54 5f 48 41 4e 44 53 48 41 4b 45  Y_POST_HANDSHAKE
11570 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73  ) {..    Tcl_Lis
11580 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
11590 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62  t(interp, listOb
115a0 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
115b0 69 6e 67 4f 62 6a 28 22 70 6f 73 74 20 68 61 6e  ingObj("post han
115c0 64 73 68 61 6b 65 22 2c 20 2d 31 29 29 3b 0a 09  dshake", -1));..
115d0 7d 0a 09 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69  }..LAPPEND_OBJ(i
115e0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
115f0 76 65 72 69 66 79 4d 6f 64 65 22 2c 20 6c 69 73  verifyMode", lis
11600 74 4f 62 6a 50 74 72 29 0a 20 20 20 20 7d 0a 0a  tObjPtr).    }..
11610 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 6d 6f      /* Verify mo
11620 64 65 20 64 65 70 74 68 20 2a 2f 0a 20 20 20 20  de depth */.    
11630 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65  LAPPEND_INT(inte
11640 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 76 65 72  rp, objPtr, "ver
11650 69 66 79 44 65 70 74 68 22 2c 20 53 53 4c 5f 67  ifyDepth", SSL_g
11660 65 74 5f 76 65 72 69 66 79 5f 64 65 70 74 68 28  et_verify_depth(
11670 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 29 3b  statePtr->ssl));
11680 0a 0a 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20  ..    /* Report 
11690 74 68 65 20 73 65 6c 65 63 74 65 64 20 70 72 6f  the selected pro
116a0 74 6f 63 6f 6c 20 61 73 20 61 20 72 65 73 75 6c  tocol as a resul
116b0 74 20 6f 66 20 74 68 65 20 6e 65 67 6f 74 69 61  t of the negotia
116c0 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 53 53 4c 5f  tion */.    SSL_
116d0 67 65 74 30 5f 61 6c 70 6e 5f 73 65 6c 65 63 74  get0_alpn_select
116e0 65 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  ed(statePtr->ssl
116f0 2c 20 26 70 72 6f 74 6f 2c 20 26 6c 65 6e 29 3b  , &proto, &len);
11700 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52  .    LAPPEND_STR
11710 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
11720 20 22 61 6c 70 6e 22 2c 20 28 63 68 61 72 20 2a   "alpn", (char *
11730 29 70 72 6f 74 6f 2c 20 28 54 63 6c 5f 53 69 7a  )proto, (Tcl_Siz
11740 65 29 20 6c 65 6e 29 3b 0a 20 20 20 20 4c 41 50  e) len);.    LAP
11750 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
11760 20 6f 62 6a 50 74 72 2c 20 22 70 72 6f 74 6f 63   objPtr, "protoc
11770 6f 6c 22 2c 20 53 53 4c 5f 67 65 74 5f 76 65 72  ol", SSL_get_ver
11780 73 69 6f 6e 28 73 74 61 74 65 50 74 72 2d 3e 73  sion(statePtr->s
11790 73 6c 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f  sl), -1);..    /
117a0 2a 20 56 61 6c 69 64 20 66 6f 72 20 6e 6f 6e 2d  * Valid for non-
117b0 52 53 41 20 73 69 67 6e 61 74 75 72 65 20 61 6e  RSA signature an
117c0 64 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 20 20  d TLS 1.3 */.   
117d0 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20   if (objc == 2) 
117e0 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67 65 74  {..res = SSL_get
117f0 5f 70 65 65 72 5f 73 69 67 6e 61 74 75 72 65 5f  _peer_signature_
11800 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73  nid(statePtr->ss
11810 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20 7d 20  l, &nid);.    } 
11820 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 53 53  else {..res = SS
11830 4c 5f 67 65 74 5f 73 69 67 6e 61 74 75 72 65 5f  L_get_signature_
11840 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73  nid(statePtr->ss
11850 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20 7d 0a  l, &nid);.    }.
11860 20 20 20 20 69 66 20 28 21 72 65 73 29 20 7b 6e      if (!res) {n
11870 69 64 20 3d 20 30 3b 7d 0a 20 20 20 20 4c 41 50  id = 0;}.    LAP
11880 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
11890 20 6f 62 6a 50 74 72 2c 20 22 73 69 67 6e 61 74   objPtr, "signat
118a0 75 72 65 48 61 73 68 41 6c 67 6f 72 69 74 68 6d  ureHashAlgorithm
118b0 22 2c 20 4f 42 4a 5f 6e 69 64 32 6c 6e 28 6e 69  ", OBJ_nid2ln(ni
118c0 64 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a  d), -1);..    /*
118d0 20 41 64 64 65 64 20 69 6e 20 4f 70 65 6e 53 53   Added in OpenSS
118e0 4c 20 31 2e 31 2e 31 61 20 2a 2f 0a 23 69 66 20  L 1.1.1a */.#if 
118f0 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f  OPENSSL_VERSION_
11900 4e 55 4d 42 45 52 20 3e 20 30 78 31 30 31 30 31  NUMBER > 0x10101
11910 30 30 30 4c 0a 20 20 20 20 69 66 20 28 6f 62 6a  000L.    if (obj
11920 63 20 3d 3d 20 32 29 20 7b 0a 09 72 65 73 20 3d  c == 2) {..res =
11930 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f 73 69   SSL_get_peer_si
11940 67 6e 61 74 75 72 65 5f 74 79 70 65 5f 6e 69 64  gnature_type_nid
11950 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20  (statePtr->ssl, 
11960 26 6e 69 64 29 3b 0a 20 20 20 20 7d 20 65 6c 73  &nid);.    } els
11970 65 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67  e {..res = SSL_g
11980 65 74 5f 73 69 67 6e 61 74 75 72 65 5f 74 79 70  et_signature_typ
11990 65 5f 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e  e_nid(statePtr->
119a0 73 73 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20  ssl, &nid);.    
119b0 7d 0a 20 20 20 20 69 66 20 28 21 72 65 73 29 20  }.    if (!res) 
119c0 7b 6e 69 64 20 3d 20 30 3b 7d 0a 20 20 20 20 4c  {nid = 0;}.    L
119d0 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
119e0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 69 67 6e  p, objPtr, "sign
119f0 61 74 75 72 65 54 79 70 65 22 2c 20 4f 42 4a 5f  atureType", OBJ_
11a00 6e 69 64 32 6c 6e 28 6e 69 64 29 2c 20 2d 31 29  nid2ln(nid), -1)
11a10 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 54 63  ;.#endif..    Tc
11a20 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
11a30 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a  nterp, objPtr);.
11a40 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f      return TCL_O
11a50 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  K;.}.../*. *----
11a60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11a70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11a80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11a90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
11aa0 20 2a 0a 20 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e   *. * Connection
11ab0 49 6e 66 6f 4f 62 6a 43 6d 64 20 2d 2d 20 72 65  InfoObjCmd -- re
11ac0 74 75 72 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  turn connection 
11ad0 69 6e 66 6f 20 66 72 6f 6d 20 4f 70 65 6e 53 53  info from OpenSS
11ae0 4c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  L.. *. * Results
11af0 3a 0a 20 2a 09 41 20 6c 69 73 74 20 6f 66 20 63  :. *.A list of c
11b00 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 0a 20  onnection info. 
11b10 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
11b20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11b30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11b40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11b50 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74  --------. */..st
11b60 61 74 69 63 20 69 6e 74 20 43 6f 6e 6e 65 63 74  atic int Connect
11b70 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 28 43 6c  ionInfoObjCmd(Cl
11b80 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
11b90 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20  ata, Tcl_Interp 
11ba0 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a  *interp, int obj
11bb0 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73  c, Tcl_Obj *cons
11bc0 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20  t objv[]) {.    
11bd0 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e  Tcl_Channel chan
11be0 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65  ;../* The channe
11bf0 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 20  l to set a mode 
11c00 6f 6e 20 2a 2f 0a 20 20 20 20 53 74 61 74 65 20  on */.    State 
11c10 2a 73 74 61 74 65 50 74 72 3b 09 09 2f 2a 20 63  *statePtr;../* c
11c20 6c 69 65 6e 74 20 73 74 61 74 65 20 66 6f 72 20  lient state for 
11c30 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 20  ssl socket */.  
11c40 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74    Tcl_Obj *objPt
11c50 72 2c 20 2a 6c 69 73 74 50 74 72 3b 0a 20 20 20  r, *listPtr;.   
11c60 20 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 3b   const SSL *ssl;
11c70 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 43  .    const SSL_C
11c80 49 50 48 45 52 20 2a 63 69 70 68 65 72 3b 0a 20  IPHER *cipher;. 
11c90 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 53 45 53     const SSL_SES
11ca0 53 49 4f 4e 20 2a 73 65 73 73 69 6f 6e 3b 0a 20  SION *session;. 
11cb0 20 20 20 63 6f 6e 73 74 20 45 56 50 5f 4d 44 20     const EVP_MD 
11cc0 2a 6d 64 3b 0a 20 20 20 20 28 76 6f 69 64 29 20  *md;.    (void) 
11cd0 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20  clientData;..   
11ce0 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
11cf0 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a  ");..    if (obj
11d00 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57  c != 2) {..Tcl_W
11d10 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
11d20 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68  rp, 1, objv, "ch
11d30 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e  annel");..return
11d40 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
11d50 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63  }..    chan = Tc
11d60 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74  l_GetChannel(int
11d70 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
11d80 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c  ng(objv[1]), NUL
11d90 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e  L);.    if (chan
11da0 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c   == (Tcl_Channel
11db0 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  ) NULL) {..retur
11dc0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
11dd0 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20   }..    /* Make 
11de0 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20  sure to operate 
11df0 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63  on the topmost c
11e00 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68  hannel */.    ch
11e10 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43  an = Tcl_GetTopC
11e20 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20  hannel(chan);.  
11e30 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61    if (Tcl_GetCha
11e40 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21  nnelType(chan) !
11e50 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70  = Tls_ChannelTyp
11e60 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65  e()) {..Tcl_Appe
11e70 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
11e80 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22   "bad channel \"
11e90 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  ", Tcl_GetChanne
11ea0 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 20 20  lName(chan),..  
11eb0 20 20 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53    "\": not a TLS
11ec0 20 63 68 61 6e 6e 65 6c 22 2c 20 28 63 68 61 72   channel", (char
11ed0 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f   *) NULL);..Tcl_
11ee0 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74  SetErrorCode(int
11ef0 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 43 4f 4e  erp, "TLS", "CON
11f00 4e 45 43 54 49 4f 4e 22 2c 20 22 43 48 41 4e 4e  NECTION", "CHANN
11f10 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20  EL", "INVALID", 
11f20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
11f30 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
11f40 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6f 62  R;.    }..    ob
11f50 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69  jPtr = Tcl_NewLi
11f60 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a  stObj(0, NULL);.
11f70 0a 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69  .    /* Connecti
11f80 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 73  on info */.    s
11f90 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65  tatePtr = (State
11fa0 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65   *)Tcl_GetChanne
11fb0 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68  lInstanceData(ch
11fc0 61 6e 29 3b 0a 20 20 20 20 73 73 6c 20 3d 20 73  an);.    ssl = s
11fd0 74 61 74 65 50 74 72 2d 3e 73 73 6c 3b 0a 20 20  tatePtr->ssl;.  
11fe0 20 20 69 66 20 28 73 73 6c 20 21 3d 20 4e 55 4c    if (ssl != NUL
11ff0 4c 29 20 7b 0a 09 63 6f 6e 73 74 20 75 6e 73 69  L) {..const unsi
12000 67 6e 65 64 20 63 68 61 72 20 2a 70 72 6f 74 6f  gned char *proto
12010 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  ;..unsigned int 
12020 75 6c 65 6e 3b 0a 0a 09 2f 2a 20 49 6e 69 74 69  ulen;.../* Initi
12030 61 6c 69 7a 61 74 69 6f 6e 20 66 69 6e 69 73 68  alization finish
12040 65 64 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42  ed */..LAPPEND_B
12050 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  OOL(interp, objP
12060 74 72 2c 20 22 69 6e 69 74 5f 66 69 6e 69 73 68  tr, "init_finish
12070 65 64 22 2c 20 53 53 4c 5f 69 73 5f 69 6e 69 74  ed", SSL_is_init
12080 5f 66 69 6e 69 73 68 65 64 28 73 73 6c 29 29 3b  _finished(ssl));
12090 0a 0a 09 2f 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e  .../* connection
120a0 20 73 74 61 74 65 20 2a 2f 0a 09 4c 41 50 50 45   state */..LAPPE
120b0 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f  ND_STR(interp, o
120c0 62 6a 50 74 72 2c 20 22 73 74 61 74 65 22 2c 20  bjPtr, "state", 
120d0 53 53 4c 5f 73 74 61 74 65 5f 73 74 72 69 6e 67  SSL_state_string
120e0 5f 6c 6f 6e 67 28 73 73 6c 29 2c 20 2d 31 29 3b  _long(ssl), -1);
120f0 0a 0a 09 2f 2a 20 47 65 74 20 53 4e 49 20 72 65  .../* Get SNI re
12100 71 75 65 73 74 65 64 20 73 65 72 76 65 72 20 6e  quested server n
12110 61 6d 65 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f  ame */..LAPPEND_
12120 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
12130 74 72 2c 20 22 73 65 72 76 65 72 6e 61 6d 65 22  tr, "servername"
12140 2c 20 53 53 4c 5f 67 65 74 5f 73 65 72 76 65 72  , SSL_get_server
12150 6e 61 6d 65 28 73 73 6c 2c 20 54 4c 53 45 58 54  name(ssl, TLSEXT
12160 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f 6e  _NAMETYPE_host_n
12170 61 6d 65 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20  ame), -1);.../* 
12180 52 65 70 6f 72 74 20 74 68 65 20 73 65 6c 65 63  Report the selec
12190 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20  ted protocol as 
121a0 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  a result of the 
121b0 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a 09  negotiation */..
121c0 53 53 4c 5f 67 65 74 30 5f 61 6c 70 6e 5f 73 65  SSL_get0_alpn_se
121d0 6c 65 63 74 65 64 28 73 74 61 74 65 50 74 72 2d  lected(statePtr-
121e0 3e 73 73 6c 2c 20 26 70 72 6f 74 6f 2c 20 26 75  >ssl, &proto, &u
121f0 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53  len);..LAPPEND_S
12200 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  TR(interp, objPt
12210 72 2c 20 22 61 6c 70 6e 22 2c 20 28 63 68 61 72  r, "alpn", (char
12220 20 2a 29 70 72 6f 74 6f 2c 20 28 54 63 6c 5f 53   *)proto, (Tcl_S
12230 69 7a 65 29 20 75 6c 65 6e 29 3b 0a 0a 09 2f 2a  ize) ulen);.../*
12240 20 47 65 74 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f   Get protocol */
12250 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e  ..LAPPEND_STR(in
12260 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70  terp, objPtr, "p
12270 72 6f 74 6f 63 6f 6c 22 2c 20 53 53 4c 5f 67 65  rotocol", SSL_ge
12280 74 5f 76 65 72 73 69 6f 6e 28 73 73 6c 29 2c 20  t_version(ssl), 
12290 2d 31 29 3b 0a 0a 09 2f 2a 20 52 65 6e 65 67 6f  -1);.../* Renego
122a0 74 69 61 74 69 6f 6e 20 61 6c 6c 6f 77 65 64 20  tiation allowed 
122b0 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c  */..LAPPEND_BOOL
122c0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
122d0 20 22 72 65 6e 65 67 6f 74 69 61 74 69 6f 6e 5f   "renegotiation_
122e0 61 6c 6c 6f 77 65 64 22 2c 20 53 53 4c 5f 67 65  allowed", SSL_ge
122f0 74 5f 73 65 63 75 72 65 5f 72 65 6e 65 67 6f 74  t_secure_renegot
12300 69 61 74 69 6f 6e 5f 73 75 70 70 6f 72 74 28 28  iation_support((
12310 53 53 4c 20 2a 29 20 73 73 6c 29 29 3b 0a 0a 09  SSL *) ssl));...
12320 2f 2a 20 47 65 74 20 73 65 63 75 72 69 74 79 20  /* Get security 
12330 6c 65 76 65 6c 20 2a 2f 0a 09 4c 41 50 50 45 4e  level */..LAPPEN
12340 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62  D_INT(interp, ob
12350 6a 50 74 72 2c 20 22 73 65 63 75 72 69 74 79 5f  jPtr, "security_
12360 6c 65 76 65 6c 22 2c 20 53 53 4c 5f 67 65 74 5f  level", SSL_get_
12370 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 28 73  security_level(s
12380 73 6c 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69  sl));.../* Sessi
12390 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 09 4c 41 50 50  on info */..LAPP
123a0 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c  END_BOOL(interp,
123b0 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69 6f   objPtr, "sessio
123c0 6e 5f 72 65 75 73 65 64 22 2c 20 53 53 4c 5f 73  n_reused", SSL_s
123d0 65 73 73 69 6f 6e 5f 72 65 75 73 65 64 28 73 73  ession_reused(ss
123e0 6c 29 29 3b 0a 0a 09 2f 2a 20 49 73 20 73 65 72  l));.../* Is ser
123f0 76 65 72 20 69 6e 66 6f 20 2a 2f 0a 09 4c 41 50  ver info */..LAP
12400 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70  PEND_BOOL(interp
12410 2c 20 6f 62 6a 50 74 72 2c 20 22 69 73 5f 73 65  , objPtr, "is_se
12420 72 76 65 72 22 2c 20 53 53 4c 5f 69 73 5f 73 65  rver", SSL_is_se
12430 72 76 65 72 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a  rver(ssl));.../*
12440 20 49 73 20 44 54 4c 53 20 2a 2f 0a 09 4c 41 50   Is DTLS */..LAP
12450 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70  PEND_BOOL(interp
12460 2c 20 6f 62 6a 50 74 72 2c 20 22 69 73 5f 64 74  , objPtr, "is_dt
12470 6c 73 22 2c 20 53 53 4c 5f 69 73 5f 64 74 6c 73  ls", SSL_is_dtls
12480 28 73 73 6c 29 29 3b 0a 0a 23 69 66 20 4f 50 45  (ssl));..#if OPE
12490 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d  NSSL_VERSION_NUM
124a0 42 45 52 20 3e 3d 20 30 78 33 30 32 30 30 30 30  BER >= 0x3020000
124b0 30 4c 0a 09 2f 2a 20 49 73 20 51 55 49 43 20 2a  0L../* Is QUIC *
124c0 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28  /..LAPPEND_BOOL(
124d0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
124e0 22 69 73 5f 71 75 69 63 22 2c 20 53 53 4c 5f 69  "is_quic", SSL_i
124f0 73 5f 71 75 69 63 28 73 73 6c 29 29 3b 0a 0a 09  s_quic(ssl));...
12500 2f 2a 20 49 73 20 54 4c 53 20 2a 2f 0a 09 4c 41  /* Is TLS */..LA
12510 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72  PPEND_BOOL(inter
12520 70 2c 20 6f 62 6a 50 74 72 2c 20 22 69 73 5f 74  p, objPtr, "is_t
12530 6c 73 22 2c 20 53 53 4c 5f 69 73 5f 74 6c 73 28  ls", SSL_is_tls(
12540 73 73 6c 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 09  ssl));.#endif...
12550 2f 2a 20 44 41 4e 45 20 54 4c 53 20 61 75 74 68  /* DANE TLS auth
12560 65 6e 74 69 63 61 74 69 6f 6e 20 2a 2f 0a 09 4c  entication */..L
12570 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65  APPEND_BOOL(inte
12580 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 64 61 6e  rp, objPtr, "dan
12590 65 5f 61 75 74 68 22 2c 20 53 53 4c 5f 67 65 74  e_auth", SSL_get
125a0 30 5f 64 61 6e 65 28 28 53 53 4c 20 2a 29 73 73  0_dane((SSL *)ss
125b0 6c 29 20 21 3d 20 4e 55 4c 4c 29 3b 0a 0a 09 2f  l) != NULL);.../
125c0 2a 20 57 61 69 74 69 6e 67 20 66 6f 72 20 61 73  * Waiting for as
125d0 79 6e 63 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f  ync */..LAPPEND_
125e0 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a  BOOL(interp, obj
125f0 50 74 72 2c 20 22 77 61 69 74 69 6e 67 5f 66 6f  Ptr, "waiting_fo
12600 72 5f 61 73 79 6e 63 22 2c 20 53 53 4c 5f 77 61  r_async", SSL_wa
12610 69 74 69 6e 67 5f 66 6f 72 5f 61 73 79 6e 63 28  iting_for_async(
12620 28 53 53 4c 20 2a 29 73 73 6c 29 29 3b 0a 0a 09  (SSL *)ssl));...
12630 2f 2a 20 54 69 6d 65 2d 6f 75 74 20 2a 2f 0a 09  /* Time-out */..
12640 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e 74  LAPPEND_LONG(int
12650 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 74 69  erp, objPtr, "ti
12660 6d 65 2d 6f 75 74 22 2c 20 53 53 4c 5f 67 65 74  me-out", SSL_get
12670 5f 64 65 66 61 75 6c 74 5f 74 69 6d 65 6f 75 74  _default_timeout
12680 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 49 73 20  (ssl));.../* Is 
12690 43 65 72 74 69 66 69 63 61 74 65 20 54 72 61 6e  Certificate Tran
126a0 73 70 61 72 65 6e 63 79 20 76 61 6c 69 64 61 74  sparency validat
126b0 69 6f 6e 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 09  ion enabled */..
126c0 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74  LAPPEND_BOOL(int
126d0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 74  erp, objPtr, "ct
126e0 5f 65 6e 61 62 6c 65 64 22 2c 20 53 53 4c 5f 63  _enabled", SSL_c
126f0 74 5f 69 73 5f 65 6e 61 62 6c 65 64 28 73 73 6c  t_is_enabled(ssl
12700 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ));.    }..    /
12710 2a 20 43 69 70 68 65 72 20 69 6e 66 6f 20 2a 2f  * Cipher info */
12720 0a 20 20 20 20 63 69 70 68 65 72 20 3d 20 53 53  .    cipher = SS
12730 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 63 69  L_get_current_ci
12740 70 68 65 72 28 73 73 6c 29 3b 0a 20 20 20 20 69  pher(ssl);.    i
12750 66 20 28 63 69 70 68 65 72 20 21 3d 20 4e 55 4c  f (cipher != NUL
12760 4c 29 20 7b 0a 09 63 68 61 72 20 62 75 66 5b 42  L) {..char buf[B
12770 55 46 53 49 5a 5d 20 3d 20 7b 30 7d 3b 0a 09 69  UFSIZ] = {0};..i
12780 6e 74 20 62 69 74 73 2c 20 61 6c 67 5f 62 69 74  nt bits, alg_bit
12790 73 3b 0a 0a 09 2f 2a 20 43 69 70 68 65 72 20 6e  s;.../* Cipher n
127a0 61 6d 65 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f  ame */..LAPPEND_
127b0 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
127c0 74 72 2c 20 22 63 69 70 68 65 72 22 2c 20 53 53  tr, "cipher", SS
127d0 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 6e 61 6d  L_CIPHER_get_nam
127e0 65 28 63 69 70 68 65 72 29 2c 20 2d 31 29 3b 0a  e(cipher), -1);.
127f0 0a 09 2f 2a 20 52 46 43 20 6e 61 6d 65 20 6f 66  ../* RFC name of
12800 20 63 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50 50   cipher */..LAPP
12810 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
12820 6f 62 6a 50 74 72 2c 20 22 73 74 61 6e 64 61 72  objPtr, "standar
12830 64 5f 6e 61 6d 65 22 2c 20 53 53 4c 5f 43 49 50  d_name", SSL_CIP
12840 48 45 52 5f 73 74 61 6e 64 61 72 64 5f 6e 61 6d  HER_standard_nam
12850 65 28 63 69 70 68 65 72 29 2c 20 2d 31 29 3b 0a  e(cipher), -1);.
12860 0a 09 2f 2a 20 4f 70 65 6e 53 53 4c 20 6e 61 6d  ../* OpenSSL nam
12870 65 20 6f 66 20 63 69 70 68 65 72 20 2a 2f 0a 09  e of cipher */..
12880 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65  LAPPEND_STR(inte
12890 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6f 70 65  rp, objPtr, "ope
128a0 6e 73 73 6c 5f 6e 61 6d 65 22 2c 20 4f 50 45 4e  nssl_name", OPEN
128b0 53 53 4c 5f 63 69 70 68 65 72 5f 6e 61 6d 65 28  SSL_cipher_name(
128c0 53 53 4c 5f 43 49 50 48 45 52 5f 73 74 61 6e 64  SSL_CIPHER_stand
128d0 61 72 64 5f 6e 61 6d 65 28 63 69 70 68 65 72 29  ard_name(cipher)
128e0 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 6e 75 6d  ), -1);.../* num
128f0 62 65 72 20 6f 66 20 73 65 63 72 65 74 20 62 69  ber of secret bi
12900 74 73 20 75 73 65 64 20 66 6f 72 20 63 69 70 68  ts used for ciph
12910 65 72 20 2a 2f 0a 09 62 69 74 73 20 3d 20 53 53  er */..bits = SS
12920 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 62 69 74  L_CIPHER_get_bit
12930 73 28 63 69 70 68 65 72 2c 20 26 61 6c 67 5f 62  s(cipher, &alg_b
12940 69 74 73 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 49  its);..LAPPEND_I
12950 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  NT(interp, objPt
12960 72 2c 20 22 73 65 63 72 65 74 5f 62 69 74 73 22  r, "secret_bits"
12970 2c 20 62 69 74 73 29 3b 0a 09 4c 41 50 50 45 4e  , bits);..LAPPEN
12980 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62  D_INT(interp, ob
12990 6a 50 74 72 2c 20 22 61 6c 67 6f 72 69 74 68 6d  jPtr, "algorithm
129a0 5f 62 69 74 73 22 2c 20 61 6c 67 5f 62 69 74 73  _bits", alg_bits
129b0 29 3b 0a 09 2f 2a 20 61 6c 67 5f 62 69 74 73 20  );../* alg_bits 
129c0 69 73 20 61 63 74 75 61 6c 20 6b 65 79 20 73 65  is actual key se
129d0 63 72 65 74 20 62 69 74 73 2e 20 49 66 20 75 73  cret bits. If us
129e0 65 20 62 69 74 73 20 61 6e 64 20 73 65 63 72 65  e bits and secre
129f0 74 20 28 61 6c 67 6f 72 69 74 68 6d 29 20 62 69  t (algorithm) bi
12a00 74 73 20 64 69 66 66 65 72 2c 0a 09 20 20 20 74  ts differ,..   t
12a10 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 62  he rest of the b
12a20 69 74 73 20 61 72 65 20 66 69 78 65 64 2c 20 69  its are fixed, i
12a30 2e 65 2e 20 66 6f 72 20 6c 69 6d 69 74 65 64 20  .e. for limited 
12a40 65 78 70 6f 72 74 20 63 69 70 68 65 72 73 20 28  export ciphers (
12a50 62 69 74 73 20 3c 20 35 36 29 20 2a 2f 0a 0a 09  bits < 56) */...
12a60 2f 2a 20 49 6e 64 69 63 61 74 65 73 20 77 68 69  /* Indicates whi
12a70 63 68 20 53 53 4c 2f 54 4c 53 20 70 72 6f 74 6f  ch SSL/TLS proto
12a80 63 6f 6c 20 76 65 72 73 69 6f 6e 20 66 69 72 73  col version firs
12a90 74 20 64 65 66 69 6e 65 64 20 74 68 65 20 63 69  t defined the ci
12aa0 70 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e 44  pher */..LAPPEND
12ab0 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _STR(interp, obj
12ac0 50 74 72 2c 20 22 6d 69 6e 5f 76 65 72 73 69 6f  Ptr, "min_versio
12ad0 6e 22 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f 67  n", SSL_CIPHER_g
12ae0 65 74 5f 76 65 72 73 69 6f 6e 28 63 69 70 68 65  et_version(ciphe
12af0 72 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 43 69  r), -1);.../* Ci
12b00 70 68 65 72 20 4e 49 44 20 2a 2f 0a 09 4c 41 50  pher NID */..LAP
12b10 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
12b20 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65 72   objPtr, "cipher
12b30 4e 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4f 42  NID", (char *)OB
12b40 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49 50  J_nid2ln(SSL_CIP
12b50 48 45 52 5f 67 65 74 5f 63 69 70 68 65 72 5f 6e  HER_get_cipher_n
12b60 69 64 28 63 69 70 68 65 72 29 29 2c 20 2d 31 29  id(cipher)), -1)
12b70 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69  ;..LAPPEND_STR(i
12b80 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
12b90 64 69 67 65 73 74 4e 49 44 22 2c 20 28 63 68 61  digestNID", (cha
12ba0 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53  r *)OBJ_nid2ln(S
12bb0 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 64 69  SL_CIPHER_get_di
12bc0 67 65 73 74 5f 6e 69 64 28 63 69 70 68 65 72 29  gest_nid(cipher)
12bd0 29 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44  ), -1);..LAPPEND
12be0 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _STR(interp, obj
12bf0 50 74 72 2c 20 22 6b 65 79 45 78 63 68 61 6e 67  Ptr, "keyExchang
12c00 65 4e 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4f  eNID", (char *)O
12c10 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49  BJ_nid2ln(SSL_CI
12c20 50 48 45 52 5f 67 65 74 5f 6b 78 5f 6e 69 64 28  PHER_get_kx_nid(
12c30 63 69 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a 09  cipher)), -1);..
12c40 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65  LAPPEND_STR(inte
12c50 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61 75 74  rp, objPtr, "aut
12c60 68 65 6e 74 69 63 61 74 69 6f 6e 4e 49 44 22 2c  henticationNID",
12c70 20 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 64   (char *)OBJ_nid
12c80 32 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f 67  2ln(SSL_CIPHER_g
12c90 65 74 5f 61 75 74 68 5f 6e 69 64 28 63 69 70 68  et_auth_nid(ciph
12ca0 65 72 29 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20  er)), -1);.../* 
12cb0 6d 65 73 73 61 67 65 20 61 75 74 68 65 6e 74 69  message authenti
12cc0 63 61 74 69 6f 6e 20 63 6f 64 65 20 2d 20 43 69  cation code - Ci
12cd0 70 68 65 72 20 69 73 20 41 45 41 44 20 28 65 2e  pher is AEAD (e.
12ce0 67 2e 20 47 43 4d 20 6f 72 20 43 68 61 43 68 61  g. GCM or ChaCha
12cf0 32 30 2f 50 6f 6c 79 31 33 30 35 29 20 6f 72 20  20/Poly1305) or 
12d00 6e 6f 74 20 2a 2f 0a 09 2f 2a 20 41 75 74 68 65  not */../* Authe
12d10 6e 74 69 63 61 74 65 64 20 45 6e 63 72 79 70 74  nticated Encrypt
12d20 69 6f 6e 20 77 69 74 68 20 61 73 73 6f 63 69 61  ion with associa
12d30 74 65 64 20 64 61 74 61 20 28 41 45 41 44 29 20  ted data (AEAD) 
12d40 63 68 65 63 6b 20 2a 2f 0a 09 4c 41 50 50 45 4e  check */..LAPPEN
12d50 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f  D_BOOL(interp, o
12d60 62 6a 50 74 72 2c 20 22 63 69 70 68 65 72 5f 69  bjPtr, "cipher_i
12d70 73 5f 61 65 61 64 22 2c 20 53 53 4c 5f 43 49 50  s_aead", SSL_CIP
12d80 48 45 52 5f 69 73 5f 61 65 61 64 28 63 69 70 68  HER_is_aead(ciph
12d90 65 72 29 29 3b 0a 0a 09 2f 2a 20 44 69 67 65 73  er));.../* Diges
12da0 74 20 75 73 65 64 20 64 75 72 69 6e 67 20 74 68  t used during th
12db0 65 20 53 53 4c 2f 54 4c 53 20 68 61 6e 64 73 68  e SSL/TLS handsh
12dc0 61 6b 65 20 77 68 65 6e 20 75 73 69 6e 67 20 74  ake when using t
12dd0 68 65 20 63 69 70 68 65 72 2e 20 2a 2f 0a 09 6d  he cipher. */..m
12de0 64 20 3d 20 53 53 4c 5f 43 49 50 48 45 52 5f 67  d = SSL_CIPHER_g
12df0 65 74 5f 68 61 6e 64 73 68 61 6b 65 5f 64 69 67  et_handshake_dig
12e00 65 73 74 28 63 69 70 68 65 72 29 3b 0a 09 4c 41  est(cipher);..LA
12e10 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
12e20 2c 20 6f 62 6a 50 74 72 2c 20 22 68 61 6e 64 73  , objPtr, "hands
12e30 68 61 6b 65 5f 64 69 67 65 73 74 22 2c 20 28 63  hake_digest", (c
12e40 68 61 72 20 2a 29 45 56 50 5f 4d 44 5f 6e 61 6d  har *)EVP_MD_nam
12e50 65 28 6d 64 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a  e(md), -1);.../*
12e60 20 47 65 74 20 4f 70 65 6e 53 53 4c 2d 73 70 65   Get OpenSSL-spe
12e70 63 69 66 69 63 20 49 44 2c 20 6e 6f 74 20 49 41  cific ID, not IA
12e80 4e 41 20 49 44 20 2a 2f 0a 09 4c 41 50 50 45 4e  NA ID */..LAPPEN
12e90 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62  D_INT(interp, ob
12ea0 6a 50 74 72 2c 20 22 63 69 70 68 65 72 5f 69 64  jPtr, "cipher_id
12eb0 22 2c 20 28 69 6e 74 29 20 53 53 4c 5f 43 49 50  ", (int) SSL_CIP
12ec0 48 45 52 5f 67 65 74 5f 69 64 28 63 69 70 68 65  HER_get_id(ciphe
12ed0 72 29 29 3b 0a 0a 09 2f 2a 20 54 77 6f 2d 62 79  r));.../* Two-by
12ee0 74 65 20 49 44 20 75 73 65 64 20 69 6e 20 74 68  te ID used in th
12ef0 65 20 54 4c 53 20 70 72 6f 74 6f 63 6f 6c 20 6f  e TLS protocol o
12f00 66 20 74 68 65 20 67 69 76 65 6e 20 63 69 70 68  f the given ciph
12f10 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 49  er */..LAPPEND_I
12f20 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  NT(interp, objPt
12f30 72 2c 20 22 70 72 6f 74 6f 63 6f 6c 5f 69 64 22  r, "protocol_id"
12f40 2c 20 28 69 6e 74 29 20 53 53 4c 5f 43 49 50 48  , (int) SSL_CIPH
12f50 45 52 5f 67 65 74 5f 70 72 6f 74 6f 63 6f 6c 5f  ER_get_protocol_
12f60 69 64 28 63 69 70 68 65 72 29 29 3b 0a 0a 09 2f  id(cipher));.../
12f70 2a 20 54 65 78 74 75 61 6c 20 64 65 73 63 72 69  * Textual descri
12f80 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 69 70  ption of the cip
12f90 68 65 72 20 2a 2f 0a 09 69 66 20 28 53 53 4c 5f  her */..if (SSL_
12fa0 43 49 50 48 45 52 5f 64 65 73 63 72 69 70 74 69  CIPHER_descripti
12fb0 6f 6e 28 63 69 70 68 65 72 2c 20 62 75 66 2c 20  on(cipher, buf, 
12fc0 73 69 7a 65 6f 66 28 62 75 66 29 29 20 21 3d 20  sizeof(buf)) != 
12fd0 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 4c 41 50  NULL) {..    LAP
12fe0 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
12ff0 20 6f 62 6a 50 74 72 2c 20 22 64 65 73 63 72 69   objPtr, "descri
13000 70 74 69 6f 6e 22 2c 20 62 75 66 2c 20 2d 31 29  ption", buf, -1)
13010 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ;..}.    }..    
13020 2f 2a 20 53 65 73 73 69 6f 6e 20 69 6e 66 6f 20  /* Session info 
13030 2a 2f 0a 20 20 20 20 73 65 73 73 69 6f 6e 20 3d  */.    session =
13040 20 53 53 4c 5f 67 65 74 5f 73 65 73 73 69 6f 6e   SSL_get_session
13050 28 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 73  (ssl);.    if (s
13060 65 73 73 69 6f 6e 20 21 3d 20 4e 55 4c 4c 29 20  ession != NULL) 
13070 7b 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  {..const unsigne
13080 64 20 63 68 61 72 20 2a 74 69 63 6b 65 74 3b 0a  d char *ticket;.
13090 09 73 69 7a 65 5f 74 20 6c 65 6e 32 3b 0a 09 75  .size_t len2;..u
130a0 6e 73 69 67 6e 65 64 20 69 6e 74 20 75 6c 65 6e  nsigned int ulen
130b0 3b 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  ;..const unsigne
130c0 64 20 63 68 61 72 20 2a 73 65 73 73 69 6f 6e 5f  d char *session_
130d0 69 64 2c 20 2a 70 72 6f 74 6f 3b 0a 09 75 6e 73  id, *proto;..uns
130e0 69 67 6e 65 64 20 63 68 61 72 20 62 75 66 66 65  igned char buffe
130f0 72 5b 53 53 4c 5f 4d 41 58 5f 4d 41 53 54 45 52  r[SSL_MAX_MASTER
13100 5f 4b 45 59 5f 4c 45 4e 47 54 48 5d 3b 0a 0a 09  _KEY_LENGTH];...
13110 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 20 73 65  /* Report the se
13120 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20  lected protocol 
13130 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74  as a result of t
13140 68 65 20 41 4c 50 4e 20 6e 65 67 6f 74 69 61 74  he ALPN negotiat
13150 69 6f 6e 20 2a 2f 0a 09 53 53 4c 5f 53 45 53 53  ion */..SSL_SESS
13160 49 4f 4e 5f 67 65 74 30 5f 61 6c 70 6e 5f 73 65  ION_get0_alpn_se
13170 6c 65 63 74 65 64 28 73 65 73 73 69 6f 6e 2c 20  lected(session, 
13180 26 70 72 6f 74 6f 2c 20 26 6c 65 6e 32 29 3b 0a  &proto, &len2);.
13190 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74  .LAPPEND_STR(int
131a0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61 6c  erp, objPtr, "al
131b0 70 6e 22 2c 20 28 63 68 61 72 20 2a 29 20 70 72  pn", (char *) pr
131c0 6f 74 6f 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20  oto, (Tcl_Size) 
131d0 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20 52 65 70 6f  len2);.../* Repo
131e0 72 74 20 74 68 65 20 73 65 6c 65 63 74 65 64 20  rt the selected 
131f0 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20 72 65  protocol as a re
13200 73 75 6c 74 20 6f 66 20 74 68 65 20 4e 50 4e 20  sult of the NPN 
13210 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a 23  negotiation */.#
13220 69 66 64 65 66 20 55 53 45 5f 4e 50 4e 0a 09 53  ifdef USE_NPN..S
13230 53 4c 5f 67 65 74 30 5f 6e 65 78 74 5f 70 72 6f  SL_get0_next_pro
13240 74 6f 5f 6e 65 67 6f 74 69 61 74 65 64 28 73 73  to_negotiated(ss
13250 6c 2c 20 26 70 72 6f 74 6f 2c 20 26 75 6c 65 6e  l, &proto, &ulen
13260 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28  );..LAPPEND_STR(
13270 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
13280 22 6e 70 6e 22 2c 20 28 63 68 61 72 20 2a 29 20  "npn", (char *) 
13290 70 72 6f 74 6f 2c 20 28 54 63 6c 5f 53 69 7a 65  proto, (Tcl_Size
132a0 29 20 75 6c 65 6e 29 3b 0a 23 65 6e 64 69 66 0a  ) ulen);.#endif.
132b0 0a 09 2f 2a 20 52 65 73 75 6d 61 62 6c 65 20 73  ../* Resumable s
132c0 65 73 73 69 6f 6e 20 2a 2f 0a 09 4c 41 50 50 45  ession */..LAPPE
132d0 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20  ND_BOOL(interp, 
132e0 6f 62 6a 50 74 72 2c 20 22 72 65 73 75 6d 61 62  objPtr, "resumab
132f0 6c 65 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e  le", SSL_SESSION
13300 5f 69 73 5f 72 65 73 75 6d 61 62 6c 65 28 73 65  _is_resumable(se
13310 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 53 65  ssion));.../* Se
13320 73 73 69 6f 6e 20 73 74 61 72 74 20 74 69 6d 65  ssion start time
13330 20 28 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20   (seconds since 
13340 65 70 6f 63 68 29 20 2a 2f 0a 09 4c 41 50 50 45  epoch) */..LAPPE
13350 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 2c 20  ND_LONG(interp, 
13360 6f 62 6a 50 74 72 2c 20 22 73 74 61 72 74 5f 74  objPtr, "start_t
13370 69 6d 65 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f  ime", SSL_SESSIO
13380 4e 5f 67 65 74 5f 74 69 6d 65 28 73 65 73 73 69  N_get_time(sessi
13390 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 54 69 6d 65 6f  on));.../* Timeo
133a0 75 74 20 76 61 6c 75 65 20 2d 20 53 53 4c 5f 43  ut value - SSL_C
133b0 54 58 5f 67 65 74 5f 74 69 6d 65 6f 75 74 20 28  TX_get_timeout (
133c0 69 6e 20 73 65 63 6f 6e 64 73 29 20 2a 2f 0a 09  in seconds) */..
133d0 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e 74  LAPPEND_LONG(int
133e0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 74 69  erp, objPtr, "ti
133f0 6d 65 6f 75 74 22 2c 20 53 53 4c 5f 53 45 53 53  meout", SSL_SESS
13400 49 4f 4e 5f 67 65 74 5f 74 69 6d 65 6f 75 74 28  ION_get_timeout(
13410 73 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20  session));.../* 
13420 53 65 73 73 69 6f 6e 20 69 64 20 2d 20 54 4c 53  Session id - TLS
13430 76 31 2e 32 20 61 6e 64 20 62 65 6c 6f 77 20 6f  v1.2 and below o
13440 6e 6c 79 20 2a 2f 0a 09 73 65 73 73 69 6f 6e 5f  nly */..session_
13450 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e  id = SSL_SESSION
13460 5f 67 65 74 5f 69 64 28 73 65 73 73 69 6f 6e 2c  _get_id(session,
13470 20 26 75 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e   &ulen);..LAPPEN
13480 44 5f 42 41 52 52 41 59 28 69 6e 74 65 72 70 2c  D_BARRAY(interp,
13490 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69 6f   objPtr, "sessio
134a0 6e 5f 69 64 22 2c 20 73 65 73 73 69 6f 6e 5f 69  n_id", session_i
134b0 64 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 75 6c  d, (Tcl_Size) ul
134c0 65 6e 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f  en);.../* Sessio
134d0 6e 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 73 65  n context */..se
134e0 73 73 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f 53  ssion_id = SSL_S
134f0 45 53 53 49 4f 4e 5f 67 65 74 30 5f 69 64 5f 63  ESSION_get0_id_c
13500 6f 6e 74 65 78 74 28 73 65 73 73 69 6f 6e 2c 20  ontext(session, 
13510 26 75 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e 44  &ulen);..LAPPEND
13520 5f 42 41 52 52 41 59 28 69 6e 74 65 72 70 2c 20  _BARRAY(interp, 
13530 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69 6f 6e  objPtr, "session
13540 5f 63 6f 6e 74 65 78 74 22 2c 20 73 65 73 73 69  _context", sessi
13550 6f 6e 5f 69 64 2c 20 28 54 63 6c 5f 53 69 7a 65  on_id, (Tcl_Size
13560 29 20 75 6c 65 6e 29 3b 0a 0a 09 2f 2a 20 53 65  ) ulen);.../* Se
13570 73 73 69 6f 6e 20 74 69 63 6b 65 74 20 2d 20 63  ssion ticket - c
13580 6c 69 65 6e 74 20 6f 6e 6c 79 20 2a 2f 0a 09 53  lient only */..S
13590 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f  SL_SESSION_get0_
135a0 74 69 63 6b 65 74 28 73 65 73 73 69 6f 6e 2c 20  ticket(session, 
135b0 26 74 69 63 6b 65 74 2c 20 26 6c 65 6e 32 29 3b  &ticket, &len2);
135c0 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59  ..LAPPEND_BARRAY
135d0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
135e0 20 22 73 65 73 73 69 6f 6e 5f 74 69 63 6b 65 74   "session_ticket
135f0 22 2c 20 74 69 63 6b 65 74 2c 20 28 54 63 6c 5f  ", ticket, (Tcl_
13600 53 69 7a 65 29 20 6c 65 6e 32 29 3b 0a 0a 09 2f  Size) len2);.../
13610 2a 20 53 65 73 73 69 6f 6e 20 74 69 63 6b 65 74  * Session ticket
13620 20 6c 69 66 65 74 69 6d 65 20 68 69 6e 74 20 28   lifetime hint (
13630 69 6e 20 73 65 63 6f 6e 64 73 29 20 2a 2f 0a 09  in seconds) */..
13640 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e 74  LAPPEND_LONG(int
13650 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6c 69  erp, objPtr, "li
13660 66 65 74 69 6d 65 22 2c 20 53 53 4c 5f 53 45 53  fetime", SSL_SES
13670 53 49 4f 4e 5f 67 65 74 5f 74 69 63 6b 65 74 5f  SION_get_ticket_
13680 6c 69 66 65 74 69 6d 65 5f 68 69 6e 74 28 73 65  lifetime_hint(se
13690 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 54 69  ssion));.../* Ti
136a0 63 6b 65 74 20 61 70 70 20 64 61 74 61 20 2a 2f  cket app data */
136b0 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52  .#if OPENSSL_VER
136c0 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78  SION_NUMBER < 0x
136d0 33 30 30 30 30 30 30 30 4c 0a 09 53 53 4c 5f 53  30000000L..SSL_S
136e0 45 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63 6b  ESSION_get0_tick
136f0 65 74 5f 61 70 70 64 61 74 61 28 28 53 53 4c 5f  et_appdata((SSL_
13700 53 45 53 53 49 4f 4e 20 2a 29 20 73 65 73 73 69  SESSION *) sessi
13710 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 26 6c 65  on, &ticket, &le
13720 6e 32 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41  n2);..LAPPEND_BA
13730 52 52 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a  RRAY(interp, obj
13740 50 74 72 2c 20 22 74 69 63 6b 65 74 5f 61 70 70  Ptr, "ticket_app
13750 5f 64 61 74 61 22 2c 20 74 69 63 6b 65 74 2c 20  _data", ticket, 
13760 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 29  (Tcl_Size) len2)
13770 3b 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a 20 47 65  ;.#endif.../* Ge
13780 74 20 6d 61 73 74 65 72 20 6b 65 79 20 2a 2f 0a  t master key */.
13790 09 6c 65 6e 32 20 3d 20 53 53 4c 5f 53 45 53 53  .len2 = SSL_SESS
137a0 49 4f 4e 5f 67 65 74 5f 6d 61 73 74 65 72 5f 6b  ION_get_master_k
137b0 65 79 28 73 65 73 73 69 6f 6e 2c 20 62 75 66 66  ey(session, buff
137c0 65 72 2c 20 53 53 4c 5f 4d 41 58 5f 4d 41 53 54  er, SSL_MAX_MAST
137d0 45 52 5f 4b 45 59 5f 4c 45 4e 47 54 48 29 3b 0a  ER_KEY_LENGTH);.
137e0 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59 28  .LAPPEND_BARRAY(
137f0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
13800 22 6d 61 73 74 65 72 5f 6b 65 79 22 2c 20 62 75  "master_key", bu
13810 66 66 65 72 2c 20 28 54 63 6c 5f 53 69 7a 65 29  ffer, (Tcl_Size)
13820 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20 43 6f 6d   len2);.../* Com
13830 70 72 65 73 73 69 6f 6e 20 69 64 20 2a 2f 0a 09  pression id */..
13840 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 64 20  unsigned int id 
13850 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65  = SSL_SESSION_ge
13860 74 5f 63 6f 6d 70 72 65 73 73 5f 69 64 28 73 65  t_compress_id(se
13870 73 73 69 6f 6e 29 3b 0a 09 4c 41 50 50 45 4e 44  ssion);..LAPPEND
13880 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _STR(interp, obj
13890 50 74 72 2c 20 22 63 6f 6d 70 72 65 73 73 69 6f  Ptr, "compressio
138a0 6e 5f 69 64 22 2c 20 69 64 20 3d 3d 20 31 20 3f  n_id", id == 1 ?
138b0 20 22 7a 6c 69 62 22 20 3a 20 22 6e 6f 6e 65 22   "zlib" : "none"
138c0 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  , -1);.    }..  
138d0 20 20 2f 2a 20 43 6f 6d 70 72 65 73 73 69 6f 6e    /* Compression
138e0 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 69 66 20   info */.    if 
138f0 28 73 73 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  (ssl != NULL) {.
13900 23 69 66 64 65 66 20 48 41 56 45 5f 53 53 4c 5f  #ifdef HAVE_SSL_
13910 43 4f 4d 50 52 45 53 53 49 4f 4e 0a 09 63 6f 6e  COMPRESSION..con
13920 73 74 20 43 4f 4d 50 5f 4d 45 54 48 4f 44 20 2a  st COMP_METHOD *
13930 63 6f 6d 70 2c 20 2a 65 78 70 6e 3b 0a 09 63 6f  comp, *expn;..co
13940 6d 70 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75 72  mp = SSL_get_cur
13950 72 65 6e 74 5f 63 6f 6d 70 72 65 73 73 69 6f 6e  rent_compression
13960 28 73 73 6c 29 3b 0a 09 65 78 70 6e 20 3d 20 53  (ssl);..expn = S
13970 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 65  SL_get_current_e
13980 78 70 61 6e 73 69 6f 6e 28 73 73 6c 29 3b 0a 0a  xpansion(ssl);..
13990 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74  .LAPPEND_STR(int
139a0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 6f  erp, objPtr, "co
139b0 6d 70 72 65 73 73 69 6f 6e 22 2c 20 63 6f 6d 70  mpression", comp
139c0 20 3f 20 53 53 4c 5f 43 4f 4d 50 5f 67 65 74 5f   ? SSL_COMP_get_
139d0 6e 61 6d 65 28 63 6f 6d 70 29 20 3a 20 22 6e 6f  name(comp) : "no
139e0 6e 65 22 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45  ne", -1);..LAPPE
139f0 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f  ND_STR(interp, o
13a00 62 6a 50 74 72 2c 20 22 65 78 70 61 6e 73 69 6f  bjPtr, "expansio
13a10 6e 22 2c 20 65 78 70 6e 20 3f 20 53 53 4c 5f 43  n", expn ? SSL_C
13a20 4f 4d 50 5f 67 65 74 5f 6e 61 6d 65 28 65 78 70  OMP_get_name(exp
13a30 6e 29 20 3a 20 22 6e 6f 6e 65 22 2c 20 2d 31 29  n) : "none", -1)
13a40 3b 0a 23 65 6c 73 65 0a 09 4c 41 50 50 45 4e 44  ;.#else..LAPPEND
13a50 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _STR(interp, obj
13a60 50 74 72 2c 20 22 63 6f 6d 70 72 65 73 73 69 6f  Ptr, "compressio
13a70 6e 22 2c 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b  n", "none", -1);
13a80 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e  ..LAPPEND_STR(in
13a90 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 65  terp, objPtr, "e
13aa0 78 70 61 6e 73 69 6f 6e 22 2c 20 22 6e 6f 6e 65  xpansion", "none
13ab0 22 2c 20 2d 31 29 3b 0a 23 65 6e 64 69 66 0a 20  ", -1);.#endif. 
13ac0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 72     }..    /* Ser
13ad0 76 65 72 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20  ver info */.    
13ae0 7b 0a 09 6c 6f 6e 67 20 6d 6f 64 65 20 3d 20 53  {..long mode = S
13af0 53 4c 5f 43 54 58 5f 67 65 74 5f 73 65 73 73 69  SL_CTX_get_sessi
13b00 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 28 73 74  on_cache_mode(st
13b10 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a 09 63  atePtr->ctx);..c
13b20 68 61 72 20 2a 6d 73 67 3b 0a 0a 09 69 66 20 28  har *msg;...if (
13b30 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f  mode & SSL_SESS_
13b40 43 41 43 48 45 5f 4f 46 46 29 20 7b 0a 09 20 20  CACHE_OFF) {..  
13b50 20 20 6d 73 67 20 3d 20 22 6f 66 66 22 3b 0a 09    msg = "off";..
13b60 7d 20 65 6c 73 65 20 69 66 20 28 6d 6f 64 65 20  } else if (mode 
13b70 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45  & SSL_SESS_CACHE
13b80 5f 43 4c 49 45 4e 54 29 20 7b 0a 09 20 20 20 20  _CLIENT) {..    
13b90 6d 73 67 20 3d 20 22 63 6c 69 65 6e 74 22 3b 0a  msg = "client";.
13ba0 09 7d 20 65 6c 73 65 20 69 66 20 28 6d 6f 64 65  .} else if (mode
13bb0 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48   & SSL_SESS_CACH
13bc0 45 5f 53 45 52 56 45 52 29 20 7b 0a 09 20 20 20  E_SERVER) {..   
13bd0 20 6d 73 67 20 3d 20 22 73 65 72 76 65 72 22 3b   msg = "server";
13be0 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 6d 6f 64  ..} else if (mod
13bf0 65 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43  e & SSL_SESS_CAC
13c00 48 45 5f 42 4f 54 48 29 20 7b 0a 09 20 20 20 20  HE_BOTH) {..    
13c10 6d 73 67 20 3d 20 22 62 6f 74 68 22 3b 0a 09 7d  msg = "both";..}
13c20 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 6d 73 67   else {..    msg
13c30 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 09 7d   = "unknown";..}
13c40 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e  ..LAPPEND_STR(in
13c50 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73  terp, objPtr, "s
13c60 65 73 73 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64  ession_cache_mod
13c70 65 22 2c 20 6d 73 67 2c 20 2d 31 29 3b 0a 20 20  e", msg, -1);.  
13c80 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 41 20 4c    }..    /* CA L
13c90 69 73 74 20 2a 2f 0a 20 20 20 20 2f 2a 20 49 46  ist */.    /* IF
13ca0 20 6e 6f 74 20 61 20 73 65 72 76 65 72 2c 20 73   not a server, s
13cb0 61 6d 65 20 61 73 20 53 53 4c 5f 67 65 74 30 5f  ame as SSL_get0_
13cc0 70 65 65 72 5f 43 41 5f 6c 69 73 74 2e 20 49 66  peer_CA_list. If
13cd0 20 73 65 72 76 65 72 20 73 61 6d 65 20 61 73 20   server same as 
13ce0 53 53 4c 5f 43 54 58 5f 67 65 74 5f 63 6c 69 65  SSL_CTX_get_clie
13cf0 6e 74 5f 43 41 5f 6c 69 73 74 20 2a 2f 0a 20 20  nt_CA_list */.  
13d00 20 20 6c 69 73 74 50 74 72 20 3d 20 54 63 6c 5f    listPtr = Tcl_
13d10 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55  NewListObj(0, NU
13d20 4c 4c 29 3b 0a 20 20 20 20 53 54 41 43 4b 5f 4f  LL);.    STACK_O
13d30 46 28 58 35 30 39 5f 4e 41 4d 45 29 20 2a 63 61  F(X509_NAME) *ca
13d40 5f 6c 69 73 74 3b 0a 20 20 20 20 69 66 20 28 28  _list;.    if ((
13d50 63 61 5f 6c 69 73 74 20 3d 20 53 53 4c 5f 67 65  ca_list = SSL_ge
13d60 74 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 74  t_client_CA_list
13d70 28 73 73 6c 29 29 20 21 3d 20 4e 55 4c 4c 29 20  (ssl)) != NULL) 
13d80 7b 0a 09 63 68 61 72 20 62 75 66 66 65 72 5b 42  {..char buffer[B
13d90 55 46 53 49 5a 5d 3b 0a 09 66 6f 72 20 28 69 6e  UFSIZ];..for (in
13da0 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b 5f  t i = 0; i < sk_
13db0 58 35 30 39 5f 4e 41 4d 45 5f 6e 75 6d 28 63 61  X509_NAME_num(ca
13dc0 5f 6c 69 73 74 29 3b 20 69 2b 2b 29 20 7b 0a 09  _list); i++) {..
13dd0 20 20 20 20 58 35 30 39 5f 4e 41 4d 45 20 2a 6e      X509_NAME *n
13de0 61 6d 65 20 3d 20 73 6b 5f 58 35 30 39 5f 4e 41  ame = sk_X509_NA
13df0 4d 45 5f 76 61 6c 75 65 28 63 61 5f 6c 69 73 74  ME_value(ca_list
13e00 2c 20 69 29 3b 0a 09 20 20 20 20 69 66 20 28 6e  , i);..    if (n
13e10 61 6d 65 29 20 7b 0a 09 09 58 35 30 39 5f 4e 41  ame) {...X509_NA
13e20 4d 45 5f 6f 6e 65 6c 69 6e 65 28 6e 61 6d 65 2c  ME_oneline(name,
13e30 20 62 75 66 66 65 72 2c 20 42 55 46 53 49 5a 29   buffer, BUFSIZ)
13e40 3b 0a 09 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;...Tcl_ListObjA
13e50 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
13e60 65 72 70 2c 20 6c 69 73 74 50 74 72 2c 20 54 63  erp, listPtr, Tc
13e70 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 62  l_NewStringObj(b
13e80 75 66 66 65 72 2c 20 2d 31 29 29 3b 0a 09 20 20  uffer, -1));..  
13e90 20 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20    }..}.    }.   
13ea0 20 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74   LAPPEND_OBJ(int
13eb0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 61  erp, objPtr, "ca
13ec0 4c 69 73 74 22 2c 20 6c 69 73 74 50 74 72 29 3b  List", listPtr);
13ed0 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 49 4e 54  .    LAPPEND_INT
13ee0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
13ef0 20 22 63 61 4c 69 73 74 43 6f 75 6e 74 22 2c 20   "caListCount", 
13f00 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f 6e 75 6d  sk_X509_NAME_num
13f10 28 63 61 5f 6c 69 73 74 29 29 3b 0a 0a 20 20 20  (ca_list));..   
13f20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
13f30 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
13f40 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
13f50 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d  L_OK;.}.../*. *-
13f60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13f70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13f80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13f90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13fa0 2d 2d 0a 20 2a 0a 20 2a 20 56 65 72 73 69 6f 6e  --. *. * Version
13fb0 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72 6e  ObjCmd -- return
13fc0 20 76 65 72 73 69 6f 6e 20 73 74 72 69 6e 67 20   version string 
13fd0 66 72 6f 6d 20 4f 70 65 6e 53 53 4c 2e 0a 20 2a  from OpenSSL.. *
13fe0 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
13ff0 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72  A standard Tcl r
14000 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64  esult.. *. * Sid
14010 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f  e effects:. *.No
14020 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  ne.. *. *-------
14030 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14040 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14050 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14060 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
14070 0a 73 74 61 74 69 63 20 69 6e 74 0a 56 65 72 73  .static int.Vers
14080 69 6f 6e 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74  ionObjCmd(Client
14090 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
140a0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
140b0 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54  erp, int objc, T
140c0 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62  cl_Obj *const ob
140d0 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f  jv[]) {.    Tcl_
140e0 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 20 20 20  Obj *objPtr;.   
140f0 20 28 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 61   (void) clientDa
14100 74 61 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 6f  ta;.    (void) o
14110 62 6a 63 3b 0a 20 20 20 20 28 76 6f 69 64 29 20  bjc;.    (void) 
14120 6f 62 6a 76 3b 0a 0a 20 20 20 20 64 70 72 69 6e  objv;..    dprin
14130 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20  tf("Called");.. 
14140 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f     objPtr = Tcl_
14150 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 4f 50 45  NewStringObj(OPE
14160 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 54 45 58  NSSL_VERSION_TEX
14170 54 2c 20 2d 31 29 3b 0a 20 20 20 20 54 63 6c 5f  T, -1);.    Tcl_
14180 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
14190 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 0a 20  erp, objPtr);.. 
141a0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b     return TCL_OK
141b0 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ;.}.../*. *-----
141c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
141d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
141e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
141f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
14200 2a 0a 20 2a 20 4d 69 73 63 4f 62 6a 43 6d 64 20  *. * MiscObjCmd 
14210 2d 2d 20 6d 69 73 63 20 63 6f 6d 6d 61 6e 64 73  -- misc commands
14220 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
14230 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63   *.A standard Tc
14240 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20  l result.. *. * 
14250 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
14260 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d  .None.. *. *----
14270 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14280 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14290 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
142a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
142b0 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 4d   */.static int.M
142c0 69 73 63 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74  iscObjCmd(Client
142d0 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
142e0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
142f0 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54  erp, int objc, T
14300 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62  cl_Obj *const ob
14310 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 73 74 61 74  jv[]) {.    stat
14320 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63  ic const char *c
14330 6f 6d 6d 61 6e 64 73 20 5b 5d 20 3d 20 7b 20 22  ommands [] = { "
14340 72 65 71 22 2c 20 22 73 74 72 72 65 71 22 2c 20  req", "strreq", 
14350 4e 55 4c 4c 20 7d 3b 0a 20 20 20 20 65 6e 75 6d  NULL };.    enum
14360 20 63 6f 6d 6d 61 6e 64 20 7b 20 43 5f 52 45 51   command { C_REQ
14370 2c 20 43 5f 53 54 52 52 45 51 2c 20 43 5f 44 55  , C_STRREQ, C_DU
14380 4d 4d 59 20 7d 3b 0a 20 20 20 20 54 63 6c 5f 53  MMY };.    Tcl_S
14390 69 7a 65 20 63 6d 64 3b 0a 20 20 20 20 69 6e 74  ize cmd;.    int
143a0 20 69 73 53 74 72 3b 0a 20 20 20 20 63 68 61 72   isStr;.    char
143b0 20 62 75 66 66 65 72 5b 31 36 33 38 34 5d 3b 0a   buffer[16384];.
143c0 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65 6e      (void) clien
143d0 74 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 72 69  tData;..    dpri
143e0 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a  ntf("Called");..
143f0 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 32      if (objc < 2
14400 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75  ) {..Tcl_WrongNu
14410 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
14420 20 6f 62 6a 76 2c 20 22 73 75 62 63 6f 6d 6d 61   objv, "subcomma
14430 6e 64 20 3f 61 72 67 73 3f 22 29 3b 0a 09 72 65  nd ?args?");..re
14440 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
14450 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 54 63      }.    if (Tc
14460 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62  l_GetIndexFromOb
14470 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31  j(interp, objv[1
14480 5d 2c 20 63 6f 6d 6d 61 6e 64 73 2c 20 22 63 6f  ], commands, "co
14490 6d 6d 61 6e 64 22 2c 20 30 2c 20 26 63 6d 64 29  mmand", 0, &cmd)
144a0 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72   != TCL_OK) {..r
144b0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
144c0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f  .    }..    ERR_
144d0 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a  clear_error();..
144e0 20 20 20 20 69 73 53 74 72 20 3d 20 28 63 6d 64      isStr = (cmd
144f0 20 3d 3d 20 43 5f 53 54 52 52 45 51 29 3b 0a 20   == C_STRREQ);. 
14500 20 20 20 73 77 69 74 63 68 20 28 28 65 6e 75 6d     switch ((enum
14510 20 63 6f 6d 6d 61 6e 64 29 20 63 6d 64 29 20 7b   command) cmd) {
14520 0a 09 63 61 73 65 20 43 5f 52 45 51 3a 0a 09 63  ..case C_REQ:..c
14530 61 73 65 20 43 5f 53 54 52 52 45 51 3a 20 7b 0a  ase C_STRREQ: {.
14540 09 20 20 20 20 45 56 50 5f 50 4b 45 59 20 2a 70  .    EVP_PKEY *p
14550 6b 65 79 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 58  key=NULL;..    X
14560 35 30 39 20 2a 63 65 72 74 3d 4e 55 4c 4c 3b 0a  509 *cert=NULL;.
14570 09 20 20 20 20 58 35 30 39 5f 4e 41 4d 45 20 2a  .    X509_NAME *
14580 6e 61 6d 65 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20  name=NULL;..    
14590 54 63 6c 5f 4f 62 6a 20 2a 2a 6c 69 73 74 76 3b  Tcl_Obj **listv;
145a0 0a 09 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 6c  ..    Tcl_Size l
145b0 69 73 74 63 3b 0a 09 20 20 20 20 69 6e 74 20 69  istc;..    int i
145c0 3b 0a 0a 09 20 20 20 20 42 49 4f 20 2a 6f 75 74  ;...    BIO *out
145d0 3d 4e 55 4c 4c 3b 0a 0a 09 20 20 20 20 63 68 61  =NULL;...    cha
145e0 72 20 2a 6b 5f 43 3d 22 22 2c 2a 6b 5f 53 54 3d  r *k_C="",*k_ST=
145f0 22 22 2c 2a 6b 5f 4c 3d 22 22 2c 2a 6b 5f 4f 3d  "",*k_L="",*k_O=
14600 22 22 2c 2a 6b 5f 4f 55 3d 22 22 2c 2a 6b 5f 43  "",*k_OU="",*k_C
14610 4e 3d 22 22 2c 2a 6b 5f 45 6d 61 69 6c 3d 22 22  N="",*k_Email=""
14620 3b 0a 09 20 20 20 20 63 68 61 72 20 2a 6b 65 79  ;..    char *key
14630 6f 75 74 2c 2a 70 65 6d 6f 75 74 2c 2a 73 74 72  out,*pemout,*str
14640 3b 0a 09 20 20 20 20 69 6e 74 20 6b 65 79 73 69  ;..    int keysi
14650 7a 65 2c 73 65 72 69 61 6c 3d 30 2c 64 61 79 73  ze,serial=0,days
14660 3d 33 36 35 3b 0a 0a 23 69 66 20 4f 50 45 4e 53  =365;..#if OPENS
14670 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45  SL_VERSION_NUMBE
14680 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a  R < 0x30000000L.
14690 09 20 20 20 20 42 49 47 4e 55 4d 20 2a 62 6e 65  .    BIGNUM *bne
146a0 20 3d 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 52 53   = NULL;..    RS
146b0 41 20 2a 72 73 61 20 3d 20 4e 55 4c 4c 3b 0a 23  A *rsa = NULL;.#
146c0 65 6c 73 65 0a 09 20 20 20 20 45 56 50 5f 50 4b  else..    EVP_PK
146d0 45 59 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e 55  EY_CTX *ctx = NU
146e0 4c 4c 3b 0a 23 65 6e 64 69 66 0a 0a 09 20 20 20  LL;.#endif...   
146f0 20 69 66 20 28 28 6f 62 6a 63 3c 35 29 20 7c 7c   if ((objc<5) ||
14700 20 28 6f 62 6a 63 3e 36 29 29 20 7b 0a 09 09 54   (objc>6)) {...T
14710 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
14720 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
14730 20 22 6b 65 79 73 69 7a 65 20 6b 65 79 66 69 6c   "keysize keyfil
14740 65 20 63 65 72 74 66 69 6c 65 20 3f 69 6e 66 6f  e certfile ?info
14750 3f 22 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43  ?");...return TC
14760 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a  L_ERROR;..    }.
14770 0a 09 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65  ..    if (Tcl_Ge
14780 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
14790 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 6b 65  rp, objv[2], &ke
147a0 79 73 69 7a 65 29 20 21 3d 20 54 43 4c 5f 4f 4b  ysize) != TCL_OK
147b0 29 20 7b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c  ) {...return TCL
147c0 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 09  _ERROR;..    }..
147d0 20 20 20 20 6b 65 79 6f 75 74 3d 54 63 6c 5f 47      keyout=Tcl_G
147e0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d  etString(objv[3]
147f0 29 3b 0a 09 20 20 20 20 70 65 6d 6f 75 74 3d 54  );..    pemout=T
14800 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
14810 76 5b 34 5d 29 3b 0a 09 20 20 20 20 69 66 20 28  v[4]);..    if (
14820 69 73 53 74 72 29 20 7b 0a 09 09 54 63 6c 5f 53  isStr) {...Tcl_S
14830 65 74 56 61 72 28 69 6e 74 65 72 70 2c 6b 65 79  etVar(interp,key
14840 6f 75 74 2c 22 22 2c 30 29 3b 0a 09 09 54 63 6c  out,"",0);...Tcl
14850 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 70  _SetVar(interp,p
14860 65 6d 6f 75 74 2c 22 22 2c 30 29 3b 0a 09 20 20  emout,"",0);..  
14870 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 6f 62    }...    if (ob
14880 6a 63 3e 3d 36 29 20 7b 0a 09 09 69 66 20 28 54  jc>=6) {...if (T
14890 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65  cl_ListObjGetEle
148a0 6d 65 6e 74 73 28 69 6e 74 65 72 70 2c 20 6f 62  ments(interp, ob
148b0 6a 76 5b 35 5d 2c 20 26 6c 69 73 74 63 2c 20 26  jv[5], &listc, &
148c0 6c 69 73 74 76 29 20 21 3d 20 54 43 4c 5f 4f 4b  listv) != TCL_OK
148d0 29 20 7b 0a 09 09 20 20 20 20 72 65 74 75 72 6e  ) {...    return
148e0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a   TCL_ERROR;...}.
148f0 0a 09 09 69 66 20 28 28 6c 69 73 74 63 25 32 29  ...if ((listc%2)
14900 20 21 3d 20 30 29 20 7b 0a 09 09 20 20 20 20 54   != 0) {...    T
14910 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
14920 65 72 70 2c 22 49 6e 66 6f 72 6d 61 74 69 6f 6e  erp,"Information
14930 20 6c 69 73 74 20 6d 75 73 74 20 68 61 76 65 20   list must have 
14940 65 76 65 6e 20 6e 75 6d 62 65 72 20 6f 66 20 61  even number of a
14950 72 67 75 6d 65 6e 74 73 22 2c 4e 55 4c 4c 29 3b  rguments",NULL);
14960 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  ...    return TC
14970 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 09 09 66  L_ERROR;...}...f
14980 6f 72 20 28 69 3d 30 3b 20 69 3c 6c 69 73 74 63  or (i=0; i<listc
14990 3b 20 69 2b 3d 32 29 20 7b 0a 09 09 20 20 20 20  ; i+=2) {...    
149a0 73 74 72 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e  str=Tcl_GetStrin
149b0 67 28 6c 69 73 74 76 5b 69 5d 29 3b 0a 09 09 20  g(listv[i]);... 
149c0 20 20 20 69 66 20 28 73 74 72 63 6d 70 28 73 74     if (strcmp(st
149d0 72 2c 22 64 61 79 73 22 29 3d 3d 30 29 20 7b 0a  r,"days")==0) {.
149e0 09 09 09 69 66 20 28 54 63 6c 5f 47 65 74 49 6e  ...if (Tcl_GetIn
149f0 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
14a00 6c 69 73 74 76 5b 69 2b 31 5d 2c 26 64 61 79 73  listv[i+1],&days
14a10 29 21 3d 54 43 4c 5f 4f 4b 29 0a 09 09 09 20 20  )!=TCL_OK)....  
14a20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
14a30 4f 52 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65  OR;...    } else
14a40 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c   if (strcmp(str,
14a50 22 73 65 72 69 61 6c 22 29 3d 3d 30 29 20 7b 0a  "serial")==0) {.
14a60 09 09 09 69 66 20 28 54 63 6c 5f 47 65 74 49 6e  ...if (Tcl_GetIn
14a70 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
14a80 6c 69 73 74 76 5b 69 2b 31 5d 2c 26 73 65 72 69  listv[i+1],&seri
14a90 61 6c 29 21 3d 54 43 4c 5f 4f 4b 29 0a 09 09 09  al)!=TCL_OK)....
14aa0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
14ab0 52 52 4f 52 3b 0a 09 09 20 20 20 20 7d 20 65 6c  RROR;...    } el
14ac0 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74  se if (strcmp(st
14ad0 72 2c 22 43 22 29 3d 3d 30 29 20 7b 0a 09 09 09  r,"C")==0) {....
14ae0 6b 5f 43 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e  k_C=Tcl_GetStrin
14af0 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09  g(listv[i+1]);..
14b00 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
14b10 73 74 72 63 6d 70 28 73 74 72 2c 22 53 54 22 29  strcmp(str,"ST")
14b20 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 53 54 3d 54  ==0) {....k_ST=T
14b30 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73  cl_GetString(lis
14b40 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20  tv[i+1]);...    
14b50 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d  } else if (strcm
14b60 70 28 73 74 72 2c 22 4c 22 29 3d 3d 30 29 20 7b  p(str,"L")==0) {
14b70 0a 09 09 09 6b 5f 4c 3d 54 63 6c 5f 47 65 74 53  ....k_L=Tcl_GetS
14b80 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d  tring(listv[i+1]
14b90 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20  );...    } else 
14ba0 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22  if (strcmp(str,"
14bb0 4f 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4f  O")==0) {....k_O
14bc0 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c  =Tcl_GetString(l
14bd0 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20  istv[i+1]);...  
14be0 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72    } else if (str
14bf0 63 6d 70 28 73 74 72 2c 22 4f 55 22 29 3d 3d 30  cmp(str,"OU")==0
14c00 29 20 7b 0a 09 09 09 6b 5f 4f 55 3d 54 63 6c 5f  ) {....k_OU=Tcl_
14c10 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b  GetString(listv[
14c20 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65  i+1]);...    } e
14c30 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73  lse if (strcmp(s
14c40 74 72 2c 22 43 4e 22 29 3d 3d 30 29 20 7b 0a 09  tr,"CN")==0) {..
14c50 09 09 6b 5f 43 4e 3d 54 63 6c 5f 47 65 74 53 74  ..k_CN=Tcl_GetSt
14c60 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29  ring(listv[i+1])
14c70 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69  ;...    } else i
14c80 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 45  f (strcmp(str,"E
14c90 6d 61 69 6c 22 29 3d 3d 30 29 20 7b 0a 09 09 09  mail")==0) {....
14ca0 6b 5f 45 6d 61 69 6c 3d 54 63 6c 5f 47 65 74 53  k_Email=Tcl_GetS
14cb0 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d  tring(listv[i+1]
14cc0 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20  );...    } else 
14cd0 7b 0a 09 09 09 54 63 6c 5f 53 65 74 52 65 73 75  {....Tcl_SetResu
14ce0 6c 74 28 69 6e 74 65 72 70 2c 22 55 6e 6b 6e 6f  lt(interp,"Unkno
14cf0 77 6e 20 70 61 72 61 6d 65 74 65 72 22 2c 4e 55  wn parameter",NU
14d00 4c 4c 29 3b 0a 09 09 09 72 65 74 75 72 6e 20 54  LL);....return T
14d10 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20 20  CL_ERROR;...    
14d20 7d 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 0a 23 69  }...}..    }..#i
14d30 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f  f OPENSSL_VERSIO
14d40 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30  N_NUMBER < 0x300
14d50 30 30 30 30 30 4c 0a 09 20 20 20 20 62 6e 65 20  00000L..    bne 
14d60 3d 20 42 4e 5f 6e 65 77 28 29 3b 0a 09 20 20 20  = BN_new();..   
14d70 20 72 73 61 20 3d 20 52 53 41 5f 6e 65 77 28 29   rsa = RSA_new()
14d80 3b 0a 09 20 20 20 20 70 6b 65 79 20 3d 20 45 56  ;..    pkey = EV
14d90 50 5f 50 4b 45 59 5f 6e 65 77 28 29 3b 0a 09 20  P_PKEY_new();.. 
14da0 20 20 20 69 66 20 28 62 6e 65 20 3d 3d 20 4e 55     if (bne == NU
14db0 4c 4c 20 7c 7c 20 72 73 61 20 3d 3d 20 4e 55 4c  LL || rsa == NUL
14dc0 4c 20 7c 7c 20 70 6b 65 79 20 3d 3d 20 4e 55 4c  L || pkey == NUL
14dd0 4c 20 7c 7c 20 21 42 4e 5f 73 65 74 5f 77 6f 72  L || !BN_set_wor
14de0 64 28 62 6e 65 2c 52 53 41 5f 46 34 29 20 7c 7c  d(bne,RSA_F4) ||
14df0 0a 09 09 21 52 53 41 5f 67 65 6e 65 72 61 74 65  ...!RSA_generate
14e00 5f 6b 65 79 5f 65 78 28 72 73 61 2c 20 6b 65 79  _key_ex(rsa, key
14e10 73 69 7a 65 2c 20 62 6e 65 2c 20 4e 55 4c 4c 29  size, bne, NULL)
14e20 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59 5f 61 73   || !EVP_PKEY_as
14e30 73 69 67 6e 5f 52 53 41 28 70 6b 65 79 2c 20 72  sign_RSA(pkey, r
14e40 73 61 29 29 20 7b 0a 09 09 45 56 50 5f 50 4b 45  sa)) {...EVP_PKE
14e50 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 09 09  Y_free(pkey);...
14e60 2f 2a 20 52 53 41 5f 66 72 65 65 28 72 73 61 29  /* RSA_free(rsa)
14e70 3b 20 66 72 65 65 64 20 62 79 20 45 56 50 5f 50  ; freed by EVP_P
14e80 4b 45 59 5f 66 72 65 65 20 2a 2f 0a 09 09 42 4e  KEY_free */...BN
14e90 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6c 73  _free(bne);.#els
14ea0 65 0a 09 20 20 20 20 70 6b 65 79 20 3d 20 45 56  e..    pkey = EV
14eb0 50 5f 52 53 41 5f 67 65 6e 28 28 75 6e 73 69 67  P_RSA_gen((unsig
14ec0 6e 65 64 20 69 6e 74 29 20 6b 65 79 73 69 7a 65  ned int) keysize
14ed0 29 3b 0a 09 20 20 20 20 63 74 78 20 3d 20 45 56  );..    ctx = EV
14ee0 50 5f 50 4b 45 59 5f 43 54 58 5f 6e 65 77 28 70  P_PKEY_CTX_new(p
14ef0 6b 65 79 2c 4e 55 4c 4c 29 3b 0a 09 20 20 20 20  key,NULL);..    
14f00 69 66 20 28 70 6b 65 79 20 3d 3d 20 4e 55 4c 4c  if (pkey == NULL
14f10 20 7c 7c 20 63 74 78 20 3d 3d 20 4e 55 4c 4c 20   || ctx == NULL 
14f20 7c 7c 20 21 45 56 50 5f 50 4b 45 59 5f 6b 65 79  || !EVP_PKEY_key
14f30 67 65 6e 5f 69 6e 69 74 28 63 74 78 29 20 7c 7c  gen_init(ctx) ||
14f40 0a 09 09 21 45 56 50 5f 50 4b 45 59 5f 43 54 58  ...!EVP_PKEY_CTX
14f50 5f 73 65 74 5f 72 73 61 5f 6b 65 79 67 65 6e 5f  _set_rsa_keygen_
14f60 62 69 74 73 28 63 74 78 2c 20 6b 65 79 73 69 7a  bits(ctx, keysiz
14f70 65 29 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59 5f  e) || !EVP_PKEY_
14f80 6b 65 79 67 65 6e 28 63 74 78 2c 20 26 70 6b 65  keygen(ctx, &pke
14f90 79 29 29 20 7b 0a 09 09 45 56 50 5f 50 4b 45 59  y)) {...EVP_PKEY
14fa0 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 09 09 45  _free(pkey);...E
14fb0 56 50 5f 50 4b 45 59 5f 43 54 58 5f 66 72 65 65  VP_PKEY_CTX_free
14fc0 28 63 74 78 29 3b 0a 23 65 6e 64 69 66 0a 09 09  (ctx);.#endif...
14fd0 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
14fe0 74 65 72 70 2c 22 45 72 72 6f 72 20 67 65 6e 65  terp,"Error gene
14ff0 72 61 74 69 6e 67 20 70 72 69 76 61 74 65 20 6b  rating private k
15000 65 79 22 2c 4e 55 4c 4c 29 3b 0a 09 09 72 65 74  ey",NULL);...ret
15010 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
15020 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 69      } else {...i
15030 66 20 28 69 73 53 74 72 29 20 7b 0a 09 09 20 20  f (isStr) {...  
15040 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49    out=BIO_new(BI
15050 4f 5f 73 5f 6d 65 6d 28 29 29 3b 0a 09 09 20 20  O_s_mem());...  
15060 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f    PEM_write_bio_
15070 50 72 69 76 61 74 65 4b 65 79 28 6f 75 74 2c 70  PrivateKey(out,p
15080 6b 65 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c  key,NULL,NULL,0,
15090 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20  NULL,NULL);...  
150a0 20 20 69 3d 42 49 4f 5f 72 65 61 64 28 6f 75 74    i=BIO_read(out
150b0 2c 62 75 66 66 65 72 2c 73 69 7a 65 6f 66 28 62  ,buffer,sizeof(b
150c0 75 66 66 65 72 29 2d 31 29 3b 0a 09 09 20 20 20  uffer)-1);...   
150d0 20 69 3d 28 69 3c 30 29 20 3f 20 30 20 3a 20 69   i=(i<0) ? 0 : i
150e0 3b 0a 09 09 20 20 20 20 62 75 66 66 65 72 5b 69  ;...    buffer[i
150f0 5d 3d 27 5c 30 27 3b 0a 09 09 20 20 20 20 54 63  ]='\0';...    Tc
15100 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c  l_SetVar(interp,
15110 6b 65 79 6f 75 74 2c 62 75 66 66 65 72 2c 30 29  keyout,buffer,0)
15120 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 6c 75 73  ;...    BIO_flus
15130 68 28 6f 75 74 29 3b 0a 09 09 20 20 20 20 42 49  h(out);...    BI
15140 4f 5f 66 72 65 65 28 6f 75 74 29 3b 0a 09 09 7d  O_free(out);...}
15150 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 6f 75   else {...    ou
15160 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f  t=BIO_new(BIO_s_
15170 66 69 6c 65 28 29 29 3b 0a 09 09 20 20 20 20 42  file());...    B
15180 49 4f 5f 77 72 69 74 65 5f 66 69 6c 65 6e 61 6d  IO_write_filenam
15190 65 28 6f 75 74 2c 6b 65 79 6f 75 74 29 3b 0a 09  e(out,keyout);..
151a0 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62  .    PEM_write_b
151b0 69 6f 5f 50 72 69 76 61 74 65 4b 65 79 28 6f 75  io_PrivateKey(ou
151c0 74 2c 70 6b 65 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c  t,pkey,NULL,NULL
151d0 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09  ,0,NULL,NULL);..
151e0 09 20 20 20 20 2f 2a 20 50 45 4d 5f 77 72 69 74  .    /* PEM_writ
151f0 65 5f 62 69 6f 5f 52 53 41 50 72 69 76 61 74 65  e_bio_RSAPrivate
15200 4b 65 79 28 6f 75 74 2c 20 72 73 61 2c 20 4e 55  Key(out, rsa, NU
15210 4c 4c 2c 20 4e 55 4c 4c 2c 20 30 2c 20 4e 55 4c  LL, NULL, 0, NUL
15220 4c 2c 20 4e 55 4c 4c 29 3b 20 2a 2f 0a 09 09 20  L, NULL); */... 
15230 20 20 20 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28     BIO_free_all(
15240 6f 75 74 29 3b 0a 09 20 09 7d 0a 0a 09 09 69 66  out);.. .}....if
15250 20 28 28 63 65 72 74 3d 58 35 30 39 5f 6e 65 77   ((cert=X509_new
15260 28 29 29 3d 3d 4e 55 4c 4c 29 20 7b 0a 09 09 20  ())==NULL) {... 
15270 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74     Tcl_SetResult
15280 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 67  (interp,"Error g
15290 65 6e 65 72 61 74 69 6e 67 20 63 65 72 74 69 66  enerating certif
152a0 69 63 61 74 65 20 72 65 71 75 65 73 74 22 2c 4e  icate request",N
152b0 55 4c 4c 29 3b 0a 09 09 20 20 20 20 45 56 50 5f  ULL);...    EVP_
152c0 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b  PKEY_free(pkey);
152d0 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52  .#if OPENSSL_VER
152e0 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78  SION_NUMBER < 0x
152f0 33 30 30 30 30 30 30 30 4c 0a 09 09 20 20 20 20  30000000L...    
15300 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65  BN_free(bne);.#e
15310 6e 64 69 66 0a 09 09 20 20 20 20 72 65 74 75 72  ndif...    retur
15320 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d  n TCL_ERROR;...}
15330 0a 0a 09 09 58 35 30 39 5f 73 65 74 5f 76 65 72  ....X509_set_ver
15340 73 69 6f 6e 28 63 65 72 74 2c 32 29 3b 0a 09 09  sion(cert,2);...
15350 41 53 4e 31 5f 49 4e 54 45 47 45 52 5f 73 65 74  ASN1_INTEGER_set
15360 28 58 35 30 39 5f 67 65 74 5f 73 65 72 69 61 6c  (X509_get_serial
15370 4e 75 6d 62 65 72 28 63 65 72 74 29 2c 73 65 72  Number(cert),ser
15380 69 61 6c 29 3b 0a 09 09 58 35 30 39 5f 67 6d 74  ial);...X509_gmt
15390 69 6d 65 5f 61 64 6a 28 58 35 30 39 5f 67 65 74  ime_adj(X509_get
153a0 6d 5f 6e 6f 74 42 65 66 6f 72 65 28 63 65 72 74  m_notBefore(cert
153b0 29 2c 30 29 3b 0a 09 09 58 35 30 39 5f 67 6d 74  ),0);...X509_gmt
153c0 69 6d 65 5f 61 64 6a 28 58 35 30 39 5f 67 65 74  ime_adj(X509_get
153d0 6d 5f 6e 6f 74 41 66 74 65 72 28 63 65 72 74 29  m_notAfter(cert)
153e0 2c 28 6c 6f 6e 67 29 36 30 2a 36 30 2a 32 34 2a  ,(long)60*60*24*
153f0 64 61 79 73 29 3b 0a 09 09 58 35 30 39 5f 73 65  days);...X509_se
15400 74 5f 70 75 62 6b 65 79 28 63 65 72 74 2c 70 6b  t_pubkey(cert,pk
15410 65 79 29 3b 0a 0a 09 09 6e 61 6d 65 3d 58 35 30  ey);....name=X50
15420 39 5f 67 65 74 5f 73 75 62 6a 65 63 74 5f 6e 61  9_get_subject_na
15430 6d 65 28 63 65 72 74 29 3b 0a 0a 09 09 58 35 30  me(cert);....X50
15440 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79  9_NAME_add_entry
15450 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 43 22  _by_txt(name,"C"
15460 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20  , MBSTRING_ASC, 
15470 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
15480 63 68 61 72 20 2a 29 20 6b 5f 43 2c 20 2d 31 2c  char *) k_C, -1,
15490 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f   -1, 0);...X509_
154a0 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62  NAME_add_entry_b
154b0 79 5f 74 78 74 28 6e 61 6d 65 2c 22 53 54 22 2c  y_txt(name,"ST",
154c0 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28   MBSTRING_ASC, (
154d0 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
154e0 68 61 72 20 2a 29 20 6b 5f 53 54 2c 20 2d 31 2c  har *) k_ST, -1,
154f0 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f   -1, 0);...X509_
15500 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62  NAME_add_entry_b
15510 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4c 22 2c 20  y_txt(name,"L", 
15520 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63  MBSTRING_ASC, (c
15530 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
15540 61 72 20 2a 29 20 6b 5f 4c 2c 20 2d 31 2c 20 2d  ar *) k_L, -1, -
15550 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41  1, 0);...X509_NA
15560 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f  ME_add_entry_by_
15570 74 78 74 28 6e 61 6d 65 2c 22 4f 22 2c 20 4d 42  txt(name,"O", MB
15580 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e  STRING_ASC, (con
15590 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
155a0 20 2a 29 20 6b 5f 4f 2c 20 2d 31 2c 20 2d 31 2c   *) k_O, -1, -1,
155b0 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45   0);...X509_NAME
155c0 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78  _add_entry_by_tx
155d0 74 28 6e 61 6d 65 2c 22 4f 55 22 2c 20 4d 42 53  t(name,"OU", MBS
155e0 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73  TRING_ASC, (cons
155f0 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
15600 2a 29 20 6b 5f 4f 55 2c 20 2d 31 2c 20 2d 31 2c  *) k_OU, -1, -1,
15610 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45   0);...X509_NAME
15620 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78  _add_entry_by_tx
15630 74 28 6e 61 6d 65 2c 22 43 4e 22 2c 20 4d 42 53  t(name,"CN", MBS
15640 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73  TRING_ASC, (cons
15650 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
15660 2a 29 20 6b 5f 43 4e 2c 20 2d 31 2c 20 2d 31 2c  *) k_CN, -1, -1,
15670 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45   0);...X509_NAME
15680 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78  _add_entry_by_tx
15690 74 28 6e 61 6d 65 2c 22 45 6d 61 69 6c 22 2c 20  t(name,"Email", 
156a0 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63  MBSTRING_ASC, (c
156b0 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
156c0 61 72 20 2a 29 20 6b 5f 45 6d 61 69 6c 2c 20 2d  ar *) k_Email, -
156d0 31 2c 20 2d 31 2c 20 30 29 3b 0a 0a 09 09 58 35  1, -1, 0);....X5
156e0 30 39 5f 73 65 74 5f 73 75 62 6a 65 63 74 5f 6e  09_set_subject_n
156f0 61 6d 65 28 63 65 72 74 2c 6e 61 6d 65 29 3b 0a  ame(cert,name);.
15700 0a 09 09 69 66 20 28 21 58 35 30 39 5f 73 69 67  ...if (!X509_sig
15710 6e 28 63 65 72 74 2c 70 6b 65 79 2c 45 56 50 5f  n(cert,pkey,EVP_
15720 73 68 61 32 35 36 28 29 29 29 20 7b 0a 09 09 20  sha256())) {... 
15730 20 20 20 58 35 30 39 5f 66 72 65 65 28 63 65 72     X509_free(cer
15740 74 29 3b 0a 09 09 20 20 20 20 45 56 50 5f 50 4b  t);...    EVP_PK
15750 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 23  EY_free(pkey);.#
15760 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49  if OPENSSL_VERSI
15770 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30  ON_NUMBER < 0x30
15780 30 30 30 30 30 30 4c 0a 09 09 20 20 20 20 42 4e  000000L...    BN
15790 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64  _free(bne);.#end
157a0 69 66 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74  if...    Tcl_Set
157b0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45  Result(interp,"E
157c0 72 72 6f 72 20 73 69 67 6e 69 6e 67 20 63 65 72  rror signing cer
157d0 74 69 66 69 63 61 74 65 22 2c 4e 55 4c 4c 29 3b  tificate",NULL);
157e0 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  ...    return TC
157f0 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09  L_ERROR;...}....
15800 69 66 20 28 69 73 53 74 72 29 20 7b 0a 09 09 20  if (isStr) {... 
15810 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42     out=BIO_new(B
15820 49 4f 5f 73 5f 6d 65 6d 28 29 29 3b 0a 09 09 20  IO_s_mem());... 
15830 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f     PEM_write_bio
15840 5f 58 35 30 39 28 6f 75 74 2c 63 65 72 74 29 3b  _X509(out,cert);
15850 0a 09 09 20 20 20 20 69 3d 42 49 4f 5f 72 65 61  ...    i=BIO_rea
15860 64 28 6f 75 74 2c 62 75 66 66 65 72 2c 73 69 7a  d(out,buffer,siz
15870 65 6f 66 28 62 75 66 66 65 72 29 2d 31 29 3b 0a  eof(buffer)-1);.
15880 09 09 20 20 20 20 69 3d 28 69 3c 30 29 20 3f 20  ..    i=(i<0) ? 
15890 30 20 3a 20 69 3b 0a 09 09 20 20 20 20 62 75 66  0 : i;...    buf
158a0 66 65 72 5b 69 5d 3d 27 5c 30 27 3b 0a 09 09 20  fer[i]='\0';... 
158b0 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e     Tcl_SetVar(in
158c0 74 65 72 70 2c 70 65 6d 6f 75 74 2c 62 75 66 66  terp,pemout,buff
158d0 65 72 2c 30 29 3b 0a 09 09 20 20 20 20 42 49 4f  er,0);...    BIO
158e0 5f 66 6c 75 73 68 28 6f 75 74 29 3b 0a 09 09 20  _flush(out);... 
158f0 20 20 20 42 49 4f 5f 66 72 65 65 28 6f 75 74 29     BIO_free(out)
15900 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20  ;...} else {... 
15910 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42     out=BIO_new(B
15920 49 4f 5f 73 5f 66 69 6c 65 28 29 29 3b 0a 09 09  IO_s_file());...
15930 20 20 20 20 42 49 4f 5f 77 72 69 74 65 5f 66 69      BIO_write_fi
15940 6c 65 6e 61 6d 65 28 6f 75 74 2c 70 65 6d 6f 75  lename(out,pemou
15950 74 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72  t);...    PEM_wr
15960 69 74 65 5f 62 69 6f 5f 58 35 30 39 28 6f 75 74  ite_bio_X509(out
15970 2c 63 65 72 74 29 3b 0a 09 09 20 20 20 20 42 49  ,cert);...    BI
15980 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f 75 74 29 3b  O_free_all(out);
15990 0a 09 09 7d 0a 0a 09 09 58 35 30 39 5f 66 72 65  ...}....X509_fre
159a0 65 28 63 65 72 74 29 3b 0a 09 09 45 56 50 5f 50  e(cert);...EVP_P
159b0 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a  KEY_free(pkey);.
159c0 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53  #if OPENSSL_VERS
159d0 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33  ION_NUMBER < 0x3
159e0 30 30 30 30 30 30 30 4c 0a 09 09 42 4e 5f 66 72  0000000L...BN_fr
159f0 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a  ee(bne);.#endif.
15a00 09 20 20 20 20 7d 0a 09 7d 0a 09 62 72 65 61 6b  .    }..}..break
15a10 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 09  ;.    default:..
15a20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
15a30 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
15a40 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }.../***********
15a50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 49 6e  *********/./* In
15a60 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20 2a  it             *
15a70 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /./*************
15a80 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d  *******/../*. *-
15a90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15aa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15ab0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15ac0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15ad0 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 46 72 65  --. *. * Tls_Fre
15ae0 65 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20  e --. *. *.This 
15af0 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73  procedure cleans
15b00 20 75 70 20 77 68 65 6e 20 61 20 53 53 4c 20 73   up when a SSL s
15b10 6f 63 6b 65 74 20 62 61 73 65 64 20 63 68 61 6e  ocket based chan
15b20 6e 65 6c 0a 20 2a 09 69 73 20 63 6c 6f 73 65 64  nel. *.is closed
15b30 20 61 6e 64 20 69 74 73 20 72 65 66 65 72 65 6e   and its referen
15b40 63 65 20 63 6f 75 6e 74 20 66 61 6c 6c 73 20 62  ce count falls b
15b50 65 6c 6f 77 20 31 0a 20 2a 0a 20 2a 20 52 65 73  elow 1. *. * Res
15b60 75 6c 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a  ults:. *.none. *
15b70 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
15b80 3a 0a 20 2a 09 46 72 65 65 73 20 61 6c 6c 20 74  :. *.Frees all t
15b90 68 65 20 73 74 61 74 65 0a 20 2a 0a 20 2a 2d 2d  he state. *. *--
15ba0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15bb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15bc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15bd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15be0 2d 0a 20 2a 2f 0a 76 6f 69 64 0a 54 6c 73 5f 46  -. */.void.Tls_F
15bf0 72 65 65 28 74 6c 73 5f 66 72 65 65 5f 74 79 70  ree(tls_free_typ
15c00 65 20 2a 62 6c 6f 63 6b 50 74 72 29 20 7b 0a 20  e *blockPtr) {. 
15c10 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50     State *stateP
15c20 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 62 6c  tr = (State *)bl
15c30 6f 63 6b 50 74 72 3b 0a 0a 20 20 20 20 64 70 72  ockPtr;..    dpr
15c40 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
15c50 0a 20 20 20 20 54 6c 73 5f 43 6c 65 61 6e 28 73  .    Tls_Clean(s
15c60 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 63 6b  tatePtr);.    ck
15c70 66 72 65 65 28 62 6c 6f 63 6b 50 74 72 29 3b 0a  free(blockPtr);.
15c80 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  }.../*. *-------
15c90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15ca0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15cb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15cc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
15cd0 20 2a 20 54 6c 73 5f 43 6c 65 61 6e 20 2d 2d 0a   * Tls_Clean --.
15ce0 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65   *. *.This proce
15cf0 64 75 72 65 20 63 6c 65 61 6e 73 20 75 70 20 77  dure cleans up w
15d00 68 65 6e 20 61 20 53 53 4c 20 73 6f 63 6b 65 74  hen a SSL socket
15d10 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c 0a 20   based channel. 
15d20 2a 09 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 20  *.is closed and 
15d30 69 74 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f  its reference co
15d40 75 6e 74 20 66 61 6c 6c 73 20 62 65 6c 6f 77 20  unt falls below 
15d50 31 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 0a  1.  This should.
15d60 20 2a 09 62 65 20 63 61 6c 6c 65 64 20 73 79 6e   *.be called syn
15d70 63 68 72 6f 6e 6f 75 73 6c 79 20 62 79 20 74 68  chronously by th
15d80 65 20 43 6c 6f 73 65 50 72 6f 63 2c 20 6e 6f 74  e CloseProc, not
15d90 20 69 6e 20 74 68 65 0a 20 2a 09 45 76 65 6e 74   in the. *.Event
15da0 75 61 6c 6c 79 46 72 65 65 20 63 61 6c 6c 62 61  uallyFree callba
15db0 63 6b 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  ck.. *. * Result
15dc0 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a  s:. *.none. *. *
15dd0 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
15de0 2a 09 46 72 65 65 73 20 61 6c 6c 20 74 68 65 20  *.Frees all the 
15df0 73 74 61 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  state. *. *-----
15e00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15e10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15e20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15e30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
15e40 2a 2f 0a 76 6f 69 64 20 54 6c 73 5f 43 6c 65 61  */.void Tls_Clea
15e50 6e 28 53 74 61 74 65 20 2a 73 74 61 74 65 50 74  n(State *statePt
15e60 72 29 20 7b 0a 20 20 20 20 64 70 72 69 6e 74 66  r) {.    dprintf
15e70 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20  ("Called");..   
15e80 20 2f 2a 0a 20 20 20 20 20 2a 20 77 65 27 72 65   /*.     * we're
15e90 20 61 73 73 75 6d 69 6e 67 20 68 65 72 65 20 74   assuming here t
15ea0 68 61 74 20 77 65 27 72 65 20 73 69 6e 67 6c 65  hat we're single
15eb0 2d 74 68 72 65 61 64 65 64 0a 20 20 20 20 20 2a  -threaded.     *
15ec0 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  /.    if (stateP
15ed0 74 72 2d 3e 74 69 6d 65 72 20 21 3d 20 28 54 63  tr->timer != (Tc
15ee0 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55  l_TimerToken) NU
15ef0 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 65 6c 65 74  LL) {..Tcl_Delet
15f00 65 54 69 6d 65 72 48 61 6e 64 6c 65 72 28 73 74  eTimerHandler(st
15f10 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 29 3b 0a  atePtr->timer);.
15f20 09 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72  .statePtr->timer
15f30 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a   = NULL;.    }..
15f40 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 63 61      /* Remove ca
15f50 6c 6c 62 61 63 6b 73 20 2a 2f 0a 20 20 20 20 69  llbacks */.    i
15f60 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c  f (statePtr->cal
15f70 6c 62 61 63 6b 29 20 7b 0a 09 54 63 6c 5f 44 65  lback) {..Tcl_De
15f80 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65  crRefCount(state
15f90 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a  Ptr->callback);.
15fa0 09 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62  .statePtr->callb
15fb0 61 63 6b 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  ack = NULL;.    
15fc0 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  }.    if (stateP
15fd0 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 20 7b 0a  tr->password) {.
15fe0 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e  .Tcl_DecrRefCoun
15ff0 74 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73  t(statePtr->pass
16000 77 6f 72 64 29 3b 0a 09 73 74 61 74 65 50 74 72  word);..statePtr
16010 2d 3e 70 61 73 73 77 6f 72 64 20 3d 20 4e 55 4c  ->password = NUL
16020 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  L;.    }.    if 
16030 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29  (statePtr->vcmd)
16040 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43   {..Tcl_DecrRefC
16050 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 76  ount(statePtr->v
16060 63 6d 64 29 3b 0a 09 73 74 61 74 65 50 74 72 2d  cmd);..statePtr-
16070 3e 76 63 6d 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20  >vcmd = NULL;.  
16080 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 61    }..    if (sta
16090 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 29 20 7b  tePtr->protos) {
160a0 0a 09 63 6b 66 72 65 65 28 73 74 61 74 65 50 74  ..ckfree(statePt
160b0 72 2d 3e 70 72 6f 74 6f 73 29 3b 0a 09 73 74 61  r->protos);..sta
160c0 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 3d 20  tePtr->protos = 
160d0 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  NULL;.    }..   
160e0 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 62   if (statePtr->b
160f0 69 6f 29 20 7b 0a 09 2f 2a 20 54 68 69 73 20 77  io) {../* This w
16100 69 6c 6c 20 63 61 6c 6c 20 53 53 4c 5f 73 68 75  ill call SSL_shu
16110 74 64 6f 77 6e 2e 20 42 75 67 20 31 34 31 34 30  tdown. Bug 14140
16120 34 35 20 2a 2f 0a 09 64 70 72 69 6e 74 66 28 22  45 */..dprintf("
16130 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 25 70 29  BIO_free_all(%p)
16140 22 2c 20 73 74 61 74 65 50 74 72 2d 3e 62 69 6f  ", statePtr->bio
16150 29 3b 0a 09 42 49 4f 5f 66 72 65 65 5f 61 6c 6c  );..BIO_free_all
16160 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b  (statePtr->bio);
16170 0a 09 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 20  ..statePtr->bio 
16180 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20  = NULL;.    }.. 
16190 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
161a0 3e 73 73 6c 29 20 7b 0a 09 64 70 72 69 6e 74 66  >ssl) {..dprintf
161b0 28 22 53 53 4c 5f 66 72 65 65 28 25 70 29 22 2c  ("SSL_free(%p)",
161c0 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b   statePtr->ssl);
161d0 0a 09 53 53 4c 5f 66 72 65 65 28 73 74 61 74 65  ..SSL_free(state
161e0 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 73 74 61 74  Ptr->ssl);..stat
161f0 65 50 74 72 2d 3e 73 73 6c 20 3d 20 4e 55 4c 4c  ePtr->ssl = NULL
16200 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20  ;.    }..    if 
16210 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29 20  (statePtr->ctx) 
16220 7b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28  {..SSL_CTX_free(
16230 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a  statePtr->ctx);.
16240 09 73 74 61 74 65 50 74 72 2d 3e 63 74 78 20 3d  .statePtr->ctx =
16250 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20   NULL;.    }..  
16260 20 20 64 70 72 69 6e 74 66 28 22 52 65 74 75 72    dprintf("Retur
16270 6e 69 6e 67 22 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  ning");.}.../*. 
16280 2a 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 2d 2d  ----------------
162a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
162b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
162c0 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 42 75  -------. *. * Bu
162d0 69 6c 64 20 49 6e 66 6f 20 43 6f 6d 6d 61 6e 64  ild Info Command
162e0 20 2d 2d 0a 20 2a 0a 20 2a 09 43 72 65 61 74 65   --. *. *.Create
162f0 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 72 65 74 75   command to retu
16300 72 6e 20 62 75 69 6c 64 20 69 6e 66 6f 20 66 6f  rn build info fo
16310 72 20 70 61 63 6b 61 67 65 2e 0a 20 2a 0a 20 2a  r package.. *. *
16320 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73   Results:. *.A s
16330 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75  tandard Tcl resu
16340 6c 74 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  lt. *. * Side ef
16350 66 65 63 74 73 3a 0a 20 2a 09 43 72 65 61 74 65  fects:. *.Create
16360 64 20 62 75 69 6c 64 2d 69 6e 66 6f 20 63 6f 6d  d build-info com
16370 6d 61 6e 64 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  mand.. *. *-----
16380 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16390 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
163a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
163b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
163c0 2d 0a 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  -. */..#ifndef S
163d0 54 52 49 4e 47 49 46 59 0a 23 20 20 64 65 66 69  TRINGIFY.#  defi
163e0 6e 65 20 53 54 52 49 4e 47 49 46 59 28 78 29 20  ne STRINGIFY(x) 
163f0 53 54 52 49 4e 47 49 46 59 31 28 78 29 0a 23 20  STRINGIFY1(x).# 
16400 20 64 65 66 69 6e 65 20 53 54 52 49 4e 47 49 46   define STRINGIF
16410 59 31 28 78 29 20 23 78 0a 23 65 6e 64 69 66 0a  Y1(x) #x.#endif.
16420 0a 69 6e 74 0a 42 75 69 6c 64 49 6e 66 6f 43 6f  .int.BuildInfoCo
16430 6d 6d 61 6e 64 28 54 63 6c 5f 49 6e 74 65 72 70  mmand(Tcl_Interp
16440 2a 20 69 6e 74 65 72 70 29 20 7b 0a 20 20 20 20  * interp) {.    
16450 54 63 6c 5f 43 6d 64 49 6e 66 6f 20 69 6e 66 6f  Tcl_CmdInfo info
16460 3b 0a 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47  ;..    if (Tcl_G
16470 65 74 43 6f 6d 6d 61 6e 64 49 6e 66 6f 28 69 6e  etCommandInfo(in
16480 74 65 72 70 2c 20 22 3a 3a 74 63 6c 3a 3a 62 75  terp, "::tcl::bu
16490 69 6c 64 2d 69 6e 66 6f 22 2c 20 26 69 6e 66 6f  ild-info", &info
164a0 29 29 20 7b 0a 09 54 63 6c 5f 43 72 65 61 74 65  )) {..Tcl_Create
164b0 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
164c0 70 2c 20 22 3a 3a 74 6c 73 3a 3a 62 75 69 6c 64  p, "::tls::build
164d0 2d 69 6e 66 6f 22 2c 20 69 6e 66 6f 2e 6f 62 6a  -info", info.obj
164e0 50 72 6f 63 2c 20 28 76 6f 69 64 20 2a 29 28 0a  Proc, (void *)(.
164f0 09 09 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f  ..PACKAGE_VERSIO
16500 4e 20 22 2b 22 20 53 54 52 49 4e 47 49 46 59 28  N "+" STRINGIFY(
16510 54 4c 53 5f 56 45 52 53 49 4f 4e 5f 55 55 49 44  TLS_VERSION_UUID
16520 29 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  ).#if defined(__
16530 63 6c 61 6e 67 5f 5f 29 20 26 26 20 64 65 66 69  clang__) && defi
16540 6e 65 64 28 5f 5f 63 6c 61 6e 67 5f 6d 61 6a 6f  ned(__clang_majo
16550 72 5f 5f 29 0a 09 09 09 20 20 20 20 22 2e 63 6c  r__)....    ".cl
16560 61 6e 67 2d 22 20 53 54 52 49 4e 47 49 46 59 28  ang-" STRINGIFY(
16570 5f 5f 63 6c 61 6e 67 5f 6d 61 6a 6f 72 5f 5f 29  __clang_major__)
16580 0a 23 69 66 20 5f 5f 63 6c 61 6e 67 5f 6d 69 6e  .#if __clang_min
16590 6f 72 5f 5f 20 3c 20 31 30 0a 09 09 09 20 20 20  or__ < 10....   
165a0 20 22 30 22 0a 23 65 6e 64 69 66 0a 09 09 09 20   "0".#endif.... 
165b0 20 20 20 53 54 52 49 4e 47 49 46 59 28 5f 5f 63     STRINGIFY(__c
165c0 6c 61 6e 67 5f 6d 69 6e 6f 72 5f 5f 29 0a 23 65  lang_minor__).#e
165d0 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64  ndif.#if defined
165e0 28 5f 5f 63 70 6c 75 73 70 6c 75 73 29 20 26 26  (__cplusplus) &&
165f0 20 21 64 65 66 69 6e 65 64 28 5f 5f 4f 42 4a 43   !defined(__OBJC
16600 5f 5f 29 0a 09 09 09 20 20 20 20 22 2e 63 70 6c  __)....    ".cpl
16610 75 73 70 6c 75 73 22 0a 23 65 6e 64 69 66 0a 23  usplus".#endif.#
16620 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 09 09  ifndef NDEBUG...
16630 09 20 20 20 20 22 2e 64 65 62 75 67 22 0a 23 65  .    ".debug".#e
16640 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65  ndif.#if !define
16650 64 28 5f 5f 63 6c 61 6e 67 5f 5f 29 20 26 26 20  d(__clang__) && 
16660 21 64 65 66 69 6e 65 64 28 5f 5f 49 4e 54 45 4c  !defined(__INTEL
16670 5f 43 4f 4d 50 49 4c 45 52 29 20 26 26 20 64 65  _COMPILER) && de
16680 66 69 6e 65 64 28 5f 5f 47 4e 55 43 5f 5f 29 0a  fined(__GNUC__).
16690 09 09 09 20 20 20 20 22 2e 67 63 63 2d 22 20 53  ...    ".gcc-" S
166a0 54 52 49 4e 47 49 46 59 28 5f 5f 47 4e 55 43 5f  TRINGIFY(__GNUC_
166b0 5f 29 0a 23 69 66 20 5f 5f 47 4e 55 43 5f 4d 49  _).#if __GNUC_MI
166c0 4e 4f 52 5f 5f 20 3c 20 31 30 0a 09 09 09 20 20  NOR__ < 10....  
166d0 20 20 22 30 22 0a 23 65 6e 64 69 66 0a 09 09 09    "0".#endif....
166e0 20 20 20 20 53 54 52 49 4e 47 49 46 59 28 5f 5f      STRINGIFY(__
166f0 47 4e 55 43 5f 4d 49 4e 4f 52 5f 5f 29 0a 23 65  GNUC_MINOR__).#e
16700 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 49 4e  ndif.#ifdef __IN
16710 54 45 4c 5f 43 4f 4d 50 49 4c 45 52 0a 09 09 09  TEL_COMPILER....
16720 20 20 20 20 22 2e 69 63 63 2d 22 20 53 54 52 49      ".icc-" STRI
16730 4e 47 49 46 59 28 5f 5f 49 4e 54 45 4c 5f 43 4f  NGIFY(__INTEL_CO
16740 4d 50 49 4c 45 52 29 0a 23 65 6e 64 69 66 0a 23  MPILER).#endif.#
16750 69 66 64 65 66 20 54 43 4c 5f 4d 45 4d 5f 44 45  ifdef TCL_MEM_DE
16760 42 55 47 0a 09 09 09 20 20 20 20 22 2e 6d 65 6d  BUG....    ".mem
16770 64 65 62 75 67 22 0a 23 65 6e 64 69 66 0a 23 69  debug".#endif.#i
16780 66 20 64 65 66 69 6e 65 64 28 5f 4d 53 43 5f 56  f defined(_MSC_V
16790 45 52 29 0a 09 09 09 20 20 20 20 22 2e 6d 73 76  ER)....    ".msv
167a0 63 2d 22 20 53 54 52 49 4e 47 49 46 59 28 5f 4d  c-" STRINGIFY(_M
167b0 53 43 5f 56 45 52 29 0a 23 65 6e 64 69 66 0a 23  SC_VER).#endif.#
167c0 69 66 64 65 66 20 55 53 45 5f 4e 4d 41 4b 45 0a  ifdef USE_NMAKE.
167d0 09 09 09 20 20 20 20 22 2e 6e 6d 61 6b 65 22 0a  ...    ".nmake".
167e0 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 54  #endif.#ifndef T
167f0 43 4c 5f 43 46 47 5f 4f 50 54 49 4d 49 5a 45 44  CL_CFG_OPTIMIZED
16800 0a 09 09 09 20 20 20 20 22 2e 6e 6f 2d 6f 70 74  ....    ".no-opt
16810 69 6d 69 7a 65 22 0a 23 65 6e 64 69 66 0a 23 69  imize".#endif.#i
16820 66 64 65 66 20 5f 5f 4f 42 4a 43 5f 5f 0a 09 09  fdef __OBJC__...
16830 09 20 20 20 20 22 2e 6f 62 6a 65 63 74 69 76 65  .    ".objective
16840 2d 63 22 0a 23 69 66 20 64 65 66 69 6e 65 64 28  -c".#if defined(
16850 5f 5f 63 70 6c 75 73 70 6c 75 73 29 0a 09 09 09  __cplusplus)....
16860 20 20 20 20 22 70 6c 75 73 70 6c 75 73 22 0a 23      "plusplus".#
16870 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 23 69 66  endif.#endif.#if
16880 64 65 66 20 54 43 4c 5f 43 46 47 5f 50 52 4f 46  def TCL_CFG_PROF
16890 49 4c 45 44 0a 09 09 09 20 20 20 20 22 2e 70 72  ILED....    ".pr
168a0 6f 66 69 6c 65 22 0a 23 65 6e 64 69 66 0a 23 69  ofile".#endif.#i
168b0 66 64 65 66 20 50 55 52 49 46 59 0a 09 09 09 20  fdef PURIFY.... 
168c0 20 20 20 22 2e 70 75 72 69 66 79 22 0a 23 65 6e     ".purify".#en
168d0 64 69 66 0a 23 69 66 64 65 66 20 53 54 41 54 49  dif.#ifdef STATI
168e0 43 5f 42 55 49 4c 44 0a 09 09 09 20 20 20 20 22  C_BUILD....    "
168f0 2e 73 74 61 74 69 63 22 0a 23 65 6e 64 69 66 0a  .static".#endif.
16900 09 09 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  ..), NULL);.    
16910 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  }.    return TCL
16920 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  _OK;.}.../*. *--
16930 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16940 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16950 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16960 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 20 54 6c 73 4c  ----*. *. * TlsL
16970 69 62 53 68 75 74 64 6f 77 6e 20 2d 2d 0a 20 2a  ibShutdown --. *
16980 0a 20 2a 09 53 68 75 74 64 6f 77 6e 20 53 53 4c  . *.Shutdown SSL
16990 20 6c 69 62 72 61 72 79 20 6f 6e 63 65 20 70 65   library once pe
169a0 72 20 61 70 70 6c 69 63 61 74 69 6f 6e 0a 20 2a  r application. *
169b0 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
169c0 41 20 73 74 61 6e 64 61 72 64 20 54 43 4c 20 72  A standard TCL r
169d0 65 73 75 6c 74 0a 20 2a 0a 20 2a 20 53 69 64 65  esult. *. * Side
169e0 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 53 68 75   effects:. *.Shu
169f0 74 64 6f 77 6e 20 53 53 4c 20 6c 69 62 72 61 72  tdown SSL librar
16a00 79 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  y. *. *---------
16a10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16a20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16a30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20  -------------*. 
16a40 2a 2f 0a 76 6f 69 64 20 54 6c 73 4c 69 62 53 68  */.void TlsLibSh
16a50 75 74 64 6f 77 6e 28 43 6c 69 65 6e 74 44 61 74  utdown(ClientDat
16a60 61 20 63 6c 69 65 6e 74 44 61 74 61 29 20 7b 0a  a clientData) {.
16a70 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
16a80 6c 65 64 22 29 3b 0a 0a 20 20 20 20 42 49 4f 5f  led");..    BIO_
16a90 63 6c 65 61 6e 75 70 28 29 3b 0a 7d 0a 0a 2f 2a  cleanup();.}../*
16aa0 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
16ab0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16ac0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16ad0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a  ---------*. *. *
16ae0 09 54 6c 73 4c 69 62 49 6e 69 74 20 2d 2d 0a 20  .TlsLibInit --. 
16af0 2a 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a 65 73  *. *.Initializes
16b00 20 53 53 4c 20 6c 69 62 72 61 72 79 20 6f 6e 63   SSL library onc
16b10 65 20 70 65 72 20 61 70 70 6c 69 63 61 74 69 6f  e per applicatio
16b20 6e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  n. *. * Results:
16b30 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54  . *.A standard T
16b40 63 6c 20 72 65 73 75 6c 74 0a 20 2a 0a 20 2a 20  cl result. *. * 
16b50 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
16b60 09 49 6e 69 74 69 61 6c 69 7a 65 73 20 53 53 4c  .Initializes SSL
16b70 20 6c 69 62 72 61 72 79 0a 20 2a 0a 20 2a 2d 2d   library. *. *--
16b80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16b90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16ba0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16bb0 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 73 74 61 74 69 63  ----*. */.static
16bc0 20 69 6e 74 20 54 6c 73 4c 69 62 49 6e 69 74 28   int TlsLibInit(
16bd0 29 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20 69  ) {.    static i
16be0 6e 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d  nt initialized =
16bf0 20 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66   0;..    dprintf
16c00 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20  ("Called");..   
16c10 20 69 66 20 28 21 69 6e 69 74 69 61 6c 69 7a 65   if (!initialize
16c20 64 29 20 7b 0a 09 2f 2a 20 49 6e 69 74 69 61 6c  d) {../* Initial
16c30 69 7a 65 20 42 4f 54 48 20 6c 69 62 63 72 79 70  ize BOTH libcryp
16c40 74 6f 20 61 6e 64 20 6c 69 62 73 73 6c 2e 20 2a  to and libssl. *
16c50 2f 0a 09 69 66 20 28 21 4f 50 45 4e 53 53 4c 5f  /..if (!OPENSSL_
16c60 69 6e 69 74 5f 73 73 6c 28 4f 50 45 4e 53 53 4c  init_ssl(OPENSSL
16c70 5f 49 4e 49 54 5f 4c 4f 41 44 5f 53 53 4c 5f 53  _INIT_LOAD_SSL_S
16c80 54 52 49 4e 47 53 20 7c 20 4f 50 45 4e 53 53 4c  TRINGS | OPENSSL
16c90 5f 49 4e 49 54 5f 4c 4f 41 44 5f 43 52 59 50 54  _INIT_LOAD_CRYPT
16ca0 4f 5f 53 54 52 49 4e 47 53 0a 09 20 20 20 20 7c  O_STRINGS..    |
16cb0 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 41 44   OPENSSL_INIT_AD
16cc0 44 5f 41 4c 4c 5f 43 49 50 48 45 52 53 20 7c 20  D_ALL_CIPHERS | 
16cd0 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 41 44 44  OPENSSL_INIT_ADD
16ce0 5f 41 4c 4c 5f 44 49 47 45 53 54 53 0a 09 20 20  _ALL_DIGESTS..  
16cf0 20 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54    | OPENSSL_INIT
16d00 5f 4c 4f 41 44 5f 43 4f 4e 46 49 47 20 7c 20 4f  _LOAD_CONFIG | O
16d10 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 41 53 59 4e  PENSSL_INIT_ASYN
16d20 43 2c 20 4e 55 4c 4c 29 29 20 7b 0a 09 20 20 20  C, NULL)) {..   
16d30 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
16d40 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 72 65 61 74  R;..}.../* Creat
16d50 65 20 42 49 4f 20 68 61 6e 64 6c 65 72 73 20 2a  e BIO handlers *
16d60 2f 0a 09 42 49 4f 5f 6e 65 77 5f 74 63 6c 28 4e  /..BIO_new_tcl(N
16d70 55 4c 4c 2c 20 30 29 3b 0a 0a 09 2f 2a 20 43 72  ULL, 0);.../* Cr
16d80 65 61 74 65 20 65 78 69 74 20 68 61 6e 64 6c 65  eate exit handle
16d90 72 20 2a 2f 0a 09 54 63 6c 5f 43 72 65 61 74 65  r */..Tcl_Create
16da0 45 78 69 74 48 61 6e 64 6c 65 72 28 54 6c 73 4c  ExitHandler(TlsL
16db0 69 62 53 68 75 74 64 6f 77 6e 2c 20 4e 55 4c 4c  ibShutdown, NULL
16dc0 29 3b 0a 09 69 6e 69 74 69 61 6c 69 7a 65 64 20  );..initialized 
16dd0 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  = 1;.    }.    r
16de0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
16df0 0c 0a 2f 2a 20 49 6e 69 74 20 73 63 72 69 70 74  ../* Init script
16e00 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74   */.static const
16e10 20 63 68 61 72 20 74 6c 73 54 63 6c 49 6e 69 74   char tlsTclInit
16e20 53 63 72 69 70 74 5b 5d 20 3d 20 7b 0a 23 69 6e  Script[] = {.#in
16e30 63 6c 75 64 65 20 22 74 6c 73 2e 74 63 6c 2e 68  clude "tls.tcl.h
16e40 22 0a 7d 3b 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ".};../*. *-----
16e50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16e60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16e70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16e80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
16e90 2a 0a 20 2a 20 54 6c 73 5f 49 6e 69 74 20 2d 2d  *. * Tls_Init --
16ea0 0a 20 2a 0a 20 2a 09 54 68 69 73 20 69 73 20 61  . *. *.This is a
16eb0 20 70 61 63 6b 61 67 65 20 69 6e 69 74 69 61 6c   package initial
16ec0 69 7a 61 74 69 6f 6e 20 70 72 6f 63 65 64 75 72  ization procedur
16ed0 65 2c 20 77 68 69 63 68 20 69 73 20 63 61 6c 6c  e, which is call
16ee0 65 64 0a 20 2a 09 62 79 20 54 43 4c 20 77 68 65  ed. *.by TCL whe
16ef0 6e 20 74 68 69 73 20 70 61 63 6b 61 67 65 20 69  n this package i
16f00 73 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f  s to be added to
16f10 20 61 6e 20 69 6e 74 65 72 70 72 65 74 65 72 2e   an interpreter.
16f20 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
16f30 20 2a 09 49 6e 69 74 69 61 6c 69 7a 65 73 20 73   *.Initializes s
16f40 74 72 75 63 74 75 72 65 73 20 61 6e 64 20 63 72  tructures and cr
16f50 65 61 74 65 73 20 63 6f 6d 6d 61 6e 64 73 2e 0a  eates commands..
16f60 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
16f70 74 73 3a 0a 20 2a 09 20 43 72 65 61 74 65 20 74  ts:. *. Create t
16f80 68 65 20 63 6f 6d 6d 61 6e 64 73 0a 20 2a 0a 20  he commands. *. 
16f90 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
16fa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16fb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16fc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16fd0 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 23 69 66 20 54 43  ----. */..#if TC
16fe0 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20  L_MAJOR_VERSION 
16ff0 3e 20 38 0a 23 64 65 66 69 6e 65 20 4d 49 4e 5f  > 8.#define MIN_
17000 56 45 52 53 49 4f 4e 20 22 39 2e 30 22 0a 23 65  VERSION "9.0".#e
17010 6c 73 65 0a 23 64 65 66 69 6e 65 20 4d 49 4e 5f  lse.#define MIN_
17020 56 45 52 53 49 4f 4e 20 22 38 2e 35 22 0a 23 65  VERSION "8.5".#e
17030 6e 64 69 66 0a 0a 44 4c 4c 45 58 50 4f 52 54 20  ndif..DLLEXPORT 
17040 69 6e 74 20 54 6c 73 5f 49 6e 69 74 28 54 63 6c  int Tls_Init(Tcl
17050 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29  _Interp *interp)
17060 20 7b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28   {..    dprintf(
17070 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 64  "Called");..#ifd
17080 65 66 20 55 53 45 5f 54 43 4c 5f 53 54 55 42 53  ef USE_TCL_STUBS
17090 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 49 6e 69  .    if (Tcl_Ini
170a0 74 53 74 75 62 73 28 69 6e 74 65 72 70 2c 20 4d  tStubs(interp, M
170b0 49 4e 5f 56 45 52 53 49 4f 4e 2c 20 30 29 20 3d  IN_VERSION, 0) =
170c0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  = NULL) {..retur
170d0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
170e0 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 20   }.#else.    if 
170f0 28 54 63 6c 5f 50 6b 67 52 65 71 75 69 72 65 45  (Tcl_PkgRequireE
17100 78 28 69 6e 74 65 72 70 2c 20 22 54 63 6c 22 2c  x(interp, "Tcl",
17110 20 4d 49 4e 5f 56 45 52 53 49 4f 4e 2c 20 30 2c   MIN_VERSION, 0,
17120 20 4e 55 4c 4c 29 20 3d 3d 20 4e 55 4c 4c 29 20   NULL) == NULL) 
17130 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  {..return TCL_ER
17140 52 4f 52 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ROR;.    }.#endi
17150 66 0a 0a 20 20 20 20 69 66 20 28 54 6c 73 4c 69  f..    if (TlsLi
17160 62 49 6e 69 74 28 29 20 21 3d 20 54 43 4c 5f 4f  bInit() != TCL_O
17170 4b 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  K) {..Tcl_Append
17180 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
17190 63 6f 75 6c 64 20 6e 6f 74 20 69 6e 69 74 69 61  could not initia
171a0 6c 69 7a 65 20 53 53 4c 20 6c 69 62 72 61 72 79  lize SSL library
171b0 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
171c0 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  );..return TCL_E
171d0 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
171e0 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
171f0 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a  mmand(interp, ":
17200 3a 74 6c 73 3a 3a 63 69 70 68 65 72 73 22 2c 20  :tls::ciphers", 
17210 43 69 70 68 65 72 73 4f 62 6a 43 6d 64 2c 20 28  CiphersObjCmd, (
17220 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c  ClientData) NULL
17230 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65  , (Tcl_CmdDelete
17240 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20  Proc *) NULL);. 
17250 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a     Tcl_CreateObj
17260 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
17270 22 3a 3a 74 6c 73 3a 3a 63 6f 6e 6e 65 63 74 69  "::tls::connecti
17280 6f 6e 22 2c 20 43 6f 6e 6e 65 63 74 69 6f 6e 49  on", ConnectionI
17290 6e 66 6f 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65  nfoObjCmd, (Clie
172a0 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54  ntData) NULL, (T
172b0 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63  cl_CmdDeleteProc
172c0 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54   *) NULL);.    T
172d0 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
172e0 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74  and(interp, "::t
172f0 6c 73 3a 3a 68 61 6e 64 73 68 61 6b 65 22 2c 20  ls::handshake", 
17300 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64 2c  HandshakeObjCmd,
17310 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55   (ClientData) NU
17320 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65  LL, (Tcl_CmdDele
17330 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b  teProc *) NULL);
17340 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f  .    Tcl_CreateO
17350 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  bjCommand(interp
17360 2c 20 22 3a 3a 74 6c 73 3a 3a 69 6d 70 6f 72 74  , "::tls::import
17370 22 2c 20 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c  ", ImportObjCmd,
17380 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55   (ClientData) NU
17390 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65  LL, (Tcl_CmdDele
173a0 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b  teProc *) NULL);
173b0 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f  .    Tcl_CreateO
173c0 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  bjCommand(interp
173d0 2c 20 22 3a 3a 74 6c 73 3a 3a 75 6e 69 6d 70 6f  , "::tls::unimpo
173e0 72 74 22 2c 20 55 6e 69 6d 70 6f 72 74 4f 62 6a  rt", UnimportObj
173f0 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61  Cmd, (ClientData
17400 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64  ) NULL, (Tcl_Cmd
17410 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55  DeleteProc *) NU
17420 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65  LL);.    Tcl_Cre
17430 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e  ateObjCommand(in
17440 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 75 6e  terp, "::tls::un
17450 73 74 61 63 6b 22 2c 20 55 6e 69 6d 70 6f 72 74  stack", Unimport
17460 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44  ObjCmd, (ClientD
17470 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f  ata) NULL, (Tcl_
17480 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29  CmdDeleteProc *)
17490 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f   NULL);.    Tcl_
174a0 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64  CreateObjCommand
174b0 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a  (interp, "::tls:
174c0 3a 73 74 61 74 75 73 22 2c 20 53 74 61 74 75 73  :status", Status
174d0 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44  ObjCmd, (ClientD
174e0 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f  ata) NULL, (Tcl_
174f0 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29  CmdDeleteProc *)
17500 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f   NULL);.    Tcl_
17510 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64  CreateObjCommand
17520 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a  (interp, "::tls:
17530 3a 76 65 72 73 69 6f 6e 22 2c 20 56 65 72 73 69  :version", Versi
17540 6f 6e 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e  onObjCmd, (Clien
17550 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63  tData) NULL, (Tc
17560 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20  l_CmdDeleteProc 
17570 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63  *) NULL);.    Tc
17580 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61  l_CreateObjComma
17590 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c  nd(interp, "::tl
175a0 73 3a 3a 6d 69 73 63 22 2c 20 4d 69 73 63 4f 62  s::misc", MiscOb
175b0 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74  jCmd, (ClientDat
175c0 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d  a) NULL, (Tcl_Cm
175d0 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e  dDeleteProc *) N
175e0 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72  ULL);.    Tcl_Cr
175f0 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
17600 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 70  nterp, "::tls::p
17610 72 6f 74 6f 63 6f 6c 73 22 2c 20 50 72 6f 74 6f  rotocols", Proto
17620 63 6f 6c 73 4f 62 6a 43 6d 64 2c 20 28 43 6c 69  colsObjCmd, (Cli
17630 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28  entData) NULL, (
17640 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f  Tcl_CmdDeletePro
17650 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20  c *) NULL);..   
17660 20 42 75 69 6c 64 49 6e 66 6f 43 6f 6d 6d 61 6e   BuildInfoComman
17670 64 28 69 6e 74 65 72 70 29 3b 0a 0a 20 20 20 20  d(interp);..    
17680 69 66 20 28 69 6e 74 65 72 70 20 26 26 20 54 63  if (interp && Tc
17690 6c 5f 45 76 61 6c 28 69 6e 74 65 72 70 2c 20 74  l_Eval(interp, t
176a0 6c 73 54 63 6c 49 6e 69 74 53 63 72 69 70 74 29  lsTclInitScript)
176b0 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72   != TCL_OK) {..r
176c0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
176d0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 75  .    }..    retu
176e0 72 6e 20 54 63 6c 5f 50 6b 67 50 72 6f 76 69 64  rn Tcl_PkgProvid
176f0 65 28 69 6e 74 65 72 70 2c 20 50 41 43 4b 41 47  e(interp, PACKAG
17700 45 5f 4e 41 4d 45 2c 20 50 41 43 4b 41 47 45 5f  E_NAME, PACKAGE_
17710 56 45 52 53 49 4f 4e 29 3b 0a 7d 0a 0a 2f 2a 0a  VERSION);.}../*.
17720 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
17730 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17740 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17750 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17760 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 09 54 6c 73 5f  -----. *. *.Tls_
17770 53 61 66 65 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20  SafeInit --. *. 
17780 2a 09 54 68 69 73 20 69 73 20 61 20 70 61 63 6b  *.This is a pack
17790 61 67 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  age initializati
177a0 6f 6e 20 70 72 6f 63 65 64 75 72 65 20 66 6f 72  on procedure for
177b0 20 73 61 66 65 20 69 6e 74 65 72 70 73 2e 0a 20   safe interps.. 
177c0 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
177d0 09 53 61 6d 65 20 61 73 20 6f 66 20 27 54 6c 73  .Same as of 'Tls
177e0 5f 49 6e 69 74 27 0a 20 2a 0a 20 2a 20 53 69 64  _Init'. *. * Sid
177f0 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 53 61  e effects:. *.Sa
17800 6d 65 20 61 73 20 6f 66 20 27 54 6c 73 5f 49 6e  me as of 'Tls_In
17810 69 74 27 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  it'. *. *-------
17820 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17830 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17840 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17850 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
17860 0a 44 4c 4c 45 58 50 4f 52 54 20 69 6e 74 20 54  .DLLEXPORT int T
17870 6c 73 5f 53 61 66 65 49 6e 69 74 28 54 63 6c 5f  ls_SafeInit(Tcl_
17880 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 20  Interp *interp) 
17890 7b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  {.    dprintf("C
178a0 61 6c 6c 65 64 22 29 3b 0a 20 20 20 20 72 65 74  alled");.    ret
178b0 75 72 6e 20 54 6c 73 5f 49 6e 69 74 28 69 6e 74  urn Tls_Init(int
178c0 65 72 70 29 3b 0a 7d 0a                          erp);.}.