Hex Artifact Content

Artifact 25bb520bd78e409b073b934c739324cd4911a77dcfb288e5abac25dfd0e81ed8:


0000: 2f 2a 0a 20 2a 20 43 6f 70 79 72 69 67 68 74 20  /*. * Copyright 
0010: 28 43 29 20 31 39 39 37 2d 31 39 39 39 20 4d 61  (C) 1997-1999 Ma
0020: 74 74 20 4e 65 77 6d 61 6e 20 3c 6d 61 74 74 40  tt Newman <matt@
0030: 6e 6f 76 61 64 69 67 6d 2e 63 6f 6d 3e 0a 20 2a  novadigm.com>. *
0040: 20 73 6f 6d 65 20 6d 6f 64 69 66 69 63 61 74 69   some modificati
0050: 6f 6e 73 3a 0a 20 2a 09 43 6f 70 79 72 69 67 68  ons:. *.Copyrigh
0060: 74 20 28 43 29 20 32 30 30 30 20 41 6a 75 62 61  t (C) 2000 Ajuba
0070: 20 53 6f 6c 75 74 69 6f 6e 73 0a 20 2a 09 43 6f   Solutions. *.Co
0080: 70 79 72 69 67 68 74 20 28 43 29 20 32 30 30 32  pyright (C) 2002
0090: 20 41 63 74 69 76 65 53 74 61 74 65 20 43 6f 72   ActiveState Cor
00a0: 70 6f 72 61 74 69 6f 6e 0a 20 2a 09 43 6f 70 79  poration. *.Copy
00b0: 72 69 67 68 74 20 28 43 29 20 32 30 30 34 20 53  right (C) 2004 S
00c0: 74 61 72 66 69 73 68 20 53 79 73 74 65 6d 73 0a  tarfish Systems.
00d0: 20 2a 09 43 6f 70 79 72 69 67 68 74 20 28 43 29   *.Copyright (C)
00e0: 20 32 30 32 33 20 42 72 69 61 6e 20 4f 27 48 61   2023 Brian O'Ha
00f0: 67 61 6e 0a 20 2a 0a 20 2a 20 54 4c 53 20 28 61  gan. *. * TLS (a
0100: 6b 61 20 53 53 4c 29 20 43 68 61 6e 6e 65 6c 20  ka SSL) Channel 
0110: 2d 20 63 61 6e 20 62 65 20 6c 61 79 65 72 65 64  - can be layered
0120: 20 6f 6e 20 61 6e 79 20 62 69 2d 64 69 72 65 63   on any bi-direc
0130: 74 69 6f 6e 61 6c 0a 20 2a 20 54 63 6c 5f 43 68  tional. * Tcl_Ch
0140: 61 6e 6e 65 6c 20 28 4e 6f 74 65 3a 20 52 65 71  annel (Note: Req
0150: 75 69 72 65 73 20 54 72 66 20 43 6f 72 65 20 50  uires Trf Core P
0160: 61 74 63 68 29 0a 20 2a 0a 20 2a 20 54 68 69 73  atch). *. * This
0170: 20 77 61 73 20 62 75 69 6c 74 20 28 61 6c 6d 6f   was built (almo
0180: 73 74 29 20 66 72 6f 6d 20 73 63 72 61 74 63 68  st) from scratch
0190: 20 62 61 73 65 64 20 75 70 6f 6e 20 6f 62 73 65   based upon obse
01a0: 72 76 61 74 69 6f 6e 20 6f 66 0a 20 2a 20 4f 70  rvation of. * Op
01b0: 65 6e 53 53 4c 20 30 2e 39 2e 32 42 0a 20 2a 0a  enSSL 0.9.2B. *.
01c0: 20 2a 20 41 64 64 69 74 69 6f 6e 20 63 72 65 64   * Addition cred
01d0: 69 74 20 69 73 20 64 75 65 20 66 6f 72 20 41 6e  it is due for An
01e0: 64 72 65 61 73 20 4b 75 70 72 69 65 73 20 28 61  dreas Kupries (a
01f0: 2e 6b 75 70 72 69 65 73 40 77 65 73 74 65 6e 64  .kupries@westend
0200: 2e 63 6f 6d 29 2c 20 66 6f 72 0a 20 2a 20 70 72  .com), for. * pr
0210: 6f 76 69 64 69 6e 67 20 74 68 65 20 54 63 6c 5f  oviding the Tcl_
0220: 52 65 70 6c 61 63 65 43 68 61 6e 6e 65 6c 20 6d  ReplaceChannel m
0230: 65 63 68 61 6e 69 73 6d 20 61 6e 64 20 77 6f 72  echanism and wor
0240: 6b 69 6e 67 20 63 6c 6f 73 65 6c 79 20 77 69 74  king closely wit
0250: 68 20 6d 65 0a 20 2a 20 74 6f 20 65 6e 68 61 6e  h me. * to enhan
0260: 63 65 20 69 74 20 74 6f 20 73 75 70 70 6f 72 74  ce it to support
0270: 20 66 75 6c 6c 20 66 69 6c 65 65 76 65 6e 74 20   full fileevent 
0280: 73 65 6d 61 6e 74 69 63 73 2e 0a 20 2a 0a 20 2a  semantics.. *. *
0290: 20 41 6c 73 6f 20 77 6f 72 6b 20 64 6f 6e 65 20   Also work done 
02a0: 62 79 20 74 68 65 20 66 6f 6c 6c 6f 77 20 70 65  by the follow pe
02b0: 6f 70 6c 65 20 70 72 6f 76 69 64 65 64 20 74 68  ople provided th
02c0: 65 20 69 6d 70 65 74 75 73 20 74 6f 20 64 6f 20  e impetus to do 
02d0: 74 68 69 73 20 22 72 69 67 68 74 22 3a 0a 20 2a  this "right":. *
02e0: 09 74 63 6c 53 53 4c 20 28 43 6f 6c 69 6e 20 4d  .tclSSL (Colin M
02f0: 63 43 6f 72 6d 61 63 6b 2c 20 53 68 61 72 65 64  cCormack, Shared
0300: 20 54 65 63 68 6e 6f 6c 6f 67 79 29 0a 20 2a 09   Technology). *.
0310: 53 53 4c 74 63 6c 20 28 50 65 74 65 72 20 41 6e  SSLtcl (Peter An
0320: 74 6d 61 6e 29 0a 20 2a 0a 20 2a 2f 0a 0a 23 69  tman). *. */..#i
0330: 6e 63 6c 75 64 65 20 22 74 6c 73 49 6e 74 2e 68  nclude "tlsInt.h
0340: 22 0a 23 69 6e 63 6c 75 64 65 20 22 74 63 6c 4f  ".#include "tclO
0350: 70 74 73 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  pts.h".#include 
0360: 22 74 6c 73 55 75 69 64 2e 68 22 0a 23 69 6e 63  "tlsUuid.h".#inc
0370: 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a 23  lude <stdio.h>.#
0380: 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e  include <stdlib.
0390: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65  h>.#include <ope
03a0: 6e 73 73 6c 2f 73 73 6c 2e 68 3e 0a 23 69 6e 63  nssl/ssl.h>.#inc
03b0: 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f 63 72  lude <openssl/cr
03c0: 79 70 74 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  ypto.h>.#include
03d0: 20 3c 6f 70 65 6e 73 73 6c 2f 6f 70 65 6e 73 73   <openssl/openss
03e0: 6c 63 6f 6e 66 2e 68 3e 0a 23 69 6e 63 6c 75 64  lconf.h>.#includ
03f0: 65 20 3c 6f 70 65 6e 73 73 6c 2f 72 73 61 2e 68  e <openssl/rsa.h
0400: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65 6e  >.#include <open
0410: 73 73 6c 2f 73 61 66 65 73 74 61 63 6b 2e 68 3e  ssl/safestack.h>
0420: 0a 0a 2f 2a 20 4d 69 6e 20 4f 70 65 6e 53 53 4c  ../* Min OpenSSL
0430: 20 76 65 72 73 69 6f 6e 20 2a 2f 0a 23 69 66 20   version */.#if 
0440: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f  OPENSSL_VERSION_
0450: 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 31  NUMBER < 0x10101
0460: 30 30 30 4c 0a 23 65 72 72 6f 72 20 22 4f 6e 6c  000L.#error "Onl
0470: 79 20 4f 70 65 6e 53 53 4c 20 76 31 2e 31 2e 31  y OpenSSL v1.1.1
0480: 20 6f 72 20 6c 61 74 65 72 20 69 73 20 73 75 70   or later is sup
0490: 70 6f 72 74 65 64 22 0a 23 65 6e 64 69 66 0a 0a  ported".#endif..
04a0: 0a 2f 2a 0a 20 2a 20 46 6f 72 77 61 72 64 20 64  ./*. * Forward d
04b0: 65 63 6c 61 72 61 74 69 6f 6e 73 0a 20 2a 2f 0a  eclarations. */.
04c0: 0a 23 64 65 66 69 6e 65 20 46 32 4e 28 6b 65 79  .#define F2N(key
04d0: 2c 20 64 73 70 29 20 5c 0a 09 28 28 28 6b 65 79  , dsp) \..(((key
04e0: 29 20 3d 3d 20 4e 55 4c 4c 29 20 3f 20 28 63 68  ) == NULL) ? (ch
04f0: 61 72 20 2a 29 20 4e 55 4c 4c 20 3a 20 5c 0a 09  ar *) NULL : \..
0500: 09 54 63 6c 5f 54 72 61 6e 73 6c 61 74 65 46 69  .Tcl_TranslateFi
0510: 6c 65 4e 61 6d 65 28 69 6e 74 65 72 70 2c 20 28  leName(interp, (
0520: 6b 65 79 29 2c 20 28 64 73 70 29 29 29 0a 0a 73  key), (dsp)))..s
0530: 74 61 74 69 63 20 53 53 4c 5f 43 54 58 20 2a 43  tatic SSL_CTX *C
0540: 54 58 5f 49 6e 69 74 28 53 74 61 74 65 20 2a 73  TX_Init(State *s
0550: 74 61 74 65 50 74 72 2c 20 69 6e 74 20 69 73 53  tatePtr, int isS
0560: 65 72 76 65 72 2c 20 69 6e 74 20 70 72 6f 74 6f  erver, int proto
0570: 2c 20 63 68 61 72 20 2a 6b 65 79 2c 0a 09 09 63  , char *key,...c
0580: 68 61 72 20 2a 63 65 72 74 66 69 6c 65 2c 20 75  har *certfile, u
0590: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6b 65  nsigned char *ke
05a0: 79 5f 61 73 6e 31 2c 20 75 6e 73 69 67 6e 65 64  y_asn1, unsigned
05b0: 20 63 68 61 72 20 2a 63 65 72 74 5f 61 73 6e 31   char *cert_asn1
05c0: 2c 0a 09 09 54 63 6c 5f 53 69 7a 65 20 6b 65 79  ,...Tcl_Size key
05d0: 5f 61 73 6e 31 5f 6c 65 6e 2c 20 54 63 6c 5f 53  _asn1_len, Tcl_S
05e0: 69 7a 65 20 63 65 72 74 5f 61 73 6e 31 5f 6c 65  ize cert_asn1_le
05f0: 6e 2c 20 63 68 61 72 20 2a 43 41 70 61 74 68 2c  n, char *CApath,
0600: 20 63 68 61 72 20 2a 43 41 73 74 6f 72 65 2c 0a   char *CAstore,.
0610: 09 09 63 68 61 72 20 2a 43 41 66 69 6c 65 2c 20  ..char *CAfile, 
0620: 63 68 61 72 20 2a 63 69 70 68 65 72 73 2c 20 63  char *ciphers, c
0630: 68 61 72 20 2a 63 69 70 68 65 72 73 75 69 74 65  har *ciphersuite
0640: 73 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 63 68  s, int level, ch
0650: 61 72 20 2a 44 48 70 61 72 61 6d 73 29 3b 0a 0a  ar *DHparams);..
0660: 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54  #define TLS_PROT
0670: 4f 5f 53 53 4c 32 09 09 30 78 30 31 0a 23 64 65  O_SSL2..0x01.#de
0680: 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53  fine TLS_PROTO_S
0690: 53 4c 33 09 09 30 78 30 32 0a 23 64 65 66 69 6e  SL3..0x02.#defin
06a0: 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31  e TLS_PROTO_TLS1
06b0: 09 09 30 78 30 34 0a 23 64 65 66 69 6e 65 20 54  ..0x04.#define T
06c0: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 09  LS_PROTO_TLS1_1.
06d0: 30 78 30 38 0a 23 64 65 66 69 6e 65 20 54 4c 53  0x08.#define TLS
06e0: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 09 30 78  _PROTO_TLS1_2.0x
06f0: 31 30 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50  10.#define TLS_P
0700: 52 4f 54 4f 5f 54 4c 53 31 5f 33 09 30 78 32 30  ROTO_TLS1_3.0x20
0710: 0a 23 64 65 66 69 6e 65 20 45 4e 41 42 4c 45 44  .#define ENABLED
0720: 28 66 6c 61 67 2c 20 6d 61 73 6b 29 09 28 28 28  (flag, mask).(((
0730: 66 6c 61 67 29 20 26 20 28 6d 61 73 6b 29 29 20  flag) & (mask)) 
0740: 3d 3d 20 28 6d 61 73 6b 29 29 0a 0a 23 64 65 66  == (mask))..#def
0750: 69 6e 65 20 53 53 4c 4b 45 59 4c 4f 47 46 49 4c  ine SSLKEYLOGFIL
0760: 45 09 09 22 53 53 4c 4b 45 59 4c 4f 47 46 49 4c  E.."SSLKEYLOGFIL
0770: 45 22 0a 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  E"..../*********
0780: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20  ***********/./* 
0790: 43 61 6c 6c 62 61 63 6b 73 20 20 20 20 20 20 20  Callbacks       
07a0: 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   */./***********
07b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20  *********/../*. 
07c0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
07d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
07e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
07f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0800: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 45 76 61 6c 20  ----. *. * Eval 
0810: 43 61 6c 6c 62 61 63 6b 20 43 6f 6d 6d 61 6e 64  Callback Command
0820: 20 2d 2d 0a 20 2a 0a 20 2a 09 45 76 61 6c 20 63   --. *. *.Eval c
0830: 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20  allback command 
0840: 61 6e 64 20 63 61 74 63 68 20 61 6e 79 20 65 72  and catch any er
0850: 72 6f 72 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  rors. *. * Resul
0860: 74 73 3a 0a 20 2a 09 30 20 3d 20 43 6f 6d 6d 61  ts:. *.0 = Comma
0870: 6e 64 20 72 65 74 75 72 6e 65 64 20 66 61 69 6c  nd returned fail
0880: 20 6f 72 20 65 76 61 6c 20 72 65 74 75 72 6e 65   or eval returne
0890: 64 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 09 31  d TCL_ERROR. *.1
08a0: 20 3d 20 43 6f 6d 6d 61 6e 64 20 72 65 74 75 72   = Command retur
08b0: 6e 65 64 20 73 75 63 63 65 73 73 20 6f 72 20 65  ned success or e
08c0: 76 61 6c 20 72 65 74 75 72 6e 65 64 20 54 43 4c  val returned TCL
08d0: 5f 4f 4b 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  _OK. *. * Side e
08e0: 66 66 65 63 74 73 3a 0a 20 2a 09 45 76 61 6c 75  ffects:. *.Evalu
08f0: 61 74 65 73 20 63 61 6c 6c 62 61 63 6b 20 63 6f  ates callback co
0900: 6d 6d 61 6e 64 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  mmand. *. *-----
0910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
0950: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 45 76  */.static int.Ev
0960: 61 6c 43 61 6c 6c 62 61 63 6b 28 54 63 6c 5f 49  alCallback(Tcl_I
0970: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 53  nterp *interp, S
0980: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 2c 20  tate *statePtr, 
0990: 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 29  Tcl_Obj *cmdPtr)
09a0: 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 2c   {.    int code,
09b0: 20 6f 6b 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70   ok = 0;..    dp
09c0: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
09d0: 0a 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72  ..    Tcl_Preser
09e0: 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20  ve((ClientData) 
09f0: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c  interp);.    Tcl
0a00: 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e  _Preserve((Clien
0a10: 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29  tData) statePtr)
0a20: 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63  ;..    /* Eval c
0a30: 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 73 75 63  allback with suc
0a40: 63 65 73 73 20 66 6f 72 20 6f 6b 20 6f 72 20 72  cess for ok or r
0a50: 65 74 75 72 6e 20 76 61 6c 75 65 20 31 2c 20 66  eturn value 1, f
0a60: 61 69 6c 20 66 6f 72 20 65 72 72 6f 72 20 6f 72  ail for error or
0a70: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 30 20   return value 0 
0a80: 2a 2f 0a 20 20 20 20 54 63 6c 5f 52 65 73 65 74  */.    Tcl_Reset
0a90: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a  Result(interp);.
0aa0: 20 20 20 20 63 6f 64 65 20 3d 20 54 63 6c 5f 45      code = Tcl_E
0ab0: 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c  valObjEx(interp,
0ac0: 20 63 6d 64 50 74 72 2c 20 54 43 4c 5f 45 56 41   cmdPtr, TCL_EVA
0ad0: 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 20 20 64  L_GLOBAL);.    d
0ae0: 70 72 69 6e 74 66 28 22 45 76 61 6c 43 61 6c 6c  printf("EvalCall
0af0: 62 61 63 6b 3a 20 25 64 22 2c 20 63 6f 64 65 29  back: %d", code)
0b00: 3b 0a 20 20 20 20 69 66 20 28 63 6f 64 65 20 3d  ;.    if (code =
0b10: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 2f 2a 20  = TCL_OK) {../* 
0b20: 43 68 65 63 6b 20 72 65 73 75 6c 74 20 66 6f 72  Check result for
0b30: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f   return value */
0b40: 0a 09 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c  ..Tcl_Obj *resul
0b50: 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65  t = Tcl_GetObjRe
0b60: 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 69  sult(interp);..i
0b70: 66 20 28 72 65 73 75 6c 74 20 3d 3d 20 4e 55 4c  f (result == NUL
0b80: 4c 20 7c 7c 20 54 63 6c 5f 47 65 74 49 6e 74 46  L || Tcl_GetIntF
0b90: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 72  romObj(interp, r
0ba0: 65 73 75 6c 74 2c 20 26 6f 6b 29 20 21 3d 20 54  esult, &ok) != T
0bb0: 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 6f 6b  CL_OK) {..    ok
0bc0: 20 3d 20 31 3b 0a 09 7d 0a 09 64 70 72 69 6e 74   = 1;..}..dprint
0bd0: 66 28 22 52 65 73 75 6c 74 3a 20 25 64 22 2c 20  f("Result: %d", 
0be0: 6f 6b 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  ok);.    } else 
0bf0: 7b 0a 09 2f 2a 20 45 72 72 6f 72 20 2d 20 72 65  {../* Error - re
0c00: 6a 65 63 74 20 74 68 65 20 63 65 72 74 69 66 69  ject the certifi
0c10: 63 61 74 65 20 2a 2f 0a 09 64 70 72 69 6e 74 66  cate */..dprintf
0c20: 28 22 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64  ("Tcl_Background
0c30: 45 72 72 6f 72 22 29 3b 0a 23 69 66 20 28 54 43  Error");.#if (TC
0c40: 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20  L_MAJOR_VERSION 
0c50: 3d 3d 20 38 29 20 26 26 20 28 54 43 4c 5f 4d 49  == 8) && (TCL_MI
0c60: 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20 36 29  NOR_VERSION < 6)
0c70: 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64  ..Tcl_Background
0c80: 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a 23  Error(interp);.#
0c90: 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63 6b 67 72  else..Tcl_Backgr
0ca0: 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e 28 69 6e  oundException(in
0cb0: 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a 23 65 6e  terp, code);.#en
0cc0: 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54  dif.    }..    T
0cd0: 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65  cl_Release((Clie
0ce0: 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72  ntData) statePtr
0cf0: 29 3b 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61  );.    Tcl_Relea
0d00: 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20  se((ClientData) 
0d10: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 72 65 74  interp);.    ret
0d20: 75 72 6e 20 6f 6b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  urn ok;.}.../*. 
0d30: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
0d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d70: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 49 6e 66 6f 43  ----. *. * InfoC
0d80: 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a  allback --. *. *
0d90: 09 4d 6f 6e 69 74 6f 72 73 20 53 53 4c 20 63 6f  .Monitors SSL co
0da0: 6e 6e 65 63 74 69 6f 6e 20 70 72 6f 63 65 73 73  nnection process
0db0: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
0dc0: 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69   *.None. *. * Si
0dd0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43  de effects:. *.C
0de0: 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69  alls callback (i
0df0: 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a  f defined). *. *
0e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e40: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76  ---. */.static v
0e50: 6f 69 64 0a 49 6e 66 6f 43 61 6c 6c 62 61 63 6b  oid.InfoCallback
0e60: 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c  (const SSL *ssl,
0e70: 20 69 6e 74 20 77 68 65 72 65 2c 20 69 6e 74 20   int where, int 
0e80: 72 65 74 29 20 7b 0a 20 20 20 20 53 74 61 74 65  ret) {.    State
0e90: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74   *statePtr = (St
0ea0: 61 74 65 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70  ate*)SSL_get_app
0eb0: 5f 64 61 74 61 28 28 53 53 4c 20 2a 29 73 73 6c  _data((SSL *)ssl
0ec0: 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72  );.    Tcl_Inter
0ed0: 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74  p *interp.= stat
0ee0: 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20  ePtr->interp;.  
0ef0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74    Tcl_Obj *cmdPt
0f00: 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  r;.    const cha
0f10: 72 20 2a 6d 61 6a 6f 72 2c 20 2a 6d 69 6e 6f 72  r *major, *minor
0f20: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
0f30: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69  Called");..    i
0f40: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c  f (statePtr->cal
0f50: 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62  lback == (Tcl_Ob
0f60: 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75  j*)NULL) {..retu
0f70: 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  rn;.    }..    i
0f80: 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43  f (where & SSL_C
0f90: 42 5f 48 41 4e 44 53 48 41 4b 45 5f 53 54 41 52  B_HANDSHAKE_STAR
0fa0: 54 29 20 7b 0a 09 6d 61 6a 6f 72 20 3d 20 22 68  T) {..major = "h
0fb0: 61 6e 64 73 68 61 6b 65 22 3b 0a 09 6d 69 6e 6f  andshake";..mino
0fc0: 72 20 3d 20 22 73 74 61 72 74 22 3b 0a 20 20 20  r = "start";.   
0fd0: 20 7d 20 65 6c 73 65 20 69 66 20 28 77 68 65 72   } else if (wher
0fe0: 65 20 26 20 53 53 4c 5f 43 42 5f 48 41 4e 44 53  e & SSL_CB_HANDS
0ff0: 48 41 4b 45 5f 44 4f 4e 45 29 20 7b 0a 09 6d 61  HAKE_DONE) {..ma
1000: 6a 6f 72 20 3d 20 22 68 61 6e 64 73 68 61 6b 65  jor = "handshake
1010: 22 3b 0a 09 6d 69 6e 6f 72 20 3d 20 22 64 6f 6e  ";..minor = "don
1020: 65 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  e";.    } else {
1030: 0a 09 69 66 20 28 77 68 65 72 65 20 26 20 53 53  ..if (where & SS
1040: 4c 5f 43 42 5f 41 4c 45 52 54 29 09 09 6d 61 6a  L_CB_ALERT)..maj
1050: 6f 72 20 3d 20 22 61 6c 65 72 74 22 3b 0a 09 65  or = "alert";..e
1060: 6c 73 65 20 69 66 20 28 77 68 65 72 65 20 26 20  lse if (where & 
1070: 53 53 4c 5f 53 54 5f 43 4f 4e 4e 45 43 54 29 09  SSL_ST_CONNECT).
1080: 6d 61 6a 6f 72 20 3d 20 22 63 6f 6e 6e 65 63 74  major = "connect
1090: 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65  ";..else if (whe
10a0: 72 65 20 26 20 53 53 4c 5f 53 54 5f 41 43 43 45  re & SSL_ST_ACCE
10b0: 50 54 29 09 09 6d 61 6a 6f 72 20 3d 20 22 61 63  PT)..major = "ac
10c0: 63 65 70 74 22 3b 0a 09 65 6c 73 65 09 09 09 09  cept";..else....
10d0: 09 6d 61 6a 6f 72 20 3d 20 22 75 6e 6b 6e 6f 77  .major = "unknow
10e0: 6e 22 3b 0a 0a 09 69 66 20 28 77 68 65 72 65 20  n";...if (where 
10f0: 26 20 53 53 4c 5f 43 42 5f 52 45 41 44 29 09 09  & SSL_CB_READ)..
1100: 6d 69 6e 6f 72 20 3d 20 22 72 65 61 64 22 3b 0a  minor = "read";.
1110: 09 65 6c 73 65 20 69 66 20 28 77 68 65 72 65 20  .else if (where 
1120: 26 20 53 53 4c 5f 43 42 5f 57 52 49 54 45 29 09  & SSL_CB_WRITE).
1130: 09 6d 69 6e 6f 72 20 3d 20 22 77 72 69 74 65 22  .minor = "write"
1140: 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65 72  ;..else if (wher
1150: 65 20 26 20 53 53 4c 5f 43 42 5f 4c 4f 4f 50 29  e & SSL_CB_LOOP)
1160: 09 09 6d 69 6e 6f 72 20 3d 20 22 6c 6f 6f 70 22  ..minor = "loop"
1170: 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65 72  ;..else if (wher
1180: 65 20 26 20 53 53 4c 5f 43 42 5f 45 58 49 54 29  e & SSL_CB_EXIT)
1190: 09 09 6d 69 6e 6f 72 20 3d 20 22 65 78 69 74 22  ..minor = "exit"
11a0: 3b 0a 09 65 6c 73 65 09 09 09 09 09 6d 69 6e 6f  ;..else.....mino
11b0: 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 20  r = "unknown";. 
11c0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65     }..    /* Cre
11d0: 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65  ate command to e
11e0: 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 63 68 61  val with fn, cha
11f0: 6e 2c 20 6d 61 6a 6f 72 2c 20 6d 69 6e 6f 72 2c  n, major, minor,
1200: 20 6d 65 73 73 61 67 65 2c 20 61 6e 64 20 74 79   message, and ty
1210: 70 65 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 63  pe args */.    c
1220: 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c  mdPtr = Tcl_Dupl
1230: 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74  icateObj(statePt
1240: 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 20  r->callback);.  
1250: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
1260: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
1270: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e  p, cmdPtr, Tcl_N
1280: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 69 6e 66  ewStringObj("inf
1290: 6f 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63  o", -1));.    Tc
12a0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
12b0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
12c0: 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f  mdPtr,..    Tcl_
12d0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c  NewStringObj(Tcl
12e0: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28  _GetChannelName(
12f0: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c  statePtr->self),
1300: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c   -1));.    Tcl_L
1310: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
1320: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
1330: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
1340: 67 4f 62 6a 28 6d 61 6a 6f 72 2c 20 2d 31 29 29  gObj(major, -1))
1350: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
1360: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
1370: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54  nterp, cmdPtr, T
1380: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
1390: 6d 69 6e 6f 72 2c 20 2d 31 29 29 3b 0a 0a 20 20  minor, -1));..  
13a0: 20 20 69 66 20 28 77 68 65 72 65 20 26 20 53 53    if (where & SS
13b0: 4c 5f 43 42 5f 41 4c 45 52 54 29 20 7b 0a 09 54  L_CB_ALERT) {..T
13c0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
13d0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
13e0: 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c  cmdPtr,..    Tcl
13f0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53  _NewStringObj(SS
1400: 4c 5f 61 6c 65 72 74 5f 64 65 73 63 5f 73 74 72  L_alert_desc_str
1410: 69 6e 67 5f 6c 6f 6e 67 28 72 65 74 29 2c 20 2d  ing_long(ret), -
1420: 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62  1));..Tcl_ListOb
1430: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
1440: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09  nterp, cmdPtr,..
1450: 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e      Tcl_NewStrin
1460: 67 4f 62 6a 28 53 53 4c 5f 61 6c 65 72 74 5f 74  gObj(SSL_alert_t
1470: 79 70 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28  ype_string_long(
1480: 72 65 74 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20  ret), -1));.    
1490: 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 4c 69  } else {..Tcl_Li
14a0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
14b0: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
14c0: 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53  r,..    Tcl_NewS
14d0: 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 73 74 61  tringObj(SSL_sta
14e0: 74 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 73  te_string_long(s
14f0: 73 6c 29 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f  sl), -1));..Tcl_
1500: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
1510: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
1520: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
1530: 6e 67 4f 62 6a 28 22 69 6e 66 6f 22 2c 20 2d 31  ngObj("info", -1
1540: 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ));.    }..    /
1550: 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20  * Eval callback 
1560: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54  command */.    T
1570: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
1580: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 45 76 61  cmdPtr);.    Eva
1590: 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70  lCallback(interp
15a0: 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50  , statePtr, cmdP
15b0: 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63  tr);.    Tcl_Dec
15c0: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72  rRefCount(cmdPtr
15d0: 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  );.}.../*. *----
15e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
1620: 20 2a 0a 20 2a 20 4d 65 73 73 61 67 65 43 61 6c   *. * MessageCal
1630: 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 4d  lback --. *. *.M
1640: 6f 6e 69 74 6f 72 73 20 53 53 4c 20 70 72 6f 74  onitors SSL prot
1650: 6f 63 6f 6c 20 6d 65 73 73 61 67 65 73 0a 20 2a  ocol messages. *
1660: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
1670: 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20  None. *. * Side 
1680: 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c  effects:. *.Call
1690: 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64  s callback (if d
16a0: 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 2d 2d 2d  efined). *. *---
16b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16f0: 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 50 45  . */.#ifndef OPE
1700: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 5f 54 52 41 43  NSSL_NO_SSL_TRAC
1710: 45 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 4d 65  E.static void.Me
1720: 73 73 61 67 65 43 61 6c 6c 62 61 63 6b 28 69 6e  ssageCallback(in
1730: 74 20 77 72 69 74 65 5f 70 2c 20 69 6e 74 20 76  t write_p, int v
1740: 65 72 73 69 6f 6e 2c 20 69 6e 74 20 63 6f 6e 74  ersion, int cont
1750: 65 6e 74 5f 74 79 70 65 2c 20 63 6f 6e 73 74 20  ent_type, const 
1760: 76 6f 69 64 20 2a 62 75 66 2c 20 73 69 7a 65 5f  void *buf, size_
1770: 74 20 6c 65 6e 2c 20 53 53 4c 20 2a 73 73 6c 2c  t len, SSL *ssl,
1780: 20 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a 20 20   void *arg) {.  
1790: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74    State *statePt
17a0: 72 20 3d 20 28 53 74 61 74 65 2a 29 61 72 67 3b  r = (State*)arg;
17b0: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  .    Tcl_Interp 
17c0: 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50  *interp.= stateP
17d0: 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20  tr->interp;.    
17e0: 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b  Tcl_Obj *cmdPtr;
17f0: 0a 20 20 20 20 63 68 61 72 20 2a 76 65 72 2c 20  .    char *ver, 
1800: 2a 74 79 70 65 3b 0a 20 20 20 20 42 49 4f 20 2a  *type;.    BIO *
1810: 62 69 6f 3b 0a 20 20 20 20 63 68 61 72 20 62 75  bio;.    char bu
1820: 66 66 65 72 5b 31 35 30 30 30 5d 3b 0a 20 20 20  ffer[15000];.   
1830: 20 62 75 66 66 65 72 5b 30 5d 20 3d 20 30 3b 0a   buffer[0] = 0;.
1840: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
1850: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20  lled");..    if 
1860: 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62  (statePtr->callb
1870: 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a  ack == (Tcl_Obj*
1880: 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e  )NULL) {..return
1890: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 77 69  ;.    }..    swi
18a0: 74 63 68 28 76 65 72 73 69 6f 6e 29 20 7b 0a 23  tch(version) {.#
18b0: 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49  if OPENSSL_VERSI
18c0: 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30  ON_NUMBER < 0x10
18d0: 31 30 30 30 30 30 4c 20 26 26 20 21 64 65 66 69  100000L && !defi
18e0: 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20  ned(NO_SSL2) && 
18f0: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
1900: 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20 63 61  _NO_SSL2).    ca
1910: 73 65 20 53 53 4c 32 5f 56 45 52 53 49 4f 4e 3a  se SSL2_VERSION:
1920: 0a 09 76 65 72 20 3d 20 22 53 53 4c 76 32 22 3b  ..ver = "SSLv2";
1930: 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a  ..break;.#endif.
1940: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f  #if !defined(NO_
1950: 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65  SSL3) && !define
1960: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c  d(OPENSSL_NO_SSL
1970: 33 29 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33  3).    case SSL3
1980: 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3d  _VERSION:..ver =
1990: 20 22 53 53 4c 76 33 22 3b 0a 09 62 72 65 61 6b   "SSLv3";..break
19a0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73  ;.#endif.    cas
19b0: 65 20 54 4c 53 31 5f 56 45 52 53 49 4f 4e 3a 0a  e TLS1_VERSION:.
19c0: 09 76 65 72 20 3d 20 22 54 4c 53 76 31 22 3b 0a  .ver = "TLSv1";.
19d0: 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65  .break;.    case
19e0: 20 54 4c 53 31 5f 31 5f 56 45 52 53 49 4f 4e 3a   TLS1_1_VERSION:
19f0: 0a 09 76 65 72 20 3d 20 22 54 4c 53 76 31 2e 31  ..ver = "TLSv1.1
1a00: 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63  ";..break;.    c
1a10: 61 73 65 20 54 4c 53 31 5f 32 5f 56 45 52 53 49  ase TLS1_2_VERSI
1a20: 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 54 4c 53 76  ON:..ver = "TLSv
1a30: 31 2e 32 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20  1.2";..break;.  
1a40: 20 20 63 61 73 65 20 54 4c 53 31 5f 33 5f 56 45    case TLS1_3_VE
1a50: 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 54  RSION:..ver = "T
1a60: 4c 53 76 31 2e 33 22 3b 0a 09 62 72 65 61 6b 3b  LSv1.3";..break;
1a70: 0a 20 20 20 20 63 61 73 65 20 30 3a 0a 09 76 65  .    case 0:..ve
1a80: 72 20 3d 20 22 6e 6f 6e 65 22 3b 0a 09 62 72 65  r = "none";..bre
1a90: 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  ak;.    default:
1aa0: 0a 09 76 65 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e  ..ver = "unknown
1ab0: 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d  ";..break;.    }
1ac0: 0a 0a 20 20 20 20 73 77 69 74 63 68 20 28 63 6f  ..    switch (co
1ad0: 6e 74 65 6e 74 5f 74 79 70 65 29 20 7b 0a 20 20  ntent_type) {.  
1ae0: 20 20 63 61 73 65 20 53 53 4c 33 5f 52 54 5f 48    case SSL3_RT_H
1af0: 45 41 44 45 52 3a 0a 09 74 79 70 65 20 3d 20 22  EADER:..type = "
1b00: 48 65 61 64 65 72 22 3b 0a 09 62 72 65 61 6b 3b  Header";..break;
1b10: 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52  .    case SSL3_R
1b20: 54 5f 49 4e 4e 45 52 5f 43 4f 4e 54 45 4e 54 5f  T_INNER_CONTENT_
1b30: 54 59 50 45 3a 0a 09 74 79 70 65 20 3d 20 22 49  TYPE:..type = "I
1b40: 6e 6e 65 72 20 43 6f 6e 74 65 6e 74 20 54 79 70  nner Content Typ
1b50: 65 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20  e";..break;.    
1b60: 63 61 73 65 20 53 53 4c 33 5f 52 54 5f 43 48 41  case SSL3_RT_CHA
1b70: 4e 47 45 5f 43 49 50 48 45 52 5f 53 50 45 43 3a  NGE_CIPHER_SPEC:
1b80: 0a 09 74 79 70 65 20 3d 20 22 43 68 61 6e 67 65  ..type = "Change
1b90: 20 43 69 70 68 65 72 22 3b 0a 09 62 72 65 61 6b   Cipher";..break
1ba0: 3b 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f  ;.    case SSL3_
1bb0: 52 54 5f 41 4c 45 52 54 3a 0a 09 74 79 70 65 20  RT_ALERT:..type 
1bc0: 3d 20 22 41 6c 65 72 74 22 3b 0a 09 62 72 65 61  = "Alert";..brea
1bd0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33  k;.    case SSL3
1be0: 5f 52 54 5f 48 41 4e 44 53 48 41 4b 45 3a 0a 09  _RT_HANDSHAKE:..
1bf0: 74 79 70 65 20 3d 20 22 48 61 6e 64 73 68 61 6b  type = "Handshak
1c00: 65 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20  e";..break;.    
1c10: 63 61 73 65 20 53 53 4c 33 5f 52 54 5f 41 50 50  case SSL3_RT_APP
1c20: 4c 49 43 41 54 49 4f 4e 5f 44 41 54 41 3a 0a 09  LICATION_DATA:..
1c30: 74 79 70 65 20 3d 20 22 41 70 70 20 44 61 74 61  type = "App Data
1c40: 22 3b 0a 09 62 72 65 61 6b 3b 0a 23 69 66 20 4f  ";..break;.#if O
1c50: 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e  PENSSL_VERSION_N
1c60: 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30  UMBER < 0x300000
1c70: 30 30 4c 0a 20 20 20 20 63 61 73 65 20 44 54 4c  00L.    case DTL
1c80: 53 31 5f 52 54 5f 48 45 41 52 54 42 45 41 54 3a  S1_RT_HEARTBEAT:
1c90: 0a 09 74 79 70 65 20 3d 20 22 48 65 61 72 74 62  ..type = "Heartb
1ca0: 65 61 74 22 3b 0a 09 62 72 65 61 6b 3b 0a 23 65  eat";..break;.#e
1cb0: 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74  ndif.    default
1cc0: 3a 0a 09 74 79 70 65 20 3d 20 22 75 6e 6b 6e 6f  :..type = "unkno
1cd0: 77 6e 22 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  wn";.    }..    
1ce0: 2f 2a 20 4e 65 65 64 73 20 63 6f 6d 70 69 6c 65  /* Needs compile
1cf0: 20 74 69 6d 65 20 6f 70 74 69 6f 6e 20 22 65 6e   time option "en
1d00: 61 62 6c 65 2d 73 73 6c 2d 74 72 61 63 65 22 2e  able-ssl-trace".
1d10: 20 2a 2f 0a 20 20 20 20 69 66 20 28 28 62 69 6f   */.    if ((bio
1d20: 20 3d 20 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73   = BIO_new(BIO_s
1d30: 5f 6d 65 6d 28 29 29 29 20 21 3d 20 4e 55 4c 4c  _mem())) != NULL
1d40: 29 20 7b 0a 09 69 6e 74 20 6e 3b 0a 09 53 53 4c  ) {..int n;..SSL
1d50: 5f 74 72 61 63 65 28 77 72 69 74 65 5f 70 2c 20  _trace(write_p, 
1d60: 76 65 72 73 69 6f 6e 2c 20 63 6f 6e 74 65 6e 74  version, content
1d70: 5f 74 79 70 65 2c 20 62 75 66 2c 20 6c 65 6e 2c  _type, buf, len,
1d80: 20 73 73 6c 2c 20 28 76 6f 69 64 20 2a 29 62 69   ssl, (void *)bi
1d90: 6f 29 3b 0a 09 6e 20 3d 20 42 49 4f 5f 72 65 61  o);..n = BIO_rea
1da0: 64 28 62 69 6f 2c 20 62 75 66 66 65 72 2c 20 42  d(bio, buffer, B
1db0: 49 4f 5f 70 65 6e 64 69 6e 67 28 62 69 6f 29 20  IO_pending(bio) 
1dc0: 3c 20 31 35 30 30 30 20 3f 20 42 49 4f 5f 70 65  < 15000 ? BIO_pe
1dd0: 6e 64 69 6e 67 28 62 69 6f 29 20 3a 20 31 34 39  nding(bio) : 149
1de0: 39 39 29 3b 0a 09 6e 20 3d 20 28 6e 3c 30 29 20  99);..n = (n<0) 
1df0: 3f 20 30 20 3a 20 6e 3b 0a 09 62 75 66 66 65 72  ? 0 : n;..buffer
1e00: 5b 6e 5d 20 3d 20 30 3b 0a 09 28 76 6f 69 64 29  [n] = 0;..(void)
1e10: 42 49 4f 5f 66 6c 75 73 68 28 62 69 6f 29 3b 0a  BIO_flush(bio);.
1e20: 09 42 49 4f 5f 66 72 65 65 28 62 69 6f 29 3b 0a  .BIO_free(bio);.
1e30: 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74     }..    dprint
1e40: 66 28 22 4d 65 73 73 61 67 65 20 64 69 72 65 63  f("Message direc
1e50: 74 69 6f 6e 3d 25 64 2c 20 76 65 72 3d 25 73 2c  tion=%d, ver=%s,
1e60: 20 74 79 70 65 3d 25 73 2c 20 6d 65 73 73 61 67   type=%s, messag
1e70: 65 3d 25 73 22 2c 20 77 72 69 74 65 5f 70 2c 20  e=%s", write_p, 
1e80: 76 65 72 2c 20 74 79 70 65 2c 20 26 62 75 66 66  ver, type, &buff
1e90: 65 72 5b 30 5d 29 3b 0a 0a 20 20 20 20 2f 2a 20  er[0]);..    /* 
1ea0: 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74  Create command t
1eb0: 6f 20 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20  o eval with fn, 
1ec0: 63 68 61 6e 2c 20 64 69 72 65 63 74 69 6f 6e 2c  chan, direction,
1ed0: 20 76 65 72 73 69 6f 6e 2c 20 74 79 70 65 2c 20   version, type, 
1ee0: 61 6e 64 20 6d 65 73 73 61 67 65 20 61 72 67 73  and message args
1ef0: 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d   */.    cmdPtr =
1f00: 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62   Tcl_DuplicateOb
1f10: 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c  j(statePtr->call
1f20: 62 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f 4c  back);.    Tcl_L
1f30: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
1f40: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
1f50: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
1f60: 67 4f 62 6a 28 22 6d 65 73 73 61 67 65 22 2c 20  gObj("message", 
1f70: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  -1));.    Tcl_Li
1f80: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
1f90: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
1fa0: 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53  r,..    Tcl_NewS
1fb0: 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74  tringObj(Tcl_Get
1fc0: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74  ChannelName(stat
1fd0: 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29  ePtr->self), -1)
1fe0: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
1ff0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
2000: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
2010: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
2020: 28 77 72 69 74 65 5f 70 20 3f 20 22 53 65 6e 74  (write_p ? "Sent
2030: 22 20 3a 20 22 52 65 63 65 69 76 65 64 22 2c 20  " : "Received", 
2040: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  -1));.    Tcl_Li
2050: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
2060: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
2070: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
2080: 4f 62 6a 28 76 65 72 2c 20 2d 31 29 29 3b 0a 20  Obj(ver, -1));. 
2090: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
20a0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
20b0: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
20c0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 74 79 70  NewStringObj(typ
20d0: 65 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c  e, -1));.    Tcl
20e0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
20f0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
2100: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  dPtr, Tcl_NewStr
2110: 69 6e 67 4f 62 6a 28 62 75 66 66 65 72 2c 20 2d  ingObj(buffer, -
2120: 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61  1));..    /* Eva
2130: 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61  l callback comma
2140: 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e  nd */.    Tcl_In
2150: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74  crRefCount(cmdPt
2160: 72 29 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c 6c  r);.    EvalCall
2170: 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61  back(interp, sta
2180: 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a  tePtr, cmdPtr);.
2190: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
21a0: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 7d 0a  ount(cmdPtr);.}.
21b0: 23 65 6e 64 69 66 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  #endif.../*. *--
21c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2200: 2d 0a 20 2a 0a 20 2a 20 56 65 72 69 66 79 43 61  -. *. * VerifyCa
2210: 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09  llback --. *. *.
2220: 4d 6f 6e 69 74 6f 72 73 20 53 53 4c 20 63 65 72  Monitors SSL cer
2230: 74 69 66 69 63 61 74 65 20 76 61 6c 69 64 61 74  tificate validat
2240: 69 6f 6e 20 70 72 6f 63 65 73 73 2e 20 55 73 65  ion process. Use
2250: 64 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 65  d to control the
2260: 0a 20 2a 09 62 65 68 61 76 69 6f 72 20 77 68 65  . *.behavior whe
2270: 6e 20 74 68 65 20 53 53 4c 5f 56 45 52 49 46 59  n the SSL_VERIFY
2280: 5f 50 45 45 52 20 66 6c 61 67 20 69 73 20 73 65  _PEER flag is se
2290: 74 2e 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65  t. This is calle
22a0: 64 0a 20 2a 09 77 68 65 6e 65 76 65 72 20 61 20  d. *.whenever a 
22b0: 63 65 72 74 69 66 69 63 61 74 65 20 69 73 20 69  certificate is i
22c0: 6e 73 70 65 63 74 65 64 20 6f 72 20 64 65 63 69  nspected or deci
22d0: 64 65 64 20 69 6e 76 61 6c 69 64 2e 20 43 61 6c  ded invalid. Cal
22e0: 6c 65 64 20 66 6f 72 0a 20 2a 09 65 61 63 68 20  led for. *.each 
22f0: 63 65 72 74 69 66 69 63 61 74 65 20 69 6e 20 74  certificate in t
2300: 68 65 20 63 65 72 74 20 63 68 61 69 6e 2e 0a 20  he cert chain.. 
2310: 2a 0a 20 2a 20 43 68 65 63 6b 73 3a 0a 20 2a 09  *. * Checks:. *.
2320: 54 68 65 20 63 65 72 74 69 66 69 63 61 74 65 20  The certificate 
2330: 63 68 61 69 6e 20 69 73 20 63 68 65 63 6b 65 64  chain is checked
2340: 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 20 74   starting with t
2350: 68 65 20 64 65 65 70 65 73 74 20 6e 65 73 74 69  he deepest nesti
2360: 6e 67 20 6c 65 76 65 6c 0a 20 2a 09 20 20 28 74  ng level. *.  (t
2370: 68 65 20 72 6f 6f 74 20 43 41 20 63 65 72 74 69  he root CA certi
2380: 66 69 63 61 74 65 29 20 61 6e 64 20 77 6f 72 6b  ficate) and work
2390: 65 64 20 75 70 77 61 72 64 20 74 6f 20 74 68 65  ed upward to the
23a0: 20 70 65 65 72 27 73 20 63 65 72 74 69 66 69 63   peer's certific
23b0: 61 74 65 2e 0a 20 2a 09 41 6c 6c 20 73 69 67 6e  ate.. *.All sign
23c0: 61 74 75 72 65 73 20 61 72 65 20 76 61 6c 69 64  atures are valid
23d0: 2c 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 69  , current time i
23e0: 73 20 77 69 74 68 69 6e 20 66 69 72 73 74 20 61  s within first a
23f0: 6e 64 20 6c 61 73 74 20 76 61 6c 69 64 69 74 79  nd last validity
2400: 20 74 69 6d 65 2e 0a 20 2a 09 43 68 65 63 6b 20   time.. *.Check 
2410: 74 68 61 74 20 74 68 65 20 63 65 72 74 69 66 69  that the certifi
2420: 63 61 74 65 20 69 73 20 69 73 73 75 65 64 20 62  cate is issued b
2430: 79 20 74 68 65 20 69 73 73 75 65 72 20 63 65 72  y the issuer cer
2440: 74 69 66 69 63 61 74 65 20 69 73 73 75 65 72 2e  tificate issuer.
2450: 0a 20 2a 09 43 68 65 63 6b 20 74 68 65 20 72 65  . *.Check the re
2460: 76 6f 63 61 74 69 6f 6e 20 73 74 61 74 75 73 20  vocation status 
2470: 66 6f 72 20 65 61 63 68 20 63 65 72 74 69 66 69  for each certifi
2480: 63 61 74 65 2e 0a 20 2a 09 43 68 65 63 6b 20 74  cate.. *.Check t
2490: 68 65 20 76 61 6c 69 64 69 74 79 20 6f 66 20 74  he validity of t
24a0: 68 65 20 67 69 76 65 6e 20 43 52 4c 20 61 6e 64  he given CRL and
24b0: 20 74 68 65 20 63 65 72 74 20 72 65 76 6f 63 61   the cert revoca
24c0: 74 69 6f 6e 20 73 74 61 74 75 73 2e 0a 20 2a 09  tion status.. *.
24d0: 43 68 65 63 6b 20 74 68 65 20 70 6f 6c 69 63 69  Check the polici
24e0: 65 73 20 6f 66 20 61 6c 6c 20 74 68 65 20 63 65  es of all the ce
24f0: 72 74 69 66 69 63 61 74 65 73 0a 20 2a 0a 20 2a  rtificates. *. *
2500: 20 41 72 67 73 0a 20 2a 09 70 72 65 76 65 72 69   Args. *.preveri
2510: 66 79 5f 6f 6b 20 69 6e 64 69 63 61 74 65 73 20  fy_ok indicates 
2520: 77 68 65 74 68 65 72 20 74 68 65 20 63 65 72 74  whether the cert
2530: 69 66 69 63 61 74 65 20 76 65 72 69 66 69 63 61  ificate verifica
2540: 74 69 6f 6e 20 70 61 73 73 65 64 20 28 31 29 20  tion passed (1) 
2550: 6f 72 20 6e 6f 74 20 28 30 29 0a 20 2a 0a 20 2a  or not (0). *. *
2560: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 63   Results:. *.A c
2570: 61 6c 6c 62 61 63 6b 20 62 6f 75 6e 64 20 74 6f  allback bound to
2580: 20 74 68 65 20 73 6f 63 6b 65 74 20 6d 61 79 20   the socket may 
2590: 72 65 74 75 72 6e 20 6f 6e 65 20 6f 66 3a 0a 20  return one of:. 
25a0: 2a 09 20 20 20 20 30 09 09 09 2d 20 74 68 65 20  *.    0...- the 
25b0: 63 65 72 74 69 66 69 63 61 74 65 20 69 73 20 64  certificate is d
25c0: 65 65 6d 65 64 20 69 6e 76 61 6c 69 64 2c 20 73  eemed invalid, s
25d0: 65 6e 64 20 76 65 72 69 66 69 63 61 74 69 6f 6e  end verification
25e0: 0a 20 2a 09 09 09 09 20 20 66 61 69 6c 75 72 65  . *....  failure
25f0: 20 61 6c 65 72 74 20 74 6f 20 70 65 65 72 2c 20   alert to peer, 
2600: 61 6e 64 20 74 65 72 6d 69 6e 61 74 65 20 68 61  and terminate ha
2610: 6e 64 73 68 61 6b 65 2e 0a 20 2a 09 20 20 20 20  ndshake.. *.    
2620: 31 09 09 09 2d 20 74 68 65 20 63 65 72 74 69 66  1...- the certif
2630: 69 63 61 74 65 20 69 73 20 64 65 65 6d 65 64 20  icate is deemed 
2640: 76 61 6c 69 64 2c 20 63 6f 6e 74 69 6e 75 65 20  valid, continue 
2650: 77 69 74 68 20 68 61 6e 64 73 68 61 6b 65 2e 0a  with handshake..
2660: 20 2a 09 20 20 20 20 65 6d 70 74 79 20 73 74 72   *.    empty str
2670: 69 6e 67 09 2d 20 6e 6f 20 63 68 61 6e 67 65 20  ing.- no change 
2680: 74 6f 20 63 65 72 74 69 66 69 63 61 74 65 20 76  to certificate v
2690: 61 6c 69 64 61 74 69 6f 6e 0a 20 2a 0a 20 2a 20  alidation. *. * 
26a0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
26b0: 09 54 68 65 20 65 72 72 20 66 69 65 6c 64 20 6f  .The err field o
26c0: 66 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20  f the currently 
26d0: 6f 70 65 72 61 74 69 76 65 20 53 74 61 74 65 20  operative State 
26e0: 69 73 20 73 65 74 0a 20 2a 09 20 20 74 6f 20 61  is set. *.  to a
26f0: 20 73 74 72 69 6e 67 20 64 65 73 63 72 69 62 69   string describi
2700: 6e 67 20 74 68 65 20 53 53 4c 20 6e 65 67 6f 74  ng the SSL negot
2710: 69 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 20 72  iation failure r
2720: 65 61 73 6f 6e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  eason. *. *-----
2730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
2770: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 56 65  */.static int.Ve
2780: 72 69 66 79 43 61 6c 6c 62 61 63 6b 28 69 6e 74  rifyCallback(int
2790: 20 6f 6b 2c 20 58 35 30 39 5f 53 54 4f 52 45 5f   ok, X509_STORE_
27a0: 43 54 58 20 2a 63 74 78 29 20 7b 0a 20 20 20 20  CTX *ctx) {.    
27b0: 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b  Tcl_Obj *cmdPtr;
27c0: 0a 20 20 20 20 53 53 4c 20 20 20 2a 73 73 6c 09  .    SSL   *ssl.
27d0: 09 3d 20 28 53 53 4c 2a 29 58 35 30 39 5f 53 54  .= (SSL*)X509_ST
27e0: 4f 52 45 5f 43 54 58 5f 67 65 74 5f 65 78 5f 64  ORE_CTX_get_ex_d
27f0: 61 74 61 28 63 74 78 2c 20 53 53 4c 5f 67 65 74  ata(ctx, SSL_get
2800: 5f 65 78 5f 64 61 74 61 5f 58 35 30 39 5f 53 54  _ex_data_X509_ST
2810: 4f 52 45 5f 43 54 58 5f 69 64 78 28 29 29 3b 0a  ORE_CTX_idx());.
2820: 20 20 20 20 58 35 30 39 20 20 2a 63 65 72 74 09      X509  *cert.
2830: 09 3d 20 58 35 30 39 5f 53 54 4f 52 45 5f 43 54  .= X509_STORE_CT
2840: 58 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 63 65  X_get_current_ce
2850: 72 74 28 63 74 78 29 3b 0a 20 20 20 20 53 74 61  rt(ctx);.    Sta
2860: 74 65 20 2a 73 74 61 74 65 50 74 72 09 3d 20 28  te *statePtr.= (
2870: 53 74 61 74 65 2a 29 53 53 4c 5f 67 65 74 5f 61  State*)SSL_get_a
2880: 70 70 5f 64 61 74 61 28 73 73 6c 29 3b 0a 20 20  pp_data(ssl);.  
2890: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
28a0: 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d  terp.= statePtr-
28b0: 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 69 6e 74  >interp;.    int
28c0: 20 64 65 70 74 68 09 09 3d 20 58 35 30 39 5f 53   depth..= X509_S
28d0: 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f 65 72 72  TORE_CTX_get_err
28e0: 6f 72 5f 64 65 70 74 68 28 63 74 78 29 3b 0a 20  or_depth(ctx);. 
28f0: 20 20 20 69 6e 74 20 65 72 72 09 09 3d 20 58 35     int err..= X5
2900: 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 74  09_STORE_CTX_get
2910: 5f 65 72 72 6f 72 28 63 74 78 29 3b 0a 0a 20 20  _error(ctx);..  
2920: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
2930: 64 22 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66  d");.    dprintf
2940: 28 22 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b  ("VerifyCallback
2950: 3a 20 25 64 22 2c 20 6f 6b 29 3b 0a 0a 20 20 20  : %d", ok);..   
2960: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76   if (statePtr->v
2970: 63 6d 64 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a  cmd == (Tcl_Obj*
2980: 29 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 20 55 73 65  )NULL) {../* Use
2990: 20 6f 6b 20 76 61 6c 75 65 20 69 66 20 76 65 72   ok value if ver
29a0: 69 66 69 63 61 74 69 6f 6e 20 69 73 20 72 65 71  ification is req
29b0: 75 69 72 65 64 20 2a 2f 0a 09 69 66 20 28 73 74  uired */..if (st
29c0: 61 74 65 50 74 72 2d 3e 76 66 6c 61 67 73 20 26  atePtr->vflags &
29d0: 20 53 53 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c   SSL_VERIFY_FAIL
29e0: 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54  _IF_NO_PEER_CERT
29f0: 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  ) {..    return 
2a00: 6f 6b 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20  ok;..} else {.. 
2a10: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 09 7d 0a     return 1;..}.
2a20: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63      } else if (c
2a30: 65 72 74 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 73  ert == NULL || s
2a40: 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72  sl == NULL) {..r
2a50: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a  eturn 0;.    }..
2a60: 20 20 20 20 64 70 72 69 6e 74 66 28 22 56 65 72      dprintf("Ver
2a70: 69 66 79 43 61 6c 6c 62 61 63 6b 3a 20 63 72 65  ifyCallback: cre
2a80: 61 74 65 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d  ate callback com
2a90: 6d 61 6e 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 20  mand");..    /* 
2aa0: 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74  Create command t
2ab0: 6f 20 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20  o eval with fn, 
2ac0: 63 68 61 6e 2c 20 64 65 70 74 68 2c 20 63 65 72  chan, depth, cer
2ad0: 74 20 69 6e 66 6f 20 6c 69 73 74 2c 20 73 74 61  t info list, sta
2ae0: 74 75 73 2c 20 61 6e 64 20 65 72 72 6f 72 20 61  tus, and error a
2af0: 72 67 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74  rgs */.    cmdPt
2b00: 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74  r = Tcl_Duplicat
2b10: 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 76  eObj(statePtr->v
2b20: 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  cmd);.    Tcl_Li
2b30: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
2b40: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
2b50: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
2b60: 4f 62 6a 28 22 76 65 72 69 66 79 22 2c 20 2d 31  Obj("verify", -1
2b70: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
2b80: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
2b90: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
2ba0: 0a 09 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  ..Tcl_NewStringO
2bb0: 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  bj(Tcl_GetChanne
2bc0: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e  lName(statePtr->
2bd0: 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20  self), -1));.   
2be0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
2bf0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
2c00: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
2c10: 77 49 6e 74 4f 62 6a 28 64 65 70 74 68 29 29 3b  wIntObj(depth));
2c20: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
2c30: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
2c40: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 6c  terp, cmdPtr, Tl
2c50: 73 5f 4e 65 77 58 35 30 39 4f 62 6a 28 69 6e 74  s_NewX509Obj(int
2c60: 65 72 70 2c 20 63 65 72 74 2c 20 30 29 29 3b 0a  erp, cert, 0));.
2c70: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
2c80: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
2c90: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c  erp, cmdPtr, Tcl
2ca0: 5f 4e 65 77 49 6e 74 4f 62 6a 28 6f 6b 29 29 3b  _NewIntObj(ok));
2cb0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
2cc0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
2cd0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 54  terp, cmdPtr,..T
2ce0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
2cf0: 28 63 68 61 72 2a 29 58 35 30 39 5f 76 65 72 69  (char*)X509_veri
2d00: 66 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73 74  fy_cert_error_st
2d10: 72 69 6e 67 28 65 72 72 29 2c 20 2d 31 29 29 3b  ring(err), -1));
2d20: 0a 0a 20 20 20 20 2f 2a 20 50 72 65 76 65 6e 74  ..    /* Prevent
2d30: 20 49 2f 4f 20 77 68 69 6c 65 20 63 61 6c 6c 62   I/O while callb
2d40: 61 63 6b 20 69 73 20 69 6e 20 70 72 6f 67 72 65  ack is in progre
2d50: 73 73 20 2a 2f 0a 20 20 20 20 2f 2a 20 73 74 61  ss */.    /* sta
2d60: 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20  tePtr->flags |= 
2d70: 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42 41 43 4b  TLS_TCL_CALLBACK
2d80: 3b 20 2a 2f 0a 0a 20 20 20 20 64 70 72 69 6e 74  ; */..    dprint
2d90: 66 28 22 56 65 72 69 66 79 43 61 6c 6c 62 61 63  f("VerifyCallbac
2da0: 6b 3a 20 65 76 61 6c 20 63 61 6c 6c 62 61 63 6b  k: eval callback
2db0: 22 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c  ");..    /* Eval
2dc0: 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e   callback comman
2dd0: 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63  d */.    Tcl_Inc
2de0: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72  rRefCount(cmdPtr
2df0: 29 3b 0a 20 20 20 20 6f 6b 20 3d 20 45 76 61 6c  );.    ok = Eval
2e00: 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c  Callback(interp,
2e10: 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74   statePtr, cmdPt
2e20: 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72  r);.    Tcl_Decr
2e30: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29  RefCount(cmdPtr)
2e40: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
2e50: 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b 3a 20  VerifyCallback: 
2e60: 63 6f 6d 6d 61 6e 64 20 72 65 73 75 6c 74 20 3d  command result =
2e70: 20 25 64 22 2c 20 6f 6b 29 3b 0a 0a 20 20 20 20   %d", ok);..    
2e80: 2f 2a 20 73 74 61 74 65 50 74 72 2d 3e 66 6c 61  /* statePtr->fla
2e90: 67 73 20 26 3d 20 7e 28 54 4c 53 5f 54 43 4c 5f  gs &= ~(TLS_TCL_
2ea0: 43 41 4c 4c 42 41 43 4b 29 3b 20 2a 2f 0a 20 20  CALLBACK); */.  
2eb0: 20 20 72 65 74 75 72 6e 20 6f 6b 3b 09 2f 2a 20    return ok;./* 
2ec0: 42 79 20 64 65 66 61 75 6c 74 2c 20 6c 65 61 76  By default, leav
2ed0: 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 75  e verification u
2ee0: 6e 63 68 61 6e 67 65 64 2e 20 2a 2f 0a 7d 0a 0c  nchanged. */.}..
2ef0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
2f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
2f40: 54 6c 73 5f 45 72 72 6f 72 20 2d 2d 0a 20 2a 0a  Tls_Error --. *.
2f50: 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63   *.Calls callbac
2f60: 6b 20 77 69 74 68 20 65 72 72 6f 72 20 6d 65 73  k with error mes
2f70: 73 61 67 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65  sage.. *. * Side
2f80: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 54 68 65   effects:. *.The
2f90: 20 65 72 72 20 66 69 65 6c 64 20 6f 66 20 74 68   err field of th
2fa0: 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 72  e currently oper
2fb0: 61 74 69 76 65 20 53 74 61 74 65 20 69 73 20 73  ative State is s
2fc0: 65 74 0a 20 2a 09 20 20 74 6f 20 61 20 73 74 72  et. *.  to a str
2fd0: 69 6e 67 20 64 65 73 63 72 69 62 69 6e 67 20 74  ing describing t
2fe0: 68 65 20 53 53 4c 20 6e 65 67 6f 74 69 61 74 69  he SSL negotiati
2ff0: 6f 6e 20 66 61 69 6c 75 72 65 20 72 65 61 73 6f  on failure reaso
3000: 6e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  n. *. *---------
3010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76  ----------. */.v
3050: 6f 69 64 0a 54 6c 73 5f 45 72 72 6f 72 28 53 74  oid.Tls_Error(St
3060: 61 74 65 20 2a 73 74 61 74 65 50 74 72 2c 20 63  ate *statePtr, c
3070: 6f 6e 73 74 20 63 68 61 72 20 2a 6d 73 67 29 20  onst char *msg) 
3080: 7b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70  {.    Tcl_Interp
3090: 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65   *interp.= state
30a0: 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20  Ptr->interp;.   
30b0: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72   Tcl_Obj *cmdPtr
30c0: 2c 20 2a 6c 69 73 74 50 74 72 3b 0a 20 20 20 20  , *listPtr;.    
30d0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 65 72  unsigned long er
30e0: 72 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d  r;.    statePtr-
30f0: 3e 65 72 72 20 3d 20 6d 73 67 3b 0a 0a 20 20 20  >err = msg;..   
3100: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
3110: 20 77 69 74 68 20 6d 65 73 73 61 67 65 20 25 73   with message %s
3120: 22 2c 20 6d 73 67 29 3b 0a 0a 20 20 20 20 69 66  ", msg);..    if
3130: 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c   (statePtr->call
3140: 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a  back == (Tcl_Obj
3150: 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  *)NULL) {..retur
3160: 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70  n;.    }..    dp
3170: 72 69 6e 74 66 28 22 54 6c 73 5f 45 72 72 6f 72  rintf("Tls_Error
3180: 3a 20 63 72 65 61 74 65 20 63 61 6c 6c 62 61 63  : create callbac
3190: 6b 20 63 6f 6d 6d 61 6e 64 22 29 3b 0a 0a 20 20  k command");..  
31a0: 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d    /* Create comm
31b0: 61 6e 64 20 74 6f 20 65 76 61 6c 20 77 69 74 68  and to eval with
31c0: 20 66 6e 2c 20 63 68 61 6e 2c 20 61 6e 64 20 6d   fn, chan, and m
31d0: 65 73 73 61 67 65 20 61 72 67 73 20 2a 2f 0a 20  essage args */. 
31e0: 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f     cmdPtr = Tcl_
31f0: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61  DuplicateObj(sta
3200: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29  tePtr->callback)
3210: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
3220: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
3230: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54  nterp, cmdPtr, T
3240: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
3250: 22 65 72 72 6f 72 22 2c 20 2d 31 29 29 3b 0a 20  "error", -1));. 
3260: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
3270: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
3280: 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20  rp, cmdPtr,..   
3290: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
32a0: 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  j(Tcl_GetChannel
32b0: 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73  Name(statePtr->s
32c0: 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20  elf), -1));.    
32d0: 69 66 20 28 6d 73 67 20 21 3d 20 4e 55 4c 4c 29  if (msg != NULL)
32e0: 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41   {..Tcl_ListObjA
32f0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
3300: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c  erp, cmdPtr, Tcl
3310: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d 73  _NewStringObj(ms
3320: 67 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 7d 20  g, -1));..    } 
3330: 65 6c 73 65 20 69 66 20 28 28 6d 73 67 20 3d 20  else if ((msg = 
3340: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 54 63  Tcl_GetString(Tc
3350: 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_GetObjResult(i
3360: 6e 74 65 72 70 29 29 29 20 21 3d 20 4e 55 4c 4c  nterp))) != NULL
3370: 29 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a  ) {..Tcl_ListObj
3380: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
3390: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
33a0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d  l_NewStringObj(m
33b0: 73 67 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 7d  sg, -1));..    }
33c0: 20 65 6c 73 65 20 7b 0a 09 6c 69 73 74 50 74 72   else {..listPtr
33d0: 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62   = Tcl_NewListOb
33e0: 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 09 77 68 69  j(0, NULL);..whi
33f0: 6c 65 20 28 28 65 72 72 20 3d 20 45 52 52 5f 67  le ((err = ERR_g
3400: 65 74 5f 65 72 72 6f 72 28 29 29 20 21 3d 20 30  et_error()) != 0
3410: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73  ) {..    Tcl_Lis
3420: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
3430: 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 50 74  t(interp, listPt
3440: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
3450: 4f 62 6a 28 45 52 52 5f 72 65 61 73 6f 6e 5f 65  Obj(ERR_reason_e
3460: 72 72 6f 72 5f 73 74 72 69 6e 67 28 65 72 72 29  rror_string(err)
3470: 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 54 63 6c 5f  , -1));..}..Tcl_
3480: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
3490: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
34a0: 50 74 72 2c 20 6c 69 73 74 50 74 72 29 3b 0a 20  Ptr, listPtr);. 
34b0: 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74     }..    dprint
34c0: 66 28 22 54 6c 73 5f 45 72 72 6f 72 3a 20 65 76  f("Tls_Error: ev
34d0: 61 6c 20 63 61 6c 6c 62 61 63 6b 22 29 3b 0a 0a  al callback");..
34e0: 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c      /* Eval call
34f0: 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  back command */.
3500: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
3510: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20  ount(cmdPtr);.  
3520: 20 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69    EvalCallback(i
3530: 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c  nterp, statePtr,
3540: 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63   cmdPtr);.    Tc
3550: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63  l_DecrRefCount(c
3560: 6d 64 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  mdPtr);.}.../*. 
3570: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
3580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35b0: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4b 65 79 4c 6f  ----. *. * KeyLo
35c0: 67 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a  gCallback --. *.
35d0: 20 2a 09 57 72 69 74 65 20 72 65 63 65 69 76 65   *.Write receive
35e0: 64 20 6b 65 79 20 64 61 74 61 20 74 6f 20 6c 6f  d key data to lo
35f0: 67 20 66 69 6c 65 2e 0a 20 2a 0a 20 2a 20 53 69  g file.. *. * Si
3600: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 6e  de effects:. *.n
3610: 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  one. *. *-------
3620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
3660: 0a 76 6f 69 64 20 4b 65 79 4c 6f 67 43 61 6c 6c  .void KeyLogCall
3670: 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a  back(const SSL *
3680: 73 73 6c 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ssl, const char 
3690: 2a 6c 69 6e 65 29 20 7b 0a 20 20 20 20 63 68 61  *line) {.    cha
36a0: 72 20 2a 73 74 72 20 3d 20 67 65 74 65 6e 76 28  r *str = getenv(
36b0: 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 29 3b 0a  SSLKEYLOGFILE);.
36c0: 20 20 20 20 46 49 4c 45 20 2a 66 64 3b 0a 0a 20      FILE *fd;.. 
36d0: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
36e0: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73  ed");..    if (s
36f0: 74 72 29 20 7b 0a 09 66 64 20 3d 20 66 6f 70 65  tr) {..fd = fope
3700: 6e 28 73 74 72 2c 20 22 61 22 29 3b 0a 09 66 70  n(str, "a");..fp
3710: 72 69 6e 74 66 28 66 64 2c 20 22 25 73 5c 6e 22  rintf(fd, "%s\n"
3720: 2c 6c 69 6e 65 29 3b 0a 09 66 63 6c 6f 73 65 28  ,line);..fclose(
3730: 66 64 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0c 0a 2f  fd);.    }.}.../
3740: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
3750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3780: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 50 61  -------. *. * Pa
3790: 73 73 77 6f 72 64 20 43 61 6c 6c 62 61 63 6b 20  ssword Callback 
37a0: 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20  --. *. *.Called 
37b0: 77 68 65 6e 20 61 20 70 61 73 73 77 6f 72 64 20  when a password 
37c0: 69 73 20 6e 65 65 64 65 64 20 66 6f 72 20 61 20  is needed for a 
37d0: 70 72 69 76 61 74 65 20 6b 65 79 20 77 68 65 6e  private key when
37e0: 20 6c 6f 61 64 69 6e 67 0a 20 2a 09 6f 72 20 73   loading. *.or s
37f0: 74 6f 72 69 6e 67 20 61 20 50 45 4d 20 63 65 72  toring a PEM cer
3800: 74 69 66 69 63 61 74 65 20 77 69 74 68 20 65 6e  tificate with en
3810: 63 72 79 70 74 69 6f 6e 2e 20 45 76 61 6c 73 20  cryption. Evals 
3820: 63 61 6c 6c 62 61 63 6b 0a 20 2a 09 73 63 72 69  callback. *.scri
3830: 70 74 20 61 6e 64 20 72 65 74 75 72 6e 73 20 74  pt and returns t
3840: 68 65 20 72 65 73 75 6c 74 20 61 73 20 74 68 65  he result as the
3850: 20 70 61 73 73 77 6f 72 64 20 73 74 72 69 6e 67   password string
3860: 20 69 6e 20 62 75 66 2e 0a 20 2a 0a 20 2a 20 52   in buf.. *. * R
3870: 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a  esults:. *.None.
3880: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
3890: 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c  ts:. *.Calls cal
38a0: 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65  lback (if define
38b0: 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73  d). *. * Returns
38c0: 3a 0a 20 2a 09 50 61 73 73 77 6f 72 64 20 73 69  :. *.Password si
38d0: 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 72 20 2d  ze in bytes or -
38e0: 31 20 66 6f 72 20 61 6e 20 65 72 72 6f 72 2e 0a  1 for an error..
38f0: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
3900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3930: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61  --------. */.sta
3940: 74 69 63 20 69 6e 74 0a 50 61 73 73 77 6f 72 64  tic int.Password
3950: 43 61 6c 6c 62 61 63 6b 28 63 68 61 72 20 2a 62  Callback(char *b
3960: 75 66 2c 20 69 6e 74 20 73 69 7a 65 2c 20 69 6e  uf, int size, in
3970: 74 20 72 77 66 6c 61 67 2c 20 76 6f 69 64 20 2a  t rwflag, void *
3980: 75 64 61 74 61 29 20 7b 0a 20 20 20 20 53 74 61  udata) {.    Sta
3990: 74 65 20 2a 73 74 61 74 65 50 74 72 09 3d 20 28  te *statePtr.= (
39a0: 53 74 61 74 65 20 2a 29 20 75 64 61 74 61 3b 0a  State *) udata;.
39b0: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a      Tcl_Interp *
39c0: 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 74  interp.= statePt
39d0: 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54  r->interp;.    T
39e0: 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a  cl_Obj *cmdPtr;.
39f0: 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20      int code;.  
3a00: 20 20 54 63 6c 5f 53 69 7a 65 20 6c 65 6e 3b 0a    Tcl_Size len;.
3a10: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
3a20: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 20  lled");..    /* 
3a30: 49 66 20 6e 6f 20 63 61 6c 6c 62 61 63 6b 2c 20  If no callback, 
3a40: 75 73 65 20 64 65 66 61 75 6c 74 20 63 61 6c 6c  use default call
3a50: 62 61 63 6b 20 2a 2f 0a 20 20 20 20 69 66 20 28  back */.    if (
3a60: 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f  statePtr->passwo
3a70: 72 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69  rd == NULL) {..i
3a80: 66 20 28 54 63 6c 5f 45 76 61 6c 45 78 28 69 6e  f (Tcl_EvalEx(in
3a90: 74 65 72 70 2c 20 22 74 6c 73 3a 3a 70 61 73 73  terp, "tls::pass
3aa0: 77 6f 72 64 22 2c 20 2d 31 2c 20 54 43 4c 5f 45  word", -1, TCL_E
3ab0: 56 41 4c 5f 47 4c 4f 42 41 4c 29 20 3d 3d 20 54  VAL_GLOBAL) == T
3ac0: 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 63 68  CL_OK) {..    ch
3ad0: 61 72 20 2a 72 65 74 20 3d 20 28 63 68 61 72 20  ar *ret = (char 
3ae0: 2a 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  *) Tcl_GetString
3af0: 46 72 6f 6d 4f 62 6a 28 54 63 6c 5f 47 65 74 4f  FromObj(Tcl_GetO
3b00: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  bjResult(interp)
3b10: 2c 20 26 6c 65 6e 29 3b 0a 09 20 20 20 20 69 66  , &len);..    if
3b20: 20 28 6c 65 6e 20 3e 20 28 54 63 6c 5f 53 69 7a   (len > (Tcl_Siz
3b30: 65 29 20 73 69 7a 65 2d 31 29 20 7b 0a 09 09 6c  e) size-1) {...l
3b40: 65 6e 20 3d 20 28 54 63 6c 5f 53 69 7a 65 29 20  en = (Tcl_Size) 
3b50: 73 69 7a 65 2d 31 3b 0a 09 20 20 20 20 7d 0a 09  size-1;..    }..
3b60: 20 20 20 20 73 74 72 6e 63 70 79 28 62 75 66 2c      strncpy(buf,
3b70: 20 72 65 74 2c 20 28 73 69 7a 65 5f 74 29 20 6c   ret, (size_t) l
3b80: 65 6e 29 3b 0a 09 20 20 20 20 62 75 66 5b 6c 65  en);..    buf[le
3b90: 6e 5d 20 3d 20 27 5c 30 27 3b 0a 09 20 20 20 20  n] = '\0';..    
3ba0: 72 65 74 75 72 6e 20 28 69 6e 74 29 20 6c 65 6e  return (int) len
3bb0: 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20  ;..} else {..   
3bc0: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 09 7d 0a 20   return -1;..}. 
3bd0: 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74     }..    dprint
3be0: 66 28 22 50 61 73 73 77 6f 72 64 43 61 6c 6c 62  f("PasswordCallb
3bf0: 61 63 6b 3a 20 63 72 65 61 74 65 20 63 61 6c 6c  ack: create call
3c00: 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 22 29 3b 0a  back command");.
3c10: 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63  .    /* Create c
3c20: 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 77  ommand to eval w
3c30: 69 74 68 20 66 6e 2c 20 72 77 66 6c 61 67 2c 20  ith fn, rwflag, 
3c40: 61 6e 64 20 73 69 7a 65 20 61 72 67 73 20 2a 2f  and size args */
3c50: 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63  .    cmdPtr = Tc
3c60: 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73  l_DuplicateObj(s
3c70: 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72  tatePtr->passwor
3c80: 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  d);.    Tcl_List
3c90: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
3ca0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
3cb0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
3cc0: 6a 28 22 70 61 73 73 77 6f 72 64 22 2c 20 2d 31  j("password", -1
3cd0: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
3ce0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
3cf0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
3d00: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72   Tcl_NewIntObj(r
3d10: 77 66 6c 61 67 29 29 3b 0a 20 20 20 20 54 63 6c  wflag));.    Tcl
3d20: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
3d30: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
3d40: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  dPtr, Tcl_NewInt
3d50: 4f 62 6a 28 73 69 7a 65 29 29 3b 0a 0a 20 20 20  Obj(size));..   
3d60: 20 64 70 72 69 6e 74 66 28 22 50 61 73 73 77 6f   dprintf("Passwo
3d70: 72 64 43 61 6c 6c 62 61 63 6b 3a 20 65 76 61 6c  rdCallback: eval
3d80: 20 63 61 6c 6c 62 61 63 6b 22 29 3b 0a 0a 20 20   callback");..  
3d90: 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28    Tcl_Preserve((
3da0: 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74 65  ClientData) inte
3db0: 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 50 72 65  rp);.    Tcl_Pre
3dc0: 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74  serve((ClientDat
3dd0: 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a 0a 20  a) statePtr);.. 
3de0: 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62     /* Eval callb
3df0: 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  ack command */. 
3e00: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
3e10: 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20  unt(cmdPtr);.   
3e20: 20 63 6f 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c   code = Tcl_Eval
3e30: 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 63 6d  ObjEx(interp, cm
3e40: 64 50 74 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47  dPtr, TCL_EVAL_G
3e50: 4c 4f 42 41 4c 29 3b 0a 20 20 20 20 69 66 20 28  LOBAL);.    if (
3e60: 63 6f 64 65 20 21 3d 20 54 43 4c 5f 4f 4b 29 20  code != TCL_OK) 
3e70: 7b 0a 23 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52  {.#if (TCL_MAJOR
3e80: 5f 56 45 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26  _VERSION == 8) &
3e90: 26 20 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52  & (TCL_MINOR_VER
3ea0: 53 49 4f 4e 20 3c 20 36 29 0a 09 54 63 6c 5f 42  SION < 6)..Tcl_B
3eb0: 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 69  ackgroundError(i
3ec0: 6e 74 65 72 70 29 3b 0a 23 65 6c 73 65 0a 09 54  nterp);.#else..T
3ed0: 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 78 63  cl_BackgroundExc
3ee0: 65 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63  eption(interp, c
3ef0: 6f 64 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  ode);.#endif.   
3f00: 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52   }.    Tcl_DecrR
3f10: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b  efCount(cmdPtr);
3f20: 0a 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73  ..    Tcl_Releas
3f30: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73  e((ClientData) s
3f40: 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f  tatePtr);..    /
3f50: 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
3f60: 20 70 61 73 73 20 62 61 63 6b 20 70 61 73 73 77   pass back passw
3f70: 6f 72 64 20 73 74 72 69 6e 67 20 61 6e 64 20 74  ord string and t
3f80: 72 75 6e 63 61 74 65 20 69 66 20 74 6f 6f 20 6c  runcate if too l
3f90: 6f 6e 67 20 2a 2f 0a 20 20 20 20 69 66 20 28 63  ong */.    if (c
3fa0: 6f 64 65 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b  ode == TCL_OK) {
3fb0: 0a 09 63 68 61 72 20 2a 72 65 74 20 3d 20 28 63  ..char *ret = (c
3fc0: 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 53 74  har *) Tcl_GetSt
3fd0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 54 63 6c 5f  ringFromObj(Tcl_
3fe0: 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  GetObjResult(int
3ff0: 65 72 70 29 2c 20 26 6c 65 6e 29 3b 0a 09 69 66  erp), &len);..if
4000: 20 28 6c 65 6e 20 3e 20 28 54 63 6c 5f 53 69 7a   (len > (Tcl_Siz
4010: 65 29 20 73 69 7a 65 2d 31 29 20 7b 0a 09 20 20  e) size-1) {..  
4020: 20 20 6c 65 6e 20 3d 20 28 54 63 6c 5f 53 69 7a    len = (Tcl_Siz
4030: 65 29 20 73 69 7a 65 2d 31 3b 0a 09 7d 0a 09 73  e) size-1;..}..s
4040: 74 72 6e 63 70 79 28 62 75 66 2c 20 72 65 74 2c  trncpy(buf, ret,
4050: 20 28 73 69 7a 65 5f 74 29 20 6c 65 6e 29 3b 0a   (size_t) len);.
4060: 09 62 75 66 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27  .buf[len] = '\0'
4070: 3b 0a 09 54 63 6c 5f 52 65 6c 65 61 73 65 28 28  ;..Tcl_Release((
4080: 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74 65  ClientData) inte
4090: 72 70 29 3b 0a 09 72 65 74 75 72 6e 20 28 69 6e  rp);..return (in
40a0: 74 29 20 6c 65 6e 3b 0a 20 20 20 20 7d 0a 20 20  t) len;.    }.  
40b0: 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43    Tcl_Release((C
40c0: 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74 65 72  lientData) inter
40d0: 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d  p);.    return -
40e0: 31 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  1;.}.../*. *----
40f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
4130: 20 2a 0a 20 2a 20 53 65 73 73 69 6f 6e 20 43 61   *. * Session Ca
4140: 6c 6c 62 61 63 6b 20 66 6f 72 20 43 6c 69 65 6e  llback for Clien
4150: 74 73 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c  ts --. *. *.Call
4160: 65 64 20 77 68 65 6e 20 61 20 6e 65 77 20 73 65  ed when a new se
4170: 73 73 69 6f 6e 20 69 73 20 61 64 64 65 64 20 74  ssion is added t
4180: 6f 20 74 68 65 20 63 61 63 68 65 2e 20 49 6e 20  o the cache. In 
4190: 54 4c 53 20 31 2e 33 0a 20 2a 09 74 68 69 73 20  TLS 1.3. *.this 
41a0: 6d 61 79 20 62 65 20 72 65 63 65 69 76 65 64 20  may be received 
41b0: 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20 61  multiple times a
41c0: 66 74 65 72 20 74 68 65 20 68 61 6e 64 73 68 61  fter the handsha
41d0: 6b 65 2e 20 46 6f 72 0a 20 2a 09 65 61 72 6c 69  ke. For. *.earli
41e0: 65 72 20 76 65 72 73 69 6f 6e 73 2c 20 74 68 69  er versions, thi
41f0: 73 20 77 69 6c 6c 20 62 65 20 72 65 63 65 69 76  s will be receiv
4200: 65 64 20 64 75 72 69 6e 67 20 74 68 65 20 68 61  ed during the ha
4210: 6e 64 73 68 61 6b 65 2e 0a 20 2a 09 54 68 69 73  ndshake.. *.This
4220: 20 69 73 20 74 68 65 20 70 72 65 66 65 72 72 65   is the preferre
4230: 64 20 77 61 79 20 74 6f 20 6f 62 74 61 69 6e 20  d way to obtain 
4240: 61 20 72 65 73 75 6d 61 62 6c 65 20 73 65 73 73  a resumable sess
4250: 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  ion.. *. * Resul
4260: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20  ts:. *.None. *. 
4270: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
4280: 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63   *.Calls callbac
4290: 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20  k (if defined). 
42a0: 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 65  *. * Return code
42b0: 73 3a 0a 20 2a 09 30 20 3d 20 65 72 72 6f 72 20  s:. *.0 = error 
42c0: 77 68 65 72 65 20 73 65 73 73 69 6f 6e 20 77 69  where session wi
42d0: 6c 6c 20 62 65 20 69 6d 6d 65 64 69 61 74 65 6c  ll be immediatel
42e0: 79 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74  y removed from t
42f0: 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 61 63 68  he internal cach
4300: 65 2e 0a 20 2a 09 31 20 3d 20 73 75 63 63 65 73  e.. *.1 = succes
4310: 73 20 77 68 65 72 65 20 61 70 70 20 72 65 74 61  s where app reta
4320: 69 6e 73 20 73 65 73 73 69 6f 6e 20 69 6e 20 73  ins session in s
4330: 65 73 73 69 6f 6e 20 63 61 63 68 65 2c 20 61 6e  ession cache, an
4340: 64 20 6d 75 73 74 20 63 61 6c 6c 20 53 53 4c 5f  d must call SSL_
4350: 53 45 53 53 49 4f 4e 5f 66 72 65 65 28 29 20 77  SESSION_free() w
4360: 68 65 6e 20 64 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d  hen done.. *. *-
4370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
43a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
43b0: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  --. */.static in
43c0: 74 0a 53 65 73 73 69 6f 6e 43 61 6c 6c 62 61 63  t.SessionCallbac
43d0: 6b 28 53 53 4c 20 2a 73 73 6c 2c 20 53 53 4c 5f  k(SSL *ssl, SSL_
43e0: 53 45 53 53 49 4f 4e 20 2a 73 65 73 73 69 6f 6e  SESSION *session
43f0: 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73  ) {.    State *s
4400: 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65  tatePtr = (State
4410: 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70 5f 64 61  *)SSL_get_app_da
4420: 74 61 28 28 53 53 4c 20 2a 29 73 73 6c 29 3b 0a  ta((SSL *)ssl);.
4430: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a      Tcl_Interp *
4440: 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 74  interp.= statePt
4450: 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54  r->interp;.    T
4460: 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a  cl_Obj *cmdPtr;.
4470: 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e      const unsign
4480: 65 64 20 63 68 61 72 20 2a 74 69 63 6b 65 74 3b  ed char *ticket;
4490: 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  .    const unsig
44a0: 6e 65 64 20 63 68 61 72 20 2a 73 65 73 73 69 6f  ned char *sessio
44b0: 6e 5f 69 64 3b 0a 20 20 20 20 73 69 7a 65 5f 74  n_id;.    size_t
44c0: 20 6c 65 6e 32 3b 0a 20 20 20 20 75 6e 73 69 67   len2;.    unsig
44d0: 6e 65 64 20 69 6e 74 20 75 6c 65 6e 3b 0a 0a 20  ned int ulen;.. 
44e0: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
44f0: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73  ed");..    if (s
4500: 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63  tatePtr->callbac
4510: 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e  k == (Tcl_Obj*)N
4520: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53  ULL) {..return S
4530: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b  SL_TLSEXT_ERR_OK
4540: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ;.    } else if 
4550: 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  (ssl == NULL) {.
4560: 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45  .return SSL_TLSE
4570: 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20  XT_ERR_NOACK;.  
4580: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61    }..    /* Crea
4590: 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76  te command to ev
45a0: 61 6c 20 77 69 74 68 20 66 6e 2c 20 63 68 61 6e  al with fn, chan
45b0: 2c 20 73 65 73 73 69 6f 6e 20 69 64 2c 20 73 65  , session id, se
45c0: 73 73 69 6f 6e 20 74 69 63 6b 65 74 2c 20 61 6e  ssion ticket, an
45d0: 64 20 6c 69 66 65 74 69 6d 65 20 61 72 67 73 20  d lifetime args 
45e0: 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20  */.    cmdPtr = 
45f0: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a  Tcl_DuplicateObj
4600: 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62  (statePtr->callb
4610: 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  ack);.    Tcl_Li
4620: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
4630: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
4640: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
4650: 4f 62 6a 28 22 73 65 73 73 69 6f 6e 22 2c 20 2d  Obj("session", -
4660: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1));.    Tcl_Lis
4670: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
4680: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
4690: 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74  ,..    Tcl_NewSt
46a0: 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43  ringObj(Tcl_GetC
46b0: 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65  hannelName(state
46c0: 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29  Ptr->self), -1))
46d0: 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 73 73 69 6f  ;..    /* Sessio
46e0: 6e 20 69 64 20 2a 2f 0a 20 20 20 20 73 65 73 73  n id */.    sess
46f0: 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53  ion_id = SSL_SES
4700: 53 49 4f 4e 5f 67 65 74 5f 69 64 28 73 65 73 73  SION_get_id(sess
4710: 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a 20 20 20  ion, &ulen);.   
4720: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
4730: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
4740: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
4750: 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 73 65  wByteArrayObj(se
4760: 73 73 69 6f 6e 5f 69 64 2c 20 28 54 63 6c 5f 53  ssion_id, (Tcl_S
4770: 69 7a 65 29 20 75 6c 65 6e 29 29 3b 0a 0a 20 20  ize) ulen));..  
4780: 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69 63    /* Session tic
4790: 6b 65 74 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 53  ket */.    SSL_S
47a0: 45 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63 6b  ESSION_get0_tick
47b0: 65 74 28 73 65 73 73 69 6f 6e 2c 20 26 74 69 63  et(session, &tic
47c0: 6b 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 20 20 20  ket, &len2);.   
47d0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
47e0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
47f0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
4800: 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 74 69  wByteArrayObj(ti
4810: 63 6b 65 74 2c 20 28 54 63 6c 5f 53 69 7a 65 29  cket, (Tcl_Size)
4820: 20 6c 65 6e 32 29 29 3b 0a 0a 20 20 20 20 2f 2a   len2));..    /*
4830: 20 4c 69 66 65 74 69 6d 65 20 2d 20 6e 75 6d 62   Lifetime - numb
4840: 65 72 20 6f 66 20 73 65 63 6f 6e 64 73 20 2a 2f  er of seconds */
4850: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
4860: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
4870: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 54  terp, cmdPtr,..T
4880: 63 6c 5f 4e 65 77 4c 6f 6e 67 4f 62 6a 28 28 6c  cl_NewLongObj((l
4890: 6f 6e 67 29 20 53 53 4c 5f 53 45 53 53 49 4f 4e  ong) SSL_SESSION
48a0: 5f 67 65 74 5f 74 69 63 6b 65 74 5f 6c 69 66 65  _get_ticket_life
48b0: 74 69 6d 65 5f 68 69 6e 74 28 73 65 73 73 69 6f  time_hint(sessio
48c0: 6e 29 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76  n)));..    /* Ev
48d0: 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d  al callback comm
48e0: 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49  and */.    Tcl_I
48f0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50  ncrRefCount(cmdP
4900: 74 72 29 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c  tr);.    EvalCal
4910: 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74  lback(interp, st
4920: 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b  atePtr, cmdPtr);
4930: 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66  .    Tcl_DecrRef
4940: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a  Count(cmdPtr);..
4950: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 30 20      /* Return 0 
4960: 66 6f 72 20 6e 6f 77 20 75 6e 74 69 6c 20 73 65  for now until se
4970: 73 73 69 6f 6e 20 68 61 6e 64 6c 69 6e 67 20 69  ssion handling i
4980: 73 20 63 6f 6d 70 6c 65 74 65 20 2a 2f 0a 20 20  s complete */.  
4990: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0c 0a    return 0;.}...
49a0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
49b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
49c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
49d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
49e0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 41  --------. *. * A
49f0: 4c 50 4e 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72  LPN Callback for
4a00: 20 53 65 72 76 65 72 73 20 61 6e 64 20 4e 50 4e   Servers and NPN
4a10: 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 43 6c   Callback for Cl
4a20: 69 65 6e 74 73 20 2d 2d 0a 20 2a 0a 20 2a 09 50  ients --. *. *.P
4a30: 65 72 66 6f 72 6d 20 70 72 6f 74 6f 63 6f 6c 20  erform protocol 
4a40: 28 68 74 74 70 2f 31 2e 31 2c 20 68 32 2c 20 68  (http/1.1, h2, h
4a50: 33 2c 20 65 74 63 2e 29 20 73 65 6c 65 63 74 69  3, etc.) selecti
4a60: 6f 6e 20 66 6f 72 20 74 68 65 0a 20 2a 09 69 6e  on for the. *.in
4a70: 63 6f 6d 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f  coming connectio
4a80: 6e 2e 20 43 61 6c 6c 65 64 20 61 66 74 65 72 20  n. Called after 
4a90: 48 65 6c 6c 6f 20 61 6e 64 20 73 65 72 76 65 72  Hello and server
4aa0: 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 2a 09 57   callbacks.. *.W
4ab0: 68 65 72 65 20 27 6f 75 74 27 20 69 73 20 73 65  here 'out' is se
4ac0: 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20  lected protocol 
4ad0: 61 6e 64 20 27 69 6e 27 20 69 73 20 74 68 65 20  and 'in' is the 
4ae0: 70 65 65 72 20 61 64 76 65 72 74 69 73 65 64 20  peer advertised 
4af0: 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  list.. *. * Resu
4b00: 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a  lts:. *.None. *.
4b10: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
4b20: 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61  . *.Calls callba
4b30: 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a  ck (if defined).
4b40: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64   *. * Return cod
4b50: 65 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58  es:. *.SSL_TLSEX
4b60: 54 5f 45 52 52 5f 4f 4b 3a 20 41 4c 50 4e 20 70  T_ERR_OK: ALPN p
4b70: 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64  rotocol selected
4b80: 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  . The connection
4b90: 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53   continues.. *.S
4ba0: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c  SL_TLSEXT_ERR_AL
4bb0: 45 52 54 5f 46 41 54 41 4c 3a 20 54 68 65 72 65  ERT_FATAL: There
4bc0: 20 77 61 73 20 6e 6f 20 6f 76 65 72 6c 61 70 20   was no overlap 
4bd0: 62 65 74 77 65 65 6e 20 74 68 65 20 63 6c 69 65  between the clie
4be0: 6e 74 27 73 0a 20 2a 09 20 20 20 20 73 75 70 70  nt's. *.    supp
4bf0: 6c 69 65 64 20 6c 69 73 74 20 61 6e 64 20 74 68  lied list and th
4c00: 65 20 73 65 72 76 65 72 20 63 6f 6e 66 69 67 75  e server configu
4c10: 72 61 74 69 6f 6e 2e 20 54 68 65 20 63 6f 6e 6e  ration. The conn
4c20: 65 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 61  ection will be a
4c30: 62 6f 72 74 65 64 2e 0a 20 2a 09 53 53 4c 5f 54  borted.. *.SSL_T
4c40: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a  LSEXT_ERR_NOACK:
4c50: 20 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e   ALPN protocol n
4c60: 6f 74 20 73 65 6c 65 63 74 65 64 2c 20 65 2e 67  ot selected, e.g
4c70: 2e 2c 20 62 65 63 61 75 73 65 20 6e 6f 20 41 4c  ., because no AL
4c80: 50 4e 0a 20 2a 09 20 20 20 20 70 72 6f 74 6f 63  PN. *.    protoc
4c90: 6f 6c 73 20 61 72 65 20 63 6f 6e 66 69 67 75 72  ols are configur
4ca0: 65 64 20 66 6f 72 20 74 68 69 73 20 63 6f 6e 6e  ed for this conn
4cb0: 65 63 74 69 6f 6e 2e 20 54 68 65 20 63 6f 6e 6e  ection. The conn
4cc0: 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73  ection continues
4cd0: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  .. *. *---------
4ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73  ----------. */.s
4d20: 74 61 74 69 63 20 69 6e 74 0a 41 4c 50 4e 43 61  tatic int.ALPNCa
4d30: 6c 6c 62 61 63 6b 28 53 53 4c 20 2a 73 73 6c 2c  llback(SSL *ssl,
4d40: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
4d50: 63 68 61 72 20 2a 2a 6f 75 74 2c 20 75 6e 73 69  char **out, unsi
4d60: 67 6e 65 64 20 63 68 61 72 20 2a 6f 75 74 6c 65  gned char *outle
4d70: 6e 2c 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e  n,..const unsign
4d80: 65 64 20 63 68 61 72 20 2a 69 6e 2c 20 75 6e 73  ed char *in, uns
4d90: 69 67 6e 65 64 20 69 6e 74 20 69 6e 6c 65 6e 2c  igned int inlen,
4da0: 20 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a 20 20   void *arg) {.  
4db0: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74    State *statePt
4dc0: 72 20 3d 20 28 53 74 61 74 65 2a 29 61 72 67 3b  r = (State*)arg;
4dd0: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  .    Tcl_Interp 
4de0: 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50  *interp.= stateP
4df0: 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20  tr->interp;.    
4e00: 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b  Tcl_Obj *cmdPtr;
4e10: 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 2c 20 72  .    int code, r
4e20: 65 73 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66  es;..    dprintf
4e30: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20  ("Called");..   
4e40: 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c   if (ssl == NULL
4e50: 20 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 4c 4c 29   || arg == NULL)
4e60: 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54   {..return SSL_T
4e70: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b  LSEXT_ERR_NOACK;
4e80: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  .    }..    /* S
4e90: 65 6c 65 63 74 20 70 72 6f 74 6f 63 6f 6c 20 2a  elect protocol *
4ea0: 2f 0a 20 20 20 20 69 66 20 28 53 53 4c 5f 73 65  /.    if (SSL_se
4eb0: 6c 65 63 74 5f 6e 65 78 74 5f 70 72 6f 74 6f 28  lect_next_proto(
4ec0: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
4ed0: 2a 29 20 6f 75 74 2c 20 6f 75 74 6c 65 6e 2c 20  *) out, outlen, 
4ee0: 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73  statePtr->protos
4ef0: 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74  , statePtr->prot
4f00: 6f 73 5f 6c 65 6e 2c 0a 09 69 6e 2c 20 69 6e 6c  os_len,..in, inl
4f10: 65 6e 29 20 3d 3d 20 4f 50 45 4e 53 53 4c 5f 4e  en) == OPENSSL_N
4f20: 50 4e 5f 4e 45 47 4f 54 49 41 54 45 44 29 20 7b  PN_NEGOTIATED) {
4f30: 0a 09 2f 2a 20 4d 61 74 63 68 20 66 6f 75 6e 64  ../* Match found
4f40: 20 2a 2f 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54   */..res = SSL_T
4f50: 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20  LSEXT_ERR_OK;.  
4f60: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 4f    } else {../* O
4f70: 50 45 4e 53 53 4c 5f 4e 50 4e 5f 4e 4f 5f 4f 56  PENSSL_NPN_NO_OV
4f80: 45 52 4c 41 50 20 3d 20 4e 6f 20 6f 76 65 72 6c  ERLAP = No overl
4f90: 61 70 2c 20 73 6f 20 75 73 65 20 66 69 72 73 74  ap, so use first
4fa0: 20 69 74 65 6d 20 66 72 6f 6d 20 63 6c 69 65 6e   item from clien
4fb0: 74 20 70 72 6f 74 6f 63 6f 6c 20 6c 69 73 74 20  t protocol list 
4fc0: 2a 2f 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c  */..res = SSL_TL
4fd0: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a  SEXT_ERR_NOACK;.
4fe0: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73      }..    if (s
4ff0: 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 3d  tatePtr->vcmd ==
5000: 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29   (Tcl_Obj*)NULL)
5010: 20 7b 0a 09 72 65 74 75 72 6e 20 72 65 73 3b 0a   {..return res;.
5020: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72      }..    /* Cr
5030: 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20  eate command to 
5040: 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 63 68  eval with fn, ch
5050: 61 6e 2c 20 64 65 70 74 68 2c 20 63 65 72 74 20  an, depth, cert 
5060: 69 6e 66 6f 20 6c 69 73 74 2c 20 73 74 61 74 75  info list, statu
5070: 73 2c 20 61 6e 64 20 65 72 72 6f 72 20 61 72 67  s, and error arg
5080: 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20  s */.    cmdPtr 
5090: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f  = Tcl_DuplicateO
50a0: 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d  bj(statePtr->vcm
50b0: 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  d);.    Tcl_List
50c0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
50d0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
50e0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
50f0: 6a 28 22 61 6c 70 6e 22 2c 20 2d 31 29 29 3b 0a  j("alpn", -1));.
5100: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
5110: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
5120: 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20  erp, cmdPtr,..  
5130: 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f    Tcl_NewStringO
5140: 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  bj(Tcl_GetChanne
5150: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e  lName(statePtr->
5160: 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20  self), -1));.   
5170: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
5180: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
5190: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
51a0: 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 6f 6e 73  wStringObj((cons
51b0: 74 20 63 68 61 72 20 2a 29 20 2a 6f 75 74 2c 20  t char *) *out, 
51c0: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  -1));.    Tcl_Li
51d0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
51e0: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
51f0: 72 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61  r, Tcl_NewBoolea
5200: 6e 4f 62 6a 28 72 65 73 20 3d 3d 20 53 53 4c 5f  nObj(res == SSL_
5210: 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 29 29 3b  TLSEXT_ERR_OK));
5220: 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61  ..    /* Eval ca
5230: 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a  llback command *
5240: 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  /.    Tcl_IncrRe
5250: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a  fCount(cmdPtr);.
5260: 20 20 20 20 69 66 20 28 28 63 6f 64 65 20 3d 20      if ((code = 
5270: 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74  EvalCallback(int
5280: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63  erp, statePtr, c
5290: 6d 64 50 74 72 29 29 20 3e 20 31 29 20 7b 0a 09  mdPtr)) > 1) {..
52a0: 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54  res = SSL_TLSEXT
52b0: 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20  _ERR_NOACK;.    
52c0: 7d 20 65 6c 73 65 20 69 66 20 28 63 6f 64 65 20  } else if (code 
52d0: 3d 3d 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53  == 1) {..res = S
52e0: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b  SL_TLSEXT_ERR_OK
52f0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
5300: 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54  res = SSL_TLSEXT
5310: 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 54 41 4c  _ERR_ALERT_FATAL
5320: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f  ;.    }.    Tcl_
5330: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64  DecrRefCount(cmd
5340: 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Ptr);.    return
5350: 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d   res;.}.../*. *-
5360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
53a0: 2d 2d 0a 20 2a 0a 20 2a 20 41 64 76 65 72 74 69  --. *. * Adverti
53b0: 73 65 20 50 72 6f 74 6f 63 6f 6c 73 20 43 61 6c  se Protocols Cal
53c0: 6c 62 61 63 6b 20 66 6f 72 20 4e 65 78 74 20 50  lback for Next P
53d0: 72 6f 74 6f 63 6f 6c 20 4e 65 67 6f 74 69 61 74  rotocol Negotiat
53e0: 69 6f 6e 20 28 4e 50 4e 29 20 69 6e 20 53 65 72  ion (NPN) in Ser
53f0: 76 65 72 48 65 6c 6c 6f 20 2d 2d 0a 20 2a 0a 20  verHello --. *. 
5400: 2a 09 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20  *.called when a 
5410: 54 4c 53 20 73 65 72 76 65 72 20 6e 65 65 64 73  TLS server needs
5420: 20 61 20 6c 69 73 74 20 6f 66 20 73 75 70 70 6f   a list of suppo
5430: 72 74 65 64 20 70 72 6f 74 6f 63 6f 6c 73 20 66  rted protocols f
5440: 6f 72 20 4e 65 78 74 0a 20 2a 09 50 72 6f 74 6f  or Next. *.Proto
5450: 63 6f 6c 20 4e 65 67 6f 74 69 61 74 69 6f 6e 2e  col Negotiation.
5460: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
5470: 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69   *.None. *. * Si
5480: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 0a 20  de effects:. *. 
5490: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a  * Return codes:.
54a0: 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52   *.SSL_TLSEXT_ER
54b0: 52 5f 4f 4b 3a 20 4e 50 4e 20 70 72 6f 74 6f 63  R_OK: NPN protoc
54c0: 6f 6c 20 73 65 6c 65 63 74 65 64 2e 20 54 68 65  ol selected. The
54d0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74   connection cont
54e0: 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c  inues.. *.SSL_TL
54f0: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20  SEXT_ERR_NOACK: 
5500: 4e 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74  NPN protocol not
5510: 20 73 65 6c 65 63 74 65 64 2e 20 54 68 65 20 63   selected. The c
5520: 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e  onnection contin
5530: 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  ues.. *. *------
5540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
5580: 2f 0a 23 69 66 64 65 66 20 55 53 45 5f 4e 50 4e  /.#ifdef USE_NPN
5590: 0a 73 74 61 74 69 63 20 69 6e 74 0a 4e 50 4e 43  .static int.NPNC
55a0: 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53  allback(const SS
55b0: 4c 20 2a 73 73 6c 2c 20 63 6f 6e 73 74 20 75 6e  L *ssl, const un
55c0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 2a 6f 75  signed char **ou
55d0: 74 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  t, unsigned int 
55e0: 2a 6f 75 74 6c 65 6e 2c 20 76 6f 69 64 20 2a 61  *outlen, void *a
55f0: 72 67 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20  rg) {.    State 
5600: 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61  *statePtr = (Sta
5610: 74 65 2a 29 61 72 67 3b 0a 0a 20 20 20 20 64 70  te*)arg;..    dp
5620: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
5630: 0a 0a 20 20 20 20 69 66 20 28 73 73 6c 20 3d 3d  ..    if (ssl ==
5640: 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d 20   NULL || arg == 
5650: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20  NULL) {..return 
5660: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e  SSL_TLSEXT_ERR_N
5670: 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  OACK;.    }..   
5680: 20 2f 2a 20 53 65 74 20 70 72 6f 74 6f 63 6f 6c   /* Set protocol
5690: 73 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20 69 66  s list */.    if
56a0: 20 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74   (statePtr->prot
56b0: 6f 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 2a  os != NULL) {..*
56c0: 6f 75 74 20 3d 20 73 74 61 74 65 50 74 72 2d 3e  out = statePtr->
56d0: 70 72 6f 74 6f 73 3b 0a 09 2a 6f 75 74 6c 65 6e  protos;..*outlen
56e0: 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f   = statePtr->pro
56f0: 74 6f 73 5f 6c 65 6e 3b 0a 20 20 20 20 7d 20 65  tos_len;.    } e
5700: 6c 73 65 20 7b 0a 09 2a 6f 75 74 20 3d 20 4e 55  lse {..*out = NU
5710: 4c 4c 3b 0a 09 2a 6f 75 74 6c 65 6e 20 3d 20 30  LL;..*outlen = 0
5720: 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c  ;..return SSL_TL
5730: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a  SEXT_ERR_NOACK;.
5740: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
5750: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f   SSL_TLSEXT_ERR_
5760: 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0c 0a 2f  OK;.}.#endif.../
5770: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
5780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
57a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
57b0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 4e  -------. *. * SN
57c0: 49 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 53  I Callback for S
57d0: 65 72 76 65 72 73 20 2d 2d 0a 20 2a 0a 20 2a 09  ervers --. *. *.
57e0: 50 65 72 66 6f 72 6d 20 73 65 72 76 65 72 2d 73  Perform server-s
57f0: 69 64 65 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65  ide SNI hostname
5800: 20 73 65 6c 65 63 74 69 6f 6e 20 61 66 74 65 72   selection after
5810: 20 72 65 63 65 69 76 69 6e 67 20 53 4e 49 20 65   receiving SNI e
5820: 78 74 65 6e 73 69 6f 6e 0a 20 2a 09 69 6e 20 43  xtension. *.in C
5830: 6c 69 65 6e 74 20 48 65 6c 6c 6f 2e 20 43 61 6c  lient Hello. Cal
5840: 6c 65 64 20 61 66 74 65 72 20 68 65 6c 6c 6f 20  led after hello 
5850: 63 61 6c 6c 62 61 63 6b 20 62 75 74 20 62 65 66  callback but bef
5860: 6f 72 65 20 41 4c 50 4e 20 63 61 6c 6c 62 61 63  ore ALPN callbac
5870: 6b 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  k.. *. * Results
5880: 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20  :. *.None. *. * 
5890: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
58a0: 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20  .Calls callback 
58b0: 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a  (if defined). *.
58c0: 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a   * Return codes:
58d0: 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45  . *.SSL_TLSEXT_E
58e0: 52 52 5f 4f 4b 3a 20 53 4e 49 20 68 6f 73 74 6e  RR_OK: SNI hostn
58f0: 61 6d 65 20 69 73 20 61 63 63 65 70 74 65 64 2e  ame is accepted.
5900: 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   The connection 
5910: 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53  continues.. *.SS
5920: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45  L_TLSEXT_ERR_ALE
5930: 52 54 5f 46 41 54 41 4c 3a 20 53 4e 49 20 68 6f  RT_FATAL: SNI ho
5940: 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74 20 61 63  stname is not ac
5950: 63 65 70 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e  cepted. The conn
5960: 65 63 74 69 6f 6e 0a 20 2a 09 20 20 20 20 69 73  ection. *.    is
5970: 20 61 62 6f 72 74 65 64 2e 20 44 65 66 61 75 6c   aborted. Defaul
5980: 74 20 66 6f 72 20 61 6c 65 72 74 20 69 73 20 53  t for alert is S
5990: 53 4c 5f 41 44 5f 55 4e 52 45 43 4f 47 4e 49 5a  SL_AD_UNRECOGNIZ
59a0: 45 44 5f 4e 41 4d 45 2e 0a 20 2a 09 53 53 4c 5f  ED_NAME.. *.SSL_
59b0: 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54  TLSEXT_ERR_ALERT
59c0: 5f 57 41 52 4e 49 4e 47 3a 20 53 4e 49 20 68 6f  _WARNING: SNI ho
59d0: 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74 20 61 63  stname is not ac
59e0: 63 65 70 74 65 64 2c 20 77 61 72 6e 69 6e 67 20  cepted, warning 
59f0: 61 6c 65 72 74 0a 20 2a 09 20 20 20 20 73 65 6e  alert. *.    sen
5a00: 74 20 28 6e 6f 74 20 73 75 70 70 6f 72 74 65 64  t (not supported
5a10: 20 69 6e 20 54 4c 53 76 31 2e 33 29 2e 20 54 68   in TLSv1.3). Th
5a20: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e  e connection con
5a30: 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54  tinues.. *.SSL_T
5a40: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a  LSEXT_ERR_NOACK:
5a50: 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69 73   SNI hostname is
5a60: 20 6e 6f 74 20 61 63 63 65 70 74 65 64 20 61 6e   not accepted an
5a70: 64 20 6e 6f 74 20 61 63 6b 6e 6f 77 6c 65 64 67  d not acknowledg
5a80: 65 64 2c 0a 20 2a 09 20 20 20 20 65 2e 67 2e 20  ed,. *.    e.g. 
5a90: 69 66 20 53 4e 49 20 68 61 73 20 6e 6f 74 20 62  if SNI has not b
5aa0: 65 65 6e 20 63 6f 6e 66 69 67 75 72 65 64 2e 20  een configured. 
5ab0: 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63  The connection c
5ac0: 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 0a 20 2a 2d  ontinues.. *. *-
5ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5b10: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  --. */.static in
5b20: 74 0a 53 4e 49 43 61 6c 6c 62 61 63 6b 28 63 6f  t.SNICallback(co
5b30: 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 69 6e  nst SSL *ssl, in
5b40: 74 20 2a 61 6c 65 72 74 2c 20 76 6f 69 64 20 2a  t *alert, void *
5b50: 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61 74 65  arg) {.    State
5b60: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74   *statePtr = (St
5b70: 61 74 65 2a 29 61 72 67 3b 0a 20 20 20 20 54 63  ate*)arg;.    Tc
5b80: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
5b90: 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74  .= statePtr->int
5ba0: 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  erp;.    Tcl_Obj
5bb0: 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e   *cmdPtr;.    in
5bc0: 74 20 63 6f 64 65 2c 20 72 65 73 3b 0a 20 20 20  t code, res;.   
5bd0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 72   const char *ser
5be0: 76 65 72 6e 61 6d 65 20 3d 20 4e 55 4c 4c 3b 0a  vername = NULL;.
5bf0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
5c00: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20  lled");..    if 
5c10: 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20  (ssl == NULL || 
5c20: 61 72 67 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  arg == NULL) {..
5c30: 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58  return SSL_TLSEX
5c40: 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20  T_ERR_NOACK;.   
5c50: 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20   }..    /* Only 
5c60: 77 6f 72 6b 73 20 66 6f 72 20 54 4c 53 20 31 2e  works for TLS 1.
5c70: 32 20 61 6e 64 20 65 61 72 6c 69 65 72 20 2a 2f  2 and earlier */
5c80: 0a 20 20 20 20 73 65 72 76 65 72 6e 61 6d 65 20  .    servername 
5c90: 3d 20 53 53 4c 5f 67 65 74 5f 73 65 72 76 65 72  = SSL_get_server
5ca0: 6e 61 6d 65 28 73 73 6c 2c 20 54 4c 53 45 58 54  name(ssl, TLSEXT
5cb0: 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f 6e  _NAMETYPE_host_n
5cc0: 61 6d 65 29 3b 0a 20 20 20 20 69 66 20 28 21 73  ame);.    if (!s
5cd0: 65 72 76 65 72 6e 61 6d 65 20 7c 7c 20 73 65 72  ervername || ser
5ce0: 76 65 72 6e 61 6d 65 5b 30 5d 20 3d 3d 20 27 5c  vername[0] == '\
5cf0: 30 27 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53  0') {..return SS
5d00: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41  L_TLSEXT_ERR_NOA
5d10: 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  CK;.    }..    i
5d20: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d  f (statePtr->vcm
5d30: 64 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e  d == (Tcl_Obj*)N
5d40: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53  ULL) {..return S
5d50: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b  SL_TLSEXT_ERR_OK
5d60: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
5d70: 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74  Create command t
5d80: 6f 20 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20  o eval with fn, 
5d90: 63 68 61 6e 2c 20 61 6e 64 20 73 65 72 76 65 72  chan, and server
5da0: 20 6e 61 6d 65 20 61 72 67 73 20 2a 2f 0a 20 20   name args */.  
5db0: 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44    cmdPtr = Tcl_D
5dc0: 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74  uplicateObj(stat
5dd0: 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20  ePtr->vcmd);.   
5de0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
5df0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
5e00: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
5e10: 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 6e 69 22  wStringObj("sni"
5e20: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f  , -1));.    Tcl_
5e30: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
5e40: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
5e50: 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65  Ptr,..    Tcl_Ne
5e60: 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47  wStringObj(Tcl_G
5e70: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74  etChannelName(st
5e80: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d  atePtr->self), -
5e90: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1));.    Tcl_Lis
5ea0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
5eb0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
5ec0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
5ed0: 62 6a 28 73 65 72 76 65 72 6e 61 6d 65 20 2c 20  bj(servername , 
5ee0: 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76  -1));..    /* Ev
5ef0: 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d  al callback comm
5f00: 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49  and */.    Tcl_I
5f10: 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50  ncrRefCount(cmdP
5f20: 74 72 29 3b 0a 20 20 20 20 69 66 20 28 28 63 6f  tr);.    if ((co
5f30: 64 65 20 3d 20 45 76 61 6c 43 61 6c 6c 62 61 63  de = EvalCallbac
5f40: 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50  k(interp, stateP
5f50: 74 72 2c 20 63 6d 64 50 74 72 29 29 20 3e 20 31  tr, cmdPtr)) > 1
5f60: 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54  ) {..res = SSL_T
5f70: 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f  LSEXT_ERR_ALERT_
5f80: 57 41 52 4e 49 4e 47 3b 0a 09 2a 61 6c 65 72 74  WARNING;..*alert
5f90: 20 3d 20 53 53 4c 5f 41 44 5f 55 4e 52 45 43 4f   = SSL_AD_UNRECO
5fa0: 47 4e 49 5a 45 44 5f 4e 41 4d 45 3b 20 2f 2a 20  GNIZED_NAME; /* 
5fb0: 4e 6f 74 20 73 75 70 70 6f 72 74 65 64 20 62 79  Not supported by
5fc0: 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 20 20 20   TLS 1.3 */.    
5fd0: 7d 20 65 6c 73 65 20 69 66 20 28 63 6f 64 65 20  } else if (code 
5fe0: 3d 3d 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53  == 1) {..res = S
5ff0: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b  SL_TLSEXT_ERR_OK
6000: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
6010: 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54  res = SSL_TLSEXT
6020: 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 54 41 4c  _ERR_ALERT_FATAL
6030: 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f  ;..*alert = SSL_
6040: 41 44 5f 55 4e 52 45 43 4f 47 4e 49 5a 45 44 5f  AD_UNRECOGNIZED_
6050: 4e 41 4d 45 3b 20 2f 2a 20 4e 6f 74 20 73 75 70  NAME; /* Not sup
6060: 70 6f 72 74 65 64 20 62 79 20 54 4c 53 20 31 2e  ported by TLS 1.
6070: 33 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 54  3 */.    }.    T
6080: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
6090: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 65 74  cmdPtr);.    ret
60a0: 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 0a  urn res;.}.../*.
60b0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
60c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
60d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
60e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
60f0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 6c 69 65  -----. *. * Clie
6100: 6e 74 48 65 6c 6c 6f 20 48 61 6e 64 73 68 61 6b  ntHello Handshak
6110: 65 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 53  e Callback for S
6120: 65 72 76 65 72 73 20 2d 2d 0a 20 2a 0a 20 2a 09  ervers --. *. *.
6130: 55 73 65 64 20 62 79 20 73 65 72 76 65 72 20 74  Used by server t
6140: 6f 20 65 78 61 6d 69 6e 65 20 74 68 65 20 73 65  o examine the se
6150: 72 76 65 72 20 6e 61 6d 65 20 69 6e 64 69 63 61  rver name indica
6160: 74 69 6f 6e 20 28 53 4e 49 29 20 65 78 74 65 6e  tion (SNI) exten
6170: 73 69 6f 6e 0a 20 2a 09 70 72 6f 76 69 64 65 64  sion. *.provided
6180: 20 62 79 20 74 68 65 20 63 6c 69 65 6e 74 20 69   by the client i
6190: 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 6c 65 63  n order to selec
61a0: 74 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  t an appropriate
61b0: 20 63 65 72 74 69 66 69 63 61 74 65 20 74 6f 0a   certificate to.
61c0: 20 2a 09 70 72 65 73 65 6e 74 2c 20 61 6e 64 20   *.present, and 
61d0: 6d 61 6b 65 20 6f 74 68 65 72 20 63 6f 6e 66 69  make other confi
61e0: 67 75 72 61 74 69 6f 6e 20 61 64 6a 75 73 74 6d  guration adjustm
61f0: 65 6e 74 73 20 72 65 6c 65 76 61 6e 74 20 74 6f  ents relevant to
6200: 20 74 68 61 74 20 73 65 72 76 65 72 0a 20 2a 09   that server. *.
6210: 6e 61 6d 65 20 61 6e 64 20 69 74 73 20 63 6f 6e  name and its con
6220: 66 69 67 75 72 61 74 69 6f 6e 2e 20 54 68 69 73  figuration. This
6230: 20 69 6e 63 6c 75 64 65 73 20 73 77 61 70 70 69   includes swappi
6240: 6e 67 20 6f 75 74 20 74 68 65 20 61 73 73 6f 63  ng out the assoc
6250: 69 61 74 65 64 0a 20 2a 09 53 53 4c 5f 43 54 58  iated. *.SSL_CTX
6260: 20 70 6f 69 6e 74 65 72 2c 20 6d 6f 64 69 66 79   pointer, modify
6270: 69 6e 67 20 74 68 65 20 73 65 72 76 65 72 27 73  ing the server's
6280: 20 6c 69 73 74 20 6f 66 20 70 65 72 6d 69 74 74   list of permitt
6290: 65 64 20 54 4c 53 20 76 65 72 73 69 6f 6e 73 2c  ed TLS versions,
62a0: 0a 20 2a 09 63 68 61 6e 67 69 6e 67 20 74 68 65  . *.changing the
62b0: 20 73 65 72 76 65 72 27 73 20 63 69 70 68 65 72   server's cipher
62c0: 20 6c 69 73 74 20 69 6e 20 72 65 73 70 6f 6e 73   list in respons
62d0: 65 20 74 6f 20 74 68 65 20 63 6c 69 65 6e 74 27  e to the client'
62e0: 73 20 63 69 70 68 65 72 20 6c 69 73 74 2c 20 65  s cipher list, e
62f0: 74 63 2e 0a 20 2a 09 43 61 6c 6c 65 64 20 62 65  tc.. *.Called be
6300: 66 6f 72 65 20 53 4e 49 20 61 6e 64 20 41 4c 50  fore SNI and ALP
6310: 4e 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 2a 0a  N callbacks.. *.
6320: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e   * Results:. *.N
6330: 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  one. *. * Side e
6340: 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73  ffects:. *.Calls
6350: 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65   callback (if de
6360: 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74  fined). *. * Ret
6370: 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53  urn codes:. *.SS
6380: 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 52  L_CLIENT_HELLO_R
6390: 45 54 52 59 3a 20 73 75 73 70 65 6e 64 20 74 68  ETRY: suspend th
63a0: 65 20 68 61 6e 64 73 68 61 6b 65 2c 20 61 6e 64  e handshake, and
63b0: 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65 20 66   the handshake f
63c0: 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72 65 74  unction will ret
63d0: 75 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a  urn immediately.
63e0: 20 2a 09 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45   *.SSL_CLIENT_HE
63f0: 4c 4c 4f 5f 45 52 52 4f 52 3a 20 66 61 69 6c 75  LLO_ERROR: failu
6400: 72 65 2c 20 74 65 72 6d 69 6e 61 74 65 20 63 6f  re, terminate co
6410: 6e 6e 65 63 74 69 6f 6e 2e 20 53 65 74 20 61 6c  nnection. Set al
6420: 65 72 74 20 74 6f 20 65 72 72 6f 72 20 63 6f 64  ert to error cod
6430: 65 2e 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 4e 54  e.. *.SSL_CLIENT
6440: 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53 3a 20  _HELLO_SUCCESS: 
6450: 73 75 63 63 65 73 73 0a 20 2a 0a 20 2a 2d 2d 2d  success. *. *---
6460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
64a0: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a  . */.static int.
64b0: 48 65 6c 6c 6f 43 61 6c 6c 62 61 63 6b 28 53 53  HelloCallback(SS
64c0: 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 2a 61 6c 65  L *ssl, int *ale
64d0: 72 74 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b  rt, void *arg) {
64e0: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74  .    State *stat
64f0: 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61  ePtr = (State*)a
6500: 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65  rg;.    Tcl_Inte
6510: 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61  rp *interp.= sta
6520: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20  tePtr->interp;. 
6530: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50     Tcl_Obj *cmdP
6540: 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65  tr;.    int code
6550: 2c 20 72 65 73 3b 0a 20 20 20 20 63 6f 6e 73 74  , res;.    const
6560: 20 63 68 61 72 20 2a 73 65 72 76 65 72 6e 61 6d   char *servernam
6570: 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73  e;.    const uns
6580: 69 67 6e 65 64 20 63 68 61 72 20 2a 70 3b 0a 20  igned char *p;. 
6590: 20 20 20 73 69 7a 65 5f 74 20 6c 65 6e 2c 20 72     size_t len, r
65a0: 65 6d 61 69 6e 69 6e 67 3b 0a 0a 20 20 20 20 64  emaining;..    d
65b0: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
65c0: 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65  ;..    if (state
65d0: 50 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63  Ptr->vcmd == (Tc
65e0: 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09  l_Obj*)NULL) {..
65f0: 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e  return SSL_CLIEN
6600: 54 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53 3b  T_HELLO_SUCCESS;
6610: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
6620: 73 73 6c 20 3d 3d 20 28 63 6f 6e 73 74 20 53 53  ssl == (const SS
6630: 4c 20 2a 29 4e 55 4c 4c 20 7c 7c 20 61 72 67 20  L *)NULL || arg 
6640: 3d 3d 20 28 76 6f 69 64 20 2a 29 4e 55 4c 4c 29  == (void *)NULL)
6650: 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43   {..return SSL_C
6660: 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f  LIENT_HELLO_ERRO
6670: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  R;.    }..    /*
6680: 20 47 65 74 20 6e 61 6d 65 73 20 2a 2f 0a 20 20   Get names */.  
6690: 20 20 69 66 20 28 21 53 53 4c 5f 63 6c 69 65 6e    if (!SSL_clien
66a0: 74 5f 68 65 6c 6c 6f 5f 67 65 74 30 5f 65 78 74  t_hello_get0_ext
66b0: 28 73 73 6c 2c 20 54 4c 53 45 58 54 5f 54 59 50  (ssl, TLSEXT_TYP
66c0: 45 5f 73 65 72 76 65 72 5f 6e 61 6d 65 2c 20 26  E_server_name, &
66d0: 70 2c 20 26 72 65 6d 61 69 6e 69 6e 67 29 20 7c  p, &remaining) |
66e0: 7c 20 72 65 6d 61 69 6e 69 6e 67 20 3c 3d 20 32  | remaining <= 2
66f0: 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53  ) {..*alert = SS
6700: 4c 5f 52 5f 53 53 4c 56 33 5f 41 4c 45 52 54 5f  L_R_SSLV3_ALERT_
6710: 49 4c 4c 45 47 41 4c 5f 50 41 52 41 4d 45 54 45  ILLEGAL_PARAMETE
6720: 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43  R;..return SSL_C
6730: 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f  LIENT_HELLO_ERRO
6740: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  R;.    }..    /*
6750: 20 45 78 74 72 61 63 74 20 74 68 65 20 6c 65 6e   Extract the len
6760: 67 74 68 20 6f 66 20 74 68 65 20 73 75 70 70 6c  gth of the suppl
6770: 69 65 64 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65  ied list of name
6780: 73 2e 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20  s. */.    len = 
6790: 28 2a 28 70 2b 2b 29 20 3c 3c 20 38 29 3b 0a 20  (*(p++) << 8);. 
67a0: 20 20 20 6c 65 6e 20 2b 3d 20 2a 28 70 2b 2b 29     len += *(p++)
67b0: 3b 0a 20 20 20 20 69 66 20 28 6c 65 6e 20 2b 20  ;.    if (len + 
67c0: 32 20 21 3d 20 72 65 6d 61 69 6e 69 6e 67 29 20  2 != remaining) 
67d0: 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f  {..*alert = SSL_
67e0: 52 5f 53 53 4c 56 33 5f 41 4c 45 52 54 5f 49 4c  R_SSLV3_ALERT_IL
67f0: 4c 45 47 41 4c 5f 50 41 52 41 4d 45 54 45 52 3b  LEGAL_PARAMETER;
6800: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49  ..return SSL_CLI
6810: 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b  ENT_HELLO_ERROR;
6820: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 69  .    }.    remai
6830: 6e 69 6e 67 20 3d 20 6c 65 6e 3b 0a 0a 20 20 20  ning = len;..   
6840: 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 6e 20   /* The list in 
6850: 70 72 61 63 74 69 63 65 20 6f 6e 6c 79 20 68 61  practice only ha
6860: 73 20 61 20 73 69 6e 67 6c 65 20 65 6c 65 6d 65  s a single eleme
6870: 6e 74 2c 20 73 6f 20 77 65 20 6f 6e 6c 79 20 63  nt, so we only c
6880: 6f 6e 73 69 64 65 72 20 74 68 65 20 66 69 72 73  onsider the firs
6890: 74 20 6f 6e 65 2e 20 2a 2f 0a 20 20 20 20 69 66  t one. */.    if
68a0: 20 28 72 65 6d 61 69 6e 69 6e 67 20 3d 3d 20 30   (remaining == 0
68b0: 20 7c 7c 20 2a 70 2b 2b 20 21 3d 20 54 4c 53 45   || *p++ != TLSE
68c0: 58 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74  XT_NAMETYPE_host
68d0: 5f 6e 61 6d 65 29 20 7b 0a 09 2a 61 6c 65 72 74  _name) {..*alert
68e0: 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41   = SSL_R_TLSV1_A
68f0: 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52  LERT_INTERNAL_ER
6900: 52 4f 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c  ROR;..return SSL
6910: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52  _CLIENT_HELLO_ER
6920: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  ROR;.    }.    r
6930: 65 6d 61 69 6e 69 6e 67 2d 2d 3b 0a 0a 20 20 20  emaining--;..   
6940: 20 2f 2a 20 4e 6f 77 20 77 65 20 63 61 6e 20 66   /* Now we can f
6950: 69 6e 61 6c 6c 79 20 70 75 6c 6c 20 6f 75 74 20  inally pull out 
6960: 74 68 65 20 62 79 74 65 20 61 72 72 61 79 20 77  the byte array w
6970: 69 74 68 20 74 68 65 20 61 63 74 75 61 6c 20 68  ith the actual h
6980: 6f 73 74 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20  ostname. */.    
6990: 69 66 20 28 72 65 6d 61 69 6e 69 6e 67 20 3c 3d  if (remaining <=
69a0: 20 32 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20   2) {..*alert = 
69b0: 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52  SSL_R_TLSV1_ALER
69c0: 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52  T_INTERNAL_ERROR
69d0: 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c  ;..return SSL_CL
69e0: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52  IENT_HELLO_ERROR
69f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20  ;.    }.    len 
6a00: 3d 20 28 2a 28 70 2b 2b 29 20 3c 3c 20 38 29 3b  = (*(p++) << 8);
6a10: 0a 20 20 20 20 6c 65 6e 20 2b 3d 20 2a 28 70 2b  .    len += *(p+
6a20: 2b 29 3b 0a 20 20 20 20 69 66 20 28 6c 65 6e 20  +);.    if (len 
6a30: 2b 20 32 20 3e 20 72 65 6d 61 69 6e 69 6e 67 29  + 2 > remaining)
6a40: 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c   {..*alert = SSL
6a50: 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49  _R_TLSV1_ALERT_I
6a60: 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09  NTERNAL_ERROR;..
6a70: 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e  return SSL_CLIEN
6a80: 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20  T_HELLO_ERROR;. 
6a90: 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e 69     }.    remaini
6aa0: 6e 67 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 73 65  ng = len;.    se
6ab0: 72 76 65 72 6e 61 6d 65 20 3d 20 28 63 6f 6e 73  rvername = (cons
6ac0: 74 20 63 68 61 72 20 2a 29 70 3b 0a 0a 20 20 20  t char *)p;..   
6ad0: 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61   /* Create comma
6ae0: 6e 64 20 74 6f 20 65 76 61 6c 20 77 69 74 68 20  nd to eval with 
6af0: 66 6e 2c 20 63 68 61 6e 2c 20 61 6e 64 20 73 65  fn, chan, and se
6b00: 72 76 65 72 20 6e 61 6d 65 20 61 72 67 73 20 2a  rver name args *
6b10: 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54  /.    cmdPtr = T
6b20: 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28  cl_DuplicateObj(
6b30: 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b  statePtr->vcmd);
6b40: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
6b50: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
6b60: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
6b70: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
6b80: 68 65 6c 6c 6f 22 2c 20 2d 31 29 29 3b 0a 20 20  hello", -1));.  
6b90: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
6ba0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
6bb0: 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20  p, cmdPtr,..    
6bc0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
6bd0: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e  (Tcl_GetChannelN
6be0: 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65  ame(statePtr->se
6bf0: 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54  lf), -1));.    T
6c00: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
6c10: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
6c20: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  cmdPtr, Tcl_NewS
6c30: 74 72 69 6e 67 4f 62 6a 28 73 65 72 76 65 72 6e  tringObj(servern
6c40: 61 6d 65 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20  ame, (Tcl_Size) 
6c50: 6c 65 6e 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45  len));..    /* E
6c60: 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d  val callback com
6c70: 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f  mand */.    Tcl_
6c80: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64  IncrRefCount(cmd
6c90: 50 74 72 29 3b 0a 20 20 20 20 69 66 20 28 28 63  Ptr);.    if ((c
6ca0: 6f 64 65 20 3d 20 45 76 61 6c 43 61 6c 6c 62 61  ode = EvalCallba
6cb0: 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65  ck(interp, state
6cc0: 50 74 72 2c 20 63 6d 64 50 74 72 29 29 20 3e 20  Ptr, cmdPtr)) > 
6cd0: 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f  1) {..res = SSL_
6ce0: 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 52 45 54  CLIENT_HELLO_RET
6cf0: 52 59 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53  RY;..*alert = SS
6d00: 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f  L_R_TLSV1_ALERT_
6d10: 55 53 45 52 5f 43 41 4e 43 45 4c 4c 45 44 3b 0a  USER_CANCELLED;.
6d20: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63      } else if (c
6d30: 6f 64 65 20 3d 3d 20 31 29 20 7b 0a 09 72 65 73  ode == 1) {..res
6d40: 20 3d 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45   = SSL_CLIENT_HE
6d50: 4c 4c 4f 5f 53 55 43 43 45 53 53 3b 0a 20 20 20  LLO_SUCCESS;.   
6d60: 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d   } else {..res =
6d70: 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c   SSL_CLIENT_HELL
6d80: 4f 5f 45 52 52 4f 52 3b 0a 09 2a 61 6c 65 72 74  O_ERROR;..*alert
6d90: 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41   = SSL_R_TLSV1_A
6da0: 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52  LERT_INTERNAL_ER
6db0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54  ROR;.    }.    T
6dc0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
6dd0: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 65 74  cmdPtr);.    ret
6de0: 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 2a  urn res;.}.../**
6df0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6e00: 2a 2a 2f 0a 2f 2a 20 43 6f 6d 6d 61 6e 64 73 20  **/./* Commands 
6e10: 20 20 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a          */./****
6e20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6e30: 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  /../*. *--------
6e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
6e80: 2a 20 43 69 70 68 65 72 73 4f 62 6a 43 6d 64 20  * CiphersObjCmd 
6e90: 2d 2d 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c  -- list availabl
6ea0: 65 20 63 69 70 68 65 72 73 0a 20 2a 0a 20 2a 09  e ciphers. *. *.
6eb0: 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69  This procedure i
6ec0: 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f  s invoked to pro
6ed0: 63 65 73 73 20 74 68 65 20 22 74 6c 73 3a 3a 63  cess the "tls::c
6ee0: 69 70 68 65 72 73 22 20 63 6f 6d 6d 61 6e 64 0a  iphers" command.
6ef0: 20 2a 09 74 6f 20 6c 69 73 74 20 61 76 61 69 6c   *.to list avail
6f00: 61 62 6c 65 20 63 69 70 68 65 72 73 2c 20 62 61  able ciphers, ba
6f10: 73 65 64 20 75 70 6f 6e 20 70 72 6f 74 6f 63 6f  sed upon protoco
6f20: 6c 20 73 65 6c 65 63 74 65 64 2e 0a 20 2a 0a 20  l selected.. *. 
6f30: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20  * Results:. *.A 
6f40: 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73  standard Tcl res
6f50: 75 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20  ult list.. *. * 
6f60: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
6f70: 09 63 6f 6e 73 74 72 75 63 74 73 20 61 6e 64 20  .constructs and 
6f80: 64 65 73 74 72 6f 79 73 20 53 53 4c 20 63 6f 6e  destroys SSL con
6f90: 74 65 78 74 20 28 43 54 58 29 0a 20 2a 0a 20 2a  text (CTX). *. *
6fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6fe0: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63  ---. */.static c
6ff0: 6f 6e 73 74 20 63 68 61 72 20 2a 70 72 6f 74 6f  onst char *proto
7000: 63 6f 6c 73 5b 5d 20 3d 20 7b 0a 09 22 73 73 6c  cols[] = {.."ssl
7010: 32 22 2c 20 22 73 73 6c 33 22 2c 20 22 74 6c 73  2", "ssl3", "tls
7020: 31 22 2c 20 22 74 6c 73 31 2e 31 22 2c 20 22 74  1", "tls1.1", "t
7030: 6c 73 31 2e 32 22 2c 20 22 74 6c 73 31 2e 33 22  ls1.2", "tls1.3"
7040: 2c 20 4e 55 4c 4c 0a 7d 3b 0a 65 6e 75 6d 20 70  , NULL.};.enum p
7050: 72 6f 74 6f 63 6f 6c 20 7b 0a 20 20 20 20 54 4c  rotocol {.    TL
7060: 53 5f 53 53 4c 32 2c 20 54 4c 53 5f 53 53 4c 33  S_SSL2, TLS_SSL3
7070: 2c 20 54 4c 53 5f 54 4c 53 31 2c 20 54 4c 53 5f  , TLS_TLS1, TLS_
7080: 54 4c 53 31 5f 31 2c 20 54 4c 53 5f 54 4c 53 31  TLS1_1, TLS_TLS1
7090: 5f 32 2c 20 54 4c 53 5f 54 4c 53 31 5f 33 2c 20  _2, TLS_TLS1_3, 
70a0: 54 4c 53 5f 4e 4f 4e 45 0a 7d 3b 0a 0a 73 74 61  TLS_NONE.};..sta
70b0: 74 69 63 20 69 6e 74 0a 43 69 70 68 65 72 73 4f  tic int.CiphersO
70c0: 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61  bjCmd(ClientData
70d0: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c   clientData, Tcl
70e0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
70f0: 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f   int objc, Tcl_O
7100: 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d  bj *const objv[]
7110: 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  ) {.    Tcl_Obj 
7120: 2a 6f 62 6a 50 74 72 20 3d 20 4e 55 4c 4c 3b 0a  *objPtr = NULL;.
7130: 20 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 74 78      SSL_CTX *ctx
7140: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 53 4c   = NULL;.    SSL
7150: 20 2a 73 73 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20   *ssl = NULL;.  
7160: 20 20 53 54 41 43 4b 5f 4f 46 28 53 53 4c 5f 43    STACK_OF(SSL_C
7170: 49 50 48 45 52 29 20 2a 73 6b 3b 0a 20 20 20 20  IPHER) *sk;.    
7180: 63 68 61 72 20 62 75 66 5b 42 55 46 53 49 5a 5d  char buf[BUFSIZ]
7190: 3b 0a 20 20 20 20 69 6e 74 20 69 6e 64 65 78 2c  ;.    int index,
71a0: 20 76 65 72 62 6f 73 65 20 3d 20 30 2c 20 75 73   verbose = 0, us
71b0: 65 5f 73 75 70 70 6f 72 74 65 64 20 3d 20 30 3b  e_supported = 0;
71c0: 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 4d  .    const SSL_M
71d0: 45 54 48 4f 44 20 2a 6d 65 74 68 6f 64 3b 0a 20  ETHOD *method;. 
71e0: 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65 6e 74     (void) client
71f0: 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 72 69 6e  Data;..    dprin
7200: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20  tf("Called");.. 
7210: 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3c 20 32     if ((objc < 2
7220: 29 20 7c 7c 20 28 6f 62 6a 63 20 3e 20 34 29 29  ) || (objc > 4))
7230: 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d   {..Tcl_WrongNum
7240: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
7250: 6f 62 6a 76 2c 20 22 70 72 6f 74 6f 63 6f 6c 20  objv, "protocol 
7260: 3f 76 65 72 62 6f 73 65 3f 20 3f 73 75 70 70 6f  ?verbose? ?suppo
7270: 72 74 65 64 3f 22 29 3b 0a 09 72 65 74 75 72 6e  rted?");..return
7280: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
7290: 7d 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65  }.    if (Tcl_Ge
72a0: 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e  tIndexFromObj(in
72b0: 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 70  terp, objv[1], p
72c0: 72 6f 74 6f 63 6f 6c 73 2c 20 22 70 72 6f 74 6f  rotocols, "proto
72d0: 63 6f 6c 22 2c 20 30 2c 20 26 69 6e 64 65 78 29  col", 0, &index)
72e0: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72   != TCL_OK) {..r
72f0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
7300: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 28  .    }.    if ((
7310: 6f 62 6a 63 20 3e 20 32 29 20 26 26 20 54 63 6c  objc > 2) && Tcl
7320: 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f  _GetBooleanFromO
7330: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
7340: 32 5d 2c 20 26 76 65 72 62 6f 73 65 29 20 21 3d  2], &verbose) !=
7350: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75   TCL_OK) {..retu
7360: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
7370: 20 20 7d 0a 20 20 20 20 69 66 20 28 28 6f 62 6a    }.    if ((obj
7380: 63 20 3e 20 33 29 20 26 26 20 54 63 6c 5f 47 65  c > 3) && Tcl_Ge
7390: 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28  tBooleanFromObj(
73a0: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c  interp, objv[3],
73b0: 20 26 75 73 65 5f 73 75 70 70 6f 72 74 65 64 29   &use_supported)
73c0: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72   != TCL_OK) {..r
73d0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
73e0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f  .    }..    ERR_
73f0: 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a  clear_error();..
7400: 20 20 20 20 73 77 69 74 63 68 20 28 28 65 6e 75      switch ((enu
7410: 6d 20 70 72 6f 74 6f 63 6f 6c 29 69 6e 64 65 78  m protocol)index
7420: 29 20 7b 0a 09 63 61 73 65 20 54 4c 53 5f 53 53  ) {..case TLS_SS
7430: 4c 32 3a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f  L2:.#if OPENSSL_
7440: 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e  VERSION_NUMBER >
7450: 3d 20 30 78 31 30 31 30 30 30 30 30 4c 20 7c 7c  = 0x10100000L ||
7460: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32   defined(NO_SSL2
7470: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45  ) || defined(OPE
7480: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 09 20  NSSL_NO_SSL2).. 
7490: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
74a0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74  ult(interp, prot
74b0: 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a  ocols[index], ":
74c0: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75   protocol not su
74d0: 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20  pported", (char 
74e0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72  *) NULL);..    r
74f0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
7500: 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 74 68  .#else..    meth
7510: 6f 64 20 3d 20 53 53 4c 76 32 5f 6d 65 74 68 6f  od = SSLv2_metho
7520: 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64  d(); break;.#end
7530: 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 53 53 4c  if..case TLS_SSL
7540: 33 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e  3:.#if defined(N
7550: 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e  O_SSL3) || defin
7560: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53  ed(OPENSSL_NO_SS
7570: 4c 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f  L3) || defined(O
7580: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d  PENSSL_NO_SSL3_M
7590: 45 54 48 4f 44 29 0a 09 20 20 20 20 54 63 6c 5f  ETHOD)..    Tcl_
75a0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
75b0: 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69  erp, protocols[i
75c0: 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63  ndex], ": protoc
75d0: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64  ol not supported
75e0: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
75f0: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54  );..    return T
7600: 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a  CL_ERROR;.#else.
7610: 09 20 20 20 20 6d 65 74 68 6f 64 20 3d 20 53 53  .    method = SS
7620: 4c 76 33 5f 6d 65 74 68 6f 64 28 29 3b 20 62 72  Lv3_method(); br
7630: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73  eak;.#endif..cas
7640: 65 20 54 4c 53 5f 54 4c 53 31 3a 0a 23 69 66 20  e TLS_TLS1:.#if 
7650: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29  defined(NO_TLS1)
7660: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e   || defined(OPEN
7670: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20  SSL_NO_TLS1) || 
7680: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
7690: 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 29 0a  NO_TLS1_METHOD).
76a0: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
76b0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72  esult(interp, pr
76c0: 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20  otocols[index], 
76d0: 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20  ": protocol not 
76e0: 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61  supported", (cha
76f0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20  r *) NULL);..   
7700: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
7710: 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d 65  R;.#else..    me
7720: 74 68 6f 64 20 3d 20 54 4c 53 76 31 5f 6d 65 74  thod = TLSv1_met
7730: 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65  hod(); break;.#e
7740: 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 54  ndif..case TLS_T
7750: 4c 53 31 5f 31 3a 0a 23 69 66 20 64 65 66 69 6e  LS1_1:.#if defin
7760: 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c  ed(NO_TLS1_1) ||
7770: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
7780: 5f 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64  _NO_TLS1_1) || d
7790: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
77a0: 4f 5f 54 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29  O_TLS1_1_METHOD)
77b0: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ..    Tcl_Append
77c0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70  Result(interp, p
77d0: 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c  rotocols[index],
77e0: 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74   ": protocol not
77f0: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68   supported", (ch
7800: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20  ar *) NULL);..  
7810: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
7820: 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d  OR;.#else..    m
7830: 65 74 68 6f 64 20 3d 20 54 4c 53 76 31 5f 31 5f  ethod = TLSv1_1_
7840: 6d 65 74 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b  method(); break;
7850: 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c  .#endif..case TL
7860: 53 5f 54 4c 53 31 5f 32 3a 0a 23 69 66 20 64 65  S_TLS1_2:.#if de
7870: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29  fined(NO_TLS1_2)
7880: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e   || defined(OPEN
7890: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c  SSL_NO_TLS1_2) |
78a0: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  | defined(OPENSS
78b0: 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 48  L_NO_TLS1_2_METH
78c0: 4f 44 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 70  OD)..    Tcl_App
78d0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
78e0: 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65  , protocols[inde
78f0: 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20  x], ": protocol 
7900: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20  not supported", 
7910: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
7920: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
7930: 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20  ERROR;.#else..  
7940: 20 20 6d 65 74 68 6f 64 20 3d 20 54 4c 53 76 31    method = TLSv1
7950: 5f 32 5f 6d 65 74 68 6f 64 28 29 3b 20 62 72 65  _2_method(); bre
7960: 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 65  ak;.#endif..case
7970: 20 54 4c 53 5f 54 4c 53 31 5f 33 3a 0a 23 69 66   TLS_TLS1_3:.#if
7980: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31   defined(NO_TLS1
7990: 5f 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f  _3) || defined(O
79a0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33  PENSSL_NO_TLS1_3
79b0: 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  )..    Tcl_Appen
79c0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
79d0: 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d  protocols[index]
79e0: 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f  , ": protocol no
79f0: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63  t supported", (c
7a00: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20  har *) NULL);.. 
7a10: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
7a20: 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20  ROR;.#else..    
7a30: 6d 65 74 68 6f 64 20 3d 20 54 4c 53 5f 6d 65 74  method = TLS_met
7a40: 68 6f 64 28 29 3b 0a 09 20 20 20 20 53 53 4c 5f  hod();..    SSL_
7a50: 43 54 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74  CTX_set_min_prot
7a60: 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 54  o_version(ctx, T
7a70: 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a  LS1_3_VERSION);.
7a80: 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74  .    SSL_CTX_set
7a90: 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 72 73 69  _max_proto_versi
7aa0: 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56  on(ctx, TLS1_3_V
7ab0: 45 52 53 49 4f 4e 29 3b 0a 09 20 20 20 20 62 72  ERSION);..    br
7ac0: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 64 65 66  eak;.#endif..def
7ad0: 61 75 6c 74 3a 0a 09 20 20 20 20 6d 65 74 68 6f  ault:..    metho
7ae0: 64 20 3d 20 54 4c 53 5f 6d 65 74 68 6f 64 28 29  d = TLS_method()
7af0: 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;..    break;.  
7b00: 20 20 7d 0a 0a 20 20 20 20 63 74 78 20 3d 20 53    }..    ctx = S
7b10: 53 4c 5f 43 54 58 5f 6e 65 77 28 6d 65 74 68 6f  SL_CTX_new(metho
7b20: 64 29 3b 0a 20 20 20 20 69 66 20 28 63 74 78 20  d);.    if (ctx 
7b30: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f  == NULL) {..Tcl_
7b40: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
7b50: 65 72 70 2c 20 47 45 54 5f 45 52 52 5f 52 45 41  erp, GET_ERR_REA
7b60: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20  SON(), (char *) 
7b70: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54  NULL);..return T
7b80: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
7b90: 0a 20 20 20 20 73 73 6c 20 3d 20 53 53 4c 5f 6e  .    ssl = SSL_n
7ba0: 65 77 28 63 74 78 29 3b 0a 20 20 20 20 69 66 20  ew(ctx);.    if 
7bb0: 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  (ssl == NULL) {.
7bc0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
7bd0: 74 28 69 6e 74 65 72 70 2c 20 47 45 54 5f 45 52  t(interp, GET_ER
7be0: 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61  R_REASON(), (cha
7bf0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c  r *) NULL);..SSL
7c00: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a  _CTX_free(ctx);.
7c10: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
7c20: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  R;.    }..    /*
7c30: 20 55 73 65 20 6c 69 73 74 20 61 6e 64 20 6f 72   Use list and or
7c40: 64 65 72 20 61 73 20 77 6f 75 6c 64 20 62 65 20  der as would be 
7c50: 73 65 6e 74 20 69 6e 20 61 20 43 6c 69 65 6e 74  sent in a Client
7c60: 48 65 6c 6c 6f 20 6f 72 20 61 6c 6c 20 61 76 61  Hello or all ava
7c70: 69 6c 61 62 6c 65 20 63 69 70 68 65 72 73 20 2a  ilable ciphers *
7c80: 2f 0a 20 20 20 20 69 66 20 28 75 73 65 5f 73 75  /.    if (use_su
7c90: 70 70 6f 72 74 65 64 29 20 7b 0a 09 73 6b 20 3d  pported) {..sk =
7ca0: 20 53 53 4c 5f 67 65 74 31 5f 73 75 70 70 6f 72   SSL_get1_suppor
7cb0: 74 65 64 5f 63 69 70 68 65 72 73 28 73 73 6c 29  ted_ciphers(ssl)
7cc0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
7cd0: 73 6b 20 3d 20 53 53 4c 5f 67 65 74 5f 63 69 70  sk = SSL_get_cip
7ce0: 68 65 72 73 28 73 73 6c 29 3b 0a 20 20 20 20 7d  hers(ssl);.    }
7cf0: 0a 0a 20 20 20 20 69 66 20 28 73 6b 20 21 3d 20  ..    if (sk != 
7d00: 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 21 76 65  NULL) {..if (!ve
7d10: 72 62 6f 73 65 29 20 7b 0a 09 20 20 20 20 63 6f  rbose) {..    co
7d20: 6e 73 74 20 63 68 61 72 20 2a 63 70 3b 0a 09 20  nst char *cp;.. 
7d30: 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f     objPtr = Tcl_
7d40: 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55  NewListObj(0, NU
7d50: 4c 4c 29 3b 0a 09 20 20 20 20 66 6f 72 20 28 69  LL);..    for (i
7d60: 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b  nt i = 0; i < sk
7d70: 5f 53 53 4c 5f 43 49 50 48 45 52 5f 6e 75 6d 28  _SSL_CIPHER_num(
7d80: 73 6b 29 3b 20 69 2b 2b 29 20 7b 0a 09 09 63 6f  sk); i++) {...co
7d90: 6e 73 74 20 53 53 4c 5f 43 49 50 48 45 52 20 2a  nst SSL_CIPHER *
7da0: 63 20 3d 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45  c = sk_SSL_CIPHE
7db0: 52 5f 76 61 6c 75 65 28 73 6b 2c 20 69 29 3b 0a  R_value(sk, i);.
7dc0: 09 09 69 66 20 28 63 20 3d 3d 20 4e 55 4c 4c 29  ..if (c == NULL)
7dd0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 09 09 2f 2a   continue;..../*
7de0: 20 63 69 70 68 65 72 20 6e 61 6d 65 20 6f 72 20   cipher name or 
7df0: 28 4e 4f 4e 45 29 20 2a 2f 0a 09 09 63 70 20 3d  (NONE) */...cp =
7e00: 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f   SSL_CIPHER_get_
7e10: 6e 61 6d 65 28 63 29 3b 0a 09 09 69 66 20 28 63  name(c);...if (c
7e20: 70 20 3d 3d 20 4e 55 4c 4c 29 20 62 72 65 61 6b  p == NULL) break
7e30: 3b 0a 09 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;...Tcl_ListObjA
7e40: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
7e50: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
7e60: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63  _NewStringObj((c
7e70: 68 61 72 20 2a 29 20 63 70 2c 20 2d 31 29 29 3b  har *) cp, -1));
7e80: 0a 09 20 20 20 20 7d 0a 0a 09 7d 20 65 6c 73 65  ..    }...} else
7e90: 20 7b 0a 09 20 20 20 20 6f 62 6a 50 74 72 20 3d   {..    objPtr =
7ea0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
7eb0: 6a 28 22 22 2c 30 29 3b 0a 09 20 20 20 20 66 6f  j("",0);..    fo
7ec0: 72 20 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 20  r (int i = 0; i 
7ed0: 3c 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f  < sk_SSL_CIPHER_
7ee0: 6e 75 6d 28 73 6b 29 3b 20 69 2b 2b 29 20 7b 0a  num(sk); i++) {.
7ef0: 09 09 63 6f 6e 73 74 20 53 53 4c 5f 43 49 50 48  ..const SSL_CIPH
7f00: 45 52 20 2a 63 20 3d 20 73 6b 5f 53 53 4c 5f 43  ER *c = sk_SSL_C
7f10: 49 50 48 45 52 5f 76 61 6c 75 65 28 73 6b 2c 20  IPHER_value(sk, 
7f20: 69 29 3b 0a 09 09 69 66 20 28 63 20 3d 3d 20 4e  i);...if (c == N
7f30: 55 4c 4c 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a  ULL) continue;..
7f40: 09 09 2f 2a 20 74 65 78 74 75 61 6c 20 64 65 73  ../* textual des
7f50: 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20  cription of the 
7f60: 63 69 70 68 65 72 20 2a 2f 0a 09 09 69 66 20 28  cipher */...if (
7f70: 53 53 4c 5f 43 49 50 48 45 52 5f 64 65 73 63 72  SSL_CIPHER_descr
7f80: 69 70 74 69 6f 6e 28 63 2c 20 62 75 66 2c 20 73  iption(c, buf, s
7f90: 69 7a 65 6f 66 28 62 75 66 29 29 20 21 3d 20 4e  izeof(buf)) != N
7fa0: 55 4c 4c 29 20 7b 0a 09 09 20 20 20 20 54 63 6c  ULL) {...    Tcl
7fb0: 5f 41 70 70 65 6e 64 54 6f 4f 62 6a 28 6f 62 6a  _AppendToObj(obj
7fc0: 50 74 72 2c 20 62 75 66 2c 20 28 54 63 6c 5f 53  Ptr, buf, (Tcl_S
7fd0: 69 7a 65 29 20 73 74 72 6c 65 6e 28 62 75 66 29  ize) strlen(buf)
7fe0: 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  );...} else {...
7ff0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 54 6f      Tcl_AppendTo
8000: 4f 62 6a 28 6f 62 6a 50 74 72 2c 20 22 55 4e 4b  Obj(objPtr, "UNK
8010: 4e 4f 57 4e 5c 6e 22 2c 20 38 29 3b 0a 09 09 7d  NOWN\n", 8);...}
8020: 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 69 66 20 28  ..    }..}..if (
8030: 75 73 65 5f 73 75 70 70 6f 72 74 65 64 29 20 7b  use_supported) {
8040: 0a 09 20 20 20 20 73 6b 5f 53 53 4c 5f 43 49 50  ..    sk_SSL_CIP
8050: 48 45 52 5f 66 72 65 65 28 73 6b 29 3b 0a 09 7d  HER_free(sk);..}
8060: 0a 20 20 20 20 7d 0a 20 20 20 20 53 53 4c 5f 66  .    }.    SSL_f
8070: 72 65 65 28 73 73 6c 29 3b 0a 20 20 20 20 53 53  ree(ssl);.    SS
8080: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b  L_CTX_free(ctx);
8090: 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a  ..    Tcl_SetObj
80a0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f  Result(interp, o
80b0: 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75  bjPtr);.    retu
80c0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f  rn TCL_OK;.}.../
80d0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
80e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
80f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8110: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 50 72  -------. *. * Pr
8120: 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 20 2d 2d  otocolsObjCmd --
8130: 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65 20   list available 
8140: 70 72 6f 74 6f 63 6f 6c 73 0a 20 2a 0a 20 2a 09  protocols. *. *.
8150: 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69  This procedure i
8160: 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f  s invoked to pro
8170: 63 65 73 73 20 74 68 65 20 22 74 6c 73 3a 3a 70  cess the "tls::p
8180: 72 6f 74 6f 63 6f 6c 73 22 20 63 6f 6d 6d 61 6e  rotocols" comman
8190: 64 0a 20 2a 09 74 6f 20 6c 69 73 74 20 61 76 61  d. *.to list ava
81a0: 69 6c 61 62 6c 65 20 70 72 6f 74 6f 63 6f 6c 73  ilable protocols
81b0: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
81c0: 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54  . *.A standard T
81d0: 63 6c 20 72 65 73 75 6c 74 20 6c 69 73 74 2e 0a  cl result list..
81e0: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
81f0: 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20  ts:. *.none. *. 
8200: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
8210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8240: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ----. */.static 
8250: 69 6e 74 0a 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a  int.ProtocolsObj
8260: 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63  Cmd(ClientData c
8270: 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49  lientData, Tcl_I
8280: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69  nterp *interp, i
8290: 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a  nt objc, Tcl_Obj
82a0: 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20   *const objv[]) 
82b0: 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f  {.    Tcl_Obj *o
82c0: 62 6a 50 74 72 3b 0a 20 20 20 20 28 76 6f 69 64  bjPtr;.    (void
82d0: 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20  ) clientData;.. 
82e0: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
82f0: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f  ed");..    if (o
8300: 62 6a 63 20 21 3d 20 31 29 20 7b 0a 09 54 63 6c  bjc != 1) {..Tcl
8310: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
8320: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
8330: 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  ");..return TCL_
8340: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
8350: 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f    ERR_clear_erro
8360: 72 28 29 3b 0a 0a 20 20 20 20 6f 62 6a 50 74 72  r();..    objPtr
8370: 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62   = Tcl_NewListOb
8380: 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 23 69 66  j(0, NULL);..#if
8390: 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e   OPENSSL_VERSION
83a0: 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30  _NUMBER < 0x1010
83b0: 30 30 30 30 4c 20 26 26 20 21 64 65 66 69 6e 65  0000L && !define
83c0: 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64  d(NO_SSL2) && !d
83d0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
83e0: 4f 5f 53 53 4c 32 29 0a 20 20 20 20 54 63 6c 5f  O_SSL2).    Tcl_
83f0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
8400: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
8410: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
8420: 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b  ngObj(protocols[
8430: 54 4c 53 5f 53 53 4c 32 5d 2c 20 2d 31 29 29 3b  TLS_SSL2], -1));
8440: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66  .#endif.#if !def
8450: 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26  ined(NO_SSL3) &&
8460: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
8470: 4c 5f 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64  L_NO_SSL3) && !d
8480: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
8490: 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 29 0a 20  O_SSL3_METHOD). 
84a0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
84b0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
84c0: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
84d0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f  NewStringObj(pro
84e0: 74 6f 63 6f 6c 73 5b 54 4c 53 5f 53 53 4c 33 5d  tocols[TLS_SSL3]
84f0: 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23  , -1));.#endif.#
8500: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54  if !defined(NO_T
8510: 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 64  LS1) && !defined
8520: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
8530: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
8540: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45  ENSSL_NO_TLS1_ME
8550: 54 48 4f 44 29 0a 20 20 20 20 54 63 6c 5f 4c 69  THOD).    Tcl_Li
8560: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
8570: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
8580: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
8590: 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c  Obj(protocols[TL
85a0: 53 5f 54 4c 53 31 5d 2c 20 2d 31 29 29 3b 0a 23  S_TLS1], -1));.#
85b0: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e  endif.#if !defin
85c0: 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26  ed(NO_TLS1_1) &&
85d0: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
85e0: 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20  L_NO_TLS1_1) && 
85f0: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
8600: 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d 45 54 48 4f  _NO_TLS1_1_METHO
8610: 44 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  D).    Tcl_ListO
8620: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
8630: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
8640: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
8650: 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54  (protocols[TLS_T
8660: 4c 53 31 5f 31 5d 2c 20 2d 31 29 29 3b 0a 23 65  LS1_1], -1));.#e
8670: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65  ndif.#if !define
8680: 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20  d(NO_TLS1_2) && 
8690: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
86a0: 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21  _NO_TLS1_2) && !
86b0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
86c0: 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 48 4f 44  NO_TLS1_2_METHOD
86d0: 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ).    Tcl_ListOb
86e0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
86f0: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
8700: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
8710: 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c  protocols[TLS_TL
8720: 53 31 5f 32 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e  S1_2], -1));.#en
8730: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64  dif.#if !defined
8740: 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21  (NO_TLS1_3) && !
8750: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
8760: 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 54  NO_TLS1_3).    T
8770: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
8780: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
8790: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  objPtr, Tcl_NewS
87a0: 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f  tringObj(protoco
87b0: 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f 33 5d 2c 20  ls[TLS_TLS1_3], 
87c0: 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  -1));.#endif..  
87d0: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
87e0: 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  lt(interp, objPt
87f0: 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  r);.    return T
8800: 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  CL_OK;.}.../*. *
8810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8850: 2d 2d 2d 0a 20 2a 0a 20 2a 20 48 61 6e 64 73 68  ---. *. * Handsh
8860: 61 6b 65 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a  akeObjCmd --. *.
8870: 20 2a 09 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20   *.This command 
8880: 69 73 20 75 73 65 64 20 74 6f 20 76 65 72 69 66  is used to verif
8890: 79 20 77 68 65 74 68 65 72 20 74 68 65 20 68 61  y whether the ha
88a0: 6e 64 73 68 61 6b 65 20 69 73 20 63 6f 6d 70 6c  ndshake is compl
88b0: 65 74 65 0a 20 2a 09 6f 72 20 6e 6f 74 2e 0a 20  ete. *.or not.. 
88c0: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
88d0: 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20  .A standard Tcl 
88e0: 72 65 73 75 6c 74 2e 20 31 20 6d 65 61 6e 73 20  result. 1 means 
88f0: 68 61 6e 64 73 68 61 6b 65 20 63 6f 6d 70 6c 65  handshake comple
8900: 74 65 2c 20 30 20 6d 65 61 6e 73 20 70 65 6e 64  te, 0 means pend
8910: 69 6e 67 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  ing.. *. * Side 
8920: 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20  effects:. *.May 
8930: 66 6f 72 63 65 20 53 53 4c 20 6e 65 67 6f 74 69  force SSL negoti
8940: 61 74 69 6f 6e 20 74 6f 20 74 61 6b 65 20 70 6c  ation to take pl
8950: 61 63 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  ace.. *. *------
8960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
89a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 48 61 6e  /.static int Han
89b0: 64 73 68 61 6b 65 4f 62 6a 43 6d 64 28 43 6c 69  dshakeObjCmd(Cli
89c0: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
89d0: 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ta, Tcl_Interp *
89e0: 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63  interp, int objc
89f0: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74  , Tcl_Obj *const
8a00: 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54   objv[]) {.    T
8a10: 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b  cl_Channel chan;
8a20: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
8a30: 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20  hannel to set a 
8a40: 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20  mode on. */.    
8a50: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b  State *statePtr;
8a60: 20 20 20 20 20 20 20 20 2f 2a 20 63 6c 69 65 6e          /* clien
8a70: 74 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20  t state for ssl 
8a80: 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 63 6f  socket */.    co
8a90: 6e 73 74 20 63 68 61 72 20 2a 65 72 72 53 74 72  nst char *errStr
8aa0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74   = NULL;.    int
8ab0: 20 72 65 74 20 3d 20 31 3b 0a 20 20 20 20 69 6e   ret = 1;.    in
8ac0: 74 20 65 72 72 20 3d 20 30 3b 0a 20 20 20 20 28  t err = 0;.    (
8ad0: 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 74 61  void) clientData
8ae0: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
8af0: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69  Called");..    i
8b00: 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a  f (objc != 2) {.
8b10: 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67  .Tcl_WrongNumArg
8b20: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
8b30: 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09  v, "channel");..
8b40: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
8b50: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52  ;.    }..    ERR
8b60: 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a  _clear_error();.
8b70: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f  .    chan = Tcl_
8b80: 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72  GetChannel(inter
8b90: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
8ba0: 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29  (objv[1]), NULL)
8bb0: 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d  ;.    if (chan =
8bc0: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20  = (Tcl_Channel) 
8bd0: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20  NULL) {..return 
8be0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
8bf0: 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75  ..    /* Make su
8c00: 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e  re to operate on
8c10: 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61   the topmost cha
8c20: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e  nnel */.    chan
8c30: 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61   = Tcl_GetTopCha
8c40: 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20  nnel(chan);.    
8c50: 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e  if (Tcl_GetChann
8c60: 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20  elType(chan) != 
8c70: 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28  Tls_ChannelType(
8c80: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  )) {..Tcl_Append
8c90: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
8ca0: 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c  bad channel \"",
8cb0: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e   Tcl_GetChannelN
8cc0: 61 6d 65 28 63 68 61 6e 29 2c 0a 09 20 20 20 20  ame(chan),..    
8cd0: 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63  "\": not a TLS c
8ce0: 68 61 6e 6e 65 6c 22 2c 20 28 63 68 61 72 20 2a  hannel", (char *
8cf0: 29 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65  ) NULL);..Tcl_Se
8d00: 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72  tErrorCode(inter
8d10: 70 2c 20 22 54 4c 53 22 2c 20 22 48 41 4e 44 53  p, "TLS", "HANDS
8d20: 48 41 4b 45 22 2c 20 22 43 48 41 4e 4e 45 4c 22  HAKE", "CHANNEL"
8d30: 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68  , "INVALID", (ch
8d40: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65  ar *) NULL);..re
8d50: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
8d60: 20 20 20 20 7d 0a 20 20 20 20 73 74 61 74 65 50      }.    stateP
8d70: 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 54 63  tr = (State *)Tc
8d80: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74  l_GetChannelInst
8d90: 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29 3b 0a  anceData(chan);.
8da0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
8db0: 6c 6c 69 6e 67 20 54 6c 73 5f 57 61 69 74 46 6f  lling Tls_WaitFo
8dc0: 72 43 6f 6e 6e 65 63 74 22 29 3b 0a 20 20 20 20  rConnect");.    
8dd0: 72 65 74 20 3d 20 54 6c 73 5f 57 61 69 74 46 6f  ret = Tls_WaitFo
8de0: 72 43 6f 6e 6e 65 63 74 28 73 74 61 74 65 50 74  rConnect(statePt
8df0: 72 2c 20 26 65 72 72 2c 20 31 29 3b 0a 20 20 20  r, &err, 1);.   
8e00: 20 64 70 72 69 6e 74 66 28 22 54 6c 73 5f 57 61   dprintf("Tls_Wa
8e10: 69 74 46 6f 72 43 6f 6e 6e 65 63 74 20 72 65 74  itForConnect ret
8e20: 75 72 6e 65 64 3a 20 25 69 22 2c 20 72 65 74 29  urned: %i", ret)
8e30: 3b 0a 0a 20 20 20 20 69 66 20 28 72 65 74 20 3c  ;..    if (ret <
8e40: 20 30 20 26 26 20 28 28 73 74 61 74 65 50 74 72   0 && ((statePtr
8e50: 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 43  ->flags & TLS_TC
8e60: 4c 5f 41 53 59 4e 43 29 20 26 26 20 28 65 72 72  L_ASYNC) && (err
8e70: 20 3d 3d 20 45 41 47 41 49 4e 29 29 29 20 7b 0a   == EAGAIN))) {.
8e80: 09 64 70 72 69 6e 74 66 28 22 41 73 79 6e 63 20  .dprintf("Async 
8e90: 73 65 74 20 61 6e 64 20 65 72 72 20 3d 20 45 41  set and err = EA
8ea0: 47 41 49 4e 22 29 3b 0a 09 72 65 74 20 3d 20 30  GAIN");..ret = 0
8eb0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ;.    } else if 
8ec0: 28 72 65 74 20 3c 20 30 29 20 7b 0a 09 6c 6f 6e  (ret < 0) {..lon
8ed0: 67 20 72 65 73 75 6c 74 3b 0a 09 65 72 72 53 74  g result;..errSt
8ee0: 72 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 65 72  r = statePtr->er
8ef0: 72 3b 0a 09 54 63 6c 5f 52 65 73 65 74 52 65 73  r;..Tcl_ResetRes
8f00: 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 54 63  ult(interp);..Tc
8f10: 6c 5f 53 65 74 45 72 72 6e 6f 28 65 72 72 29 3b  l_SetErrno(err);
8f20: 0a 0a 09 69 66 20 28 21 65 72 72 53 74 72 20 7c  ...if (!errStr |
8f30: 7c 20 28 2a 65 72 72 53 74 72 20 3d 3d 20 30 29  | (*errStr == 0)
8f40: 29 20 7b 0a 09 20 20 20 20 65 72 72 53 74 72 20  ) {..    errStr 
8f50: 3d 20 54 63 6c 5f 50 6f 73 69 78 45 72 72 6f 72  = Tcl_PosixError
8f60: 28 69 6e 74 65 72 70 29 3b 0a 09 7d 0a 0a 09 54  (interp);..}...T
8f70: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
8f80: 69 6e 74 65 72 70 2c 20 22 68 61 6e 64 73 68 61  interp, "handsha
8f90: 6b 65 20 66 61 69 6c 65 64 3a 20 22 2c 20 65 72  ke failed: ", er
8fa0: 72 53 74 72 2c 20 28 63 68 61 72 20 2a 29 20 4e  rStr, (char *) N
8fb0: 55 4c 4c 29 3b 0a 09 69 66 20 28 28 72 65 73 75  ULL);..if ((resu
8fc0: 6c 74 20 3d 20 53 53 4c 5f 67 65 74 5f 76 65 72  lt = SSL_get_ver
8fd0: 69 66 79 5f 72 65 73 75 6c 74 28 73 74 61 74 65  ify_result(state
8fe0: 50 74 72 2d 3e 73 73 6c 29 29 20 21 3d 20 58 35  Ptr->ssl)) != X5
8ff0: 30 39 5f 56 5f 4f 4b 29 20 7b 0a 09 20 20 20 20  09_V_OK) {..    
9000: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
9010: 28 69 6e 74 65 72 70 2c 20 22 20 64 75 65 20 74  (interp, " due t
9020: 6f 20 5c 22 22 2c 20 58 35 30 39 5f 76 65 72 69  o \"", X509_veri
9030: 66 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73 74  fy_cert_error_st
9040: 72 69 6e 67 28 72 65 73 75 6c 74 29 2c 20 22 5c  ring(result), "\
9050: 22 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  "", (char *) NUL
9060: 4c 29 3b 0a 09 7d 0a 09 54 63 6c 5f 53 65 74 45  L);..}..Tcl_SetE
9070: 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  rrorCode(interp,
9080: 20 22 54 4c 53 22 2c 20 22 48 41 4e 44 53 48 41   "TLS", "HANDSHA
9090: 4b 45 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28  KE", "FAILED", (
90a0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
90b0: 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69  dprintf("Returni
90c0: 6e 67 20 54 43 4c 5f 45 52 52 4f 52 20 77 69 74  ng TCL_ERROR wit
90d0: 68 20 68 61 6e 64 73 68 61 6b 65 20 66 61 69 6c  h handshake fail
90e0: 65 64 3a 20 25 73 22 2c 20 65 72 72 53 74 72 29  ed: %s", errStr)
90f0: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
9100: 52 4f 52 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  ROR;.    } else 
9110: 7b 0a 09 69 66 20 28 65 72 72 20 21 3d 20 30 29  {..if (err != 0)
9120: 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28   {..    dprintf(
9130: 22 47 6f 74 20 61 6e 20 65 72 72 6f 72 20 77 69  "Got an error wi
9140: 74 68 20 61 20 63 6f 6d 70 6c 65 74 65 64 20 68  th a completed h
9150: 61 6e 64 73 68 61 6b 65 3a 20 65 72 72 20 3d 20  andshake: err = 
9160: 25 69 22 2c 20 65 72 72 29 3b 0a 09 7d 0a 09 72  %i", err);..}..r
9170: 65 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20  et = 1;.    }.. 
9180: 20 20 20 64 70 72 69 6e 74 66 28 22 52 65 74 75     dprintf("Retu
9190: 72 6e 69 6e 67 20 54 43 4c 5f 4f 4b 20 77 69 74  rning TCL_OK wit
91a0: 68 20 64 61 74 61 20 5c 22 25 69 5c 22 22 2c 20  h data \"%i\"", 
91b0: 72 65 74 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65  ret);.    Tcl_Se
91c0: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
91d0: 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
91e0: 28 72 65 74 29 29 3b 0a 20 20 20 20 72 65 74 75  (ret));.    retu
91f0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f  rn TCL_OK;.}.../
9200: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
9210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9240: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 49 6d  -------. *. * Im
9250: 70 6f 72 74 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a  portObjCmd --. *
9260: 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75  . *.This procedu
9270: 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f  re is invoked to
9280: 20 70 72 6f 63 65 73 73 20 74 68 65 20 22 73 73   process the "ss
9290: 6c 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 0a 20 2a  l" command. *. *
92a0: 09 54 68 65 20 73 73 6c 20 63 6f 6d 6d 61 6e 64  .The ssl command
92b0: 20 70 75 73 68 65 73 20 53 53 4c 20 6f 76 65 72   pushes SSL over
92c0: 20 61 20 28 6e 65 77 6c 79 20 63 6f 6e 6e 65 63   a (newly connec
92d0: 74 65 64 29 20 74 63 70 20 73 6f 63 6b 65 74 0a  ted) tcp socket.
92e0: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
92f0: 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c  *.A standard Tcl
9300: 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53   result.. *. * S
9310: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
9320: 4d 61 79 20 6d 6f 64 69 66 79 20 74 68 65 20 62  May modify the b
9330: 65 68 61 76 69 6f 72 20 6f 66 20 61 6e 20 49 4f  ehavior of an IO
9340: 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d   channel.. *. *-
9350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9390: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  --. */.static in
93a0: 74 0a 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 28 43  t.ImportObjCmd(C
93b0: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
93c0: 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70  Data, Tcl_Interp
93d0: 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62   *interp, int ob
93e0: 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e  jc, Tcl_Obj *con
93f0: 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20  st objv[]) {.   
9400: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61   Tcl_Channel cha
9410: 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e  n;../* The chann
9420: 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65  el to set a mode
9430: 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53 74 61 74   on. */.    Stat
9440: 65 20 2a 73 74 61 74 65 50 74 72 3b 09 09 2f 2a  e *statePtr;../*
9450: 20 63 6c 69 65 6e 74 20 73 74 61 74 65 20 66 6f   client state fo
9460: 72 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a  r ssl socket */.
9470: 20 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 74 78      SSL_CTX *ctx
9480: 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63  ..= NULL;.    Tc
9490: 6c 5f 4f 62 6a 20 2a 73 63 72 69 70 74 09 09 3d  l_Obj *script..=
94a0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f   NULL;.    Tcl_O
94b0: 62 6a 20 2a 70 61 73 73 77 6f 72 64 09 09 3d 20  bj *password..= 
94c0: 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62  NULL;.    Tcl_Ob
94d0: 6a 20 2a 76 63 6d 64 09 09 3d 20 4e 55 4c 4c 3b  j *vcmd..= NULL;
94e0: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
94f0: 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61   upperChannelTra
9500: 6e 73 6c 61 74 69 6f 6e 2c 20 75 70 70 65 72 43  nslation, upperC
9510: 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 2c 20  hannelBlocking, 
9520: 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f  upperChannelEnco
9530: 64 69 6e 67 2c 20 75 70 70 65 72 43 68 61 6e 6e  ding, upperChann
9540: 65 6c 45 4f 46 43 68 61 72 3b 0a 20 20 20 20 69  elEOFChar;.    i
9550: 6e 74 20 69 64 78 3b 0a 20 20 20 20 54 63 6c 5f  nt idx;.    Tcl_
9560: 53 69 7a 65 20 6c 65 6e 3b 0a 20 20 20 20 69 6e  Size len;.    in
9570: 74 20 66 6c 61 67 73 09 09 09 3d 20 54 4c 53 5f  t flags...= TLS_
9580: 54 43 4c 5f 49 4e 49 54 3b 0a 20 20 20 20 69 6e  TCL_INIT;.    in
9590: 74 20 73 65 72 76 65 72 09 09 09 3d 20 30 3b 09  t server...= 0;.
95a0: 2f 2a 20 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e  /* is connection
95b0: 20 69 6e 63 6f 6d 69 6e 67 20 6f 72 20 6f 75 74   incoming or out
95c0: 67 6f 69 6e 67 3f 20 2a 2f 0a 20 20 20 20 63 68  going? */.    ch
95d0: 61 72 20 2a 6b 65 79 66 69 6c 65 09 09 3d 20 4e  ar *keyfile..= N
95e0: 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 63  ULL;.    char *c
95f0: 65 72 74 66 69 6c 65 09 09 3d 20 4e 55 4c 4c 3b  ertfile..= NULL;
9600: 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68  .    unsigned ch
9610: 61 72 20 2a 6b 65 79 09 09 3d 20 4e 55 4c 4c 3b  ar *key..= NULL;
9620: 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 6b 65  .    Tcl_Size ke
9630: 79 5f 6c 65 6e 09 09 3d 20 30 3b 0a 20 20 20 20  y_len..= 0;.    
9640: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 63  unsigned char *c
9650: 65 72 74 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20  ert..= NULL;.   
9660: 20 54 63 6c 5f 53 69 7a 65 20 63 65 72 74 5f 6c   Tcl_Size cert_l
9670: 65 6e 09 09 3d 20 30 3b 0a 20 20 20 20 63 68 61  en..= 0;.    cha
9680: 72 20 2a 63 69 70 68 65 72 73 09 09 3d 20 4e 55  r *ciphers..= NU
9690: 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 69  LL;.    char *ci
96a0: 70 68 65 72 73 75 69 74 65 73 09 09 3d 20 4e 55  phersuites..= NU
96b0: 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 43 41  LL;.    char *CA
96c0: 66 69 6c 65 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20  file..= NULL;.  
96d0: 20 20 63 68 61 72 20 2a 43 41 70 61 74 68 09 09    char *CApath..
96e0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72  = NULL;.    char
96f0: 20 2a 43 41 73 74 6f 72 65 09 09 3d 20 4e 55 4c   *CAstore..= NUL
9700: 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 44 48 70  L;.    char *DHp
9710: 61 72 61 6d 73 09 09 3d 20 4e 55 4c 4c 3b 0a 20  arams..= NULL;. 
9720: 20 20 20 63 68 61 72 20 2a 6d 6f 64 65 6c 09 09     char *model..
9730: 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61  .= NULL;.    cha
9740: 72 20 2a 73 65 72 76 65 72 6e 61 6d 65 09 09 3d  r *servername..=
9750: 20 4e 55 4c 4c 3b 09 2f 2a 20 68 6f 73 74 6e 61   NULL;./* hostna
9760: 6d 65 20 66 6f 72 20 53 65 72 76 65 72 20 4e 61  me for Server Na
9770: 6d 65 20 49 6e 64 69 63 61 74 69 6f 6e 20 2a 2f  me Indication */
9780: 0a 20 20 20 20 63 68 61 72 20 2a 73 65 73 73 69  .    char *sessi
9790: 6f 6e 5f 69 64 09 09 3d 20 4e 55 4c 4c 3b 0a 20  on_id..= NULL;. 
97a0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 61 6c 70 6e     Tcl_Obj *alpn
97b0: 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e  ..= NULL;.    in
97c0: 74 20 73 73 6c 32 20 3d 20 30 2c 20 73 73 6c 33  t ssl2 = 0, ssl3
97d0: 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 6c   = 0;.    int tl
97e0: 73 31 20 3d 20 31 2c 20 74 6c 73 31 5f 31 20 3d  s1 = 1, tls1_1 =
97f0: 20 31 2c 20 74 6c 73 31 5f 32 20 3d 20 31 2c 20   1, tls1_2 = 1, 
9800: 74 6c 73 31 5f 33 20 3d 20 31 3b 0a 20 20 20 20  tls1_3 = 1;.    
9810: 69 6e 74 20 70 72 6f 74 6f 20 3d 20 30 2c 20 6c  int proto = 0, l
9820: 65 76 65 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 69  evel = -1;.    i
9830: 6e 74 20 76 65 72 69 66 79 20 3d 20 30 2c 20 72  nt verify = 0, r
9840: 65 71 75 69 72 65 20 3d 20 30 2c 20 72 65 71 75  equire = 0, requ
9850: 65 73 74 20 3d 20 31 2c 20 70 6f 73 74 5f 68 61  est = 1, post_ha
9860: 6e 64 73 68 61 6b 65 20 3d 20 30 3b 0a 20 20 20  ndshake = 0;.   
9870: 20 28 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 61   (void) clientDa
9880: 74 61 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66  ta;..    dprintf
9890: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66  ("Called");..#if
98a0: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31   defined(NO_TLS1
98b0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45  ) || defined(OPE
98c0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 20 20  NSSL_NO_TLS1).  
98d0: 20 20 74 6c 73 31 20 3d 20 30 3b 0a 23 65 6e 64    tls1 = 0;.#end
98e0: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e  if.#if defined(N
98f0: 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66  O_TLS1_1) || def
9900: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
9910: 54 4c 53 31 5f 31 29 0a 20 20 20 20 74 6c 73 31  TLS1_1).    tls1
9920: 5f 31 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23  _1 = 0;.#endif.#
9930: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  if defined(NO_TL
9940: 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64  S1_2) || defined
9950: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
9960: 5f 32 29 0a 20 20 20 20 74 6c 73 31 5f 32 20 3d  _2).    tls1_2 =
9970: 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64   0;.#endif.#if d
9980: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33  efined(NO_TLS1_3
9990: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45  ) || defined(OPE
99a0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a  NSSL_NO_TLS1_3).
99b0: 20 20 20 20 74 6c 73 31 5f 33 20 3d 20 30 3b 0a      tls1_3 = 0;.
99c0: 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 20 28  #endif..    if (
99d0: 6f 62 6a 63 20 3c 20 32 29 20 7b 0a 09 54 63 6c  objc < 2) {..Tcl
99e0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
99f0: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
9a00: 63 68 61 6e 6e 65 6c 20 3f 6f 70 74 69 6f 6e 73  channel ?options
9a10: 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  ?");..return TCL
9a20: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
9a30: 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72     ERR_clear_err
9a40: 6f 72 28 29 3b 0a 0a 20 20 20 20 63 68 61 6e 20  or();..    chan 
9a50: 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  = Tcl_GetChannel
9a60: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
9a70: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
9a80: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28   NULL);.    if (
9a90: 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61  chan == (Tcl_Cha
9aa0: 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72  nnel) NULL) {..r
9ab0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
9ac0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d  .    }..    /* M
9ad0: 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72  ake sure to oper
9ae0: 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f  ate on the topmo
9af0: 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20  st channel */.  
9b00: 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74    chan = Tcl_Get
9b10: 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29  TopChannel(chan)
9b20: 3b 0a 0a 20 20 20 20 66 6f 72 20 28 69 64 78 20  ;..    for (idx 
9b30: 3d 20 32 3b 20 69 64 78 20 3c 20 6f 62 6a 63 3b  = 2; idx < objc;
9b40: 20 69 64 78 2b 2b 29 20 7b 0a 09 63 68 61 72 20   idx++) {..char 
9b50: 2a 6f 70 74 20 3d 20 54 63 6c 5f 47 65 74 53 74  *opt = Tcl_GetSt
9b60: 72 69 6e 67 28 6f 62 6a 76 5b 69 64 78 5d 29 3b  ring(objv[idx]);
9b70: 0a 0a 09 69 66 20 28 6f 70 74 5b 30 5d 20 21 3d  ...if (opt[0] !=
9b80: 20 27 2d 27 29 0a 09 20 20 20 20 62 72 65 61 6b   '-')..    break
9b90: 3b 0a 0a 09 4f 50 54 4f 42 4a 28 22 2d 61 6c 70  ;...OPTOBJ("-alp
9ba0: 6e 22 2c 20 61 6c 70 6e 29 3b 0a 09 4f 50 54 53  n", alpn);..OPTS
9bb0: 54 52 28 22 2d 63 61 64 69 72 22 2c 20 43 41 70  TR("-cadir", CAp
9bc0: 61 74 68 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d  ath);..OPTSTR("-
9bd0: 63 61 66 69 6c 65 22 2c 20 43 41 66 69 6c 65 29  cafile", CAfile)
9be0: 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 61 73 74  ;..OPTSTR("-cast
9bf0: 6f 72 65 22 2c 20 43 41 73 74 6f 72 65 29 3b 0a  ore", CAstore);.
9c00: 09 4f 50 54 42 59 54 45 28 22 2d 63 65 72 74 22  .OPTBYTE("-cert"
9c10: 2c 20 63 65 72 74 2c 20 63 65 72 74 5f 6c 65 6e  , cert, cert_len
9c20: 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 65 72  );..OPTSTR("-cer
9c30: 74 66 69 6c 65 22 2c 20 63 65 72 74 66 69 6c 65  tfile", certfile
9c40: 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 69 70  );..OPTSTR("-cip
9c50: 68 65 72 22 2c 20 63 69 70 68 65 72 73 29 3b 0a  her", ciphers);.
9c60: 09 4f 50 54 53 54 52 28 22 2d 63 69 70 68 65 72  .OPTSTR("-cipher
9c70: 73 22 2c 20 63 69 70 68 65 72 73 29 3b 0a 09 4f  s", ciphers);..O
9c80: 50 54 53 54 52 28 22 2d 63 69 70 68 65 72 73 75  PTSTR("-ciphersu
9c90: 69 74 65 73 22 2c 20 63 69 70 68 65 72 73 75 69  ites", ciphersui
9ca0: 74 65 73 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d  tes);..OPTOBJ("-
9cb0: 63 6f 6d 6d 61 6e 64 22 2c 20 73 63 72 69 70 74  command", script
9cc0: 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 64 68 70  );..OPTSTR("-dhp
9cd0: 61 72 61 6d 73 22 2c 20 44 48 70 61 72 61 6d 73  arams", DHparams
9ce0: 29 3b 0a 09 4f 50 54 42 59 54 45 28 22 2d 6b 65  );..OPTBYTE("-ke
9cf0: 79 22 2c 20 6b 65 79 2c 20 6b 65 79 5f 6c 65 6e  y", key, key_len
9d00: 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 6b 65 79  );..OPTSTR("-key
9d10: 66 69 6c 65 22 2c 20 6b 65 79 66 69 6c 65 29 3b  file", keyfile);
9d20: 0a 09 4f 50 54 53 54 52 28 22 2d 6d 6f 64 65 6c  ..OPTSTR("-model
9d30: 22 2c 20 6d 6f 64 65 6c 29 3b 0a 09 4f 50 54 4f  ", model);..OPTO
9d40: 42 4a 28 22 2d 70 61 73 73 77 6f 72 64 22 2c 20  BJ("-password", 
9d50: 70 61 73 73 77 6f 72 64 29 3b 0a 09 4f 50 54 42  password);..OPTB
9d60: 4f 4f 4c 28 22 2d 70 6f 73 74 5f 68 61 6e 64 73  OOL("-post_hands
9d70: 68 61 6b 65 22 2c 20 70 6f 73 74 5f 68 61 6e 64  hake", post_hand
9d80: 73 68 61 6b 65 29 3b 0a 09 4f 50 54 42 4f 4f 4c  shake);..OPTBOOL
9d90: 28 22 2d 72 65 71 75 65 73 74 22 2c 20 72 65 71  ("-request", req
9da0: 75 65 73 74 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28  uest);..OPTBOOL(
9db0: 22 2d 72 65 71 75 69 72 65 22 2c 20 72 65 71 75  "-require", requ
9dc0: 69 72 65 29 3b 0a 09 4f 50 54 49 4e 54 28 22 2d  ire);..OPTINT("-
9dd0: 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 22 2c  security_level",
9de0: 20 6c 65 76 65 6c 29 3b 0a 09 4f 50 54 42 4f 4f   level);..OPTBOO
9df0: 4c 28 22 2d 73 65 72 76 65 72 22 2c 20 73 65 72  L("-server", ser
9e00: 76 65 72 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d  ver);..OPTSTR("-
9e10: 73 65 72 76 65 72 6e 61 6d 65 22 2c 20 73 65 72  servername", ser
9e20: 76 65 72 6e 61 6d 65 29 3b 0a 09 4f 50 54 53 54  vername);..OPTST
9e30: 52 28 22 2d 73 65 73 73 69 6f 6e 5f 69 64 22 2c  R("-session_id",
9e40: 20 73 65 73 73 69 6f 6e 5f 69 64 29 3b 0a 09 4f   session_id);..O
9e50: 50 54 42 4f 4f 4c 28 22 2d 73 73 6c 32 22 2c 20  PTBOOL("-ssl2", 
9e60: 73 73 6c 32 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28  ssl2);..OPTBOOL(
9e70: 22 2d 73 73 6c 33 22 2c 20 73 73 6c 33 29 3b 0a  "-ssl3", ssl3);.
9e80: 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 22  .OPTBOOL("-tls1"
9e90: 2c 20 74 6c 73 31 29 3b 0a 09 4f 50 54 42 4f 4f  , tls1);..OPTBOO
9ea0: 4c 28 22 2d 74 6c 73 31 2e 31 22 2c 20 74 6c 73  L("-tls1.1", tls
9eb0: 31 5f 31 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22  1_1);..OPTBOOL("
9ec0: 2d 74 6c 73 31 2e 32 22 2c 20 74 6c 73 31 5f 32  -tls1.2", tls1_2
9ed0: 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c  );..OPTBOOL("-tl
9ee0: 73 31 2e 33 22 2c 20 74 6c 73 31 5f 33 29 3b 0a  s1.3", tls1_3);.
9ef0: 09 4f 50 54 4f 42 4a 28 22 2d 76 61 6c 69 64 61  .OPTOBJ("-valida
9f00: 74 65 63 6f 6d 6d 61 6e 64 22 2c 20 76 63 6d 64  tecommand", vcmd
9f10: 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 76 63 6d  );..OPTOBJ("-vcm
9f20: 64 22 2c 20 76 63 6d 64 29 3b 0a 0a 09 4f 50 54  d", vcmd);...OPT
9f30: 42 41 44 28 22 6f 70 74 69 6f 6e 22 2c 20 22 2d  BAD("option", "-
9f40: 61 6c 70 6e 2c 20 2d 63 61 64 69 72 2c 20 2d 63  alpn, -cadir, -c
9f50: 61 66 69 6c 65 2c 20 2d 63 61 73 74 6f 72 65 2c  afile, -castore,
9f60: 20 2d 63 65 72 74 2c 20 2d 63 65 72 74 66 69 6c   -cert, -certfil
9f70: 65 2c 20 2d 63 69 70 68 65 72 2c 20 2d 63 69 70  e, -cipher, -cip
9f80: 68 65 72 73 75 69 74 65 73 2c 20 2d 63 6f 6d 6d  hersuites, -comm
9f90: 61 6e 64 2c 20 2d 64 68 70 61 72 61 6d 73 2c 20  and, -dhparams, 
9fa0: 2d 6b 65 79 2c 20 2d 6b 65 79 66 69 6c 65 2c 20  -key, -keyfile, 
9fb0: 2d 6d 6f 64 65 6c 2c 20 2d 70 61 73 73 77 6f 72  -model, -passwor
9fc0: 64 2c 20 2d 70 6f 73 74 5f 68 61 6e 64 73 68 61  d, -post_handsha
9fd0: 6b 65 2c 20 2d 72 65 71 75 65 73 74 2c 20 2d 72  ke, -request, -r
9fe0: 65 71 75 69 72 65 2c 20 2d 73 65 63 75 72 69 74  equire, -securit
9ff0: 79 5f 6c 65 76 65 6c 2c 20 2d 73 65 72 76 65 72  y_level, -server
a000: 2c 20 2d 73 65 72 76 65 72 6e 61 6d 65 2c 20 2d  , -servername, -
a010: 73 65 73 73 69 6f 6e 5f 69 64 2c 20 2d 73 73 6c  session_id, -ssl
a020: 32 2c 20 2d 73 73 6c 33 2c 20 2d 74 6c 73 31 2c  2, -ssl3, -tls1,
a030: 20 2d 74 6c 73 31 2e 31 2c 20 2d 74 6c 73 31 2e   -tls1.1, -tls1.
a040: 32 2c 20 2d 74 6c 73 31 2e 33 2c 20 6f 72 20 2d  2, -tls1.3, or -
a050: 76 61 6c 69 64 61 74 65 63 6f 6d 6d 61 6e 64 22  validatecommand"
a060: 29 3b 0a 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  );...return TCL_
a070: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
a080: 20 69 66 20 28 72 65 71 75 65 73 74 29 09 09 76   if (request)..v
a090: 65 72 69 66 79 20 7c 3d 20 53 53 4c 5f 56 45 52  erify |= SSL_VER
a0a0: 49 46 59 5f 43 4c 49 45 4e 54 5f 4f 4e 43 45 20  IFY_CLIENT_ONCE 
a0b0: 7c 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 45 45  | SSL_VERIFY_PEE
a0c0: 52 3b 0a 20 20 20 20 69 66 20 28 72 65 71 75 65  R;.    if (reque
a0d0: 73 74 20 26 26 20 72 65 71 75 69 72 65 29 09 76  st && require).v
a0e0: 65 72 69 66 79 20 7c 3d 20 53 53 4c 5f 56 45 52  erify |= SSL_VER
a0f0: 49 46 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50  IFY_FAIL_IF_NO_P
a100: 45 45 52 5f 43 45 52 54 3b 0a 20 20 20 20 69 66  EER_CERT;.    if
a110: 20 28 72 65 71 75 65 73 74 20 26 26 20 70 6f 73   (request && pos
a120: 74 5f 68 61 6e 64 73 68 61 6b 65 29 09 76 65 72  t_handshake).ver
a130: 69 66 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46  ify |= SSL_VERIF
a140: 59 5f 50 4f 53 54 5f 48 41 4e 44 53 48 41 4b 45  Y_POST_HANDSHAKE
a150: 3b 0a 20 20 20 20 69 66 20 28 76 65 72 69 66 79  ;.    if (verify
a160: 20 3d 3d 20 30 29 09 09 76 65 72 69 66 79 20 3d   == 0)..verify =
a170: 20 53 53 4c 5f 56 45 52 49 46 59 5f 4e 4f 4e 45   SSL_VERIFY_NONE
a180: 3b 0a 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20  ;..    proto |= 
a190: 28 73 73 6c 32 20 3f 20 54 4c 53 5f 50 52 4f 54  (ssl2 ? TLS_PROT
a1a0: 4f 5f 53 53 4c 32 20 3a 20 30 29 3b 0a 20 20 20  O_SSL2 : 0);.   
a1b0: 20 70 72 6f 74 6f 20 7c 3d 20 28 73 73 6c 33 20   proto |= (ssl3 
a1c0: 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33  ? TLS_PROTO_SSL3
a1d0: 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f   : 0);.    proto
a1e0: 20 7c 3d 20 28 74 6c 73 31 20 3f 20 54 4c 53 5f   |= (tls1 ? TLS_
a1f0: 50 52 4f 54 4f 5f 54 4c 53 31 20 3a 20 30 29 3b  PROTO_TLS1 : 0);
a200: 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74  .    proto |= (t
a210: 6c 73 31 5f 31 20 3f 20 54 4c 53 5f 50 52 4f 54  ls1_1 ? TLS_PROT
a220: 4f 5f 54 4c 53 31 5f 31 20 3a 20 30 29 3b 0a 20  O_TLS1_1 : 0);. 
a230: 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73     proto |= (tls
a240: 31 5f 32 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f  1_2 ? TLS_PROTO_
a250: 54 4c 53 31 5f 32 20 3a 20 30 29 3b 0a 20 20 20  TLS1_2 : 0);.   
a260: 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f   proto |= (tls1_
a270: 33 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c  3 ? TLS_PROTO_TL
a280: 53 31 5f 33 20 3a 20 30 29 3b 0a 0a 20 20 20 20  S1_3 : 0);..    
a290: 2f 2a 20 72 65 73 65 74 20 74 6f 20 4e 55 4c 4c  /* reset to NULL
a2a0: 20 69 66 20 62 6c 61 6e 6b 20 73 74 72 69 6e 67   if blank string
a2b0: 20 70 72 6f 76 69 64 65 64 20 2a 2f 0a 20 20 20   provided */.   
a2c0: 20 69 66 20 28 63 65 72 74 20 26 26 20 21 2a 63   if (cert && !*c
a2d0: 65 72 74 29 09 09 20 20 20 20 20 20 20 20 63 65  ert)..        ce
a2e0: 72 74 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c  rt.        = NUL
a2f0: 4c 3b 0a 20 20 20 20 69 66 20 28 6b 65 79 20 26  L;.    if (key &
a300: 26 20 21 2a 6b 65 79 29 09 09 20 20 20 20 20 20  & !*key)..      
a310: 20 20 6b 65 79 09 20 20 20 20 20 20 20 20 3d 20    key.        = 
a320: 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63 65  NULL;.    if (ce
a330: 72 74 66 69 6c 65 20 26 26 20 21 2a 63 65 72 74  rtfile && !*cert
a340: 66 69 6c 65 29 20 20 20 20 20 20 20 20 20 63 65  file)         ce
a350: 72 74 66 69 6c 65 09 3d 20 4e 55 4c 4c 3b 0a 20  rtfile.= NULL;. 
a360: 20 20 20 69 66 20 28 6b 65 79 66 69 6c 65 20 26     if (keyfile &
a370: 26 20 21 2a 6b 65 79 66 69 6c 65 29 09 09 6b 65  & !*keyfile)..ke
a380: 79 66 69 6c 65 09 20 20 20 20 20 20 20 20 3d 20  yfile.        = 
a390: 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63 69  NULL;.    if (ci
a3a0: 70 68 65 72 73 20 26 26 20 21 2a 63 69 70 68 65  phers && !*ciphe
a3b0: 72 73 29 09 20 20 20 20 20 20 20 20 63 69 70 68  rs).        ciph
a3c0: 65 72 73 09 20 20 20 20 20 20 20 20 3d 20 4e 55  ers.        = NU
a3d0: 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63 69 70 68  LL;.    if (ciph
a3e0: 65 72 73 75 69 74 65 73 20 26 26 20 21 2a 63 69  ersuites && !*ci
a3f0: 70 68 65 72 73 75 69 74 65 73 29 20 63 69 70 68  phersuites) ciph
a400: 65 72 73 75 69 74 65 73 20 20 20 20 3d 20 4e 55  ersuites    = NU
a410: 4c 4c 3b 0a 20 20 20 20 69 66 20 28 43 41 66 69  LL;.    if (CAfi
a420: 6c 65 20 26 26 20 21 2a 43 41 66 69 6c 65 29 09  le && !*CAfile).
a430: 20 20 20 20 20 20 20 20 43 41 66 69 6c 65 09 20          CAfile. 
a440: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20         = NULL;. 
a450: 20 20 20 69 66 20 28 43 41 70 61 74 68 20 26 26     if (CApath &&
a460: 20 21 2a 43 41 70 61 74 68 29 09 20 20 20 20 20   !*CApath).     
a470: 20 20 20 43 41 70 61 74 68 09 20 20 20 20 20 20     CApath.      
a480: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66    = NULL;.    if
a490: 20 28 43 41 73 74 6f 72 65 20 26 26 20 21 2a 43   (CAstore && !*C
a4a0: 41 73 74 6f 72 65 29 09 20 20 20 20 20 20 20 20  Astore).        
a4b0: 43 41 73 74 6f 72 65 09 20 20 20 20 20 20 20 20  CAstore.        
a4c0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28  = NULL;.    if (
a4d0: 44 48 70 61 72 61 6d 73 20 26 26 20 21 2a 44 48  DHparams && !*DH
a4e0: 70 61 72 61 6d 73 29 09 20 20 20 20 20 20 20 20  params).        
a4f0: 44 48 70 61 72 61 6d 73 20 20 20 20 20 20 20 20  DHparams        
a500: 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 2f 2a 20  = NULL;..    /* 
a510: 6e 65 77 20 53 53 4c 20 73 74 61 74 65 20 2a 2f  new SSL state */
a520: 0a 20 20 20 20 73 74 61 74 65 50 74 72 09 09 3d  .    statePtr..=
a530: 20 28 53 74 61 74 65 20 2a 29 20 63 6b 61 6c 6c   (State *) ckall
a540: 6f 63 28 28 75 6e 73 69 67 6e 65 64 29 20 73 69  oc((unsigned) si
a550: 7a 65 6f 66 28 53 74 61 74 65 29 29 3b 0a 20 20  zeof(State));.  
a560: 20 20 6d 65 6d 73 65 74 28 73 74 61 74 65 50 74    memset(statePt
a570: 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 53 74 61  r, 0, sizeof(Sta
a580: 74 65 29 29 3b 0a 0a 20 20 20 20 73 74 61 74 65  te));..    state
a590: 50 74 72 2d 3e 66 6c 61 67 73 09 3d 20 66 6c 61  Ptr->flags.= fla
a5a0: 67 73 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72  gs;.    statePtr
a5b0: 2d 3e 69 6e 74 65 72 70 09 3d 20 69 6e 74 65 72  ->interp.= inter
a5c0: 70 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d  p;.    statePtr-
a5d0: 3e 77 61 6e 74 09 3d 20 30 3b 0a 20 20 20 20 73  >want.= 0;.    s
a5e0: 74 61 74 65 50 74 72 2d 3e 76 66 6c 61 67 73 09  tatePtr->vflags.
a5f0: 3d 20 76 65 72 69 66 79 3b 0a 20 20 20 20 73 74  = verify;.    st
a600: 61 74 65 50 74 72 2d 3e 65 72 72 09 3d 20 22 22  atePtr->err.= ""
a610: 3b 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61  ;..    /* alloca
a620: 74 65 20 73 63 72 69 70 74 20 2a 2f 0a 20 20 20  te script */.   
a630: 20 69 66 20 28 73 63 72 69 70 74 29 20 7b 0a 09   if (script) {..
a640: 28 76 6f 69 64 29 20 54 63 6c 5f 47 65 74 53 74  (void) Tcl_GetSt
a650: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 73 63 72 69  ringFromObj(scri
a660: 70 74 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20 28  pt, &len);..if (
a670: 6c 65 6e 29 20 7b 0a 09 20 20 20 20 73 74 61 74  len) {..    stat
a680: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d  ePtr->callback =
a690: 20 73 63 72 69 70 74 3b 0a 09 20 20 20 20 54 63   script;..    Tc
a6a0: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 73  l_IncrRefCount(s
a6b0: 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63  tatePtr->callbac
a6c0: 6b 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20  k);..}.    }..  
a6d0: 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 70 61    /* allocate pa
a6e0: 73 73 77 6f 72 64 20 2a 2f 0a 20 20 20 20 69 66  ssword */.    if
a6f0: 20 28 70 61 73 73 77 6f 72 64 29 20 7b 0a 09 28   (password) {..(
a700: 76 6f 69 64 29 20 54 63 6c 5f 47 65 74 53 74 72  void) Tcl_GetStr
a710: 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 61 73 73 77  ingFromObj(passw
a720: 6f 72 64 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20  ord, &len);..if 
a730: 28 6c 65 6e 29 20 7b 0a 09 20 20 20 20 73 74 61  (len) {..    sta
a740: 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 20  tePtr->password 
a750: 3d 20 70 61 73 73 77 6f 72 64 3b 0a 09 20 20 20  = password;..   
a760: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
a770: 74 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73  t(statePtr->pass
a780: 77 6f 72 64 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a  word);..}.    }.
a790: 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65  .    /* allocate
a7a0: 20 76 61 6c 69 64 61 74 65 20 63 6f 6d 6d 61 6e   validate comman
a7b0: 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 76 63 6d  d */.    if (vcm
a7c0: 64 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c  d) {..(void) Tcl
a7d0: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
a7e0: 6a 28 76 63 6d 64 2c 20 26 6c 65 6e 29 3b 0a 09  j(vcmd, &len);..
a7f0: 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20 20 20 20  if (len) {..    
a800: 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d  statePtr->vcmd =
a810: 20 76 63 6d 64 3b 0a 09 20 20 20 20 54 63 6c 5f   vcmd;..    Tcl_
a820: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61  IncrRefCount(sta
a830: 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 09 7d  tePtr->vcmd);..}
a840: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28  .    }..    if (
a850: 6d 6f 64 65 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b  model != NULL) {
a860: 0a 09 69 6e 74 20 6d 6f 64 65 3b 0a 09 2f 2a 20  ..int mode;../* 
a870: 47 65 74 20 74 68 65 20 22 6d 6f 64 65 6c 22 20  Get the "model" 
a880: 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 63 68 61 6e  context */..chan
a890: 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65   = Tcl_GetChanne
a8a0: 6c 28 69 6e 74 65 72 70 2c 20 6d 6f 64 65 6c 2c  l(interp, model,
a8b0: 20 26 6d 6f 64 65 29 3b 0a 09 69 66 20 28 63 68   &mode);..if (ch
a8c0: 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e  an == (Tcl_Chann
a8d0: 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20  el) NULL) {..   
a8e0: 20 54 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f 66   Tls_Free((tls_f
a8f0: 72 65 65 5f 74 79 70 65 20 2a 29 20 73 74 61 74  ree_type *) stat
a900: 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75  ePtr);..    retu
a910: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d  rn TCL_ERROR;..}
a920: 0a 0a 09 2f 2a 0a 09 20 2a 20 4d 61 6b 65 20 73  .../*.. * Make s
a930: 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f  ure to operate o
a940: 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68  n the topmost ch
a950: 61 6e 6e 65 6c 0a 09 20 2a 2f 0a 09 63 68 61 6e  annel.. */..chan
a960: 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61   = Tcl_GetTopCha
a970: 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 09 69 66 20  nnel(chan);..if 
a980: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54  (Tcl_GetChannelT
a990: 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73  ype(chan) != Tls
a9a0: 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20  _ChannelType()) 
a9b0: 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  {..    Tcl_Appen
a9c0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
a9d0: 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22  "bad channel \""
a9e0: 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  , Tcl_GetChannel
a9f0: 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c  Name(chan),..."\
aa00: 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61  ": not a TLS cha
aa10: 6e 6e 65 6c 22 2c 20 28 63 68 61 72 20 2a 29 20  nnel", (char *) 
aa20: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f  NULL);..    Tcl_
aa30: 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74  SetErrorCode(int
aa40: 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50  erp, "TLS", "IMP
aa50: 4f 52 54 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c  ORT", "CHANNEL",
aa60: 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61   "INVALID", (cha
aa70: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20  r *) NULL);..   
aa80: 20 54 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f 66   Tls_Free((tls_f
aa90: 72 65 65 5f 74 79 70 65 20 2a 29 20 73 74 61 74  ree_type *) stat
aaa0: 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75  ePtr);..    retu
aab0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d  rn TCL_ERROR;..}
aac0: 0a 09 63 74 78 20 3d 20 28 28 53 74 61 74 65 20  ..ctx = ((State 
aad0: 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  *)Tcl_GetChannel
aae0: 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68 61  InstanceData(cha
aaf0: 6e 29 29 2d 3e 63 74 78 3b 0a 20 20 20 20 7d 20  n))->ctx;.    } 
ab00: 65 6c 73 65 20 7b 0a 09 69 66 20 28 28 63 74 78  else {..if ((ctx
ab10: 20 3d 20 43 54 58 5f 49 6e 69 74 28 73 74 61 74   = CTX_Init(stat
ab20: 65 50 74 72 2c 20 73 65 72 76 65 72 2c 20 70 72  ePtr, server, pr
ab30: 6f 74 6f 2c 20 6b 65 79 66 69 6c 65 2c 20 63 65  oto, keyfile, ce
ab40: 72 74 66 69 6c 65 2c 20 6b 65 79 2c 20 63 65 72  rtfile, key, cer
ab50: 74 2c 20 6b 65 79 5f 6c 65 6e 2c 0a 09 20 20 20  t, key_len,..   
ab60: 20 63 65 72 74 5f 6c 65 6e 2c 20 43 41 70 61 74   cert_len, CApat
ab70: 68 2c 20 43 41 73 74 6f 72 65 2c 20 43 41 66 69  h, CAstore, CAfi
ab80: 6c 65 2c 20 63 69 70 68 65 72 73 2c 20 63 69 70  le, ciphers, cip
ab90: 68 65 72 73 75 69 74 65 73 2c 20 6c 65 76 65 6c  hersuites, level
aba0: 2c 20 44 48 70 61 72 61 6d 73 29 29 20 3d 3d 20  , DHparams)) == 
abb0: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 6c 73  NULL) {..    Tls
abc0: 5f 46 72 65 65 28 28 74 6c 73 5f 66 72 65 65 5f  _Free((tls_free_
abd0: 74 79 70 65 20 2a 29 20 73 74 61 74 65 50 74 72  type *) statePtr
abe0: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54  );..    return T
abf0: 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20  CL_ERROR;..}.   
ac00: 20 7d 0a 0a 20 20 20 20 73 74 61 74 65 50 74 72   }..    statePtr
ac10: 2d 3e 63 74 78 20 3d 20 63 74 78 3b 0a 0a 20 20  ->ctx = ctx;..  
ac20: 20 20 2f 2a 20 50 72 65 73 65 72 76 65 20 63 68    /* Preserve ch
ac30: 61 6e 6e 65 6c 20 63 6f 6e 66 69 67 20 2a 2f 0a  annel config */.
ac40: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49      Tcl_DStringI
ac50: 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65  nit(&upperChanne
ac60: 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20  lTranslation);. 
ac70: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e     Tcl_DStringIn
ac80: 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c  it(&upperChannel
ac90: 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 20 54  Blocking);.    T
aca0: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26  cl_DStringInit(&
acb0: 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43  upperChannelEOFC
acc0: 68 61 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53  har);.    Tcl_DS
acd0: 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72  tringInit(&upper
ace0: 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29  ChannelEncoding)
acf0: 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61  ;.    Tcl_GetCha
ad00: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72  nnelOption(inter
ad10: 70 2c 20 63 68 61 6e 2c 20 22 2d 65 6f 66 63 68  p, chan, "-eofch
ad20: 61 72 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e  ar", &upperChann
ad30: 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20 20 20  elEOFChar);.    
ad40: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70  Tcl_GetChannelOp
ad50: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61  tion(interp, cha
ad60: 6e 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 22 2c 20  n, "-encoding", 
ad70: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63  &upperChannelEnc
ad80: 6f 64 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f  oding);.    Tcl_
ad90: 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e  GetChannelOption
ada0: 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22  (interp, chan, "
adb0: 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 26  -translation", &
adc0: 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e  upperChannelTran
add0: 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63  slation);.    Tc
ade0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69  l_GetChannelOpti
adf0: 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c  on(interp, chan,
ae00: 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 26 75   "-blocking", &u
ae10: 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b  pperChannelBlock
ae20: 69 6e 67 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 6e  ing);..    /* En
ae30: 73 75 72 65 20 74 68 65 20 63 68 61 6e 6e 65 6c  sure the channel
ae40: 20 77 6f 72 6b 73 20 69 6e 20 62 69 6e 61 72 79   works in binary
ae50: 20 6d 6f 64 65 20 28 66 6f 72 20 74 68 65 20 65   mode (for the e
ae60: 6e 63 72 79 70 74 69 6f 6e 20 6e 6f 74 20 74 6f  ncryption not to
ae70: 20 67 65 74 20 67 6f 6f 66 65 64 20 75 70 29 2e   get goofed up).
ae80: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 53 65 74 43   */.    Tcl_SetC
ae90: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74  hannelOption(int
aea0: 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61  erp, chan, "-tra
aeb0: 6e 73 6c 61 74 69 6f 6e 22 2c 20 22 62 69 6e 61  nslation", "bina
aec0: 72 79 22 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65  ry");.    Tcl_Se
aed0: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69  tChannelOption(i
aee0: 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 62  nterp, chan, "-b
aef0: 6c 6f 63 6b 69 6e 67 22 2c 20 22 74 72 75 65 22  locking", "true"
af00: 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74  );..    /* Creat
af10: 65 20 73 74 61 63 6b 65 64 20 63 68 61 6e 6e 65  e stacked channe
af20: 6c 20 2a 2f 0a 20 20 20 20 64 70 72 69 6e 74 66  l */.    dprintf
af30: 28 22 43 6f 6e 73 75 6d 69 6e 67 20 54 63 6c 20  ("Consuming Tcl 
af40: 63 68 61 6e 6e 65 6c 20 25 73 22 2c 20 54 63 6c  channel %s", Tcl
af50: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28  _GetChannelName(
af60: 63 68 61 6e 29 29 3b 0a 20 20 20 20 73 74 61 74  chan));.    stat
af70: 65 50 74 72 2d 3e 73 65 6c 66 20 3d 20 54 63 6c  ePtr->self = Tcl
af80: 5f 53 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e  _StackChannel(in
af90: 74 65 72 70 2c 20 54 6c 73 5f 43 68 61 6e 6e 65  terp, Tls_Channe
afa0: 6c 54 79 70 65 28 29 2c 20 28 43 6c 69 65 6e 74  lType(), (Client
afb0: 44 61 74 61 29 20 73 74 61 74 65 50 74 72 2c 0a  Data) statePtr,.
afc0: 09 28 54 43 4c 5f 52 45 41 44 41 42 4c 45 20 7c  .(TCL_READABLE |
afd0: 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 29 2c 20   TCL_WRITABLE), 
afe0: 63 68 61 6e 29 3b 0a 20 20 20 20 64 70 72 69 6e  chan);.    dprin
aff0: 74 66 28 22 43 72 65 61 74 65 64 20 63 68 61 6e  tf("Created chan
b000: 6e 65 6c 20 6e 61 6d 65 64 20 25 73 22 2c 20 54  nel named %s", T
b010: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d  cl_GetChannelNam
b020: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66  e(statePtr->self
b030: 29 29 3b 0a 20 20 20 20 69 66 20 28 73 74 61 74  ));.    if (stat
b040: 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54  ePtr->self == (T
b050: 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c  cl_Channel) NULL
b060: 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 4e 6f 20 75  ) {../*.. * No u
b070: 73 65 20 6f 66 20 54 63 6c 5f 45 76 65 6e 74 75  se of Tcl_Eventu
b080: 61 6c 6c 79 46 72 65 65 20 62 65 63 61 75 73 65  allyFree because
b090: 20 6e 6f 20 70 6f 73 73 69 62 6c 65 20 54 63 6c   no possible Tcl
b0a0: 5f 50 72 65 73 65 72 76 65 2e 0a 09 20 2a 2f 0a  _Preserve... */.
b0b0: 09 54 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f 66  .Tls_Free((tls_f
b0c0: 72 65 65 5f 74 79 70 65 20 2a 29 20 73 74 61 74  ree_type *) stat
b0d0: 65 50 74 72 29 3b 0a 09 54 63 6c 5f 44 53 74 72  ePtr);..Tcl_DStr
b0e0: 69 6e 67 46 72 65 65 28 26 75 70 70 65 72 43 68  ingFree(&upperCh
b0f0: 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e  annelTranslation
b100: 29 3b 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 46  );..Tcl_DStringF
b110: 72 65 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65  ree(&upperChanne
b120: 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 09 54 63 6c  lEncoding);..Tcl
b130: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 75 70  _DStringFree(&up
b140: 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61  perChannelEOFCha
b150: 72 29 3b 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67  r);..Tcl_DString
b160: 46 72 65 65 28 26 75 70 70 65 72 43 68 61 6e 6e  Free(&upperChann
b170: 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 09 72 65  elBlocking);..re
b180: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
b190: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65      }..    /* Re
b1a0: 73 74 6f 72 65 20 63 68 61 6e 6e 65 6c 20 63 6f  store channel co
b1b0: 6e 66 69 67 20 2a 2f 0a 20 20 20 20 54 63 6c 5f  nfig */.    Tcl_
b1c0: 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e  SetChannelOption
b1d0: 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74  (interp, statePt
b1e0: 72 2d 3e 73 65 6c 66 2c 20 22 2d 74 72 61 6e 73  r->self, "-trans
b1f0: 6c 61 74 69 6f 6e 22 2c 20 54 63 6c 5f 44 53 74  lation", Tcl_DSt
b200: 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72  ringValue(&upper
b210: 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69  ChannelTranslati
b220: 6f 6e 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65  on));.    Tcl_Se
b230: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69  tChannelOption(i
b240: 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d  nterp, statePtr-
b250: 3e 73 65 6c 66 2c 20 22 2d 65 6e 63 6f 64 69 6e  >self, "-encodin
b260: 67 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56  g", Tcl_DStringV
b270: 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e  alue(&upperChann
b280: 65 6c 45 6e 63 6f 64 69 6e 67 29 29 3b 0a 20 20  elEncoding));.  
b290: 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c    Tcl_SetChannel
b2a0: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73  Option(interp, s
b2b0: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22  tatePtr->self, "
b2c0: 2d 65 6f 66 63 68 61 72 22 2c 20 54 63 6c 5f 44  -eofchar", Tcl_D
b2d0: 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70  StringValue(&upp
b2e0: 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72  erChannelEOFChar
b2f0: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43  ));.    Tcl_SetC
b300: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74  hannelOption(int
b310: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73  erp, statePtr->s
b320: 65 6c 66 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22  elf, "-blocking"
b330: 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c  , Tcl_DStringVal
b340: 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c  ue(&upperChannel
b350: 42 6c 6f 63 6b 69 6e 67 29 29 3b 0a 20 20 20 20  Blocking));.    
b360: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
b370: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61  &upperChannelTra
b380: 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54  nslation);.    T
b390: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26  cl_DStringFree(&
b3a0: 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f  upperChannelEnco
b3b0: 64 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 44  ding);.    Tcl_D
b3c0: 53 74 72 69 6e 67 46 72 65 65 28 26 75 70 70 65  StringFree(&uppe
b3d0: 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29  rChannelEOFChar)
b3e0: 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ;.    Tcl_DStrin
b3f0: 67 46 72 65 65 28 26 75 70 70 65 72 43 68 61 6e  gFree(&upperChan
b400: 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 0a 20  nelBlocking);.. 
b410: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53 53 4c     /*.     * SSL
b420: 20 49 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a   Initialization.
b430: 20 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 61 74       */.    stat
b440: 65 50 74 72 2d 3e 73 73 6c 20 3d 20 53 53 4c 5f  ePtr->ssl = SSL_
b450: 6e 65 77 28 73 74 61 74 65 50 74 72 2d 3e 63 74  new(statePtr->ct
b460: 78 29 3b 0a 20 20 20 20 69 66 20 28 21 73 74 61  x);.    if (!sta
b470: 74 65 50 74 72 2d 3e 73 73 6c 29 20 7b 0a 09 2f  tePtr->ssl) {../
b480: 2a 20 53 53 4c 20 6c 69 62 72 61 72 79 20 65 72  * SSL library er
b490: 72 6f 72 20 2a 2f 0a 09 54 63 6c 5f 41 70 70 65  ror */..Tcl_Appe
b4a0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
b4b0: 20 22 63 6f 75 6c 64 6e 27 74 20 63 6f 6e 73 74   "couldn't const
b4c0: 72 75 63 74 20 73 73 6c 20 73 65 73 73 69 6f 6e  ruct ssl session
b4d0: 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41  : ", GET_ERR_REA
b4e0: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20  SON(), (char *) 
b4f0: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f  NULL);..    Tcl_
b500: 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74  SetErrorCode(int
b510: 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50  erp, "TLS", "IMP
b520: 4f 52 54 22 2c 20 22 49 4e 49 54 22 2c 20 22 46  ORT", "INIT", "F
b530: 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29  AILED", (char *)
b540: 20 4e 55 4c 4c 29 3b 0a 09 54 6c 73 5f 46 72 65   NULL);..Tls_Fre
b550: 65 28 28 74 6c 73 5f 66 72 65 65 5f 74 79 70 65  e((tls_free_type
b560: 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09   *) statePtr);..
b570: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
b580: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
b590: 53 65 74 20 68 6f 73 74 20 73 65 72 76 65 72 20  Set host server 
b5a0: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 69 66 20 28  name */.    if (
b5b0: 73 65 72 76 65 72 6e 61 6d 65 29 20 7b 0a 09 2f  servername) {../
b5c0: 2a 20 53 65 74 73 20 74 68 65 20 73 65 72 76 65  * Sets the serve
b5d0: 72 20 6e 61 6d 65 20 69 6e 64 69 63 61 74 69 6f  r name indicatio
b5e0: 6e 20 28 53 4e 49 29 20 69 6e 20 43 6c 69 65 6e  n (SNI) in Clien
b5f0: 74 48 65 6c 6c 6f 20 65 78 74 65 6e 73 69 6f 6e  tHello extension
b600: 20 2a 2f 0a 09 2f 2a 20 50 65 72 20 52 46 43 20   */../* Per RFC 
b610: 36 30 36 36 2c 20 68 6f 73 74 6e 61 6d 65 20 69  6066, hostname i
b620: 73 20 61 20 41 53 43 49 49 20 65 6e 63 6f 64 65  s a ASCII encode
b630: 64 20 73 74 72 69 6e 67 2c 20 74 68 6f 75 67 68  d string, though
b640: 20 52 46 43 20 34 33 36 36 20 73 61 79 73 20 55   RFC 4366 says U
b650: 54 46 2d 38 2e 20 2a 2f 0a 09 69 66 20 28 21 53  TF-8. */..if (!S
b660: 53 4c 5f 73 65 74 5f 74 6c 73 65 78 74 5f 68 6f  SL_set_tlsext_ho
b670: 73 74 5f 6e 61 6d 65 28 73 74 61 74 65 50 74 72  st_name(statePtr
b680: 2d 3e 73 73 6c 2c 20 73 65 72 76 65 72 6e 61 6d  ->ssl, servernam
b690: 65 29 20 26 26 20 72 65 71 75 69 72 65 29 20 7b  e) && require) {
b6a0: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ..    Tcl_Append
b6b0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
b6c0: 53 65 74 20 53 4e 49 20 65 78 74 65 6e 73 69 6f  Set SNI extensio
b6d0: 6e 20 66 61 69 6c 65 64 3a 20 22 2c 20 47 45 54  n failed: ", GET
b6e0: 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28  _ERR_REASON(), (
b6f0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
b700: 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72      Tcl_SetError
b710: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c  Code(interp, "TL
b720: 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 53  S", "IMPORT", "S
b730: 4e 49 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28  NI", "FAILED", (
b740: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
b750: 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 74 6c      Tls_Free((tl
b760: 73 5f 66 72 65 65 5f 74 79 70 65 20 2a 29 20 73  s_free_type *) s
b770: 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72  tatePtr);..    r
b780: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
b790: 0a 09 7d 0a 0a 09 2f 2a 20 53 65 74 20 68 6f 73  ..}.../* Set hos
b7a0: 74 6e 61 6d 65 20 66 6f 72 20 70 65 65 72 20 63  tname for peer c
b7b0: 65 72 74 69 66 69 63 61 74 65 20 68 6f 73 74 6e  ertificate hostn
b7c0: 61 6d 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e  ame verification
b7d0: 20 69 6e 20 63 6c 69 65 6e 74 73 2e 0a 09 20 20   in clients...  
b7e0: 20 44 6f 6e 27 74 20 75 73 65 20 53 53 4c 5f 73   Don't use SSL_s
b7f0: 65 74 31 5f 68 6f 73 74 20 73 69 6e 63 65 20 69  et1_host since i
b800: 74 20 68 61 73 20 6c 69 6d 69 74 61 74 69 6f 6e  t has limitation
b810: 73 2e 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f  s. */..if (!SSL_
b820: 61 64 64 31 5f 68 6f 73 74 28 73 74 61 74 65 50  add1_host(stateP
b830: 74 72 2d 3e 73 73 6c 2c 20 73 65 72 76 65 72 6e  tr->ssl, servern
b840: 61 6d 65 29 29 20 7b 0a 09 20 20 20 20 54 63 6c  ame)) {..    Tcl
b850: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
b860: 74 65 72 70 2c 20 22 53 65 74 20 44 4e 53 20 68  terp, "Set DNS h
b870: 6f 73 74 6e 61 6d 65 20 66 61 69 6c 65 64 3a 20  ostname failed: 
b880: 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f  ", GET_ERR_REASO
b890: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  N(), (char *) NU
b8a0: 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65  LL);..    Tcl_Se
b8b0: 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72  tErrorCode(inter
b8c0: 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52  p, "TLS", "IMPOR
b8d0: 54 22 2c 20 22 48 4f 53 54 4e 41 4d 45 22 2c 20  T", "HOSTNAME", 
b8e0: 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20  "FAILED", (char 
b8f0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54  *) NULL);..    T
b900: 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f 66 72 65  ls_Free((tls_fre
b910: 65 5f 74 79 70 65 20 2a 29 20 73 74 61 74 65 50  e_type *) stateP
b920: 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e  tr);..    return
b930: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20   TCL_ERROR;..}. 
b940: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73     }..    /* Res
b950: 75 6d 65 20 73 65 73 73 69 6f 6e 20 69 64 20 2a  ume session id *
b960: 2f 0a 20 20 20 20 69 66 20 28 73 65 73 73 69 6f  /.    if (sessio
b970: 6e 5f 69 64 20 26 26 20 73 74 72 6c 65 6e 28 73  n_id && strlen(s
b980: 65 73 73 69 6f 6e 5f 69 64 29 20 3c 3d 20 53 53  ession_id) <= SS
b990: 4c 5f 4d 41 58 5f 53 49 44 5f 43 54 58 5f 4c 45  L_MAX_SID_CTX_LE
b9a0: 4e 47 54 48 29 20 7b 0a 09 2f 2a 20 53 53 4c 5f  NGTH) {../* SSL_
b9b0: 73 65 74 5f 73 65 73 73 69 6f 6e 28 29 20 2a 2f  set_session() */
b9c0: 0a 09 69 66 20 28 21 53 53 4c 5f 53 45 53 53 49  ..if (!SSL_SESSI
b9d0: 4f 4e 5f 73 65 74 31 5f 69 64 5f 63 6f 6e 74 65  ON_set1_id_conte
b9e0: 78 74 28 53 53 4c 5f 67 65 74 5f 73 65 73 73 69  xt(SSL_get_sessi
b9f0: 6f 6e 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  on(statePtr->ssl
ba00: 29 2c 0a 09 09 28 63 6f 6e 73 74 20 75 6e 73 69  ),...(const unsi
ba10: 67 6e 65 64 20 63 68 61 72 20 2a 29 20 73 65 73  gned char *) ses
ba20: 73 69 6f 6e 5f 69 64 2c 20 28 75 6e 73 69 67 6e  sion_id, (unsign
ba30: 65 64 20 69 6e 74 29 20 73 74 72 6c 65 6e 28 73  ed int) strlen(s
ba40: 65 73 73 69 6f 6e 5f 69 64 29 29 29 20 7b 0a 09  ession_id))) {..
ba50: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
ba60: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 52 65  sult(interp, "Re
ba70: 73 75 6d 65 20 73 65 73 73 69 6f 6e 20 66 61 69  sume session fai
ba80: 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f  led: ", GET_ERR_
ba90: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20  REASON(), (char 
baa0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54  *) NULL);..    T
bab0: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28  cl_SetErrorCode(
bac0: 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22  interp, "TLS", "
bad0: 49 4d 50 4f 52 54 22 2c 20 22 53 45 53 53 49 4f  IMPORT", "SESSIO
bae0: 4e 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63  N", "FAILED", (c
baf0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20  har *) NULL);.. 
bb00: 20 20 20 54 6c 73 5f 46 72 65 65 28 28 74 6c 73     Tls_Free((tls
bb10: 5f 66 72 65 65 5f 74 79 70 65 20 2a 29 20 73 74  _free_type *) st
bb20: 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65  atePtr);..    re
bb30: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
bb40: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  .}.    }..    /*
bb50: 20 45 6e 61 62 6c 65 20 41 70 70 6c 69 63 61 74   Enable Applicat
bb60: 69 6f 6e 2d 4c 61 79 65 72 20 50 72 6f 74 6f 63  ion-Layer Protoc
bb70: 6f 6c 20 4e 65 67 6f 74 69 61 74 69 6f 6e 2e 20  ol Negotiation. 
bb80: 45 78 61 6d 70 6c 65 73 20 61 72 65 3a 20 68 74  Examples are: ht
bb90: 74 70 2f 31 2e 30 2c 0a 09 68 74 74 70 2f 31 2e  tp/1.0,..http/1.
bba0: 31 2c 20 68 32 2c 20 68 33 2c 20 66 74 70 2c 20  1, h2, h3, ftp, 
bbb0: 69 6d 61 70 2c 20 70 6f 70 33 2c 20 78 6d 70 70  imap, pop3, xmpp
bbc0: 2d 63 6c 69 65 6e 74 2c 20 78 6d 70 70 2d 73 65  -client, xmpp-se
bbd0: 72 76 65 72 2c 20 6d 71 74 74 2c 20 69 72 63 2c  rver, mqtt, irc,
bbe0: 20 65 74 63 2e 20 2a 2f 0a 20 20 20 20 69 66 20   etc. */.    if 
bbf0: 28 61 6c 70 6e 29 20 7b 0a 09 2f 2a 20 43 6f 6e  (alpn) {../* Con
bc00: 76 65 72 74 20 61 20 54 43 4c 20 6c 69 73 74 20  vert a TCL list 
bc10: 69 6e 74 6f 20 61 20 70 72 6f 74 6f 63 6f 6c 2d  into a protocol-
bc20: 6c 69 73 74 20 69 6e 20 77 69 72 65 2d 66 6f 72  list in wire-for
bc30: 6d 61 74 20 2a 2f 0a 09 75 6e 73 69 67 6e 65 64  mat */..unsigned
bc40: 20 63 68 61 72 20 2a 70 72 6f 74 6f 73 2c 20 2a   char *protos, *
bc50: 70 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e 74  p;..unsigned int
bc60: 20 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 30 3b   protos_len = 0;
bc70: 0a 09 54 63 6c 5f 53 69 7a 65 20 63 6e 74 2c 20  ..Tcl_Size cnt, 
bc80: 69 3b 0a 09 69 6e 74 20 6a 3b 0a 09 54 63 6c 5f  i;..int j;..Tcl_
bc90: 4f 62 6a 20 2a 2a 6c 69 73 74 3b 0a 0a 09 69 66  Obj **list;...if
bca0: 20 28 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 74   (Tcl_ListObjGet
bcb0: 45 6c 65 6d 65 6e 74 73 28 69 6e 74 65 72 70 2c  Elements(interp,
bcc0: 20 61 6c 70 6e 2c 20 26 63 6e 74 2c 20 26 6c 69   alpn, &cnt, &li
bcd0: 73 74 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b  st) != TCL_OK) {
bce0: 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28  ..    Tls_Free((
bcf0: 74 6c 73 5f 66 72 65 65 5f 74 79 70 65 20 2a 29  tls_free_type *)
bd00: 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20   statePtr);..   
bd10: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
bd20: 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72  R;..}.../* Deter
bd30: 6d 69 6e 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  mine the memory 
bd40: 72 65 71 75 69 72 65 64 20 66 6f 72 20 74 68 65  required for the
bd50: 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a   protocol-list *
bd60: 2f 0a 09 66 6f 72 20 28 69 20 3d 20 30 3b 20 69  /..for (i = 0; i
bd70: 20 3c 20 63 6e 74 3b 20 69 2b 2b 29 20 7b 0a 09   < cnt; i++) {..
bd80: 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
bd90: 67 46 72 6f 6d 4f 62 6a 28 6c 69 73 74 5b 69 5d  gFromObj(list[i]
bda0: 2c 20 26 6c 65 6e 29 3b 0a 09 20 20 20 20 69 66  , &len);..    if
bdb0: 20 28 6c 65 6e 20 3e 20 32 35 35 29 20 7b 0a 09   (len > 255) {..
bdc0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
bdd0: 74 28 69 6e 74 65 72 70 2c 20 22 41 4c 50 4e 20  t(interp, "ALPN 
bde0: 70 72 6f 74 6f 63 6f 6c 20 6e 61 6d 65 73 20 74  protocol names t
bdf0: 6f 6f 20 6c 6f 6e 67 22 2c 20 28 63 68 61 72 20  oo long", (char 
be00: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 54 63 6c 5f  *) NULL);...Tcl_
be10: 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74  SetErrorCode(int
be20: 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50  erp, "TLS", "IMP
be30: 4f 52 54 22 2c 20 22 41 4c 50 4e 22 2c 20 22 46  ORT", "ALPN", "F
be40: 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29  AILED", (char *)
be50: 20 4e 55 4c 4c 29 3b 0a 09 09 54 6c 73 5f 46 72   NULL);...Tls_Fr
be60: 65 65 28 28 74 6c 73 5f 66 72 65 65 5f 74 79 70  ee((tls_free_typ
be70: 65 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a  e *) statePtr);.
be80: 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
be90: 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20  OR;..    }..    
bea0: 70 72 6f 74 6f 73 5f 6c 65 6e 20 2b 3d 20 31 20  protos_len += 1 
beb0: 2b 20 28 69 6e 74 29 20 6c 65 6e 3b 0a 09 7d 0a  + (int) len;..}.
bec0: 0a 09 2f 2a 20 42 75 69 6c 64 20 74 68 65 20 63  ../* Build the c
bed0: 6f 6d 70 6c 65 74 65 20 70 72 6f 74 6f 63 6f 6c  omplete protocol
bee0: 2d 6c 69 73 74 20 2a 2f 0a 09 70 72 6f 74 6f 73  -list */..protos
bef0: 20 3d 20 63 6b 61 6c 6c 6f 63 28 70 72 6f 74 6f   = ckalloc(proto
bf00: 73 5f 6c 65 6e 29 3b 0a 09 2f 2a 20 70 72 6f 74  s_len);../* prot
bf10: 6f 63 6f 6c 2d 6c 69 73 74 73 20 63 6f 6e 73 69  ocol-lists consi
bf20: 73 74 20 6f 66 20 38 2d 62 69 74 20 6c 65 6e 67  st of 8-bit leng
bf30: 74 68 2d 70 72 65 66 69 78 65 64 2c 20 62 79 74  th-prefixed, byt
bf40: 65 20 73 74 72 69 6e 67 73 20 2a 2f 0a 09 66 6f  e strings */..fo
bf50: 72 20 28 6a 20 3d 20 30 2c 20 70 20 3d 20 70 72  r (j = 0, p = pr
bf60: 6f 74 6f 73 3b 20 6a 20 3c 20 63 6e 74 3b 20 6a  otos; j < cnt; j
bf70: 2b 2b 29 20 7b 0a 09 20 20 20 20 63 68 61 72 20  ++) {..    char 
bf80: 2a 73 74 72 20 3d 20 54 63 6c 5f 47 65 74 53 74  *str = Tcl_GetSt
bf90: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6c 69 73 74  ringFromObj(list
bfa0: 5b 6a 5d 2c 20 26 6c 65 6e 29 3b 0a 09 20 20 20  [j], &len);..   
bfb0: 20 2a 70 2b 2b 20 3d 20 28 75 6e 73 69 67 6e 65   *p++ = (unsigne
bfc0: 64 20 63 68 61 72 29 20 6c 65 6e 3b 0a 09 20 20  d char) len;..  
bfd0: 20 20 6d 65 6d 63 70 79 28 70 2c 20 73 74 72 2c    memcpy(p, str,
bfe0: 20 28 73 69 7a 65 5f 74 29 20 6c 65 6e 29 3b 0a   (size_t) len);.
bff0: 09 20 20 20 20 70 20 2b 3d 20 6c 65 6e 3b 0a 09  .    p += len;..
c000: 7d 0a 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 61  }.../* SSL_set_a
c010: 6c 70 6e 5f 70 72 6f 74 6f 73 20 6d 61 6b 65 73  lpn_protos makes
c020: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 70   a copy of the p
c030: 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a  rotocol-list */.
c040: 09 2f 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20 66  ./* Note: This f
c050: 75 6e 63 74 69 6f 6e 20 72 65 76 65 72 73 65 73  unction reverses
c060: 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
c070: 65 20 63 6f 6e 76 65 6e 74 69 6f 6e 20 2a 2f 0a  e convention */.
c080: 09 69 66 20 28 53 53 4c 5f 73 65 74 5f 61 6c 70  .if (SSL_set_alp
c090: 6e 5f 70 72 6f 74 6f 73 28 73 74 61 74 65 50 74  n_protos(statePt
c0a0: 72 2d 3e 73 73 6c 2c 20 70 72 6f 74 6f 73 2c 20  r->ssl, protos, 
c0b0: 70 72 6f 74 6f 73 5f 6c 65 6e 29 29 20 7b 0a 09  protos_len)) {..
c0c0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
c0d0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 65  sult(interp, "Se
c0e0: 74 20 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 73  t ALPN protocols
c0f0: 20 66 61 69 6c 65 64 3a 20 22 2c 20 47 45 54 5f   failed: ", GET_
c100: 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63  ERR_REASON(), (c
c110: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20  har *) NULL);.. 
c120: 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43     Tcl_SetErrorC
c130: 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53  ode(interp, "TLS
c140: 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 41 4c  ", "IMPORT", "AL
c150: 50 4e 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28  PN", "FAILED", (
c160: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
c170: 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 74 6c      Tls_Free((tl
c180: 73 5f 66 72 65 65 5f 74 79 70 65 20 2a 29 20 73  s_free_type *) s
c190: 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 63  tatePtr);..    c
c1a0: 6b 66 72 65 65 28 70 72 6f 74 6f 73 29 3b 0a 09  kfree(protos);..
c1b0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
c1c0: 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 74  RROR;..}.../* St
c1d0: 6f 72 65 20 70 72 6f 74 6f 63 6f 6c 73 20 6c 69  ore protocols li
c1e0: 73 74 20 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d  st */..statePtr-
c1f0: 3e 70 72 6f 74 6f 73 20 3d 20 70 72 6f 74 6f 73  >protos = protos
c200: 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f  ;..statePtr->pro
c210: 74 6f 73 5f 6c 65 6e 20 3d 20 70 72 6f 74 6f 73  tos_len = protos
c220: 5f 6c 65 6e 3b 0a 20 20 20 20 7d 20 65 6c 73 65  _len;.    } else
c230: 20 7b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72   {..statePtr->pr
c240: 6f 74 6f 73 20 3d 20 4e 55 4c 4c 3b 0a 09 73 74  otos = NULL;..st
c250: 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c  atePtr->protos_l
c260: 65 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20  en = 0;.    }.. 
c270: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53 53 4c     /*.     * SSL
c280: 20 43 61 6c 6c 62 61 63 6b 73 0a 20 20 20 20 20   Callbacks.     
c290: 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 61  */.    SSL_set_a
c2a0: 70 70 5f 64 61 74 61 28 73 74 61 74 65 50 74 72  pp_data(statePtr
c2b0: 2d 3e 73 73 6c 2c 20 28 76 6f 69 64 20 2a 29 73  ->ssl, (void *)s
c2c0: 74 61 74 65 50 74 72 29 3b 09 2f 2a 20 70 6f 69  tatePtr);./* poi
c2d0: 6e 74 20 62 61 63 6b 20 74 6f 20 75 73 20 2a 2f  nt back to us */
c2e0: 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 76 65 72  .    SSL_set_ver
c2f0: 69 66 79 28 73 74 61 74 65 50 74 72 2d 3e 73 73  ify(statePtr->ss
c300: 6c 2c 20 76 65 72 69 66 79 2c 20 56 65 72 69 66  l, verify, Verif
c310: 79 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20  yCallback);.    
c320: 2f 2a 53 53 4c 5f 73 65 74 5f 76 65 72 69 66 79  /*SSL_set_verify
c330: 5f 64 65 70 74 68 28 53 53 4c 5f 73 65 74 5f 76  _depth(SSL_set_v
c340: 65 72 69 66 79 5f 64 65 70 74 68 2c 20 30 29 3b  erify_depth, 0);
c350: 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 69  */.    SSL_set_i
c360: 6e 66 6f 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61  nfo_callback(sta
c370: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 49 6e 66 6f  tePtr->ssl, Info
c380: 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a 20 20 20 20  Callback);..    
c390: 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20  /* Callback for 
c3a0: 6f 62 73 65 72 76 69 6e 67 20 70 72 6f 74 6f 63  observing protoc
c3b0: 6f 6c 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a 23  ol messages */.#
c3c0: 69 66 6e 64 65 66 20 4f 50 45 4e 53 53 4c 5f 4e  ifndef OPENSSL_N
c3d0: 4f 5f 53 53 4c 5f 54 52 41 43 45 0a 20 20 20 20  O_SSL_TRACE.    
c3e0: 2f 2a 20 76 6f 69 64 20 53 53 4c 5f 43 54 58 5f  /* void SSL_CTX_
c3f0: 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b  set_msg_callback
c400: 5f 61 72 67 28 73 74 61 74 65 50 74 72 2d 3e 63  _arg(statePtr->c
c410: 74 78 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74  tx, (void *)stat
c420: 65 50 74 72 29 3b 0a 20 20 20 20 76 6f 69 64 20  ePtr);.    void 
c430: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 73 67 5f  SSL_CTX_set_msg_
c440: 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 50 74  callback(statePt
c450: 72 2d 3e 63 74 78 2c 20 4d 65 73 73 61 67 65 43  r->ctx, MessageC
c460: 61 6c 6c 62 61 63 6b 29 3b 20 2a 2f 0a 20 20 20  allback); */.   
c470: 20 53 53 4c 5f 73 65 74 5f 6d 73 67 5f 63 61 6c   SSL_set_msg_cal
c480: 6c 62 61 63 6b 5f 61 72 67 28 73 74 61 74 65 50  lback_arg(stateP
c490: 74 72 2d 3e 73 73 6c 2c 20 28 76 6f 69 64 20 2a  tr->ssl, (void *
c4a0: 29 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20  )statePtr);.    
c4b0: 53 53 4c 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c  SSL_set_msg_call
c4c0: 62 61 63 6b 28 73 74 61 74 65 50 74 72 2d 3e 73  back(statePtr->s
c4d0: 73 6c 2c 20 4d 65 73 73 61 67 65 43 61 6c 6c 62  sl, MessageCallb
c4e0: 61 63 6b 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  ack);.#endif..  
c4f0: 20 20 2f 2a 20 43 72 65 61 74 65 20 54 63 6c 5f    /* Create Tcl_
c500: 43 68 61 6e 6e 65 6c 20 42 49 4f 20 48 61 6e 64  Channel BIO Hand
c510: 6c 65 72 20 2a 2f 0a 20 20 20 20 73 74 61 74 65  ler */.    state
c520: 50 74 72 2d 3e 70 5f 62 69 6f 09 3d 20 42 49 4f  Ptr->p_bio.= BIO
c530: 5f 6e 65 77 5f 74 63 6c 28 73 74 61 74 65 50 74  _new_tcl(statePt
c540: 72 2c 20 42 49 4f 5f 4e 4f 43 4c 4f 53 45 29 3b  r, BIO_NOCLOSE);
c550: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 62  .    statePtr->b
c560: 69 6f 09 3d 20 42 49 4f 5f 6e 65 77 28 42 49 4f  io.= BIO_new(BIO
c570: 5f 66 5f 73 73 6c 28 29 29 3b 0a 0a 20 20 20 20  _f_ssl());..    
c580: 69 66 20 28 73 65 72 76 65 72 29 20 7b 0a 09 2f  if (server) {../
c590: 2a 20 53 65 72 76 65 72 20 63 61 6c 6c 62 61 63  * Server callbac
c5a0: 6b 73 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73  ks */..SSL_CTX_s
c5b0: 65 74 5f 74 6c 73 65 78 74 5f 73 65 72 76 65 72  et_tlsext_server
c5c0: 6e 61 6d 65 5f 61 72 67 28 73 74 61 74 65 50 74  name_arg(statePt
c5d0: 72 2d 3e 63 74 78 2c 20 28 76 6f 69 64 20 2a 29  r->ctx, (void *)
c5e0: 73 74 61 74 65 50 74 72 29 3b 0a 09 53 53 4c 5f  statePtr);..SSL_
c5f0: 43 54 58 5f 73 65 74 5f 74 6c 73 65 78 74 5f 73  CTX_set_tlsext_s
c600: 65 72 76 65 72 6e 61 6d 65 5f 63 61 6c 6c 62 61  ervername_callba
c610: 63 6b 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78  ck(statePtr->ctx
c620: 2c 20 53 4e 49 43 61 6c 6c 62 61 63 6b 29 3b 0a  , SNICallback);.
c630: 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69  .SSL_CTX_set_cli
c640: 65 6e 74 5f 68 65 6c 6c 6f 5f 63 62 28 73 74 61  ent_hello_cb(sta
c650: 74 65 50 74 72 2d 3e 63 74 78 2c 20 48 65 6c 6c  tePtr->ctx, Hell
c660: 6f 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64  oCallback, (void
c670: 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09 69   *)statePtr);..i
c680: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f  f (statePtr->pro
c690: 74 6f 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  tos != NULL) {..
c6a0: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f      SSL_CTX_set_
c6b0: 61 6c 70 6e 5f 73 65 6c 65 63 74 5f 63 62 28 73  alpn_select_cb(s
c6c0: 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 41 4c  tatePtr->ctx, AL
c6d0: 50 4e 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69  PNCallback, (voi
c6e0: 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 23  d *)statePtr);.#
c6f0: 69 66 64 65 66 20 55 53 45 5f 4e 50 4e 0a 09 20  ifdef USE_NPN.. 
c700: 20 20 20 69 66 20 28 74 6c 73 31 5f 32 20 3d 3d     if (tls1_2 ==
c710: 20 30 20 26 26 20 74 6c 73 31 5f 33 20 3d 3d 20   0 && tls1_3 == 
c720: 30 29 20 7b 0a 09 09 53 53 4c 5f 43 54 58 5f 73  0) {...SSL_CTX_s
c730: 65 74 5f 6e 65 78 74 5f 70 72 6f 74 6f 73 5f 61  et_next_protos_a
c740: 64 76 65 72 74 69 73 65 64 5f 63 62 28 73 74 61  dvertised_cb(sta
c750: 74 65 50 74 72 2d 3e 63 74 78 2c 20 4e 50 4e 43  tePtr->ctx, NPNC
c760: 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a  allback, (void *
c770: 29 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20  )statePtr);..   
c780: 20 7d 0a 23 65 6e 64 69 66 0a 09 7d 0a 0a 09 2f   }.#endif..}.../
c790: 2a 20 45 6e 61 62 6c 65 20 73 65 72 76 65 72 20  * Enable server 
c7a0: 74 6f 20 73 65 6e 64 20 63 65 72 74 20 72 65 71  to send cert req
c7b0: 75 65 73 74 20 61 66 74 65 72 20 68 61 6e 64 73  uest after hands
c7c0: 68 61 6b 65 20 28 54 4c 53 20 31 2e 33 20 6f 6e  hake (TLS 1.3 on
c7d0: 6c 79 29 20 2a 2f 0a 09 2f 2a 20 41 20 77 72 69  ly) */../* A wri
c7e0: 74 65 20 6f 70 65 72 61 74 69 6f 6e 20 6d 75 73  te operation mus
c7f0: 74 20 74 61 6b 65 20 70 6c 61 63 65 20 66 6f 72  t take place for
c800: 20 74 68 65 20 43 65 72 74 69 66 69 63 61 74 65   the Certificate
c810: 20 52 65 71 75 65 73 74 20 74 6f 20 62 65 0a 09   Request to be..
c820: 20 20 20 73 65 6e 74 20 74 6f 20 74 68 65 20 63     sent to the c
c830: 6c 69 65 6e 74 2c 20 74 68 69 73 20 63 61 6e 20  lient, this can 
c840: 62 65 20 64 6f 6e 65 20 77 69 74 68 20 53 53 4c  be done with SSL
c850: 5f 64 6f 5f 68 61 6e 64 73 68 61 6b 65 28 29 2e  _do_handshake().
c860: 20 2a 2f 0a 09 69 66 20 28 72 65 71 75 65 73 74   */..if (request
c870: 20 26 26 20 70 6f 73 74 5f 68 61 6e 64 73 68 61   && post_handsha
c880: 6b 65 20 26 26 20 74 6c 73 31 5f 33 29 20 7b 0a  ke && tls1_3) {.
c890: 09 20 20 20 20 53 53 4c 5f 76 65 72 69 66 79 5f  .    SSL_verify_
c8a0: 63 6c 69 65 6e 74 5f 70 6f 73 74 5f 68 61 6e 64  client_post_hand
c8b0: 73 68 61 6b 65 28 73 74 61 74 65 50 74 72 2d 3e  shake(statePtr->
c8c0: 73 73 6c 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65  ssl);..}.../* Se
c8d0: 74 20 73 65 72 76 65 72 20 6d 6f 64 65 20 2a 2f  t server mode */
c8e0: 0a 09 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67  ..statePtr->flag
c8f0: 73 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f 53 45 52  s |= TLS_TCL_SER
c900: 56 45 52 3b 0a 09 53 53 4c 5f 73 65 74 5f 61 63  VER;..SSL_set_ac
c910: 63 65 70 74 5f 73 74 61 74 65 28 73 74 61 74 65  cept_state(state
c920: 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d  Ptr->ssl);.    }
c930: 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 43 6c 69 65   else {../* Clie
c940: 6e 74 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a  nt callbacks */.
c950: 23 69 66 64 65 66 20 55 53 45 5f 4e 50 4e 0a 09  #ifdef USE_NPN..
c960: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 72  if (statePtr->pr
c970: 6f 74 6f 73 20 21 3d 20 4e 55 4c 4c 20 26 26 20  otos != NULL && 
c980: 74 6c 73 31 5f 32 20 3d 3d 20 30 20 26 26 20 74  tls1_2 == 0 && t
c990: 6c 73 31 5f 33 20 3d 3d 20 30 29 20 7b 0a 09 20  ls1_3 == 0) {.. 
c9a0: 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6e     SSL_CTX_set_n
c9b0: 65 78 74 5f 70 72 6f 74 6f 5f 73 65 6c 65 63 74  ext_proto_select
c9c0: 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63 74  _cb(statePtr->ct
c9d0: 78 2c 20 41 4c 50 4e 43 61 6c 6c 62 61 63 6b 2c  x, ALPNCallback,
c9e0: 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74   (void *)statePt
c9f0: 72 29 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 0a 09  r);..}.#endif...
ca00: 2f 2a 20 53 65 73 73 69 6f 6e 20 63 61 63 68 69  /* Session cachi
ca10: 6e 67 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73  ng */..SSL_CTX_s
ca20: 65 74 5f 73 65 73 73 69 6f 6e 5f 63 61 63 68 65  et_session_cache
ca30: 5f 6d 6f 64 65 28 73 74 61 74 65 50 74 72 2d 3e  _mode(statePtr->
ca40: 63 74 78 2c 20 53 53 4c 5f 53 45 53 53 5f 43 41  ctx, SSL_SESS_CA
ca50: 43 48 45 5f 43 4c 49 45 4e 54 20 7c 20 53 53 4c  CHE_CLIENT | SSL
ca60: 5f 53 45 53 53 5f 43 41 43 48 45 5f 4e 4f 5f 49  _SESS_CACHE_NO_I
ca70: 4e 54 45 52 4e 41 4c 5f 53 54 4f 52 45 29 3b 0a  NTERNAL_STORE);.
ca80: 09 53 53 4c 5f 43 54 58 5f 73 65 73 73 5f 73 65  .SSL_CTX_sess_se
ca90: 74 5f 6e 65 77 5f 63 62 28 73 74 61 74 65 50 74  t_new_cb(statePt
caa0: 72 2d 3e 63 74 78 2c 20 53 65 73 73 69 6f 6e 43  r->ctx, SessionC
cab0: 61 6c 6c 62 61 63 6b 29 3b 0a 0a 09 2f 2a 20 45  allback);.../* E
cac0: 6e 61 62 6c 65 20 70 6f 73 74 20 68 61 6e 64 73  nable post hands
cad0: 68 61 6b 65 20 41 75 74 68 65 6e 74 69 63 61 74  hake Authenticat
cae0: 69 6f 6e 20 65 78 74 65 6e 73 69 6f 6e 2e 20 54  ion extension. T
caf0: 4c 53 20 31 2e 33 20 6f 6e 6c 79 2c 20 6e 6f 74  LS 1.3 only, not
cb00: 20 68 74 74 70 2f 32 2e 20 2a 2f 0a 09 69 66 20   http/2. */..if 
cb10: 28 72 65 71 75 65 73 74 20 26 26 20 70 6f 73 74  (request && post
cb20: 5f 68 61 6e 64 73 68 61 6b 65 29 20 7b 0a 09 20  _handshake) {.. 
cb30: 20 20 20 53 53 4c 5f 73 65 74 5f 70 6f 73 74 5f     SSL_set_post_
cb40: 68 61 6e 64 73 68 61 6b 65 5f 61 75 74 68 28 73  handshake_auth(s
cb50: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 31 29  tatePtr->ssl, 1)
cb60: 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65 74 20 63 6c  ;..}.../* Set cl
cb70: 69 65 6e 74 20 6d 6f 64 65 20 2a 2f 0a 09 53 53  ient mode */..SS
cb80: 4c 5f 73 65 74 5f 63 6f 6e 6e 65 63 74 5f 73 74  L_set_connect_st
cb90: 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73  ate(statePtr->ss
cba0: 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  l);.    }..    /
cbb0: 2a 20 53 65 74 20 42 49 4f 20 66 6f 72 20 72 65  * Set BIO for re
cbc0: 61 64 20 61 6e 64 20 77 72 69 74 65 20 6f 70 65  ad and write ope
cbd0: 72 61 74 69 6f 6e 73 20 6f 6e 20 53 53 4c 20 6f  rations on SSL o
cbe0: 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 53 53 4c  bject */.    SSL
cbf0: 5f 73 65 74 5f 62 69 6f 28 73 74 61 74 65 50 74  _set_bio(statePt
cc00: 72 2d 3e 73 73 6c 2c 20 73 74 61 74 65 50 74 72  r->ssl, statePtr
cc10: 2d 3e 70 5f 62 69 6f 2c 20 73 74 61 74 65 50 74  ->p_bio, statePt
cc20: 72 2d 3e 70 5f 62 69 6f 29 3b 0a 20 20 20 20 42  r->p_bio);.    B
cc30: 49 4f 5f 73 65 74 5f 73 73 6c 28 73 74 61 74 65  IO_set_ssl(state
cc40: 50 74 72 2d 3e 62 69 6f 2c 20 73 74 61 74 65 50  Ptr->bio, stateP
cc50: 74 72 2d 3e 73 73 6c 2c 20 42 49 4f 5f 4e 4f 43  tr->ssl, BIO_NOC
cc60: 4c 4f 53 45 29 3b 0a 20 20 20 20 42 49 4f 5f 73  LOSE);.    BIO_s
cc70: 65 74 5f 73 73 6c 5f 6d 6f 64 65 28 73 74 61 74  et_ssl_mode(stat
cc80: 65 50 74 72 2d 3e 62 69 6f 2c 20 28 6c 6f 6e 67  ePtr->bio, (long
cc90: 29 20 21 73 65 72 76 65 72 29 3b 0a 0a 20 20 20  ) !server);..   
cca0: 20 2f 2a 0a 20 20 20 20 20 2a 20 45 6e 64 20 6f   /*.     * End o
ccb0: 66 20 53 53 4c 20 49 6e 69 74 0a 20 20 20 20 20  f SSL Init.     
ccc0: 2a 2f 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  */.    dprintf("
ccd0: 52 65 74 75 72 6e 69 6e 67 20 25 73 22 2c 20 54  Returning %s", T
cce0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d  cl_GetChannelNam
ccf0: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66  e(statePtr->self
cd00: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52  ));.    Tcl_SetR
cd10: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
cd20: 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 43 68  har *) Tcl_GetCh
cd30: 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50  annelName(stateP
cd40: 74 72 2d 3e 73 65 6c 66 29 2c 20 54 43 4c 5f 56  tr->self), TCL_V
cd50: 4f 4c 41 54 49 4c 45 29 3b 0a 0a 20 20 20 20 72  OLATILE);..    r
cd60: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
cd70: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
cd80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cd90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cda0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cdb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
cdc0: 20 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 20   UnimportObjCmd 
cdd0: 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72  --. *. *.This pr
cde0: 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b  ocedure is invok
cdf0: 65 64 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65  ed to remove the
ce00: 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c   topmost channel
ce10: 20 66 69 6c 74 65 72 2e 0a 20 2a 0a 20 2a 20 52   filter.. *. * R
ce20: 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61  esults:. *.A sta
ce30: 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74  ndard Tcl result
ce40: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  .. *. * Side eff
ce50: 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64  ects:. *.May mod
ce60: 69 66 79 20 74 68 65 20 62 65 68 61 76 69 6f 72  ify the behavior
ce70: 20 6f 66 20 61 6e 20 49 4f 20 63 68 61 6e 6e 65   of an IO channe
ce80: 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  l.. *. *--------
ce90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ceb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
ced0: 73 74 61 74 69 63 20 69 6e 74 0a 55 6e 69 6d 70  static int.Unimp
cee0: 6f 72 74 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74  ortObjCmd(Client
cef0: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
cf00: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
cf10: 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54  erp, int objc, T
cf20: 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62  cl_Obj *const ob
cf30: 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f  jv[]) {.    Tcl_
cf40: 43 68 61 6e 6e 65 6c 20 63 68 61 6e 2c 20 70 61  Channel chan, pa
cf50: 72 65 6e 74 3b 09 2f 2a 20 54 68 65 20 73 74 61  rent;./* The sta
cf60: 63 6b 65 64 20 61 6e 64 20 75 6e 64 65 72 6c 79  cked and underly
cf70: 69 6e 67 20 63 68 61 6e 6e 65 6c 73 20 2a 2f 0a  ing channels */.
cf80: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20      Tcl_DString 
cf90: 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e  upperChannelTran
cfa0: 73 6c 61 74 69 6f 6e 2c 20 75 70 70 65 72 43 68  slation, upperCh
cfb0: 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 2c 20 75  annelBlocking, u
cfc0: 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64  pperChannelEncod
cfd0: 69 6e 67 2c 20 75 70 70 65 72 43 68 61 6e 6e 65  ing, upperChanne
cfe0: 6c 45 4f 46 43 68 61 72 3b 0a 20 20 20 20 69 6e  lEOFChar;.    in
cff0: 74 20 72 65 73 20 3d 20 54 43 4c 5f 4f 4b 3b 0a  t res = TCL_OK;.
d000: 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65 6e      (void) clien
d010: 74 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 72 69  tData;..    dpri
d020: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a  ntf("Called");..
d030: 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d 20      if (objc != 
d040: 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e  2) {..Tcl_WrongN
d050: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
d060: 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c  , objv, "channel
d070: 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  ");..return TCL_
d080: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
d090: 20 20 2f 2a 20 56 61 6c 69 64 61 74 65 20 63 68    /* Validate ch
d0a0: 61 6e 6e 65 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20  annel name */.  
d0b0: 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74    chan = Tcl_Get
d0c0: 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20  Channel(interp, 
d0d0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
d0e0: 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a 20  jv[1]), NULL);. 
d0f0: 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28     if (chan == (
d100: 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c  Tcl_Channel) NUL
d110: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c  L) {..return TCL
d120: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
d130: 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
d140: 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68  to operate on th
d150: 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65  e topmost channe
d160: 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20  l */.    chan = 
d170: 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65  Tcl_GetTopChanne
d180: 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 70 61 72  l(chan);.    par
d190: 65 6e 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 61  ent = Tcl_GetSta
d1a0: 63 6b 65 64 43 68 61 6e 6e 65 6c 28 63 68 61 6e  ckedChannel(chan
d1b0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66  );..    /* Verif
d1c0: 79 20 69 73 20 61 20 73 74 61 63 6b 65 64 20 63  y is a stacked c
d1d0: 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 69 66  hannel */.    if
d1e0: 20 28 70 61 72 65 6e 74 20 3d 3d 20 4e 55 4c 4c   (parent == NULL
d1f0: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  ) {..Tcl_AppendR
d200: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62  esult(interp, "b
d210: 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20  ad channel \"", 
d220: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61  Tcl_GetChannelNa
d230: 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a  me(chan),..."\":
d240: 20 6e 6f 74 20 61 20 73 74 61 63 6b 65 64 20 63   not a stacked c
d250: 68 61 6e 6e 65 6c 22 2c 20 28 63 68 61 72 20 2a  hannel", (char *
d260: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63  ) NULL);..    Tc
d270: 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69  l_SetErrorCode(i
d280: 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 55  nterp, "TLS", "U
d290: 4e 49 4d 50 4f 52 54 22 2c 20 22 43 48 41 4e 4e  NIMPORT", "CHANN
d2a0: 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20  EL", "INVALID", 
d2b0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
d2c0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
d2d0: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  R;.    }..    /*
d2e0: 20 46 6c 75 73 68 20 61 6e 79 20 70 65 6e 64 69   Flush any pendi
d2f0: 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 20 20 69  ng data */.    i
d300: 66 20 28 54 63 6c 5f 4f 75 74 70 75 74 42 75 66  f (Tcl_OutputBuf
d310: 66 65 72 65 64 28 63 68 61 6e 29 20 3e 20 30 20  fered(chan) > 0 
d320: 26 26 20 54 63 6c 5f 46 6c 75 73 68 28 63 68 61  && Tcl_Flush(cha
d330: 6e 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a  n) != TCL_OK) {.
d340: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
d350: 74 28 69 6e 74 65 72 70 2c 20 22 63 61 6e 27 74  t(interp, "can't
d360: 20 66 6c 75 73 68 20 63 68 61 6e 6e 65 6c 22 2c   flush channel",
d370: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
d380: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
d390: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  OR;.    }..    /
d3a0: 2a 20 49 6e 69 74 20 73 74 6f 72 61 67 65 20 2a  * Init storage *
d3b0: 2f 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  /.    Tcl_DStrin
d3c0: 67 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e  gInit(&upperChan
d3d0: 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b  nelTranslation);
d3e0: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
d3f0: 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e  Init(&upperChann
d400: 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 20  elBlocking);.   
d410: 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74   Tcl_DStringInit
d420: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f  (&upperChannelEO
d430: 46 43 68 61 72 29 3b 0a 20 20 20 20 54 63 6c 5f  FChar);.    Tcl_
d440: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70  DStringInit(&upp
d450: 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e  erChannelEncodin
d460: 67 29 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 65 73  g);..    /* Pres
d470: 65 72 76 65 20 63 75 72 72 65 6e 74 20 63 68 61  erve current cha
d480: 6e 6e 65 6c 20 63 6f 6e 66 69 67 20 2a 2f 0a 20  nnel config */. 
d490: 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65     Tcl_GetChanne
d4a0: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20  lOption(interp, 
d4b0: 63 68 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67  chan, "-blocking
d4c0: 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c  ", &upperChannel
d4d0: 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 20 54  Blocking);.    T
d4e0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74  cl_GetChannelOpt
d4f0: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e  ion(interp, chan
d500: 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 26  , "-encoding", &
d510: 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f  upperChannelEnco
d520: 64 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 47  ding);.    Tcl_G
d530: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28  etChannelOption(
d540: 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d  interp, chan, "-
d550: 65 6f 66 63 68 61 72 22 2c 20 26 75 70 70 65 72  eofchar", &upper
d560: 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b  ChannelEOFChar);
d570: 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e  .    Tcl_GetChan
d580: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70  nelOption(interp
d590: 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61 6e 73 6c  , chan, "-transl
d5a0: 61 74 69 6f 6e 22 2c 20 26 75 70 70 65 72 43 68  ation", &upperCh
d5b0: 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e  annelTranslation
d5c0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 6e 73 74 61  );..    /* Unsta
d5d0: 63 6b 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 2a  ck the channel *
d5e0: 2f 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 55 6e  /.    if (Tcl_Un
d5f0: 73 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74  stackChannel(int
d600: 65 72 70 2c 20 63 68 61 6e 29 20 21 3d 20 54 43  erp, chan) != TC
d610: 4c 5f 4f 4b 29 20 7b 0a 09 72 65 73 20 3d 20 54  L_OK) {..res = T
d620: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
d630: 0a 20 20 20 20 2f 2a 20 52 65 73 74 6f 72 65 20  .    /* Restore 
d640: 63 68 61 6e 6e 65 6c 20 63 6f 6e 66 69 67 20 2a  channel config *
d650: 2f 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61  /.    Tcl_SetCha
d660: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72  nnelOption(inter
d670: 70 2c 20 70 61 72 65 6e 74 2c 20 22 2d 65 6e 63  p, parent, "-enc
d680: 6f 64 69 6e 67 22 2c 20 54 63 6c 5f 44 53 74 72  oding", Tcl_DStr
d690: 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 43  ingValue(&upperC
d6a0: 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 29  hannelEncoding))
d6b0: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61  ;.    Tcl_SetCha
d6c0: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72  nnelOption(inter
d6d0: 70 2c 20 70 61 72 65 6e 74 2c 20 22 2d 65 6f 66  p, parent, "-eof
d6e0: 63 68 61 72 22 2c 20 54 63 6c 5f 44 53 74 72 69  char", Tcl_DStri
d6f0: 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68  ngValue(&upperCh
d700: 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 29 3b 0a  annelEOFChar));.
d710: 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e      Tcl_SetChann
d720: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c  elOption(interp,
d730: 20 70 61 72 65 6e 74 2c 20 22 2d 74 72 61 6e 73   parent, "-trans
d740: 6c 61 74 69 6f 6e 22 2c 20 54 63 6c 5f 44 53 74  lation", Tcl_DSt
d750: 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72  ringValue(&upper
d760: 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69  ChannelTranslati
d770: 6f 6e 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65  on));.    Tcl_Se
d780: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69  tChannelOption(i
d790: 6e 74 65 72 70 2c 20 70 61 72 65 6e 74 2c 20 22  nterp, parent, "
d7a0: 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 54 63 6c 5f  -blocking", Tcl_
d7b0: 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70  DStringValue(&up
d7c0: 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69  perChannelBlocki
d7d0: 6e 67 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6c  ng));..    /* Cl
d7e0: 65 61 6e 2d 75 70 20 2a 2f 0a 20 20 20 20 54 63  ean-up */.    Tc
d7f0: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 75  l_DStringFree(&u
d800: 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73  pperChannelTrans
d810: 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c  lation);.    Tcl
d820: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 75 70  _DStringFree(&up
d830: 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69  perChannelEncodi
d840: 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74  ng);.    Tcl_DSt
d850: 72 69 6e 67 46 72 65 65 28 26 75 70 70 65 72 43  ringFree(&upperC
d860: 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a  hannelEOFChar);.
d870: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46      Tcl_DStringF
d880: 72 65 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65  ree(&upperChanne
d890: 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 20  lBlocking);.    
d8a0: 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a  return res;.}...
d8b0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
d8c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d8d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d8e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d8f0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43  --------. *. * C
d900: 54 58 5f 49 6e 69 74 20 2d 2d 20 63 6f 6e 73 74  TX_Init -- const
d910: 72 75 63 74 20 61 20 53 53 4c 5f 43 54 58 20 69  ruct a SSL_CTX i
d920: 6e 73 74 61 6e 63 65 0a 20 2a 0a 20 2a 20 52 65  nstance. *. * Re
d930: 73 75 6c 74 73 3a 0a 20 2a 09 41 20 76 61 6c 69  sults:. *.A vali
d940: 64 20 53 53 4c 5f 43 54 58 20 69 6e 73 74 61 6e  d SSL_CTX instan
d950: 63 65 20 6f 72 20 4e 55 4c 4c 2e 0a 20 2a 0a 20  ce or NULL.. *. 
d960: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
d970: 20 2a 09 63 6f 6e 73 74 72 75 63 74 73 20 53 53   *.constructs SS
d980: 4c 20 63 6f 6e 74 65 78 74 20 28 43 54 58 29 0a  L context (CTX).
d990: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
d9a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d9b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d9c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d9d0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61  --------. */.sta
d9e0: 74 69 63 20 53 53 4c 5f 43 54 58 20 2a 0a 43 54  tic SSL_CTX *.CT
d9f0: 58 5f 49 6e 69 74 28 53 74 61 74 65 20 2a 73 74  X_Init(State *st
da00: 61 74 65 50 74 72 2c 20 69 6e 74 20 69 73 53 65  atePtr, int isSe
da10: 72 76 65 72 2c 20 69 6e 74 20 70 72 6f 74 6f 2c  rver, int proto,
da20: 20 63 68 61 72 20 2a 6b 65 79 66 69 6c 65 2c 20   char *keyfile, 
da30: 63 68 61 72 20 2a 63 65 72 74 66 69 6c 65 2c 0a  char *certfile,.
da40: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
da50: 72 20 2a 6b 65 79 2c 20 75 6e 73 69 67 6e 65 64  r *key, unsigned
da60: 20 63 68 61 72 20 2a 63 65 72 74 2c 20 54 63 6c   char *cert, Tcl
da70: 5f 53 69 7a 65 20 6b 65 79 5f 6c 65 6e 2c 20 54  _Size key_len, T
da80: 63 6c 5f 53 69 7a 65 20 63 65 72 74 5f 6c 65 6e  cl_Size cert_len
da90: 2c 20 63 68 61 72 20 2a 43 41 70 61 74 68 2c 0a  , char *CApath,.
daa0: 20 20 20 20 63 68 61 72 20 2a 43 41 73 74 6f 72      char *CAstor
dab0: 65 2c 20 63 68 61 72 20 2a 43 41 66 69 6c 65 2c  e, char *CAfile,
dac0: 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 2c 20   char *ciphers, 
dad0: 63 68 61 72 20 2a 63 69 70 68 65 72 73 75 69 74  char *ciphersuit
dae0: 65 73 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 63  es, int level, c
daf0: 68 61 72 20 2a 44 48 70 61 72 61 6d 73 29 20 7b  har *DHparams) {
db00: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  .    Tcl_Interp 
db10: 2a 69 6e 74 65 72 70 20 3d 20 73 74 61 74 65 50  *interp = stateP
db20: 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20  tr->interp;.    
db30: 53 53 4c 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e  SSL_CTX *ctx = N
db40: 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74  ULL;.    Tcl_DSt
db50: 72 69 6e 67 20 64 73 3b 0a 20 20 20 20 69 6e 74  ring ds;.    int
db60: 20 6f 66 66 20 3d 20 30 2c 20 61 62 6f 72 74 20   off = 0, abort 
db70: 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 61  = 0;.    int loa
db80: 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 3b 0a 20  d_private_key;. 
db90: 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 4d 45 54     const SSL_MET
dba0: 48 4f 44 20 2a 6d 65 74 68 6f 64 3b 0a 0a 20 20  HOD *method;..  
dbb0: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
dbc0: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 21 70  d");..    if (!p
dbd0: 72 6f 74 6f 29 20 7b 0a 09 54 63 6c 5f 41 70 70  roto) {..Tcl_App
dbe0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
dbf0: 2c 20 22 6e 6f 20 76 61 6c 69 64 20 70 72 6f 74  , "no valid prot
dc00: 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 22 2c 20  ocol selected", 
dc10: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
dc20: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20  .return NULL;.  
dc30: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 63 72 65 61    }..    /* crea
dc40: 74 65 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 2a  te SSL context *
dc50: 2f 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45  /.#if OPENSSL_VE
dc60: 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20  RSION_NUMBER >= 
dc70: 30 78 31 30 31 30 30 30 30 30 4c 20 7c 7c 20 64  0x10100000L || d
dc80: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20  efined(NO_SSL2) 
dc90: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  || defined(OPENS
dca0: 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20  SL_NO_SSL2).    
dcb0: 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74  if (ENABLED(prot
dcc0: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c  o, TLS_PROTO_SSL
dcd0: 32 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e  2)) {..Tcl_Appen
dce0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
dcf0: 22 53 53 4c 32 20 70 72 6f 74 6f 63 6f 6c 20 6e  "SSL2 protocol n
dd00: 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28  ot supported", (
dd10: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
dd20: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20  return NULL;.   
dd30: 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65   }.#endif.#if de
dd40: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 7c  fined(NO_SSL3) |
dd50: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  | defined(OPENSS
dd60: 4c 5f 4e 4f 5f 53 53 4c 33 29 0a 20 20 20 20 69  L_NO_SSL3).    i
dd70: 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f  f (ENABLED(proto
dd80: 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33  , TLS_PROTO_SSL3
dd90: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  )) {..Tcl_Append
dda0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
ddb0: 53 53 4c 33 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f  SSL3 protocol no
ddc0: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63  t supported", (c
ddd0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72  har *) NULL);..r
dde0: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20  eturn NULL;.    
ddf0: 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  }.#endif.#if def
de00: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c  ined(NO_TLS1) ||
de10: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
de20: 5f 4e 4f 5f 54 4c 53 31 29 0a 20 20 20 20 69 66  _NO_TLS1).    if
de30: 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c   (ENABLED(proto,
de40: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 29   TLS_PROTO_TLS1)
de50: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  ) {..Tcl_AppendR
de60: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54  esult(interp, "T
de70: 4c 53 20 31 2e 30 20 70 72 6f 74 6f 63 6f 6c 20  LS 1.0 protocol 
de80: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20  not supported", 
de90: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
dea0: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20  .return NULL;.  
deb0: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64    }.#endif.#if d
dec0: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31  efined(NO_TLS1_1
ded0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45  ) || defined(OPE
dee0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a  NSSL_NO_TLS1_1).
def0: 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28      if (ENABLED(
df00: 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f  proto, TLS_PROTO
df10: 5f 54 4c 53 31 5f 31 29 29 20 7b 0a 09 54 63 6c  _TLS1_1)) {..Tcl
df20: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
df30: 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 31 20 70  terp, "TLS 1.1 p
df40: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70  rotocol not supp
df50: 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29  orted", (char *)
df60: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20   NULL);..return 
df70: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  NULL;.    }.#end
df80: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e  if.#if defined(N
df90: 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66  O_TLS1_2) || def
dfa0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
dfb0: 54 4c 53 31 5f 32 29 0a 20 20 20 20 69 66 20 28  TLS1_2).    if (
dfc0: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54  ENABLED(proto, T
dfd0: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 29  LS_PROTO_TLS1_2)
dfe0: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  ) {..Tcl_AppendR
dff0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54  esult(interp, "T
e000: 4c 53 20 31 2e 32 20 70 72 6f 74 6f 63 6f 6c 20  LS 1.2 protocol 
e010: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20  not supported", 
e020: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
e030: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20  .return NULL;.  
e040: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64    }.#endif.#if d
e050: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33  efined(NO_TLS1_3
e060: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45  ) || defined(OPE
e070: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a  NSSL_NO_TLS1_3).
e080: 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28      if (ENABLED(
e090: 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f  proto, TLS_PROTO
e0a0: 5f 54 4c 53 31 5f 33 29 29 20 7b 0a 09 54 63 6c  _TLS1_3)) {..Tcl
e0b0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
e0c0: 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 33 20 70  terp, "TLS 1.3 p
e0d0: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70  rotocol not supp
e0e0: 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29  orted", (char *)
e0f0: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20   NULL);..return 
e100: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  NULL;.    }.#end
e110: 69 66 0a 20 20 20 20 69 66 20 28 70 72 6f 74 6f  if.    if (proto
e120: 20 3d 3d 20 30 29 20 7b 0a 09 2f 2a 20 55 73 65   == 0) {../* Use
e130: 20 66 75 6c 6c 20 72 61 6e 67 65 20 2a 2f 0a 09   full range */..
e140: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 69 6e 5f  SSL_CTX_set_min_
e150: 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74  proto_version(ct
e160: 78 2c 20 30 29 3b 0a 09 53 53 4c 5f 43 54 58 5f  x, 0);..SSL_CTX_
e170: 73 65 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65  set_max_proto_ve
e180: 72 73 69 6f 6e 28 63 74 78 2c 20 30 29 3b 0a 20  rsion(ctx, 0);. 
e190: 20 20 20 7d 0a 0a 20 20 20 20 73 77 69 74 63 68     }..    switch
e1a0: 20 28 70 72 6f 74 6f 29 20 7b 0a 23 69 66 20 4f   (proto) {.#if O
e1b0: 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e  PENSSL_VERSION_N
e1c0: 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 30  UMBER < 0x101000
e1d0: 30 30 4c 20 26 26 20 21 64 65 66 69 6e 65 64 28  00L && !defined(
e1e0: 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 65 66  NO_SSL2) && !def
e1f0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
e200: 53 53 4c 32 29 0a 20 20 20 20 63 61 73 65 20 54  SSL2).    case T
e210: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 3a 0a 09  LS_PROTO_SSL2:..
e220: 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65  method = isServe
e230: 72 20 3f 20 53 53 4c 76 32 5f 73 65 72 76 65 72  r ? SSLv2_server
e240: 5f 6d 65 74 68 6f 64 28 29 20 3a 20 53 53 4c 76  _method() : SSLv
e250: 32 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28  2_client_method(
e260: 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69  );..break;.#endi
e270: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  f.#if !defined(N
e280: 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 69  O_SSL3) && !defi
e290: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53  ned(OPENSSL_NO_S
e2a0: 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 64  SL3) && !defined
e2b0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33  (OPENSSL_NO_SSL3
e2c0: 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 61 73  _METHOD).    cas
e2d0: 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33  e TLS_PROTO_SSL3
e2e0: 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65  :..method = isSe
e2f0: 72 76 65 72 20 3f 20 53 53 4c 76 33 5f 73 65 72  rver ? SSLv3_ser
e300: 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 53  ver_method() : S
e310: 53 4c 76 33 5f 63 6c 69 65 6e 74 5f 6d 65 74 68  SLv3_client_meth
e320: 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65  od();..break;.#e
e330: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65  ndif.#if !define
e340: 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64  d(NO_TLS1) && !d
e350: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
e360: 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66 69  O_TLS1) && !defi
e370: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
e380: 4c 53 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20  LS1_METHOD).    
e390: 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54  case TLS_PROTO_T
e3a0: 4c 53 31 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69  LS1:..method = i
e3b0: 73 53 65 72 76 65 72 20 3f 20 54 4c 53 76 31 5f  sServer ? TLSv1_
e3c0: 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20  server_method() 
e3d0: 3a 20 54 4c 53 76 31 5f 63 6c 69 65 6e 74 5f 6d  : TLSv1_client_m
e3e0: 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b  ethod();..break;
e3f0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66  .#endif.#if !def
e400: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20  ined(NO_TLS1_1) 
e410: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
e420: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 20 26  SSL_NO_TLS1_1) &
e430: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
e440: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d 45 54  SL_NO_TLS1_1_MET
e450: 48 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54 4c  HOD).    case TL
e460: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 3a 0a  S_PROTO_TLS1_1:.
e470: 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76  .method = isServ
e480: 65 72 20 3f 20 54 4c 53 76 31 5f 31 5f 73 65 72  er ? TLSv1_1_ser
e490: 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54  ver_method() : T
e4a0: 4c 53 76 31 5f 31 5f 63 6c 69 65 6e 74 5f 6d 65  LSv1_1_client_me
e4b0: 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a  thod();..break;.
e4c0: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69  #endif.#if !defi
e4d0: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26  ned(NO_TLS1_2) &
e4e0: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
e4f0: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26  SL_NO_TLS1_2) &&
e500: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
e510: 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 48  L_NO_TLS1_2_METH
e520: 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53  OD).    case TLS
e530: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 3a 0a 09  _PROTO_TLS1_2:..
e540: 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65  method = isServe
e550: 72 20 3f 20 54 4c 53 76 31 5f 32 5f 73 65 72 76  r ? TLSv1_2_serv
e560: 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c  er_method() : TL
e570: 53 76 31 5f 32 5f 63 6c 69 65 6e 74 5f 6d 65 74  Sv1_2_client_met
e580: 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23  hod();..break;.#
e590: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e  endif.#if !defin
e5a0: 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26  ed(NO_TLS1_3) &&
e5b0: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
e5c0: 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20  L_NO_TLS1_3).   
e5d0: 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f   case TLS_PROTO_
e5e0: 54 4c 53 31 5f 33 3a 0a 09 2f 2a 20 55 73 65 20  TLS1_3:../* Use 
e5f0: 74 68 65 20 67 65 6e 65 72 69 63 20 6d 65 74 68  the generic meth
e600: 6f 64 20 61 6e 64 20 63 6f 6e 73 74 72 61 69 6e  od and constrain
e610: 74 20 72 61 6e 67 65 20 61 66 74 65 72 20 63 6f  t range after co
e620: 6e 74 65 78 74 20 69 73 20 63 72 65 61 74 65 64  ntext is created
e630: 20 2a 2f 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73   */..method = is
e640: 53 65 72 76 65 72 20 3f 20 54 4c 53 5f 73 65 72  Server ? TLS_ser
e650: 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54  ver_method() : T
e660: 4c 53 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64  LS_client_method
e670: 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64  ();..break;.#end
e680: 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  if.    default:.
e690: 09 2f 2a 20 4e 65 67 6f 74 69 61 74 65 20 68 69  ./* Negotiate hi
e6a0: 67 68 65 73 74 20 61 76 61 69 6c 61 62 6c 65 20  ghest available 
e6b0: 53 53 4c 2f 54 4c 53 20 76 65 72 73 69 6f 6e 20  SSL/TLS version 
e6c0: 2a 2f 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53  */..method = isS
e6d0: 65 72 76 65 72 20 3f 20 54 4c 53 5f 73 65 72 76  erver ? TLS_serv
e6e0: 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c  er_method() : TL
e6f0: 53 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28  S_client_method(
e700: 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56  );.#if OPENSSL_V
e710: 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20  ERSION_NUMBER < 
e720: 30 78 31 30 31 30 30 30 30 30 4c 20 26 26 20 21  0x10100000L && !
e730: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29  defined(NO_SSL2)
e740: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
e750: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 09 6f  NSSL_NO_SSL2)..o
e760: 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70  ff |= (ENABLED(p
e770: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f  roto, TLS_PROTO_
e780: 53 53 4c 32 29 20 20 20 3f 20 30 20 3a 20 53 53  SSL2)   ? 0 : SS
e790: 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 32 29 3b 0a  L_OP_NO_SSLv2);.
e7a0: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69  #endif.#if !defi
e7b0: 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20  ned(NO_SSL3) && 
e7c0: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
e7d0: 5f 4e 4f 5f 53 53 4c 33 29 0a 09 6f 66 66 20 7c  _NO_SSL3)..off |
e7e0: 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f  = (ENABLED(proto
e7f0: 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33  , TLS_PROTO_SSL3
e800: 29 20 20 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50  )   ? 0 : SSL_OP
e810: 5f 4e 4f 5f 53 53 4c 76 33 29 3b 0a 23 65 6e 64  _NO_SSLv3);.#end
e820: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  if.#if !defined(
e830: 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66  NO_TLS1) && !def
e840: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
e850: 54 4c 53 31 29 0a 09 6f 66 66 20 7c 3d 20 28 45  TLS1)..off |= (E
e860: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c  NABLED(proto, TL
e870: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 29 20 20 20  S_PROTO_TLS1)   
e880: 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f  ? 0 : SSL_OP_NO_
e890: 54 4c 53 76 31 29 3b 0a 23 65 6e 64 69 66 0a 23  TLSv1);.#endif.#
e8a0: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54  if !defined(NO_T
e8b0: 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e  LS1_1) && !defin
e8c0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
e8d0: 53 31 5f 31 29 0a 09 6f 66 66 20 7c 3d 20 28 45  S1_1)..off |= (E
e8e0: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c  NABLED(proto, TL
e8f0: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 29 20  S_PROTO_TLS1_1) 
e900: 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f  ? 0 : SSL_OP_NO_
e910: 54 4c 53 76 31 5f 31 29 3b 0a 23 65 6e 64 69 66  TLSv1_1);.#endif
e920: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f  .#if !defined(NO
e930: 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66  _TLS1_2) && !def
e940: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
e950: 54 4c 53 31 5f 32 29 0a 09 6f 66 66 20 7c 3d 20  TLS1_2)..off |= 
e960: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20  (ENABLED(proto, 
e970: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32  TLS_PROTO_TLS1_2
e980: 29 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e  ) ? 0 : SSL_OP_N
e990: 4f 5f 54 4c 53 76 31 5f 32 29 3b 0a 23 65 6e 64  O_TLSv1_2);.#end
e9a0: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  if.#if !defined(
e9b0: 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64  NO_TLS1_3) && !d
e9c0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
e9d0: 4f 5f 54 4c 53 31 5f 33 29 0a 09 6f 66 66 20 7c  O_TLS1_3)..off |
e9e0: 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f  = (ENABLED(proto
e9f0: 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31  , TLS_PROTO_TLS1
ea00: 5f 33 29 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50  _3) ? 0 : SSL_OP
ea10: 5f 4e 4f 5f 54 4c 53 76 31 5f 33 29 3b 0a 23 65  _NO_TLSv1_3);.#e
ea20: 6e 64 69 66 0a 09 62 72 65 61 6b 3b 0a 20 20 20  ndif..break;.   
ea30: 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61   }..    ERR_clea
ea40: 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20  r_error();..    
ea50: 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65  ctx = SSL_CTX_ne
ea60: 77 28 6d 65 74 68 6f 64 29 3b 0a 20 20 20 20 69  w(method);.    i
ea70: 66 20 28 21 63 74 78 29 20 7b 0a 09 72 65 74 75  f (!ctx) {..retu
ea80: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a  rn NULL;.    }..
ea90: 20 20 20 20 69 66 20 28 67 65 74 65 6e 76 28 53      if (getenv(S
eaa0: 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 29 29 20 7b  SLKEYLOGFILE)) {
eab0: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6b 65  ..SSL_CTX_set_ke
eac0: 79 6c 6f 67 5f 63 61 6c 6c 62 61 63 6b 28 63 74  ylog_callback(ct
ead0: 78 2c 20 4b 65 79 4c 6f 67 43 61 6c 6c 62 61 63  x, KeyLogCallbac
eae0: 6b 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 21  k);.    }..#if !
eaf0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f  defined(NO_TLS1_
eb00: 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  3) && !defined(O
eb10: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33  PENSSL_NO_TLS1_3
eb20: 29 0a 20 20 20 20 69 66 20 28 70 72 6f 74 6f 20  ).    if (proto 
eb30: 3d 3d 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53  == TLS_PROTO_TLS
eb40: 31 5f 33 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f  1_3) {..SSL_CTX_
eb50: 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65  set_min_proto_ve
eb60: 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f  rsion(ctx, TLS1_
eb70: 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 09 53 53 4c  3_VERSION);..SSL
eb80: 5f 43 54 58 5f 73 65 74 5f 6d 61 78 5f 70 72 6f  _CTX_set_max_pro
eb90: 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20  to_version(ctx, 
eba0: 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b  TLS1_3_VERSION);
ebb0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
ebc0: 20 20 20 2f 2a 20 46 6f 72 63 65 20 63 69 70 68     /* Force ciph
ebd0: 65 72 20 73 65 6c 65 63 74 69 6f 6e 20 6f 72 64  er selection ord
ebe0: 65 72 20 62 79 20 73 65 72 76 65 72 20 2a 2f 0a  er by server */.
ebf0: 20 20 20 20 69 66 20 28 21 69 73 53 65 72 76 65      if (!isServe
ec00: 72 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65  r) {..SSL_CTX_se
ec10: 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 53  t_options(ctx, S
ec20: 53 4c 5f 4f 50 5f 43 49 50 48 45 52 5f 53 45 52  SL_OP_CIPHER_SER
ec30: 56 45 52 5f 50 52 45 46 45 52 45 4e 43 45 29 3b  VER_PREFERENCE);
ec40: 0a 20 20 20 20 7d 0a 0a 23 69 66 20 4f 50 45 4e  .    }..#if OPEN
ec50: 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42  SSL_VERSION_NUMB
ec60: 45 52 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c  ER < 0x10100000L
ec70: 0a 20 20 20 20 4f 70 65 6e 53 53 4c 5f 61 64 64  .    OpenSSL_add
ec80: 5f 61 6c 6c 5f 61 6c 67 6f 72 69 74 68 6d 73 28  _all_algorithms(
ec90: 29 3b 20 2f 2a 20 4c 6f 61 64 20 63 69 70 68 65  ); /* Load ciphe
eca0: 72 73 20 61 6e 64 20 64 69 67 65 73 74 73 20 2a  rs and digests *
ecb0: 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 53 53  /.#endif..    SS
ecc0: 4c 5f 43 54 58 5f 73 65 74 5f 61 70 70 5f 64 61  L_CTX_set_app_da
ecd0: 74 61 28 63 74 78 2c 20 28 76 6f 69 64 2a 29 69  ta(ctx, (void*)i
ece0: 6e 74 65 72 70 29 3b 09 2f 2a 20 72 65 6d 65 6d  nterp);./* remem
ecf0: 62 65 72 20 74 68 65 20 69 6e 74 65 72 70 72 65  ber the interpre
ed00: 74 65 72 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43  ter */.    SSL_C
ed10: 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63  TX_set_options(c
ed20: 74 78 2c 20 53 53 4c 5f 4f 50 5f 41 4c 4c 29 3b  tx, SSL_OP_ALL);
ed30: 09 2f 2a 20 45 6e 61 62 6c 65 20 61 6c 6c 20 53  ./* Enable all S
ed40: 53 4c 20 62 75 67 20 77 6f 72 6b 61 72 6f 75 6e  SL bug workaroun
ed50: 64 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54  ds */.    SSL_CT
ed60: 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74  X_set_options(ct
ed70: 78 2c 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 43 4f 4d  x, SSL_OP_NO_COM
ed80: 50 52 45 53 53 49 4f 4e 29 3b 09 2f 2a 20 44 69  PRESSION);./* Di
ed90: 73 61 62 6c 65 20 63 6f 6d 70 72 65 73 73 69 6f  sable compressio
eda0: 6e 20 65 76 65 6e 20 69 66 20 73 75 70 70 6f 72  n even if suppor
edb0: 74 65 64 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43  ted */.    SSL_C
edc0: 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63  TX_set_options(c
edd0: 74 78 2c 20 6f 66 66 29 3b 09 09 2f 2a 20 44 69  tx, off);../* Di
ede0: 73 61 62 6c 65 20 73 70 65 63 69 66 69 65 64 20  sable specified 
edf0: 70 72 6f 74 6f 63 6f 6c 20 76 65 72 73 69 6f 6e  protocol version
ee00: 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c  s */..    /* All
ee10: 6f 77 20 77 72 69 74 65 73 20 74 6f 20 72 65 70  ow writes to rep
ee20: 6f 72 74 20 73 75 63 63 65 73 73 20 77 68 65 6e  ort success when
ee30: 20 6c 65 73 73 20 74 68 61 6e 20 61 6c 6c 20 72   less than all r
ee40: 65 63 6f 72 64 73 20 68 61 76 65 20 62 65 65 6e  ecords have been
ee50: 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20   written */.    
ee60: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 6f 64 65  SSL_CTX_set_mode
ee70: 28 63 74 78 2c 20 53 53 4c 5f 4d 4f 44 45 5f 45  (ctx, SSL_MODE_E
ee80: 4e 41 42 4c 45 5f 50 41 52 54 49 41 4c 5f 57 52  NABLE_PARTIAL_WR
ee90: 49 54 45 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 69  ITE);..    /* Di
eea0: 73 61 62 6c 65 20 61 74 74 65 6d 70 74 73 20 74  sable attempts t
eeb0: 6f 20 74 72 79 20 74 6f 20 70 72 6f 63 65 73 73  o try to process
eec0: 20 74 68 65 20 6e 65 78 74 20 72 65 63 6f 72 64   the next record
eed0: 20 69 6e 73 74 65 61 64 20 6f 66 20 72 65 74 75   instead of retu
eee0: 72 6e 69 6e 67 20 61 66 74 65 72 20 61 0a 20 20  rning after a.  
eef0: 20 20 20 20 20 6e 6f 6e 2d 61 70 70 20 72 65 63       non-app rec
ef00: 6f 72 64 2e 20 41 76 6f 69 64 73 20 68 61 6e 67  ord. Avoids hang
ef10: 73 20 69 6e 20 62 6c 6f 63 6b 69 6e 67 20 6d 6f  s in blocking mo
ef20: 64 65 2c 20 77 68 65 6e 20 75 73 69 6e 67 20 53  de, when using S
ef30: 53 4c 5f 72 65 61 64 28 29 20 61 6e 64 20 61 0a  SL_read() and a.
ef40: 20 20 20 20 20 20 20 6e 6f 6e 2d 61 70 70 6c 69         non-appli
ef50: 63 61 74 69 6f 6e 20 72 65 63 6f 72 64 20 77 61  cation record wa
ef60: 73 20 73 65 6e 74 20 77 69 74 68 6f 75 74 20 61  s sent without a
ef70: 6e 79 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 64  ny application d
ef80: 61 74 61 2e 20 2a 2f 0a 20 20 20 20 2f 2a 53 53  ata. */.    /*SS
ef90: 4c 5f 43 54 58 5f 63 6c 65 61 72 5f 6d 6f 64 65  L_CTX_clear_mode
efa0: 28 63 74 78 2c 20 53 53 4c 5f 4d 4f 44 45 5f 41  (ctx, SSL_MODE_A
efb0: 55 54 4f 5f 52 45 54 52 59 29 3b 2a 2f 0a 0a 20  UTO_RETRY);*/.. 
efc0: 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 73 73 5f     SSL_CTX_sess_
efd0: 73 65 74 5f 63 61 63 68 65 5f 73 69 7a 65 28 63  set_cache_size(c
efe0: 74 78 2c 20 31 32 38 29 3b 0a 0a 20 20 20 20 2f  tx, 128);..    /
eff0: 2a 20 53 65 74 20 75 73 65 72 20 64 65 66 69 6e  * Set user defin
f000: 65 64 20 63 69 70 68 65 72 73 2c 20 63 69 70 68  ed ciphers, ciph
f010: 65 72 20 73 75 69 74 65 73 2c 20 61 6e 64 20 73  er suites, and s
f020: 65 63 75 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f  ecurity level */
f030: 0a 20 20 20 20 69 66 20 28 28 63 69 70 68 65 72  .    if ((cipher
f040: 73 20 21 3d 20 4e 55 4c 4c 29 20 26 26 20 21 53  s != NULL) && !S
f050: 53 4c 5f 43 54 58 5f 73 65 74 5f 63 69 70 68 65  SL_CTX_set_ciphe
f060: 72 5f 6c 69 73 74 28 63 74 78 2c 20 63 69 70 68  r_list(ctx, ciph
f070: 65 72 73 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70  ers)) {..Tcl_App
f080: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
f090: 2c 20 22 53 65 74 20 63 69 70 68 65 72 73 20 66  , "Set ciphers f
f0a0: 61 69 6c 65 64 3a 20 4e 6f 20 76 61 6c 69 64 20  ailed: No valid 
f0b0: 63 69 70 68 65 72 73 22 2c 20 28 63 68 61 72 20  ciphers", (char 
f0c0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43  *) NULL);..SSL_C
f0d0: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72  TX_free(ctx);..r
f0e0: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20  eturn NULL;.    
f0f0: 7d 0a 20 20 20 20 69 66 20 28 28 63 69 70 68 65  }.    if ((ciphe
f100: 72 73 75 69 74 65 73 20 21 3d 20 4e 55 4c 4c 29  rsuites != NULL)
f110: 20 26 26 20 21 53 53 4c 5f 43 54 58 5f 73 65 74   && !SSL_CTX_set
f120: 5f 63 69 70 68 65 72 73 75 69 74 65 73 28 63 74  _ciphersuites(ct
f130: 78 2c 20 63 69 70 68 65 72 73 75 69 74 65 73 29  x, ciphersuites)
f140: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  ) {..Tcl_AppendR
f150: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53  esult(interp, "S
f160: 65 74 20 63 69 70 68 65 72 20 73 75 69 74 65 73  et cipher suites
f170: 20 66 61 69 6c 65 64 3a 20 4e 6f 20 76 61 6c 69   failed: No vali
f180: 64 20 63 69 70 68 65 72 73 22 2c 20 28 63 68 61  d ciphers", (cha
f190: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c  r *) NULL);..SSL
f1a0: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a  _CTX_free(ctx);.
f1b0: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20  .return NULL;.  
f1c0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20    }..    /* set 
f1d0: 61 75 74 6f 6d 61 74 69 63 20 63 75 72 76 65 20  automatic curve 
f1e0: 73 65 6c 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 20  selection */.   
f1f0: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 65 63 64   SSL_CTX_set_ecd
f200: 68 5f 61 75 74 6f 28 63 74 78 2c 20 31 29 3b 0a  h_auto(ctx, 1);.
f210: 0a 20 20 20 20 2f 2a 20 53 65 74 20 73 65 63 75  .    /* Set secu
f220: 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 20 20  rity level */.  
f230: 20 20 69 66 20 28 6c 65 76 65 6c 20 3e 20 2d 31    if (level > -1
f240: 20 26 26 20 6c 65 76 65 6c 20 3c 20 36 29 20 7b   && level < 6) {
f250: 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 73 65 63  ../* SSL_set_sec
f260: 75 72 69 74 79 5f 6c 65 76 65 6c 20 2a 2f 0a 09  urity_level */..
f270: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 73 65 63 75  SSL_CTX_set_secu
f280: 72 69 74 79 5f 6c 65 76 65 6c 28 63 74 78 2c 20  rity_level(ctx, 
f290: 6c 65 76 65 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20  level);.    }.. 
f2a0: 20 20 20 2f 2a 20 73 65 74 20 73 6f 6d 65 20 63     /* set some c
f2b0: 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 20 20 20 20  allbacks */.    
f2c0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61  SSL_CTX_set_defa
f2d0: 75 6c 74 5f 70 61 73 73 77 64 5f 63 62 28 63 74  ult_passwd_cb(ct
f2e0: 78 2c 20 50 61 73 73 77 6f 72 64 43 61 6c 6c 62  x, PasswordCallb
f2f0: 61 63 6b 29 3b 0a 20 20 20 20 53 53 4c 5f 43 54  ack);.    SSL_CT
f300: 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 70 61  X_set_default_pa
f310: 73 73 77 64 5f 63 62 5f 75 73 65 72 64 61 74 61  sswd_cb_userdata
f320: 28 63 74 78 2c 20 28 76 6f 69 64 20 2a 29 73 74  (ctx, (void *)st
f330: 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a  atePtr);..    /*
f340: 20 72 65 61 64 20 61 20 44 69 66 66 69 65 2d 48   read a Diffie-H
f350: 65 6c 6c 6d 61 6e 20 70 61 72 61 6d 65 74 65 72  ellman parameter
f360: 73 20 66 69 6c 65 2c 20 6f 72 20 75 73 65 20 74  s file, or use t
f370: 68 65 20 62 75 69 6c 74 2d 69 6e 20 6f 6e 65 20  he built-in one 
f380: 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69  */.    Tcl_DStri
f390: 6e 67 49 6e 69 74 28 26 64 73 29 3b 0a 23 69 66  ngInit(&ds);.#if
f3a0: 64 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 44  def OPENSSL_NO_D
f3b0: 48 0a 20 20 20 20 69 66 20 28 44 48 70 61 72 61  H.    if (DHpara
f3c0: 6d 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54  ms != NULL) {..T
f3d0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
f3e0: 69 6e 74 65 72 70 2c 20 22 44 48 20 70 61 72 61  interp, "DH para
f3f0: 6d 65 74 65 72 20 73 75 70 70 6f 72 74 20 6e 6f  meter support no
f400: 74 20 61 76 61 69 6c 61 62 6c 65 22 2c 20 28 63  t available", (c
f410: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53  har *) NULL);..S
f420: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29  SL_CTX_free(ctx)
f430: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a  ;..return NULL;.
f440: 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20      }.#else.    
f450: 7b 0a 09 44 48 2a 20 64 68 3b 0a 09 69 66 20 28  {..DH* dh;..if (
f460: 44 48 70 61 72 61 6d 73 20 21 3d 20 4e 55 4c 4c  DHparams != NULL
f470: 29 20 7b 0a 09 20 20 20 20 42 49 4f 20 2a 62 69  ) {..    BIO *bi
f480: 6f 3b 0a 0a 09 20 20 20 20 62 69 6f 20 3d 20 42  o;...    bio = B
f490: 49 4f 5f 6e 65 77 5f 66 69 6c 65 28 46 32 4e 28  IO_new_file(F2N(
f4a0: 44 48 70 61 72 61 6d 73 2c 20 26 64 73 29 2c 20  DHparams, &ds), 
f4b0: 22 72 22 29 3b 0a 09 20 20 20 20 69 66 20 28 21  "r");..    if (!
f4c0: 62 69 6f 29 20 7b 0a 09 09 54 63 6c 5f 44 53 74  bio) {...Tcl_DSt
f4d0: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09  ringFree(&ds);..
f4e0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
f4f0: 74 28 69 6e 74 65 72 70 2c 20 22 43 6f 75 6c 64  t(interp, "Could
f500: 20 6e 6f 74 20 66 69 6e 64 20 44 48 20 70 61 72   not find DH par
f510: 61 6d 65 74 65 72 73 20 66 69 6c 65 22 2c 20 28  ameters file", (
f520: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
f530: 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74  .SSL_CTX_free(ct
f540: 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c  x);...return NUL
f550: 4c 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20  L;..    }...    
f560: 64 68 20 3d 20 50 45 4d 5f 72 65 61 64 5f 62 69  dh = PEM_read_bi
f570: 6f 5f 44 48 70 61 72 61 6d 73 28 62 69 6f 2c 20  o_DHparams(bio, 
f580: 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c  NULL, NULL, NULL
f590: 29 3b 0a 09 20 20 20 20 42 49 4f 5f 66 72 65 65  );..    BIO_free
f5a0: 28 62 69 6f 29 3b 0a 09 20 20 20 20 54 63 6c 5f  (bio);..    Tcl_
f5b0: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29  DStringFree(&ds)
f5c0: 3b 0a 09 20 20 20 20 69 66 20 28 21 64 68 29 20  ;..    if (!dh) 
f5d0: 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65  {...Tcl_AppendRe
f5e0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 43 6f  sult(interp, "Co
f5f0: 75 6c 64 20 6e 6f 74 20 72 65 61 64 20 44 48 20  uld not read DH 
f600: 70 61 72 61 6d 65 74 65 72 73 20 66 72 6f 6d 20  parameters from 
f610: 66 69 6c 65 22 2c 20 28 63 68 61 72 20 2a 29 20  file", (char *) 
f620: 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58  NULL);...SSL_CTX
f630: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65  _free(ctx);...re
f640: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20  turn NULL;..    
f650: 7d 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73  }..    SSL_CTX_s
f660: 65 74 5f 74 6d 70 5f 64 68 28 63 74 78 2c 20 64  et_tmp_dh(ctx, d
f670: 68 29 3b 0a 09 20 20 20 20 44 48 5f 66 72 65 65  h);..    DH_free
f680: 28 64 68 29 3b 0a 0a 09 7d 20 65 6c 73 65 20 7b  (dh);...} else {
f690: 0a 09 20 20 20 20 2f 2a 20 55 73 65 20 77 65 6c  ..    /* Use wel
f6a0: 6c 20 6b 6e 6f 77 6e 20 44 48 20 70 61 72 61 6d  l known DH param
f6b0: 65 74 65 72 73 20 74 68 61 74 20 68 61 76 65 20  eters that have 
f6c0: 62 75 69 6c 74 2d 69 6e 20 73 75 70 70 6f 72 74  built-in support
f6d0: 20 69 6e 20 4f 70 65 6e 53 53 4c 20 2a 2f 0a 09   in OpenSSL */..
f6e0: 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43 54 58      if (!SSL_CTX
f6f0: 5f 73 65 74 5f 64 68 5f 61 75 74 6f 28 63 74 78  _set_dh_auto(ctx
f700: 2c 20 31 29 29 20 7b 0a 09 09 54 63 6c 5f 41 70  , 1)) {...Tcl_Ap
f710: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
f720: 70 2c 20 22 43 6f 75 6c 64 20 6e 6f 74 20 65 6e  p, "Could not en
f730: 61 62 6c 65 20 73 65 74 20 44 48 20 61 75 74 6f  able set DH auto
f740: 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41  : ", GET_ERR_REA
f750: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20  SON(), (char *) 
f760: 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58  NULL);...SSL_CTX
f770: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65  _free(ctx);...re
f780: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20  turn NULL;..    
f790: 7d 0a 09 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69  }..}.    }.#endi
f7a0: 66 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 6f 75  f..    /* set ou
f7b0: 72 20 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f  r certificate */
f7c0: 0a 20 20 20 20 6c 6f 61 64 5f 70 72 69 76 61 74  .    load_privat
f7d0: 65 5f 6b 65 79 20 3d 20 30 3b 0a 20 20 20 20 69  e_key = 0;.    i
f7e0: 66 20 28 63 65 72 74 66 69 6c 65 20 21 3d 20 4e  f (certfile != N
f7f0: 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 69  ULL) {..load_pri
f800: 76 61 74 65 5f 6b 65 79 20 3d 20 31 3b 0a 0a 09  vate_key = 1;...
f810: 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f  if (SSL_CTX_use_
f820: 63 65 72 74 69 66 69 63 61 74 65 5f 66 69 6c 65  certificate_file
f830: 28 63 74 78 2c 20 46 32 4e 28 63 65 72 74 66 69  (ctx, F2N(certfi
f840: 6c 65 2c 20 26 64 73 29 2c 20 53 53 4c 5f 46 49  le, &ds), SSL_FI
f850: 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30  LETYPE_PEM) <= 0
f860: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74  ) {..    Tcl_DSt
f870: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09  ringFree(&ds);..
f880: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
f890: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e  sult(interp, "un
f8a0: 61 62 6c 65 20 74 6f 20 73 65 74 20 63 65 72 74  able to set cert
f8b0: 69 66 69 63 61 74 65 20 66 69 6c 65 20 22 2c 20  ificate file ", 
f8c0: 63 65 72 74 66 69 6c 65 2c 20 22 3a 20 22 2c 0a  certfile, ": ",.
f8d0: 09 09 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e  ..GET_ERR_REASON
f8e0: 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  (), (char *) NUL
f8f0: 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58  L);..    SSL_CTX
f900: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20  _free(ctx);..   
f910: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d   return NULL;..}
f920: 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65  ..Tcl_DStringFre
f930: 65 28 26 64 73 29 3b 0a 0a 20 20 20 20 7d 20 65  e(&ds);..    } e
f940: 6c 73 65 20 69 66 20 28 63 65 72 74 20 21 3d 20  lse if (cert != 
f950: 4e 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 72  NULL) {..load_pr
f960: 69 76 61 74 65 5f 6b 65 79 20 3d 20 31 3b 0a 09  ivate_key = 1;..
f970: 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f  if (SSL_CTX_use_
f980: 63 65 72 74 69 66 69 63 61 74 65 5f 41 53 4e 31  certificate_ASN1
f990: 28 63 74 78 2c 20 28 69 6e 74 29 20 63 65 72 74  (ctx, (int) cert
f9a0: 5f 6c 65 6e 2c 20 63 65 72 74 29 20 3c 3d 20 30  _len, cert) <= 0
f9b0: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70  ) {..    Tcl_App
f9c0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
f9d0: 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74  , "unable to set
f9e0: 20 63 65 72 74 69 66 69 63 61 74 65 3a 20 22 2c   certificate: ",
f9f0: 0a 09 09 47 45 54 5f 45 52 52 5f 52 45 41 53 4f  ...GET_ERR_REASO
fa00: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  N(), (char *) NU
fa10: 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54  LL);..    SSL_CT
fa20: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20  X_free(ctx);..  
fa30: 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09    return NULL;..
fa40: 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  }.    } else {..
fa50: 63 65 72 74 66 69 6c 65 20 3d 20 28 63 68 61 72  certfile = (char
fa60: 2a 29 58 35 30 39 5f 67 65 74 5f 64 65 66 61 75  *)X509_get_defau
fa70: 6c 74 5f 63 65 72 74 5f 66 69 6c 65 28 29 3b 0a  lt_cert_file();.
fa80: 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73  ..if (SSL_CTX_us
fa90: 65 5f 63 65 72 74 69 66 69 63 61 74 65 5f 66 69  e_certificate_fi
faa0: 6c 65 28 63 74 78 2c 20 63 65 72 74 66 69 6c 65  le(ctx, certfile
fab0: 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50  , SSL_FILETYPE_P
fac0: 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 23 69 66 20  EM) <= 0) {.#if 
fad0: 30 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  0..    Tcl_Appen
fae0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
faf0: 22 75 6e 61 62 6c 65 20 74 6f 20 75 73 65 20 64  "unable to use d
fb00: 65 66 61 75 6c 74 20 63 65 72 74 69 66 69 63 61  efault certifica
fb10: 74 65 20 66 69 6c 65 20 22 2c 20 63 65 72 74 66  te file ", certf
fb20: 69 6c 65 2c 20 22 3a 20 22 2c 0a 09 09 47 45 54  ile, ": ",...GET
fb30: 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28  _ERR_REASON(), (
fb40: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
fb50: 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65      SSL_CTX_free
fb60: 28 63 74 78 29 3b 0a 09 20 20 20 20 72 65 74 75  (ctx);..    retu
fb70: 72 6e 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a  rn NULL;.#endif.
fb80: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  .}.    }..    /*
fb90: 20 73 65 74 20 6f 75 72 20 70 72 69 76 61 74 65   set our private
fba0: 20 6b 65 79 20 2a 2f 0a 20 20 20 20 69 66 20 28   key */.    if (
fbb0: 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79  load_private_key
fbc0: 29 20 7b 0a 09 69 66 20 28 6b 65 79 66 69 6c 65  ) {..if (keyfile
fbd0: 20 3d 3d 20 4e 55 4c 4c 20 26 26 20 6b 65 79 20   == NULL && key 
fbe0: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20  == NULL) {..    
fbf0: 6b 65 79 66 69 6c 65 20 3d 20 63 65 72 74 66 69  keyfile = certfi
fc00: 6c 65 3b 0a 09 7d 0a 0a 09 69 66 20 28 6b 65 79  le;..}...if (key
fc10: 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  file != NULL) {.
fc20: 09 20 20 20 20 2f 2a 20 67 65 74 20 74 68 65 20  .    /* get the 
fc30: 70 72 69 76 61 74 65 20 6b 65 79 20 61 73 73 6f  private key asso
fc40: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69 73  ciated with this
fc50: 20 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a   certificate */.
fc60: 09 20 20 20 20 69 66 20 28 6b 65 79 66 69 6c 65  .    if (keyfile
fc70: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 6b 65   == NULL) {...ke
fc80: 79 66 69 6c 65 20 3d 20 63 65 72 74 66 69 6c 65  yfile = certfile
fc90: 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69  ;..    }...    i
fca0: 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 50  f (SSL_CTX_use_P
fcb0: 72 69 76 61 74 65 4b 65 79 5f 66 69 6c 65 28 63  rivateKey_file(c
fcc0: 74 78 2c 20 46 32 4e 28 6b 65 79 66 69 6c 65 2c  tx, F2N(keyfile,
fcd0: 20 26 64 73 29 2c 20 53 53 4c 5f 46 49 4c 45 54   &ds), SSL_FILET
fce0: 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b  YPE_PEM) <= 0) {
fcf0: 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72  ...Tcl_DStringFr
fd00: 65 65 28 26 64 73 29 3b 0a 09 09 2f 2a 20 66 6c  ee(&ds);.../* fl
fd10: 75 73 68 20 74 68 65 20 70 61 73 73 70 68 72 61  ush the passphra
fd20: 73 65 20 77 68 69 63 68 20 6d 69 67 68 74 20 62  se which might b
fd30: 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 72 65  e left in the re
fd40: 73 75 6c 74 20 2a 2f 0a 09 09 54 63 6c 5f 53 65  sult */...Tcl_Se
fd50: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
fd60: 4e 55 4c 4c 2c 20 54 43 4c 5f 53 54 41 54 49 43  NULL, TCL_STATIC
fd70: 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52  );...Tcl_AppendR
fd80: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75  esult(interp, "u
fd90: 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 70 75 62  nable to set pub
fda0: 6c 69 63 20 6b 65 79 20 66 69 6c 65 20 22 2c 20  lic key file ", 
fdb0: 6b 65 79 66 69 6c 65 2c 20 22 20 22 2c 0a 09 09  keyfile, " ",...
fdc0: 20 20 20 20 47 45 54 5f 45 52 52 5f 52 45 41 53      GET_ERR_REAS
fdd0: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e  ON(), (char *) N
fde0: 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f  ULL);...SSL_CTX_
fdf0: 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74  free(ctx);...ret
fe00: 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d  urn NULL;..    }
fe10: 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ..    Tcl_DStrin
fe20: 67 46 72 65 65 28 26 64 73 29 3b 0a 0a 09 7d 20  gFree(&ds);...} 
fe30: 65 6c 73 65 20 69 66 20 28 6b 65 79 20 21 3d 20  else if (key != 
fe40: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 69 66 20  NULL) {..    if 
fe50: 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 50 72 69  (SSL_CTX_use_Pri
fe60: 76 61 74 65 4b 65 79 5f 41 53 4e 31 28 45 56 50  vateKey_ASN1(EVP
fe70: 5f 50 4b 45 59 5f 52 53 41 2c 20 63 74 78 2c 20  _PKEY_RSA, ctx, 
fe80: 6b 65 79 2c 20 28 69 6e 74 29 20 6b 65 79 5f 6c  key, (int) key_l
fe90: 65 6e 29 20 3c 3d 20 30 29 20 7b 0a 09 09 2f 2a  en) <= 0) {.../*
fea0: 20 66 6c 75 73 68 20 74 68 65 20 70 61 73 73 70   flush the passp
feb0: 68 72 61 73 65 20 77 68 69 63 68 20 6d 69 67 68  hrase which migh
fec0: 74 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65  t be left in the
fed0: 20 72 65 73 75 6c 74 20 2a 2f 0a 09 09 54 63 6c   result */...Tcl
fee0: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
fef0: 70 2c 20 4e 55 4c 4c 2c 20 54 43 4c 5f 53 54 41  p, NULL, TCL_STA
ff00: 54 49 43 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65  TIC);...Tcl_Appe
ff10: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
ff20: 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20   "unable to set 
ff30: 70 75 62 6c 69 63 20 6b 65 79 3a 20 22 2c 20 47  public key: ", G
ff40: 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c  ET_ERR_REASON(),
ff50: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
ff60: 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28  ...SSL_CTX_free(
ff70: 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e  ctx);...return N
ff80: 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 09  ULL;..    }..}..
ff90: 2f 2a 20 4e 6f 77 20 77 65 20 6b 6e 6f 77 20 74  /* Now we know t
ffa0: 68 61 74 20 61 20 6b 65 79 20 61 6e 64 20 63 65  hat a key and ce
ffb0: 72 74 20 68 61 76 65 20 62 65 65 6e 20 73 65 74  rt have been set
ffc0: 20 61 67 61 69 6e 73 74 0a 09 20 2a 20 74 68 65   against.. * the
ffd0: 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a   SSL context */.
ffe0: 09 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 63 68  .if (!SSL_CTX_ch
fff0: 65 63 6b 5f 70 72 69 76 61 74 65 5f 6b 65 79 28  eck_private_key(
10000 63 74 78 29 29 20 7b 0a 09 20 20 20 20 54 63 6c  ctx)) {..    Tcl
10010 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
10020 74 65 72 70 2c 20 22 70 72 69 76 61 74 65 20 6b  terp, "private k
10030 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63  ey does not matc
10040 68 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74  h the certificat
10050 65 20 70 75 62 6c 69 63 20 6b 65 79 22 2c 0a 09  e public key",..
10060 09 09 20 20 20 20 20 28 63 68 61 72 20 2a 29 20  ..     (char *) 
10070 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f  NULL);..    SSL_
10080 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09  CTX_free(ctx);..
10090 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b      return NULL;
100a0 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ..}.    }..    /
100b0 2a 20 53 65 74 20 74 6f 20 75 73 65 20 74 68 65  * Set to use the
100c0 20 64 65 66 61 75 6c 74 20 6c 6f 63 61 74 69 6f   default locatio
100d0 6e 20 61 6e 64 20 66 69 6c 65 20 66 6f 72 20 43  n and file for C
100e0 65 72 74 69 66 69 63 61 74 65 20 41 75 74 68 6f  ertificate Autho
100f0 72 69 74 79 20 28 43 41 29 20 63 65 72 74 69 66  rity (CA) certif
10100 69 63 61 74 65 73 2e 0a 20 20 20 20 20 2a 20 54  icates..     * T
10110 68 65 20 64 65 66 61 75 6c 74 20 43 41 20 63 65  he default CA ce
10120 72 74 69 66 69 63 61 74 65 73 20 64 69 72 65 63  rtificates direc
10130 74 6f 72 79 20 69 73 20 63 61 6c 6c 65 64 20 63  tory is called c
10140 65 72 74 73 20 69 6e 20 74 68 65 20 64 65 66 61  erts in the defa
10150 75 6c 74 20 4f 70 65 6e 53 53 4c 0a 20 20 20 20  ult OpenSSL.    
10160 20 2a 20 64 69 72 65 63 74 6f 72 79 2e 20 49 74   * directory. It
10170 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 43 41   contains the CA
10180 20 63 65 72 74 69 66 69 63 61 74 65 73 20 69 6e   certificates in
10190 20 50 45 4d 20 66 6f 72 6d 61 74 2c 20 77 69 74   PEM format, wit
101a0 68 20 6f 6e 65 20 63 65 72 74 69 66 69 63 61 74  h one certificat
101b0 65 20 70 65 72 0a 20 20 20 20 20 2a 20 66 69 6c  e per.     * fil
101c0 65 2e 20 54 68 65 20 76 65 72 69 66 79 20 70 61  e. The verify pa
101d0 74 68 20 61 6e 64 20 73 74 6f 72 65 20 63 61 6e  th and store can
101e0 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20 62   be overridden b
101f0 79 20 74 68 65 20 53 53 4c 5f 43 45 52 54 5f 44  y the SSL_CERT_D
10200 49 52 20 65 6e 76 20 76 61 72 2e 20 54 68 65 0a  IR env var. The.
10210 20 20 20 20 20 2a 20 64 65 66 61 75 6c 74 20 43       * default C
10220 41 20 63 65 72 74 69 66 69 63 61 74 65 73 20 66  A certificates f
10230 69 6c 65 20 69 73 20 63 61 6c 6c 65 64 20 63 65  ile is called ce
10240 72 74 2e 70 65 6d 20 69 6e 20 74 68 65 20 64 65  rt.pem in the de
10250 66 61 75 6c 74 20 4f 70 65 6e 53 53 4c 20 64 69  fault OpenSSL di
10260 72 65 63 74 6f 72 79 2e 0a 20 20 20 20 20 2a 20  rectory..     * 
10270 54 68 65 20 76 65 72 69 66 79 20 66 69 6c 65 20  The verify file 
10280 63 61 6e 20 62 65 20 6f 76 65 72 72 69 64 64 65  can be overridde
10290 6e 20 62 79 20 74 68 65 20 53 53 4c 5f 43 45 52  n by the SSL_CER
102a0 54 5f 46 49 4c 45 20 65 6e 76 20 76 61 72 2e 20  T_FILE env var. 
102b0 2a 2f 0a 20 20 20 20 69 66 20 28 21 53 53 4c 5f  */.    if (!SSL_
102c0 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f  CTX_set_default_
102d0 76 65 72 69 66 79 5f 70 61 74 68 73 28 63 74 78  verify_paths(ctx
102e0 29 29 20 7b 0a 09 61 62 6f 72 74 2b 2b 3b 0a 20  )) {..abort++;. 
102f0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 76 65     }..    /* Ove
10300 72 72 69 64 65 73 20 66 6f 72 20 74 68 65 20 43  rrides for the C
10310 41 20 76 65 72 69 66 79 20 70 61 74 68 20 61 6e  A verify path an
10320 64 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 7b 0a  d file */.    {.
10330 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53  #if OPENSSL_VERS
10340 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33  ION_NUMBER < 0x3
10350 30 30 30 30 30 30 30 4c 0a 09 69 66 20 28 43 41  0000000L..if (CA
10360 70 61 74 68 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20  path != NULL || 
10370 43 41 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20  CAfile != NULL) 
10380 7b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69  {..    Tcl_DStri
10390 6e 67 20 64 73 31 3b 0a 09 20 20 20 20 54 63 6c  ng ds1;..    Tcl
103a0 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73  _DStringInit(&ds
103b0 31 29 3b 0a 0a 09 20 20 20 20 69 66 20 28 21 53  1);...    if (!S
103c0 53 4c 5f 43 54 58 5f 6c 6f 61 64 5f 76 65 72 69  SL_CTX_load_veri
103d0 66 79 5f 6c 6f 63 61 74 69 6f 6e 73 28 63 74 78  fy_locations(ctx
103e0 2c 20 46 32 4e 28 43 41 66 69 6c 65 2c 20 26 64  , F2N(CAfile, &d
103f0 73 29 2c 20 46 32 4e 28 43 41 70 61 74 68 2c 20  s), F2N(CApath, 
10400 26 64 73 31 29 29 29 20 7b 0a 09 09 61 62 6f 72  &ds1))) {...abor
10410 74 2b 2b 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55  t++;...return NU
10420 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20  LL;..    }..    
10430 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
10440 26 64 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f 44  &ds);..    Tcl_D
10450 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 31 29  StringFree(&ds1)
10460 3b 0a 0a 09 20 20 20 20 2f 2a 20 53 65 74 20 6c  ;...    /* Set l
10470 69 73 74 20 6f 66 20 43 41 73 20 74 6f 20 73 65  ist of CAs to se
10480 6e 64 20 74 6f 20 63 6c 69 65 6e 74 20 77 68 65  nd to client whe
10490 6e 20 72 65 71 75 65 73 74 69 6e 67 20 61 20 63  n requesting a c
104a0 6c 69 65 6e 74 20 63 65 72 74 69 66 69 63 61 74  lient certificat
104b0 65 20 2a 2f 0a 09 20 20 20 20 2f 2a 20 68 74 74  e */..    /* htt
104c0 70 73 3a 2f 2f 73 6f 75 72 63 65 66 6f 72 67 65  ps://sourceforge
104d0 2e 6e 65 74 2f 70 2f 74 6c 73 2f 62 75 67 73 2f  .net/p/tls/bugs/
104e0 35 37 2f 20 2a 2f 0a 09 20 20 20 20 2f 2a 20 58  57/ */..    /* X
104f0 58 58 3a 54 4f 44 4f 3a 20 4c 65 74 20 74 68 65  XX:TODO: Let the
10500 20 75 73 65 72 20 73 75 70 70 6c 79 20 76 61 6c   user supply val
10510 75 65 73 20 68 65 72 65 20 69 6e 73 74 65 61 64  ues here instead
10520 20 6f 66 20 73 6f 6d 65 74 68 69 6e 67 20 74 68   of something th
10530 61 74 20 65 78 69 73 74 73 20 6f 6e 20 74 68 65  at exists on the
10540 20 66 69 6c 65 73 79 73 74 65 6d 20 2a 2f 0a 09   filesystem */..
10550 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 58 35 30      STACK_OF(X50
10560 39 5f 4e 41 4d 45 29 20 2a 63 65 72 74 4e 61 6d  9_NAME) *certNam
10570 65 73 20 3d 20 53 53 4c 5f 6c 6f 61 64 5f 63 6c  es = SSL_load_cl
10580 69 65 6e 74 5f 43 41 5f 66 69 6c 65 28 46 32 4e  ient_CA_file(F2N
10590 28 43 41 66 69 6c 65 2c 20 26 64 73 29 29 3b 0a  (CAfile, &ds));.
105a0 09 20 20 20 20 69 66 20 28 63 65 72 74 4e 61 6d  .    if (certNam
105b0 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  es != NULL) {...
105c0 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65  SSL_CTX_set_clie
105d0 6e 74 5f 43 41 5f 6c 69 73 74 28 63 74 78 2c 20  nt_CA_list(ctx, 
105e0 63 65 72 74 4e 61 6d 65 73 29 3b 0a 09 20 20 20  certNames);..   
105f0 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72   }..    Tcl_DStr
10600 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 7d  ingFree(&ds);..}
10610 0a 0a 23 65 6c 73 65 0a 09 2f 2a 20 53 65 74 20  ..#else../* Set 
10620 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69  directory contai
10630 6e 69 6e 67 20 43 41 20 63 65 72 74 69 66 69 63  ning CA certific
10640 61 74 65 73 20 69 6e 20 50 45 4d 20 66 6f 72 6d  ates in PEM form
10650 61 74 2e 20 2a 2f 0a 09 69 66 20 28 43 41 70 61  at. */..if (CApa
10660 74 68 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20  th != NULL) {.. 
10670 20 20 20 69 66 20 28 21 53 53 4c 5f 43 54 58 5f     if (!SSL_CTX_
10680 6c 6f 61 64 5f 76 65 72 69 66 79 5f 64 69 72 28  load_verify_dir(
10690 63 74 78 2c 20 46 32 4e 28 43 41 70 61 74 68 2c  ctx, F2N(CApath,
106a0 20 26 64 73 29 29 29 20 7b 0a 09 09 61 62 6f 72   &ds))) {...abor
106b0 74 2b 2b 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20  t++;..    }..   
106c0 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65   Tcl_DStringFree
106d0 28 26 64 73 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 53  (&ds);..}.../* S
106e0 65 74 20 55 52 49 20 66 6f 72 20 74 6f 20 61 20  et URI for to a 
106f0 73 74 6f 72 65 2c 20 77 68 69 63 68 20 6d 61 79  store, which may
10700 20 62 65 20 61 20 73 69 6e 67 6c 65 20 63 6f 6e   be a single con
10710 74 61 69 6e 65 72 20 6f 72 20 61 20 63 61 74 61  tainer or a cata
10720 6c 6f 67 20 6f 66 20 63 6f 6e 74 61 69 6e 65 72  log of container
10730 73 2e 20 2a 2f 0a 09 69 66 20 28 43 41 73 74 6f  s. */..if (CAsto
10740 72 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20  re != NULL) {.. 
10750 20 20 20 69 66 20 28 21 53 53 4c 5f 43 54 58 5f     if (!SSL_CTX_
10760 6c 6f 61 64 5f 76 65 72 69 66 79 5f 73 74 6f 72  load_verify_stor
10770 65 28 63 74 78 2c 20 46 32 4e 28 43 41 73 74 6f  e(ctx, F2N(CAsto
10780 72 65 2c 20 26 64 73 29 29 29 20 7b 0a 09 09 61  re, &ds))) {...a
10790 62 6f 72 74 2b 2b 3b 0a 09 20 20 20 20 7d 0a 09  bort++;..    }..
107a0 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46      Tcl_DStringF
107b0 72 65 65 28 26 64 73 29 3b 0a 09 7d 0a 0a 09 2f  ree(&ds);..}.../
107c0 2a 20 53 65 74 20 66 69 6c 65 20 6f 66 20 43 41  * Set file of CA
107d0 20 63 65 72 74 69 66 69 63 61 74 65 73 20 69 6e   certificates in
107e0 20 50 45 4d 20 66 6f 72 6d 61 74 2e 20 20 2a 2f   PEM format.  */
107f0 0a 09 69 66 20 28 43 41 66 69 6c 65 20 21 3d 20  ..if (CAfile != 
10800 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 69 66 20  NULL) {..    if 
10810 28 21 53 53 4c 5f 43 54 58 5f 6c 6f 61 64 5f 76  (!SSL_CTX_load_v
10820 65 72 69 66 79 5f 66 69 6c 65 28 63 74 78 2c 20  erify_file(ctx, 
10830 46 32 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29  F2N(CAfile, &ds)
10840 29 29 20 7b 0a 09 09 61 62 6f 72 74 2b 2b 3b 0a  )) {...abort++;.
10850 09 20 20 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f  .    }..    Tcl_
10860 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29  DStringFree(&ds)
10870 3b 0a 0a 09 20 20 20 20 2f 2a 20 53 65 74 20 6c  ;...    /* Set l
10880 69 73 74 20 6f 66 20 43 41 73 20 74 6f 20 73 65  ist of CAs to se
10890 6e 64 20 74 6f 20 63 6c 69 65 6e 74 20 77 68 65  nd to client whe
108a0 6e 20 72 65 71 75 65 73 74 69 6e 67 20 61 20 63  n requesting a c
108b0 6c 69 65 6e 74 20 63 65 72 74 69 66 69 63 61 74  lient certificat
108c0 65 20 2a 2f 0a 09 20 20 20 20 53 54 41 43 4b 5f  e */..    STACK_
108d0 4f 46 28 58 35 30 39 5f 4e 41 4d 45 29 20 2a 63  OF(X509_NAME) *c
108e0 65 72 74 4e 61 6d 65 73 20 3d 20 53 53 4c 5f 6c  ertNames = SSL_l
108f0 6f 61 64 5f 63 6c 69 65 6e 74 5f 43 41 5f 66 69  oad_client_CA_fi
10900 6c 65 28 46 32 4e 28 43 41 66 69 6c 65 2c 20 26  le(F2N(CAfile, &
10910 64 73 29 29 3b 0a 09 20 20 20 20 69 66 20 28 63  ds));..    if (c
10920 65 72 74 4e 61 6d 65 73 20 21 3d 20 4e 55 4c 4c  ertNames != NULL
10930 29 20 7b 0a 09 09 53 53 4c 5f 43 54 58 5f 73 65  ) {...SSL_CTX_se
10940 74 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 74  t_client_CA_list
10950 28 63 74 78 2c 20 63 65 72 74 4e 61 6d 65 73 29  (ctx, certNames)
10960 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54 63  ;..    }..    Tc
10970 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64  l_DStringFree(&d
10980 73 29 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 20 20  s);..}.#endif.  
10990 20 20 7d 0a 20 0a 20 20 20 20 69 66 20 28 61 62    }. .    if (ab
109a0 6f 72 74 20 3e 20 30 29 20 7b 0a 09 2f 2a 20 72  ort > 0) {../* r
109b0 65 74 75 72 6e 20 65 72 72 6f 72 20 2a 2f 0a 20  eturn error */. 
109c0 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
109d0 63 74 78 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  ctx;.}.../*. *--
109e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
109f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10a00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10a10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10a20 2d 0a 20 2a 0a 20 2a 20 53 74 61 74 75 73 4f 62  -. *. * StatusOb
10a30 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72 6e 20 63  jCmd -- return c
10a40 65 72 74 69 66 69 63 61 74 65 20 66 6f 72 20 63  ertificate for c
10a50 6f 6e 6e 65 63 74 65 64 20 70 65 65 72 20 69 6e  onnected peer in
10a60 66 6f 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  fo.. *. * Result
10a70 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64  s:. *.A standard
10a80 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a   Tcl result.. *.
10a90 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
10aa0 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d  . *.None.. *. *-
10ab0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  --. */.static in
10b00 74 0a 53 74 61 74 75 73 4f 62 6a 43 6d 64 28 43  t.StatusObjCmd(C
10b10 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
10b20 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70  Data, Tcl_Interp
10b30 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62   *interp, int ob
10b40 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e  jc, Tcl_Obj *con
10b50 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20  st objv[]) {.   
10b60 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72   State *statePtr
10b70 3b 0a 20 20 20 20 58 35 30 39 20 2a 70 65 65 72  ;.    X509 *peer
10b80 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f  ;.    Tcl_Obj *o
10b90 62 6a 50 74 72 3b 0a 20 20 20 20 54 63 6c 5f 43  bjPtr;.    Tcl_C
10ba0 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a 20 20 20  hannel chan;.   
10bb0 20 63 68 61 72 20 2a 63 68 61 6e 6e 65 6c 4e 61   char *channelNa
10bc0 6d 65 2c 20 2a 63 69 70 68 65 72 73 3b 0a 20 20  me, *ciphers;.  
10bd0 20 20 69 6e 74 20 6d 6f 64 65 3b 0a 20 20 20 20    int mode;.    
10be0 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
10bf0 68 61 72 20 2a 70 72 6f 74 6f 3b 0a 20 20 20 20  har *proto;.    
10c00 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6c 65 6e  unsigned int len
10c10 3b 0a 20 20 20 20 69 6e 74 20 6e 69 64 2c 20 72  ;.    int nid, r
10c20 65 73 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 63  es;.    (void) c
10c30 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20  lientData;..    
10c40 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
10c50 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63  );..    if (objc
10c60 20 3c 20 32 20 7c 7c 20 6f 62 6a 63 20 3e 20 33   < 2 || objc > 3
10c70 20 7c 7c 20 28 6f 62 6a 63 20 3d 3d 20 33 20 26   || (objc == 3 &
10c80 26 20 21 73 74 72 63 6d 70 28 54 63 6c 5f 47 65  & !strcmp(Tcl_Ge
10c90 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
10ca0 2c 20 22 2d 6c 6f 63 61 6c 22 29 29 29 20 7b 0a  , "-local"))) {.
10cb0 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67  .Tcl_WrongNumArg
10cc0 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
10cd0 76 2c 20 22 3f 2d 6c 6f 63 61 6c 3f 20 63 68 61  v, "?-local? cha
10ce0 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20  nnel");..return 
10cf0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
10d00 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 63 68 61  ..    /* Get cha
10d10 6e 6e 65 6c 20 49 64 20 2a 2f 0a 20 20 20 20 63  nnel Id */.    c
10d20 68 61 6e 6e 65 6c 4e 61 6d 65 20 3d 20 54 63 6c  hannelName = Tcl
10d30 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
10d40 28 6f 62 6a 63 20 3d 3d 20 32 20 3f 20 31 20 3a  (objc == 2 ? 1 :
10d50 20 32 29 5d 29 3b 0a 20 20 20 20 63 68 61 6e 20   2)]);.    chan 
10d60 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  = Tcl_GetChannel
10d70 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 6e 65 6c  (interp, channel
10d80 4e 61 6d 65 2c 20 26 6d 6f 64 65 29 3b 0a 20 20  Name, &mode);.  
10d90 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54    if (chan == (T
10da0 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c  cl_Channel) NULL
10db0 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  ) {..return TCL_
10dc0 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
10dd0 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
10de0 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65  o operate on the
10df0 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c   topmost channel
10e00 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54   */.    chan = T
10e10 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c  cl_GetTopChannel
10e20 28 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 28  (chan);.    if (
10e30 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79  Tcl_GetChannelTy
10e40 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f  pe(chan) != Tls_
10e50 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b  ChannelType()) {
10e60 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
10e70 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20  lt(interp, "bad 
10e80 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c  channel \"", Tcl
10e90 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28  _GetChannelName(
10ea0 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f  chan),..."\": no
10eb0 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22  t a TLS channel"
10ec0 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
10ed0 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43  ;..Tcl_SetErrorC
10ee0 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53  ode(interp, "TLS
10ef0 22 2c 20 22 53 54 41 54 55 53 22 2c 20 22 43 48  ", "STATUS", "CH
10f00 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44  ANNEL", "INVALID
10f10 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
10f20 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  );..return TCL_E
10f30 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
10f40 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74  statePtr = (Stat
10f50 65 20 2a 29 20 54 63 6c 5f 47 65 74 43 68 61 6e  e *) Tcl_GetChan
10f60 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28  nelInstanceData(
10f70 63 68 61 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 47  chan);..    /* G
10f80 65 74 20 63 65 72 74 69 66 69 63 61 74 65 20 66  et certificate f
10f90 6f 72 20 70 65 65 72 20 6f 72 20 73 65 6c 66 20  or peer or self 
10fa0 2a 2f 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20  */.    if (objc 
10fb0 3d 3d 20 32 29 20 7b 0a 09 70 65 65 72 20 3d 20  == 2) {..peer = 
10fc0 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f 63 65 72  SSL_get_peer_cer
10fd0 74 69 66 69 63 61 74 65 28 73 74 61 74 65 50 74  tificate(statePt
10fe0 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 20 65  r->ssl);.    } e
10ff0 6c 73 65 20 7b 0a 09 70 65 65 72 20 3d 20 53 53  lse {..peer = SS
11000 4c 5f 67 65 74 5f 63 65 72 74 69 66 69 63 61 74  L_get_certificat
11010 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29  e(statePtr->ssl)
11020 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 47  ;.    }.    /* G
11030 65 74 20 58 35 30 39 20 63 65 72 74 69 66 69 63  et X509 certific
11040 61 74 65 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20  ate info */.    
11050 69 66 20 28 70 65 65 72 29 20 7b 0a 09 6f 62 6a  if (peer) {..obj
11060 50 74 72 20 3d 20 54 6c 73 5f 4e 65 77 58 35 30  Ptr = Tls_NewX50
11070 39 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 65 65  9Obj(interp, pee
11080 72 2c 20 31 29 3b 0a 09 69 66 20 28 6f 62 6a 63  r, 1);..if (objc
11090 20 3d 3d 20 32 29 20 7b 0a 09 20 20 20 20 58 35   == 2) {..    X5
110a0 30 39 5f 66 72 65 65 28 70 65 65 72 29 3b 0a 09  09_free(peer);..
110b0 20 20 20 20 70 65 65 72 20 3d 20 4e 55 4c 4c 3b      peer = NULL;
110c0 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..}.    } else {
110d0 0a 09 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e  ..objPtr = Tcl_N
110e0 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c  ewListObj(0, NUL
110f0 4c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  L);.    }..    /
11100 2a 20 50 65 65 72 20 6e 61 6d 65 20 2a 2f 0a 20  * Peer name */. 
11110 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69     LAPPEND_STR(i
11120 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
11130 70 65 65 72 6e 61 6d 65 22 2c 20 53 53 4c 5f 67  peername", SSL_g
11140 65 74 30 5f 70 65 65 72 6e 61 6d 65 28 73 74 61  et0_peername(sta
11150 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20 2d 31 29  tePtr->ssl), -1)
11160 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 49 4e  ;.    LAPPEND_IN
11170 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  T(interp, objPtr
11180 2c 20 22 73 62 69 74 73 22 2c 20 53 53 4c 5f 67  , "sbits", SSL_g
11190 65 74 5f 63 69 70 68 65 72 5f 62 69 74 73 28 73  et_cipher_bits(s
111a0 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 4e 55  tatePtr->ssl, NU
111b0 4c 4c 29 29 3b 0a 0a 20 20 20 20 63 69 70 68 65  LL));..    ciphe
111c0 72 73 20 3d 20 28 63 68 61 72 2a 29 53 53 4c 5f  rs = (char*)SSL_
111d0 67 65 74 5f 63 69 70 68 65 72 28 73 74 61 74 65  get_cipher(state
111e0 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 4c  Ptr->ssl);.    L
111f0 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
11200 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 68  p, objPtr, "ciph
11210 65 72 22 2c 20 63 69 70 68 65 72 73 2c 20 2d 31  er", ciphers, -1
11220 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66  );..    /* Verif
11230 79 20 74 68 65 20 58 35 30 39 20 63 65 72 74 69  y the X509 certi
11240 66 69 63 61 74 65 20 70 72 65 73 65 6e 74 65 64  ficate presented
11250 20 62 79 20 74 68 65 20 70 65 65 72 20 2a 2f 0a   by the peer */.
11260 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28      LAPPEND_STR(
11270 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
11280 22 76 65 72 69 66 79 52 65 73 75 6c 74 22 2c 0a  "verifyResult",.
11290 09 58 35 30 39 5f 76 65 72 69 66 79 5f 63 65 72  .X509_verify_cer
112a0 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 53  t_error_string(S
112b0 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 72 65  SL_get_verify_re
112c0 73 75 6c 74 28 73 74 61 74 65 50 74 72 2d 3e 73  sult(statePtr->s
112d0 73 6c 29 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 20  sl)), -1);..    
112e0 2f 2a 20 56 65 72 69 66 79 20 6d 6f 64 65 20 2a  /* Verify mode *
112f0 2f 0a 20 20 20 20 6d 6f 64 65 20 3d 20 53 53 4c  /.    mode = SSL
11300 5f 67 65 74 5f 76 65 72 69 66 79 5f 6d 6f 64 65  _get_verify_mode
11310 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b  (statePtr->ssl);
11320 0a 20 20 20 20 69 66 20 28 6d 6f 64 65 20 26 20  .    if (mode & 
11330 53 53 4c 5f 56 45 52 49 46 59 5f 4e 4f 4e 45 29  SSL_VERIFY_NONE)
11340 20 7b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28   {..LAPPEND_STR(
11350 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
11360 22 76 65 72 69 66 79 4d 6f 64 65 22 2c 20 22 6e  "verifyMode", "n
11370 6f 6e 65 22 2c 20 2d 31 29 3b 0a 20 20 20 20 7d  one", -1);.    }
11380 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 4f 62 6a   else {..Tcl_Obj
11390 20 2a 6c 69 73 74 4f 62 6a 50 74 72 20 3d 20 54   *listObjPtr = T
113a0 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c  cl_NewListObj(0,
113b0 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 6d 6f 64   NULL);..if (mod
113c0 65 20 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 50  e & SSL_VERIFY_P
113d0 45 45 52 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f  EER) {..    Tcl_
113e0 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
113f0 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73  ment(interp, lis
11400 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77  tObjPtr, Tcl_New
11410 53 74 72 69 6e 67 4f 62 6a 28 22 70 65 65 72 22  StringObj("peer"
11420 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28  , -1));..}..if (
11430 6d 6f 64 65 20 26 20 53 53 4c 5f 56 45 52 49 46  mode & SSL_VERIF
11440 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45  Y_FAIL_IF_NO_PEE
11450 52 5f 43 45 52 54 29 20 7b 0a 09 20 20 20 20 54  R_CERT) {..    T
11460 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
11470 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
11480 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f  listObjPtr, Tcl_
11490 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 66 61  NewStringObj("fa
114a0 69 6c 20 69 66 20 6e 6f 20 70 65 65 72 20 63 65  il if no peer ce
114b0 72 74 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69  rt", -1));..}..i
114c0 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 56 45  f (mode & SSL_VE
114d0 52 49 46 59 5f 43 4c 49 45 4e 54 5f 4f 4e 43 45  RIFY_CLIENT_ONCE
114e0 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73  ) {..    Tcl_Lis
114f0 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
11500 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62  t(interp, listOb
11510 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
11520 69 6e 67 4f 62 6a 28 22 63 6c 69 65 6e 74 20 6f  ingObj("client o
11530 6e 63 65 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09  nce", -1));..}..
11540 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 56  if (mode & SSL_V
11550 45 52 49 46 59 5f 50 4f 53 54 5f 48 41 4e 44 53  ERIFY_POST_HANDS
11560 48 41 4b 45 29 20 7b 0a 09 20 20 20 20 54 63 6c  HAKE) {..    Tcl
11570 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
11580 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69  ement(interp, li
11590 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  stObjPtr, Tcl_Ne
115a0 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 6f 73 74  wStringObj("post
115b0 20 68 61 6e 64 73 68 61 6b 65 22 2c 20 2d 31 29   handshake", -1)
115c0 29 3b 0a 09 7d 0a 09 4c 41 50 50 45 4e 44 5f 4f  );..}..LAPPEND_O
115d0 42 4a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  BJ(interp, objPt
115e0 72 2c 20 22 76 65 72 69 66 79 4d 6f 64 65 22 2c  r, "verifyMode",
115f0 20 6c 69 73 74 4f 62 6a 50 74 72 29 0a 20 20 20   listObjPtr).   
11600 20 7d 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66   }..    /* Verif
11610 79 20 6d 6f 64 65 20 64 65 70 74 68 20 2a 2f 0a  y mode depth */.
11620 20 20 20 20 4c 41 50 50 45 4e 44 5f 49 4e 54 28      LAPPEND_INT(
11630 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
11640 22 76 65 72 69 66 79 44 65 70 74 68 22 2c 20 53  "verifyDepth", S
11650 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 64 65  SL_get_verify_de
11660 70 74 68 28 73 74 61 74 65 50 74 72 2d 3e 73 73  pth(statePtr->ss
11670 6c 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 70  l));..    /* Rep
11680 6f 72 74 20 74 68 65 20 73 65 6c 65 63 74 65 64  ort the selected
11690 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20 72   protocol as a r
116a0 65 73 75 6c 74 20 6f 66 20 74 68 65 20 6e 65 67  esult of the neg
116b0 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  otiation */.    
116c0 53 53 4c 5f 67 65 74 30 5f 61 6c 70 6e 5f 73 65  SSL_get0_alpn_se
116d0 6c 65 63 74 65 64 28 73 74 61 74 65 50 74 72 2d  lected(statePtr-
116e0 3e 73 73 6c 2c 20 26 70 72 6f 74 6f 2c 20 26 6c  >ssl, &proto, &l
116f0 65 6e 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44  en);.    LAPPEND
11700 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _STR(interp, obj
11710 50 74 72 2c 20 22 61 6c 70 6e 22 2c 20 28 63 68  Ptr, "alpn", (ch
11720 61 72 20 2a 29 70 72 6f 74 6f 2c 20 28 54 63 6c  ar *)proto, (Tcl
11730 5f 53 69 7a 65 29 20 6c 65 6e 29 3b 0a 20 20 20  _Size) len);.   
11740 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74   LAPPEND_STR(int
11750 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70 72  erp, objPtr, "pr
11760 6f 74 6f 63 6f 6c 22 2c 20 53 53 4c 5f 67 65 74  otocol", SSL_get
11770 5f 76 65 72 73 69 6f 6e 28 73 74 61 74 65 50 74  _version(statePt
11780 72 2d 3e 73 73 6c 29 2c 20 2d 31 29 3b 0a 0a 20  r->ssl), -1);.. 
11790 20 20 20 2f 2a 20 56 61 6c 69 64 20 66 6f 72 20     /* Valid for 
117a0 6e 6f 6e 2d 52 53 41 20 73 69 67 6e 61 74 75 72  non-RSA signatur
117b0 65 20 61 6e 64 20 54 4c 53 20 31 2e 33 20 2a 2f  e and TLS 1.3 */
117c0 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d  .    if (objc ==
117d0 20 32 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c   2) {..res = SSL
117e0 5f 67 65 74 5f 70 65 65 72 5f 73 69 67 6e 61 74  _get_peer_signat
117f0 75 72 65 5f 6e 69 64 28 73 74 61 74 65 50 74 72  ure_nid(statePtr
11800 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 3b 0a 20 20  ->ssl, &nid);.  
11810 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20    } else {..res 
11820 3d 20 53 53 4c 5f 67 65 74 5f 73 69 67 6e 61 74  = SSL_get_signat
11830 75 72 65 5f 6e 69 64 28 73 74 61 74 65 50 74 72  ure_nid(statePtr
11840 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 3b 0a 20 20  ->ssl, &nid);.  
11850 20 20 7d 0a 20 20 20 20 69 66 20 28 21 72 65 73    }.    if (!res
11860 29 20 7b 6e 69 64 20 3d 20 30 3b 7d 0a 20 20 20  ) {nid = 0;}.   
11870 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74   LAPPEND_STR(int
11880 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 69  erp, objPtr, "si
11890 67 6e 61 74 75 72 65 48 61 73 68 41 6c 67 6f 72  gnatureHashAlgor
118a0 69 74 68 6d 22 2c 20 4f 42 4a 5f 6e 69 64 32 6c  ithm", OBJ_nid2l
118b0 6e 28 6e 69 64 29 2c 20 2d 31 29 3b 0a 0a 20 20  n(nid), -1);..  
118c0 20 20 2f 2a 20 41 64 64 65 64 20 69 6e 20 4f 70    /* Added in Op
118d0 65 6e 53 53 4c 20 31 2e 31 2e 31 61 20 2a 2f 0a  enSSL 1.1.1a */.
118e0 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53  #if OPENSSL_VERS
118f0 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e 20 30 78 31  ION_NUMBER > 0x1
11900 30 31 30 31 30 30 30 4c 0a 20 20 20 20 69 66 20  0101000L.    if 
11910 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 72  (objc == 2) {..r
11920 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f 70 65 65  es = SSL_get_pee
11930 72 5f 73 69 67 6e 61 74 75 72 65 5f 74 79 70 65  r_signature_type
11940 5f 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e 73  _nid(statePtr->s
11950 73 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20 7d  sl, &nid);.    }
11960 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 53   else {..res = S
11970 53 4c 5f 67 65 74 5f 73 69 67 6e 61 74 75 72 65  SL_get_signature
11980 5f 74 79 70 65 5f 6e 69 64 28 73 74 61 74 65 50  _type_nid(stateP
11990 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 3b 0a  tr->ssl, &nid);.
119a0 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 21 72      }.    if (!r
119b0 65 73 29 20 7b 6e 69 64 20 3d 20 30 3b 7d 0a 20  es) {nid = 0;}. 
119c0 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69     LAPPEND_STR(i
119d0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
119e0 73 69 67 6e 61 74 75 72 65 54 79 70 65 22 2c 20  signatureType", 
119f0 4f 42 4a 5f 6e 69 64 32 6c 6e 28 6e 69 64 29 2c  OBJ_nid2ln(nid),
11a00 20 2d 31 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20   -1);.#endif..  
11a10 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
11a20 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  lt(interp, objPt
11a30 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  r);.    return T
11a40 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  CL_OK;.}.../*. *
11a50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11a60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11a70 2d 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a 0a 20 2a 20 43 6f 6e 6e 65 63  ---. *. * Connec
11aa0 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 20 2d  tionInfoObjCmd -
11ab0 2d 20 72 65 74 75 72 6e 20 63 6f 6e 6e 65 63 74  - return connect
11ac0 69 6f 6e 20 69 6e 66 6f 20 66 72 6f 6d 20 4f 70  ion info from Op
11ad0 65 6e 53 53 4c 2e 0a 20 2a 0a 20 2a 20 52 65 73  enSSL.. *. * Res
11ae0 75 6c 74 73 3a 0a 20 2a 09 41 20 6c 69 73 74 20  ults:. *.A list 
11af0 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e  of connection in
11b00 66 6f 0a 20 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  fo.  *. *-------
11b10 2d 2d 2d 2d 2d 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 0a 20 2a 2f  ------------. */
11b50 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 43 6f 6e  ..static int Con
11b60 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d  nectionInfoObjCm
11b70 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69  d(ClientData cli
11b80 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74  entData, Tcl_Int
11b90 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74  erp *interp, int
11ba0 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a   objc, Tcl_Obj *
11bb0 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a  const objv[]) {.
11bc0 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20      Tcl_Channel 
11bd0 63 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68  chan;../* The ch
11be0 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d  annel to set a m
11bf0 6f 64 65 20 6f 6e 20 2a 2f 0a 20 20 20 20 53 74  ode on */.    St
11c00 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b 09 09  ate *statePtr;..
11c10 2f 2a 20 63 6c 69 65 6e 74 20 73 74 61 74 65 20  /* client state 
11c20 66 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a  for ssl socket *
11c30 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f  /.    Tcl_Obj *o
11c40 62 6a 50 74 72 2c 20 2a 6c 69 73 74 50 74 72 3b  bjPtr, *listPtr;
11c50 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 20 2a  .    const SSL *
11c60 73 73 6c 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53  ssl;.    const S
11c70 53 4c 5f 43 49 50 48 45 52 20 2a 63 69 70 68 65  SL_CIPHER *ciphe
11c80 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c  r;.    const SSL
11c90 5f 53 45 53 53 49 4f 4e 20 2a 73 65 73 73 69 6f  _SESSION *sessio
11ca0 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20 45 56 50  n;.    const EVP
11cb0 5f 4d 44 20 2a 6d 64 3b 0a 20 20 20 20 28 76 6f  _MD *md;.    (vo
11cc0 69 64 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a  id) clientData;.
11cd0 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
11ce0 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20  lled");..    if 
11cf0 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54  (objc != 2) {..T
11d00 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
11d10 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
11d20 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65   "channel");..re
11d30 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
11d40 20 20 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20      }..    chan 
11d50 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  = Tcl_GetChannel
11d60 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
11d70 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
11d80 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28   NULL);.    if (
11d90 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61  chan == (Tcl_Cha
11da0 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72  nnel) NULL) {..r
11db0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
11dc0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d  .    }..    /* M
11dd0 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72  ake sure to oper
11de0 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f  ate on the topmo
11df0 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20  st channel */.  
11e00 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74    chan = Tcl_Get
11e10 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29  TopChannel(chan)
11e20 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65  ;.    if (Tcl_Ge
11e30 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61  tChannelType(cha
11e40 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65  n) != Tls_Channe
11e50 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f  lType()) {..Tcl_
11e60 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
11e70 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65  erp, "bad channe
11e80 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68  l \"", Tcl_GetCh
11e90 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c  annelName(chan),
11ea0 0a 09 20 20 20 20 22 5c 22 3a 20 6e 6f 74 20 61  ..    "\": not a
11eb0 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 28   TLS channel", (
11ec0 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
11ed0 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65  Tcl_SetErrorCode
11ee0 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20  (interp, "TLS", 
11ef0 22 43 4f 4e 4e 45 43 54 49 4f 4e 22 2c 20 22 43  "CONNECTION", "C
11f00 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49  HANNEL", "INVALI
11f10 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  D", (char *) NUL
11f20 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  L);..return TCL_
11f30 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
11f40 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e    objPtr = Tcl_N
11f50 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c  ewListObj(0, NUL
11f60 4c 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 6e  L);..    /* Conn
11f70 65 63 74 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20  ection info */. 
11f80 20 20 20 73 74 61 74 65 50 74 72 20 3d 20 28 53     statePtr = (S
11f90 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 68  tate *)Tcl_GetCh
11fa0 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74  annelInstanceDat
11fb0 61 28 63 68 61 6e 29 3b 0a 20 20 20 20 73 73 6c  a(chan);.    ssl
11fc0 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c   = statePtr->ssl
11fd0 3b 0a 20 20 20 20 69 66 20 28 73 73 6c 20 21 3d  ;.    if (ssl !=
11fe0 20 4e 55 4c 4c 29 20 7b 0a 09 63 6f 6e 73 74 20   NULL) {..const 
11ff0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
12000 72 6f 74 6f 3b 0a 09 75 6e 73 69 67 6e 65 64 20  roto;..unsigned 
12010 69 6e 74 20 75 6c 65 6e 3b 0a 0a 09 2f 2a 20 49  int ulen;.../* I
12020 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 66 69  nitialization fi
12030 6e 69 73 68 65 64 20 2a 2f 0a 09 4c 41 50 50 45  nished */..LAPPE
12040 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20  ND_BOOL(interp, 
12050 6f 62 6a 50 74 72 2c 20 22 69 6e 69 74 5f 66 69  objPtr, "init_fi
12060 6e 69 73 68 65 64 22 2c 20 53 53 4c 5f 69 73 5f  nished", SSL_is_
12070 69 6e 69 74 5f 66 69 6e 69 73 68 65 64 28 73 73  init_finished(ss
12080 6c 29 29 3b 0a 0a 09 2f 2a 20 63 6f 6e 6e 65 63  l));.../* connec
12090 74 69 6f 6e 20 73 74 61 74 65 20 2a 2f 0a 09 4c  tion state */..L
120a0 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
120b0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 74 61 74  p, objPtr, "stat
120c0 65 22 2c 20 53 53 4c 5f 73 74 61 74 65 5f 73 74  e", SSL_state_st
120d0 72 69 6e 67 5f 6c 6f 6e 67 28 73 73 6c 29 2c 20  ring_long(ssl), 
120e0 2d 31 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 53 4e  -1);.../* Get SN
120f0 49 20 72 65 71 75 65 73 74 65 64 20 73 65 72 76  I requested serv
12100 65 72 20 6e 61 6d 65 20 2a 2f 0a 09 4c 41 50 50  er name */..LAPP
12110 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
12120 6f 62 6a 50 74 72 2c 20 22 73 65 72 76 65 72 6e  objPtr, "servern
12130 61 6d 65 22 2c 20 53 53 4c 5f 67 65 74 5f 73 65  ame", SSL_get_se
12140 72 76 65 72 6e 61 6d 65 28 73 73 6c 2c 20 54 4c  rvername(ssl, TL
12150 53 45 58 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f  SEXT_NAMETYPE_ho
12160 73 74 5f 6e 61 6d 65 29 2c 20 2d 31 29 3b 0a 0a  st_name), -1);..
12170 09 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 20 73  ./* Report the s
12180 65 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c  elected protocol
12190 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20   as a result of 
121a0 74 68 65 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20  the negotiation 
121b0 2a 2f 0a 09 53 53 4c 5f 67 65 74 30 5f 61 6c 70  */..SSL_get0_alp
121c0 6e 5f 73 65 6c 65 63 74 65 64 28 73 74 61 74 65  n_selected(state
121d0 50 74 72 2d 3e 73 73 6c 2c 20 26 70 72 6f 74 6f  Ptr->ssl, &proto
121e0 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c 41 50 50 45  , &ulen);..LAPPE
121f0 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f  ND_STR(interp, o
12200 62 6a 50 74 72 2c 20 22 61 6c 70 6e 22 2c 20 28  bjPtr, "alpn", (
12210 63 68 61 72 20 2a 29 70 72 6f 74 6f 2c 20 28 54  char *)proto, (T
12220 63 6c 5f 53 69 7a 65 29 20 75 6c 65 6e 29 3b 0a  cl_Size) ulen);.
12230 0a 09 2f 2a 20 47 65 74 20 70 72 6f 74 6f 63 6f  ../* Get protoco
12240 6c 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54  l */..LAPPEND_ST
12250 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  R(interp, objPtr
12260 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 53 53  , "protocol", SS
12270 4c 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 73 73  L_get_version(ss
12280 6c 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 52 65  l), -1);.../* Re
12290 6e 65 67 6f 74 69 61 74 69 6f 6e 20 61 6c 6c 6f  negotiation allo
122a0 77 65 64 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f  wed */..LAPPEND_
122b0 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a  BOOL(interp, obj
122c0 50 74 72 2c 20 22 72 65 6e 65 67 6f 74 69 61 74  Ptr, "renegotiat
122d0 69 6f 6e 5f 61 6c 6c 6f 77 65 64 22 2c 20 53 53  ion_allowed", SS
122e0 4c 5f 67 65 74 5f 73 65 63 75 72 65 5f 72 65 6e  L_get_secure_ren
122f0 65 67 6f 74 69 61 74 69 6f 6e 5f 73 75 70 70 6f  egotiation_suppo
12300 72 74 28 28 53 53 4c 20 2a 29 20 73 73 6c 29 29  rt((SSL *) ssl))
12310 3b 0a 0a 09 2f 2a 20 47 65 74 20 73 65 63 75 72  ;.../* Get secur
12320 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 09 4c 41  ity level */..LA
12330 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70  PPEND_INT(interp
12340 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 63 75 72  , objPtr, "secur
12350 69 74 79 5f 6c 65 76 65 6c 22 2c 20 53 53 4c 5f  ity_level", SSL_
12360 67 65 74 5f 73 65 63 75 72 69 74 79 5f 6c 65 76  get_security_lev
12370 65 6c 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 53  el(ssl));.../* S
12380 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 09  ession info */..
12390 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74  LAPPEND_BOOL(int
123a0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65  erp, objPtr, "se
123b0 73 73 69 6f 6e 5f 72 65 75 73 65 64 22 2c 20 53  ssion_reused", S
123c0 53 4c 5f 73 65 73 73 69 6f 6e 5f 72 65 75 73 65  SL_session_reuse
123d0 64 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 49 73  d(ssl));.../* Is
123e0 20 73 65 72 76 65 72 20 69 6e 66 6f 20 2a 2f 0a   server info */.
123f0 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e  .LAPPEND_BOOL(in
12400 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 69  terp, objPtr, "i
12410 73 5f 73 65 72 76 65 72 22 2c 20 53 53 4c 5f 69  s_server", SSL_i
12420 73 5f 73 65 72 76 65 72 28 73 73 6c 29 29 3b 0a  s_server(ssl));.
12430 0a 09 2f 2a 20 49 73 20 44 54 4c 53 20 2a 2f 0a  ../* Is DTLS */.
12440 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e  .LAPPEND_BOOL(in
12450 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 69  terp, objPtr, "i
12460 73 5f 64 74 6c 73 22 2c 20 53 53 4c 5f 69 73 5f  s_dtls", SSL_is_
12470 64 74 6c 73 28 73 73 6c 29 29 3b 0a 0a 23 69 66  dtls(ssl));..#if
12480 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e   OPENSSL_VERSION
12490 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 78 33 30 32  _NUMBER >= 0x302
124a0 30 30 30 30 30 4c 0a 09 2f 2a 20 49 73 20 51 55  00000L../* Is QU
124b0 49 43 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42  IC */..LAPPEND_B
124c0 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  OOL(interp, objP
124d0 74 72 2c 20 22 69 73 5f 71 75 69 63 22 2c 20 53  tr, "is_quic", S
124e0 53 4c 5f 69 73 5f 71 75 69 63 28 73 73 6c 29 29  SL_is_quic(ssl))
124f0 3b 0a 0a 09 2f 2a 20 49 73 20 54 4c 53 20 2a 2f  ;.../* Is TLS */
12500 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69  ..LAPPEND_BOOL(i
12510 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
12520 69 73 5f 74 6c 73 22 2c 20 53 53 4c 5f 69 73 5f  is_tls", SSL_is_
12530 74 6c 73 28 73 73 6c 29 29 3b 0a 23 65 6e 64 69  tls(ssl));.#endi
12540 66 0a 0a 09 2f 2a 20 44 41 4e 45 20 54 4c 53 20  f.../* DANE TLS 
12550 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 2a  authentication *
12560 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28  /..LAPPEND_BOOL(
12570 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
12580 22 64 61 6e 65 5f 61 75 74 68 22 2c 20 53 53 4c  "dane_auth", SSL
12590 5f 67 65 74 30 5f 64 61 6e 65 28 28 53 53 4c 20  _get0_dane((SSL 
125a0 2a 29 73 73 6c 29 20 21 3d 20 4e 55 4c 4c 29 3b  *)ssl) != NULL);
125b0 0a 0a 09 2f 2a 20 57 61 69 74 69 6e 67 20 66 6f  .../* Waiting fo
125c0 72 20 61 73 79 6e 63 20 2a 2f 0a 09 4c 41 50 50  r async */..LAPP
125d0 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c  END_BOOL(interp,
125e0 20 6f 62 6a 50 74 72 2c 20 22 77 61 69 74 69 6e   objPtr, "waitin
125f0 67 5f 66 6f 72 5f 61 73 79 6e 63 22 2c 20 53 53  g_for_async", SS
12600 4c 5f 77 61 69 74 69 6e 67 5f 66 6f 72 5f 61 73  L_waiting_for_as
12610 79 6e 63 28 28 53 53 4c 20 2a 29 73 73 6c 29 29  ync((SSL *)ssl))
12620 3b 0a 0a 09 2f 2a 20 54 69 6d 65 2d 6f 75 74 20  ;.../* Time-out 
12630 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47  */..LAPPEND_LONG
12640 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
12650 20 22 74 69 6d 65 2d 6f 75 74 22 2c 20 53 53 4c   "time-out", SSL
12660 5f 67 65 74 5f 64 65 66 61 75 6c 74 5f 74 69 6d  _get_default_tim
12670 65 6f 75 74 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a  eout(ssl));.../*
12680 20 49 73 20 43 65 72 74 69 66 69 63 61 74 65 20   Is Certificate 
12690 54 72 61 6e 73 70 61 72 65 6e 63 79 20 76 61 6c  Transparency val
126a0 69 64 61 74 69 6f 6e 20 65 6e 61 62 6c 65 64 20  idation enabled 
126b0 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c  */..LAPPEND_BOOL
126c0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
126d0 20 22 63 74 5f 65 6e 61 62 6c 65 64 22 2c 20 53   "ct_enabled", S
126e0 53 4c 5f 63 74 5f 69 73 5f 65 6e 61 62 6c 65 64  SL_ct_is_enabled
126f0 28 73 73 6c 29 29 3b 0a 20 20 20 20 7d 0a 0a 20  (ssl));.    }.. 
12700 20 20 20 2f 2a 20 43 69 70 68 65 72 20 69 6e 66     /* Cipher inf
12710 6f 20 2a 2f 0a 20 20 20 20 63 69 70 68 65 72 20  o */.    cipher 
12720 3d 20 53 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e  = SSL_get_curren
12730 74 5f 63 69 70 68 65 72 28 73 73 6c 29 3b 0a 20  t_cipher(ssl);. 
12740 20 20 20 69 66 20 28 63 69 70 68 65 72 20 21 3d     if (cipher !=
12750 20 4e 55 4c 4c 29 20 7b 0a 09 63 68 61 72 20 62   NULL) {..char b
12760 75 66 5b 42 55 46 53 49 5a 5d 20 3d 20 7b 30 7d  uf[BUFSIZ] = {0}
12770 3b 0a 09 69 6e 74 20 62 69 74 73 2c 20 61 6c 67  ;..int bits, alg
12780 5f 62 69 74 73 3b 0a 0a 09 2f 2a 20 43 69 70 68  _bits;.../* Ciph
12790 65 72 20 6e 61 6d 65 20 2a 2f 0a 09 4c 41 50 50  er name */..LAPP
127a0 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
127b0 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65 72 22  objPtr, "cipher"
127c0 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74  , SSL_CIPHER_get
127d0 5f 6e 61 6d 65 28 63 69 70 68 65 72 29 2c 20 2d  _name(cipher), -
127e0 31 29 3b 0a 0a 09 2f 2a 20 52 46 43 20 6e 61 6d  1);.../* RFC nam
127f0 65 20 6f 66 20 63 69 70 68 65 72 20 2a 2f 0a 09  e of cipher */..
12800 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65  LAPPEND_STR(inte
12810 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 74 61  rp, objPtr, "sta
12820 6e 64 61 72 64 5f 6e 61 6d 65 22 2c 20 53 53 4c  ndard_name", SSL
12830 5f 43 49 50 48 45 52 5f 73 74 61 6e 64 61 72 64  _CIPHER_standard
12840 5f 6e 61 6d 65 28 63 69 70 68 65 72 29 2c 20 2d  _name(cipher), -
12850 31 29 3b 0a 0a 09 2f 2a 20 4f 70 65 6e 53 53 4c  1);.../* OpenSSL
12860 20 6e 61 6d 65 20 6f 66 20 63 69 70 68 65 72 20   name of cipher 
12870 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28  */..LAPPEND_STR(
12880 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
12890 22 6f 70 65 6e 73 73 6c 5f 6e 61 6d 65 22 2c 20  "openssl_name", 
128a0 4f 50 45 4e 53 53 4c 5f 63 69 70 68 65 72 5f 6e  OPENSSL_cipher_n
128b0 61 6d 65 28 53 53 4c 5f 43 49 50 48 45 52 5f 73  ame(SSL_CIPHER_s
128c0 74 61 6e 64 61 72 64 5f 6e 61 6d 65 28 63 69 70  tandard_name(cip
128d0 68 65 72 29 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a  her)), -1);.../*
128e0 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 72 65   number of secre
128f0 74 20 62 69 74 73 20 75 73 65 64 20 66 6f 72 20  t bits used for 
12900 63 69 70 68 65 72 20 2a 2f 0a 09 62 69 74 73 20  cipher */..bits 
12910 3d 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74  = SSL_CIPHER_get
12920 5f 62 69 74 73 28 63 69 70 68 65 72 2c 20 26 61  _bits(cipher, &a
12930 6c 67 5f 62 69 74 73 29 3b 0a 09 4c 41 50 50 45  lg_bits);..LAPPE
12940 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f  ND_INT(interp, o
12950 62 6a 50 74 72 2c 20 22 73 65 63 72 65 74 5f 62  bjPtr, "secret_b
12960 69 74 73 22 2c 20 62 69 74 73 29 3b 0a 09 4c 41  its", bits);..LA
12970 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70  PPEND_INT(interp
12980 2c 20 6f 62 6a 50 74 72 2c 20 22 61 6c 67 6f 72  , objPtr, "algor
12990 69 74 68 6d 5f 62 69 74 73 22 2c 20 61 6c 67 5f  ithm_bits", alg_
129a0 62 69 74 73 29 3b 0a 09 2f 2a 20 61 6c 67 5f 62  bits);../* alg_b
129b0 69 74 73 20 69 73 20 61 63 74 75 61 6c 20 6b 65  its is actual ke
129c0 79 20 73 65 63 72 65 74 20 62 69 74 73 2e 20 49  y secret bits. I
129d0 66 20 75 73 65 20 62 69 74 73 20 61 6e 64 20 73  f use bits and s
129e0 65 63 72 65 74 20 28 61 6c 67 6f 72 69 74 68 6d  ecret (algorithm
129f0 29 20 62 69 74 73 20 64 69 66 66 65 72 2c 0a 09  ) bits differ,..
12a00 20 20 20 74 68 65 20 72 65 73 74 20 6f 66 20 74     the rest of t
12a10 68 65 20 62 69 74 73 20 61 72 65 20 66 69 78 65  he bits are fixe
12a20 64 2c 20 69 2e 65 2e 20 66 6f 72 20 6c 69 6d 69  d, i.e. for limi
12a30 74 65 64 20 65 78 70 6f 72 74 20 63 69 70 68 65  ted export ciphe
12a40 72 73 20 28 62 69 74 73 20 3c 20 35 36 29 20 2a  rs (bits < 56) *
12a50 2f 0a 0a 09 2f 2a 20 49 6e 64 69 63 61 74 65 73  /.../* Indicates
12a60 20 77 68 69 63 68 20 53 53 4c 2f 54 4c 53 20 70   which SSL/TLS p
12a70 72 6f 74 6f 63 6f 6c 20 76 65 72 73 69 6f 6e 20  rotocol version 
12a80 66 69 72 73 74 20 64 65 66 69 6e 65 64 20 74 68  first defined th
12a90 65 20 63 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50  e cipher */..LAP
12aa0 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
12ab0 20 6f 62 6a 50 74 72 2c 20 22 6d 69 6e 5f 76 65   objPtr, "min_ve
12ac0 72 73 69 6f 6e 22 2c 20 53 53 4c 5f 43 49 50 48  rsion", SSL_CIPH
12ad0 45 52 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 63  ER_get_version(c
12ae0 69 70 68 65 72 29 2c 20 2d 31 29 3b 0a 0a 09 2f  ipher), -1);.../
12af0 2a 20 43 69 70 68 65 72 20 4e 49 44 20 2a 2f 0a  * Cipher NID */.
12b00 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74  .LAPPEND_STR(int
12b10 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69  erp, objPtr, "ci
12b20 70 68 65 72 4e 49 44 22 2c 20 28 63 68 61 72 20  pherNID", (char 
12b30 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c  *)OBJ_nid2ln(SSL
12b40 5f 43 49 50 48 45 52 5f 67 65 74 5f 63 69 70 68  _CIPHER_get_ciph
12b50 65 72 5f 6e 69 64 28 63 69 70 68 65 72 29 29 2c  er_nid(cipher)),
12b60 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53   -1);..LAPPEND_S
12b70 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  TR(interp, objPt
12b80 72 2c 20 22 64 69 67 65 73 74 4e 49 44 22 2c 20  r, "digestNID", 
12b90 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 32  (char *)OBJ_nid2
12ba0 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f 67 65  ln(SSL_CIPHER_ge
12bb0 74 5f 64 69 67 65 73 74 5f 6e 69 64 28 63 69 70  t_digest_nid(cip
12bc0 68 65 72 29 29 2c 20 2d 31 29 3b 0a 09 4c 41 50  her)), -1);..LAP
12bd0 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
12be0 20 6f 62 6a 50 74 72 2c 20 22 6b 65 79 45 78 63   objPtr, "keyExc
12bf0 68 61 6e 67 65 4e 49 44 22 2c 20 28 63 68 61 72  hangeNID", (char
12c00 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 53   *)OBJ_nid2ln(SS
12c10 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 6b 78 5f  L_CIPHER_get_kx_
12c20 6e 69 64 28 63 69 70 68 65 72 29 29 2c 20 2d 31  nid(cipher)), -1
12c30 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28  );..LAPPEND_STR(
12c40 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
12c50 22 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 4e  "authenticationN
12c60 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4f 42 4a  ID", (char *)OBJ
12c70 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49 50 48  _nid2ln(SSL_CIPH
12c80 45 52 5f 67 65 74 5f 61 75 74 68 5f 6e 69 64 28  ER_get_auth_nid(
12c90 63 69 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a 0a  cipher)), -1);..
12ca0 09 2f 2a 20 6d 65 73 73 61 67 65 20 61 75 74 68  ./* message auth
12cb0 65 6e 74 69 63 61 74 69 6f 6e 20 63 6f 64 65 20  entication code 
12cc0 2d 20 43 69 70 68 65 72 20 69 73 20 41 45 41 44  - Cipher is AEAD
12cd0 20 28 65 2e 67 2e 20 47 43 4d 20 6f 72 20 43 68   (e.g. GCM or Ch
12ce0 61 43 68 61 32 30 2f 50 6f 6c 79 31 33 30 35 29  aCha20/Poly1305)
12cf0 20 6f 72 20 6e 6f 74 20 2a 2f 0a 09 2f 2a 20 41   or not */../* A
12d00 75 74 68 65 6e 74 69 63 61 74 65 64 20 45 6e 63  uthenticated Enc
12d10 72 79 70 74 69 6f 6e 20 77 69 74 68 20 61 73 73  ryption with ass
12d20 6f 63 69 61 74 65 64 20 64 61 74 61 20 28 41 45  ociated data (AE
12d30 41 44 29 20 63 68 65 63 6b 20 2a 2f 0a 09 4c 41  AD) check */..LA
12d40 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72  PPEND_BOOL(inter
12d50 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 68  p, objPtr, "ciph
12d60 65 72 5f 69 73 5f 61 65 61 64 22 2c 20 53 53 4c  er_is_aead", SSL
12d70 5f 43 49 50 48 45 52 5f 69 73 5f 61 65 61 64 28  _CIPHER_is_aead(
12d80 63 69 70 68 65 72 29 29 3b 0a 0a 09 2f 2a 20 44  cipher));.../* D
12d90 69 67 65 73 74 20 75 73 65 64 20 64 75 72 69 6e  igest used durin
12da0 67 20 74 68 65 20 53 53 4c 2f 54 4c 53 20 68 61  g the SSL/TLS ha
12db0 6e 64 73 68 61 6b 65 20 77 68 65 6e 20 75 73 69  ndshake when usi
12dc0 6e 67 20 74 68 65 20 63 69 70 68 65 72 2e 20 2a  ng the cipher. *
12dd0 2f 0a 09 6d 64 20 3d 20 53 53 4c 5f 43 49 50 48  /..md = SSL_CIPH
12de0 45 52 5f 67 65 74 5f 68 61 6e 64 73 68 61 6b 65  ER_get_handshake
12df0 5f 64 69 67 65 73 74 28 63 69 70 68 65 72 29 3b  _digest(cipher);
12e00 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e  ..LAPPEND_STR(in
12e10 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 68  terp, objPtr, "h
12e20 61 6e 64 73 68 61 6b 65 5f 64 69 67 65 73 74 22  andshake_digest"
12e30 2c 20 28 63 68 61 72 20 2a 29 45 56 50 5f 4d 44  , (char *)EVP_MD
12e40 5f 6e 61 6d 65 28 6d 64 29 2c 20 2d 31 29 3b 0a  _name(md), -1);.
12e50 0a 09 2f 2a 20 47 65 74 20 4f 70 65 6e 53 53 4c  ../* Get OpenSSL
12e60 2d 73 70 65 63 69 66 69 63 20 49 44 2c 20 6e 6f  -specific ID, no
12e70 74 20 49 41 4e 41 20 49 44 20 2a 2f 0a 09 4c 41  t IANA ID */..LA
12e80 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70  PPEND_INT(interp
12e90 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65  , objPtr, "ciphe
12ea0 72 5f 69 64 22 2c 20 28 69 6e 74 29 20 53 53 4c  r_id", (int) SSL
12eb0 5f 43 49 50 48 45 52 5f 67 65 74 5f 69 64 28 63  _CIPHER_get_id(c
12ec0 69 70 68 65 72 29 29 3b 0a 0a 09 2f 2a 20 54 77  ipher));.../* Tw
12ed0 6f 2d 62 79 74 65 20 49 44 20 75 73 65 64 20 69  o-byte ID used i
12ee0 6e 20 74 68 65 20 54 4c 53 20 70 72 6f 74 6f 63  n the TLS protoc
12ef0 6f 6c 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20  ol of the given 
12f00 63 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45  cipher */..LAPPE
12f10 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f  ND_INT(interp, o
12f20 62 6a 50 74 72 2c 20 22 70 72 6f 74 6f 63 6f 6c  bjPtr, "protocol
12f30 5f 69 64 22 2c 20 28 69 6e 74 29 20 53 53 4c 5f  _id", (int) SSL_
12f40 43 49 50 48 45 52 5f 67 65 74 5f 70 72 6f 74 6f  CIPHER_get_proto
12f50 63 6f 6c 5f 69 64 28 63 69 70 68 65 72 29 29 3b  col_id(cipher));
12f60 0a 0a 09 2f 2a 20 54 65 78 74 75 61 6c 20 64 65  .../* Textual de
12f70 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65  scription of the
12f80 20 63 69 70 68 65 72 20 2a 2f 0a 09 69 66 20 28   cipher */..if (
12f90 53 53 4c 5f 43 49 50 48 45 52 5f 64 65 73 63 72  SSL_CIPHER_descr
12fa0 69 70 74 69 6f 6e 28 63 69 70 68 65 72 2c 20 62  iption(cipher, b
12fb0 75 66 2c 20 73 69 7a 65 6f 66 28 62 75 66 29 29  uf, sizeof(buf))
12fc0 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20   != NULL) {..   
12fd0 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74   LAPPEND_STR(int
12fe0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 64 65  erp, objPtr, "de
12ff0 73 63 72 69 70 74 69 6f 6e 22 2c 20 62 75 66 2c  scription", buf,
13000 20 2d 31 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a   -1);..}.    }..
13010 20 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 69      /* Session i
13020 6e 66 6f 20 2a 2f 0a 20 20 20 20 73 65 73 73 69  nfo */.    sessi
13030 6f 6e 20 3d 20 53 53 4c 5f 67 65 74 5f 73 65 73  on = SSL_get_ses
13040 73 69 6f 6e 28 73 73 6c 29 3b 0a 20 20 20 20 69  sion(ssl);.    i
13050 66 20 28 73 65 73 73 69 6f 6e 20 21 3d 20 4e 55  f (session != NU
13060 4c 4c 29 20 7b 0a 09 63 6f 6e 73 74 20 75 6e 73  LL) {..const uns
13070 69 67 6e 65 64 20 63 68 61 72 20 2a 74 69 63 6b  igned char *tick
13080 65 74 3b 0a 09 73 69 7a 65 5f 74 20 6c 65 6e 32  et;..size_t len2
13090 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  ;..unsigned int 
130a0 75 6c 65 6e 3b 0a 09 63 6f 6e 73 74 20 75 6e 73  ulen;..const uns
130b0 69 67 6e 65 64 20 63 68 61 72 20 2a 73 65 73 73  igned char *sess
130c0 69 6f 6e 5f 69 64 2c 20 2a 70 72 6f 74 6f 3b 0a  ion_id, *proto;.
130d0 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 62  .unsigned char b
130e0 75 66 66 65 72 5b 53 53 4c 5f 4d 41 58 5f 4d 41  uffer[SSL_MAX_MA
130f0 53 54 45 52 5f 4b 45 59 5f 4c 45 4e 47 54 48 5d  STER_KEY_LENGTH]
13100 3b 0a 0a 09 2f 2a 20 52 65 70 6f 72 74 20 74 68  ;.../* Report th
13110 65 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f  e selected proto
13120 63 6f 6c 20 61 73 20 61 20 72 65 73 75 6c 74 20  col as a result 
13130 6f 66 20 74 68 65 20 41 4c 50 4e 20 6e 65 67 6f  of the ALPN nego
13140 74 69 61 74 69 6f 6e 20 2a 2f 0a 09 53 53 4c 5f  tiation */..SSL_
13150 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 61 6c 70  SESSION_get0_alp
13160 6e 5f 73 65 6c 65 63 74 65 64 28 73 65 73 73 69  n_selected(sessi
13170 6f 6e 2c 20 26 70 72 6f 74 6f 2c 20 26 6c 65 6e  on, &proto, &len
13180 32 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52  2);..LAPPEND_STR
13190 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
131a0 20 22 61 6c 70 6e 22 2c 20 28 63 68 61 72 20 2a   "alpn", (char *
131b0 29 20 70 72 6f 74 6f 2c 20 28 54 63 6c 5f 53 69  ) proto, (Tcl_Si
131c0 7a 65 29 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20  ze) len2);.../* 
131d0 52 65 70 6f 72 74 20 74 68 65 20 73 65 6c 65 63  Report the selec
131e0 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20  ted protocol as 
131f0 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  a result of the 
13200 4e 50 4e 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20  NPN negotiation 
13210 2a 2f 0a 23 69 66 64 65 66 20 55 53 45 5f 4e 50  */.#ifdef USE_NP
13220 4e 0a 09 53 53 4c 5f 67 65 74 30 5f 6e 65 78 74  N..SSL_get0_next
13230 5f 70 72 6f 74 6f 5f 6e 65 67 6f 74 69 61 74 65  _proto_negotiate
13240 64 28 73 73 6c 2c 20 26 70 72 6f 74 6f 2c 20 26  d(ssl, &proto, &
13250 75 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f  ulen);..LAPPEND_
13260 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
13270 74 72 2c 20 22 6e 70 6e 22 2c 20 28 63 68 61 72  tr, "npn", (char
13280 20 2a 29 20 70 72 6f 74 6f 2c 20 28 54 63 6c 5f   *) proto, (Tcl_
13290 53 69 7a 65 29 20 75 6c 65 6e 29 3b 0a 23 65 6e  Size) ulen);.#en
132a0 64 69 66 0a 0a 09 2f 2a 20 52 65 73 75 6d 61 62  dif.../* Resumab
132b0 6c 65 20 73 65 73 73 69 6f 6e 20 2a 2f 0a 09 4c  le session */..L
132c0 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65  APPEND_BOOL(inte
132d0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 72 65 73  rp, objPtr, "res
132e0 75 6d 61 62 6c 65 22 2c 20 53 53 4c 5f 53 45 53  umable", SSL_SES
132f0 53 49 4f 4e 5f 69 73 5f 72 65 73 75 6d 61 62 6c  SION_is_resumabl
13300 65 28 73 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f  e(session));.../
13310 2a 20 53 65 73 73 69 6f 6e 20 73 74 61 72 74 20  * Session start 
13320 74 69 6d 65 20 28 73 65 63 6f 6e 64 73 20 73 69  time (seconds si
13330 6e 63 65 20 65 70 6f 63 68 29 20 2a 2f 0a 09 4c  nce epoch) */..L
13340 41 50 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65  APPEND_LONG(inte
13350 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 74 61  rp, objPtr, "sta
13360 72 74 5f 74 69 6d 65 22 2c 20 53 53 4c 5f 53 45  rt_time", SSL_SE
13370 53 53 49 4f 4e 5f 67 65 74 5f 74 69 6d 65 28 73  SSION_get_time(s
13380 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 54  ession));.../* T
13390 69 6d 65 6f 75 74 20 76 61 6c 75 65 20 2d 20 53  imeout value - S
133a0 53 4c 5f 43 54 58 5f 67 65 74 5f 74 69 6d 65 6f  SL_CTX_get_timeo
133b0 75 74 20 28 69 6e 20 73 65 63 6f 6e 64 73 29 20  ut (in seconds) 
133c0 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47  */..LAPPEND_LONG
133d0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
133e0 20 22 74 69 6d 65 6f 75 74 22 2c 20 53 53 4c 5f   "timeout", SSL_
133f0 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 6d 65  SESSION_get_time
13400 6f 75 74 28 73 65 73 73 69 6f 6e 29 29 3b 0a 0a  out(session));..
13410 09 2f 2a 20 53 65 73 73 69 6f 6e 20 69 64 20 2d  ./* Session id -
13420 20 54 4c 53 76 31 2e 32 20 61 6e 64 20 62 65 6c   TLSv1.2 and bel
13430 6f 77 20 6f 6e 6c 79 20 2a 2f 0a 09 73 65 73 73  ow only */..sess
13440 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53  ion_id = SSL_SES
13450 53 49 4f 4e 5f 67 65 74 5f 69 64 28 73 65 73 73  SION_get_id(sess
13460 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c 41  ion, &ulen);..LA
13470 50 50 45 4e 44 5f 42 41 52 52 41 59 28 69 6e 74  PPEND_BARRAY(int
13480 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65  erp, objPtr, "se
13490 73 73 69 6f 6e 5f 69 64 22 2c 20 73 65 73 73 69  ssion_id", sessi
134a0 6f 6e 5f 69 64 2c 20 28 54 63 6c 5f 53 69 7a 65  on_id, (Tcl_Size
134b0 29 20 75 6c 65 6e 29 3b 0a 0a 09 2f 2a 20 53 65  ) ulen);.../* Se
134c0 73 73 69 6f 6e 20 63 6f 6e 74 65 78 74 20 2a 2f  ssion context */
134d0 0a 09 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20 53  ..session_id = S
134e0 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f  SL_SESSION_get0_
134f0 69 64 5f 63 6f 6e 74 65 78 74 28 73 65 73 73 69  id_context(sessi
13500 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c 41 50  on, &ulen);..LAP
13510 50 45 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 65  PEND_BARRAY(inte
13520 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 73  rp, objPtr, "ses
13530 73 69 6f 6e 5f 63 6f 6e 74 65 78 74 22 2c 20 73  sion_context", s
13540 65 73 73 69 6f 6e 5f 69 64 2c 20 28 54 63 6c 5f  ession_id, (Tcl_
13550 53 69 7a 65 29 20 75 6c 65 6e 29 3b 0a 0a 09 2f  Size) ulen);.../
13560 2a 20 53 65 73 73 69 6f 6e 20 74 69 63 6b 65 74  * Session ticket
13570 20 2d 20 63 6c 69 65 6e 74 20 6f 6e 6c 79 20 2a   - client only *
13580 2f 0a 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67  /..SSL_SESSION_g
13590 65 74 30 5f 74 69 63 6b 65 74 28 73 65 73 73 69  et0_ticket(sessi
135a0 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 26 6c 65  on, &ticket, &le
135b0 6e 32 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41  n2);..LAPPEND_BA
135c0 52 52 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a  RRAY(interp, obj
135d0 50 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f 74 69  Ptr, "session_ti
135e0 63 6b 65 74 22 2c 20 74 69 63 6b 65 74 2c 20 28  cket", ticket, (
135f0 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 29 3b  Tcl_Size) len2);
13600 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69  .../* Session ti
13610 63 6b 65 74 20 6c 69 66 65 74 69 6d 65 20 68 69  cket lifetime hi
13620 6e 74 20 28 69 6e 20 73 65 63 6f 6e 64 73 29 20  nt (in seconds) 
13630 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47  */..LAPPEND_LONG
13640 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
13650 20 22 6c 69 66 65 74 69 6d 65 22 2c 20 53 53 4c   "lifetime", SSL
13660 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 63  _SESSION_get_tic
13670 6b 65 74 5f 6c 69 66 65 74 69 6d 65 5f 68 69 6e  ket_lifetime_hin
13680 74 28 73 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f  t(session));.../
13690 2a 20 54 69 63 6b 65 74 20 61 70 70 20 64 61 74  * Ticket app dat
136a0 61 20 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 53 4c  a */.#if OPENSSL
136b0 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20  _VERSION_NUMBER 
136c0 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 53  < 0x30000000L..S
136d0 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f  SL_SESSION_get0_
136e0 74 69 63 6b 65 74 5f 61 70 70 64 61 74 61 28 28  ticket_appdata((
136f0 53 53 4c 5f 53 45 53 53 49 4f 4e 20 2a 29 20 73  SSL_SESSION *) s
13700 65 73 73 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c  ession, &ticket,
13710 20 26 6c 65 6e 32 29 3b 0a 09 4c 41 50 50 45 4e   &len2);..LAPPEN
13720 44 5f 42 41 52 52 41 59 28 69 6e 74 65 72 70 2c  D_BARRAY(interp,
13730 20 6f 62 6a 50 74 72 2c 20 22 74 69 63 6b 65 74   objPtr, "ticket
13740 5f 61 70 70 5f 64 61 74 61 22 2c 20 74 69 63 6b  _app_data", tick
13750 65 74 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c  et, (Tcl_Size) l
13760 65 6e 32 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 2f  en2);.#endif.../
13770 2a 20 47 65 74 20 6d 61 73 74 65 72 20 6b 65 79  * Get master key
13780 20 2a 2f 0a 09 6c 65 6e 32 20 3d 20 53 53 4c 5f   */..len2 = SSL_
13790 53 45 53 53 49 4f 4e 5f 67 65 74 5f 6d 61 73 74  SESSION_get_mast
137a0 65 72 5f 6b 65 79 28 73 65 73 73 69 6f 6e 2c 20  er_key(session, 
137b0 62 75 66 66 65 72 2c 20 53 53 4c 5f 4d 41 58 5f  buffer, SSL_MAX_
137c0 4d 41 53 54 45 52 5f 4b 45 59 5f 4c 45 4e 47 54  MASTER_KEY_LENGT
137d0 48 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52  H);..LAPPEND_BAR
137e0 52 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  RAY(interp, objP
137f0 74 72 2c 20 22 6d 61 73 74 65 72 5f 6b 65 79 22  tr, "master_key"
13800 2c 20 62 75 66 66 65 72 2c 20 28 54 63 6c 5f 53  , buffer, (Tcl_S
13810 69 7a 65 29 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a  ize) len2);.../*
13820 20 43 6f 6d 70 72 65 73 73 69 6f 6e 20 69 64 20   Compression id 
13830 2a 2f 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e 74  */..unsigned int
13840 20 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f   id = SSL_SESSIO
13850 4e 5f 67 65 74 5f 63 6f 6d 70 72 65 73 73 5f 69  N_get_compress_i
13860 64 28 73 65 73 73 69 6f 6e 29 3b 0a 09 4c 41 50  d(session);..LAP
13870 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
13880 20 6f 62 6a 50 74 72 2c 20 22 63 6f 6d 70 72 65   objPtr, "compre
13890 73 73 69 6f 6e 5f 69 64 22 2c 20 69 64 20 3d 3d  ssion_id", id ==
138a0 20 31 20 3f 20 22 7a 6c 69 62 22 20 3a 20 22 6e   1 ? "zlib" : "n
138b0 6f 6e 65 22 2c 20 2d 31 29 3b 0a 20 20 20 20 7d  one", -1);.    }
138c0 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 72 65 73  ..    /* Compres
138d0 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 20  sion info */.   
138e0 20 69 66 20 28 73 73 6c 20 21 3d 20 4e 55 4c 4c   if (ssl != NULL
138f0 29 20 7b 0a 23 69 66 64 65 66 20 48 41 56 45 5f  ) {.#ifdef HAVE_
13900 53 53 4c 5f 43 4f 4d 50 52 45 53 53 49 4f 4e 0a  SSL_COMPRESSION.
13910 09 63 6f 6e 73 74 20 43 4f 4d 50 5f 4d 45 54 48  .const COMP_METH
13920 4f 44 20 2a 63 6f 6d 70 2c 20 2a 65 78 70 6e 3b  OD *comp, *expn;
13930 0a 09 63 6f 6d 70 20 3d 20 53 53 4c 5f 67 65 74  ..comp = SSL_get
13940 5f 63 75 72 72 65 6e 74 5f 63 6f 6d 70 72 65 73  _current_compres
13950 73 69 6f 6e 28 73 73 6c 29 3b 0a 09 65 78 70 6e  sion(ssl);..expn
13960 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75 72 72 65   = SSL_get_curre
13970 6e 74 5f 65 78 70 61 6e 73 69 6f 6e 28 73 73 6c  nt_expansion(ssl
13980 29 3b 0a 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52  );...LAPPEND_STR
13990 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
139a0 20 22 63 6f 6d 70 72 65 73 73 69 6f 6e 22 2c 20   "compression", 
139b0 63 6f 6d 70 20 3f 20 53 53 4c 5f 43 4f 4d 50 5f  comp ? SSL_COMP_
139c0 67 65 74 5f 6e 61 6d 65 28 63 6f 6d 70 29 20 3a  get_name(comp) :
139d0 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 09 4c   "none", -1);..L
139e0 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
139f0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 65 78 70 61  p, objPtr, "expa
13a00 6e 73 69 6f 6e 22 2c 20 65 78 70 6e 20 3f 20 53  nsion", expn ? S
13a10 53 4c 5f 43 4f 4d 50 5f 67 65 74 5f 6e 61 6d 65  SL_COMP_get_name
13a20 28 65 78 70 6e 29 20 3a 20 22 6e 6f 6e 65 22 2c  (expn) : "none",
13a30 20 2d 31 29 3b 0a 23 65 6c 73 65 0a 09 4c 41 50   -1);.#else..LAP
13a40 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
13a50 20 6f 62 6a 50 74 72 2c 20 22 63 6f 6d 70 72 65   objPtr, "compre
13a60 73 73 69 6f 6e 22 2c 20 22 6e 6f 6e 65 22 2c 20  ssion", "none", 
13a70 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54  -1);..LAPPEND_ST
13a80 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  R(interp, objPtr
13a90 2c 20 22 65 78 70 61 6e 73 69 6f 6e 22 2c 20 22  , "expansion", "
13aa0 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 23 65 6e 64  none", -1);.#end
13ab0 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  if.    }..    /*
13ac0 20 53 65 72 76 65 72 20 69 6e 66 6f 20 2a 2f 0a   Server info */.
13ad0 20 20 20 20 7b 0a 09 6c 6f 6e 67 20 6d 6f 64 65      {..long mode
13ae0 20 3d 20 53 53 4c 5f 43 54 58 5f 67 65 74 5f 73   = SSL_CTX_get_s
13af0 65 73 73 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64  ession_cache_mod
13b00 65 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29  e(statePtr->ctx)
13b10 3b 0a 09 63 68 61 72 20 2a 6d 73 67 3b 0a 0a 09  ;..char *msg;...
13b20 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53  if (mode & SSL_S
13b30 45 53 53 5f 43 41 43 48 45 5f 4f 46 46 29 20 7b  ESS_CACHE_OFF) {
13b40 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 6f 66 66  ..    msg = "off
13b50 22 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 6d  ";..} else if (m
13b60 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f 43  ode & SSL_SESS_C
13b70 41 43 48 45 5f 43 4c 49 45 4e 54 29 20 7b 0a 09  ACHE_CLIENT) {..
13b80 20 20 20 20 6d 73 67 20 3d 20 22 63 6c 69 65 6e      msg = "clien
13b90 74 22 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28  t";..} else if (
13ba0 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f  mode & SSL_SESS_
13bb0 43 41 43 48 45 5f 53 45 52 56 45 52 29 20 7b 0a  CACHE_SERVER) {.
13bc0 09 20 20 20 20 6d 73 67 20 3d 20 22 73 65 72 76  .    msg = "serv
13bd0 65 72 22 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20  er";..} else if 
13be0 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53  (mode & SSL_SESS
13bf0 5f 43 41 43 48 45 5f 42 4f 54 48 29 20 7b 0a 09  _CACHE_BOTH) {..
13c00 20 20 20 20 6d 73 67 20 3d 20 22 62 6f 74 68 22      msg = "both"
13c10 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20  ;..} else {..   
13c20 20 6d 73 67 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22   msg = "unknown"
13c30 3b 0a 09 7d 0a 09 4c 41 50 50 45 4e 44 5f 53 54  ;..}..LAPPEND_ST
13c40 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  R(interp, objPtr
13c50 2c 20 22 73 65 73 73 69 6f 6e 5f 63 61 63 68 65  , "session_cache
13c60 5f 6d 6f 64 65 22 2c 20 6d 73 67 2c 20 2d 31 29  _mode", msg, -1)
13c70 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
13c80 43 41 20 4c 69 73 74 20 2a 2f 0a 20 20 20 20 2f  CA List */.    /
13c90 2a 20 49 46 20 6e 6f 74 20 61 20 73 65 72 76 65  * IF not a serve
13ca0 72 2c 20 73 61 6d 65 20 61 73 20 53 53 4c 5f 67  r, same as SSL_g
13cb0 65 74 30 5f 70 65 65 72 5f 43 41 5f 6c 69 73 74  et0_peer_CA_list
13cc0 2e 20 49 66 20 73 65 72 76 65 72 20 73 61 6d 65  . If server same
13cd0 20 61 73 20 53 53 4c 5f 43 54 58 5f 67 65 74 5f   as SSL_CTX_get_
13ce0 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 74 20 2a  client_CA_list *
13cf0 2f 0a 20 20 20 20 6c 69 73 74 50 74 72 20 3d 20  /.    listPtr = 
13d00 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30  Tcl_NewListObj(0
13d10 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 53 54 41  , NULL);.    STA
13d20 43 4b 5f 4f 46 28 58 35 30 39 5f 4e 41 4d 45 29  CK_OF(X509_NAME)
13d30 20 2a 63 61 5f 6c 69 73 74 3b 0a 20 20 20 20 69   *ca_list;.    i
13d40 66 20 28 28 63 61 5f 6c 69 73 74 20 3d 20 53 53  f ((ca_list = SS
13d50 4c 5f 67 65 74 5f 63 6c 69 65 6e 74 5f 43 41 5f  L_get_client_CA_
13d60 6c 69 73 74 28 73 73 6c 29 29 20 21 3d 20 4e 55  list(ssl)) != NU
13d70 4c 4c 29 20 7b 0a 09 63 68 61 72 20 62 75 66 66  LL) {..char buff
13d80 65 72 5b 42 55 46 53 49 5a 5d 3b 0a 09 66 6f 72  er[BUFSIZ];..for
13d90 20 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c   (int i = 0; i <
13da0 20 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f 6e 75   sk_X509_NAME_nu
13db0 6d 28 63 61 5f 6c 69 73 74 29 3b 20 69 2b 2b 29  m(ca_list); i++)
13dc0 20 7b 0a 09 20 20 20 20 58 35 30 39 5f 4e 41 4d   {..    X509_NAM
13dd0 45 20 2a 6e 61 6d 65 20 3d 20 73 6b 5f 58 35 30  E *name = sk_X50
13de0 39 5f 4e 41 4d 45 5f 76 61 6c 75 65 28 63 61 5f  9_NAME_value(ca_
13df0 6c 69 73 74 2c 20 69 29 3b 0a 09 20 20 20 20 69  list, i);..    i
13e00 66 20 28 6e 61 6d 65 29 20 7b 0a 09 09 58 35 30  f (name) {...X50
13e10 39 5f 4e 41 4d 45 5f 6f 6e 65 6c 69 6e 65 28 6e  9_NAME_oneline(n
13e20 61 6d 65 2c 20 62 75 66 66 65 72 2c 20 42 55 46  ame, buffer, BUF
13e30 53 49 5a 29 3b 0a 09 09 54 63 6c 5f 4c 69 73 74  SIZ);...Tcl_List
13e40 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
13e50 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 50 74 72  (interp, listPtr
13e60 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
13e70 62 6a 28 62 75 66 66 65 72 2c 20 2d 31 29 29 3b  bj(buffer, -1));
13e80 0a 09 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20 7d  ..    }..}.    }
13e90 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f 42 4a  .    LAPPEND_OBJ
13ea0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
13eb0 20 22 63 61 4c 69 73 74 22 2c 20 6c 69 73 74 50   "caList", listP
13ec0 74 72 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44  tr);.    LAPPEND
13ed0 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _INT(interp, obj
13ee0 50 74 72 2c 20 22 63 61 4c 69 73 74 43 6f 75 6e  Ptr, "caListCoun
13ef0 74 22 2c 20 73 6b 5f 58 35 30 39 5f 4e 41 4d 45  t", sk_X509_NAME
13f00 5f 6e 75 6d 28 63 61 5f 6c 69 73 74 29 29 3b 0a  _num(ca_list));.
13f10 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  .    Tcl_SetObjR
13f20 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62  esult(interp, ob
13f30 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72  jPtr);.    retur
13f40 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a  n TCL_OK;.}.../*
13f50 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
13f60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13f70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13f80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13f90 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 56 65 72  ------. *. * Ver
13fa0 73 69 6f 6e 4f 62 6a 43 6d 64 20 2d 2d 20 72 65  sionObjCmd -- re
13fb0 74 75 72 6e 20 76 65 72 73 69 6f 6e 20 73 74 72  turn version str
13fc0 69 6e 67 20 66 72 6f 6d 20 4f 70 65 6e 53 53 4c  ing from OpenSSL
13fd0 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
13fe0 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54  . *.A standard T
13ff0 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a  cl result.. *. *
14000 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
14010 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d  *.None.. *. *---
14020 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14030 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a  . */.static int.
14070 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 28 43 6c  VersionObjCmd(Cl
14080 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
14090 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20  ata, Tcl_Interp 
140a0 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a  *interp, int obj
140b0 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73  c, Tcl_Obj *cons
140c0 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20  t objv[]) {.    
140d0 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b  Tcl_Obj *objPtr;
140e0 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65  .    (void) clie
140f0 6e 74 44 61 74 61 3b 0a 20 20 20 20 28 76 6f 69  ntData;.    (voi
14100 64 29 20 6f 62 6a 63 3b 0a 20 20 20 20 28 76 6f  d) objc;.    (vo
14110 69 64 29 20 6f 62 6a 76 3b 0a 0a 20 20 20 20 64  id) objv;..    d
14120 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
14130 3b 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20 3d 20  ;..    objPtr = 
14140 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
14150 28 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e  (OPENSSL_VERSION
14160 5f 54 45 58 54 2c 20 2d 31 29 3b 0a 20 20 20 20  _TEXT, -1);.    
14170 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
14180 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29  (interp, objPtr)
14190 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ;..    return TC
141a0 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d  L_OK;.}.../*. *-
141b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
141c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
141d0 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 0a 20 2a 0a 20 2a 20 4d 69 73 63 4f 62 6a  --. *. * MiscObj
14200 43 6d 64 20 2d 2d 20 6d 69 73 63 20 63 6f 6d 6d  Cmd -- misc comm
14210 61 6e 64 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  ands. *. * Resul
14220 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72  ts:. *.A standar
14230 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a  d Tcl result.. *
14240 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
14250 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a  :. *.None.. *. *
14260 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14270 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  ---. */.static i
142b0 6e 74 0a 4d 69 73 63 4f 62 6a 43 6d 64 28 43 6c  nt.MiscObjCmd(Cl
142c0 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
142d0 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20  ata, Tcl_Interp 
142e0 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a  *interp, int obj
142f0 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73  c, Tcl_Obj *cons
14300 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20  t objv[]) {.    
14310 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
14320 72 20 2a 63 6f 6d 6d 61 6e 64 73 20 5b 5d 20 3d  r *commands [] =
14330 20 7b 20 22 72 65 71 22 2c 20 22 73 74 72 72 65   { "req", "strre
14340 71 22 2c 20 4e 55 4c 4c 20 7d 3b 0a 20 20 20 20  q", NULL };.    
14350 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64 20 7b 20 43  enum command { C
14360 5f 52 45 51 2c 20 43 5f 53 54 52 52 45 51 2c 20  _REQ, C_STRREQ, 
14370 43 5f 44 55 4d 4d 59 20 7d 3b 0a 20 20 20 20 54  C_DUMMY };.    T
14380 63 6c 5f 53 69 7a 65 20 63 6d 64 3b 0a 20 20 20  cl_Size cmd;.   
14390 20 69 6e 74 20 69 73 53 74 72 3b 0a 20 20 20 20   int isStr;.    
143a0 63 68 61 72 20 62 75 66 66 65 72 5b 31 36 33 38  char buffer[1638
143b0 34 5d 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 63  4];.    (void) c
143c0 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20  lientData;..    
143d0 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
143e0 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63  );..    if (objc
143f0 20 3c 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f   < 2) {..Tcl_Wro
14400 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
14410 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 73 75 62 63  , 1, objv, "subc
14420 6f 6d 6d 61 6e 64 20 3f 61 72 67 73 3f 22 29 3b  ommand ?args?");
14430 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
14440 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OR;.    }.    if
14450 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72   (Tcl_GetIndexFr
14460 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
14470 6a 76 5b 31 5d 2c 20 63 6f 6d 6d 61 6e 64 73 2c  jv[1], commands,
14480 20 22 63 6f 6d 6d 61 6e 64 22 2c 20 30 2c 20 26   "command", 0, &
14490 63 6d 64 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20  cmd) != TCL_OK) 
144a0 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  {..return TCL_ER
144b0 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
144c0 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28  ERR_clear_error(
144d0 29 3b 0a 0a 20 20 20 20 69 73 53 74 72 20 3d 20  );..    isStr = 
144e0 28 63 6d 64 20 3d 3d 20 43 5f 53 54 52 52 45 51  (cmd == C_STRREQ
144f0 29 3b 0a 20 20 20 20 73 77 69 74 63 68 20 28 28  );.    switch ((
14500 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64 29 20 63 6d  enum command) cm
14510 64 29 20 7b 0a 09 63 61 73 65 20 43 5f 52 45 51  d) {..case C_REQ
14520 3a 0a 09 63 61 73 65 20 43 5f 53 54 52 52 45 51  :..case C_STRREQ
14530 3a 20 7b 0a 09 20 20 20 20 45 56 50 5f 50 4b 45  : {..    EVP_PKE
14540 59 20 2a 70 6b 65 79 3d 4e 55 4c 4c 3b 0a 09 20  Y *pkey=NULL;.. 
14550 20 20 20 58 35 30 39 20 2a 63 65 72 74 3d 4e 55     X509 *cert=NU
14560 4c 4c 3b 0a 09 20 20 20 20 58 35 30 39 5f 4e 41  LL;..    X509_NA
14570 4d 45 20 2a 6e 61 6d 65 3d 4e 55 4c 4c 3b 0a 09  ME *name=NULL;..
14580 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 6c 69      Tcl_Obj **li
14590 73 74 76 3b 0a 09 20 20 20 20 54 63 6c 5f 53 69  stv;..    Tcl_Si
145a0 7a 65 20 6c 69 73 74 63 3b 0a 09 20 20 20 20 69  ze listc;..    i
145b0 6e 74 20 69 3b 0a 0a 09 20 20 20 20 42 49 4f 20  nt i;...    BIO 
145c0 2a 6f 75 74 3d 4e 55 4c 4c 3b 0a 0a 09 20 20 20  *out=NULL;...   
145d0 20 63 68 61 72 20 2a 6b 5f 43 3d 22 22 2c 2a 6b   char *k_C="",*k
145e0 5f 53 54 3d 22 22 2c 2a 6b 5f 4c 3d 22 22 2c 2a  _ST="",*k_L="",*
145f0 6b 5f 4f 3d 22 22 2c 2a 6b 5f 4f 55 3d 22 22 2c  k_O="",*k_OU="",
14600 2a 6b 5f 43 4e 3d 22 22 2c 2a 6b 5f 45 6d 61 69  *k_CN="",*k_Emai
14610 6c 3d 22 22 3b 0a 09 20 20 20 20 63 68 61 72 20  l="";..    char 
14620 2a 6b 65 79 6f 75 74 2c 2a 70 65 6d 6f 75 74 2c  *keyout,*pemout,
14630 2a 73 74 72 3b 0a 09 20 20 20 20 69 6e 74 20 6b  *str;..    int k
14640 65 79 73 69 7a 65 2c 73 65 72 69 61 6c 3d 30 2c  eysize,serial=0,
14650 64 61 79 73 3d 33 36 35 3b 0a 0a 23 69 66 20 4f  days=365;..#if O
14660 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e  PENSSL_VERSION_N
14670 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30  UMBER < 0x300000
14680 30 30 4c 0a 09 20 20 20 20 42 49 47 4e 55 4d 20  00L..    BIGNUM 
14690 2a 62 6e 65 20 3d 20 4e 55 4c 4c 3b 0a 09 20 20  *bne = NULL;..  
146a0 20 20 52 53 41 20 2a 72 73 61 20 3d 20 4e 55 4c    RSA *rsa = NUL
146b0 4c 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 45 56  L;.#else..    EV
146c0 50 5f 50 4b 45 59 5f 43 54 58 20 2a 63 74 78 20  P_PKEY_CTX *ctx 
146d0 3d 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 0a  = NULL;.#endif..
146e0 09 20 20 20 20 69 66 20 28 28 6f 62 6a 63 3c 35  .    if ((objc<5
146f0 29 20 7c 7c 20 28 6f 62 6a 63 3e 36 29 29 20 7b  ) || (objc>6)) {
14700 0a 09 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41  ...Tcl_WrongNumA
14710 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
14720 62 6a 76 2c 20 22 6b 65 79 73 69 7a 65 20 6b 65  bjv, "keysize ke
14730 79 66 69 6c 65 20 63 65 72 74 66 69 6c 65 20 3f  yfile certfile ?
14740 69 6e 66 6f 3f 22 29 3b 0a 09 09 72 65 74 75 72  info?");...retur
14750 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20  n TCL_ERROR;..  
14760 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 54 63    }...    if (Tc
14770 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
14780 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
14790 20 26 6b 65 79 73 69 7a 65 29 20 21 3d 20 54 43   &keysize) != TC
147a0 4c 5f 4f 4b 29 20 7b 0a 09 09 72 65 74 75 72 6e  L_OK) {...return
147b0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20   TCL_ERROR;..   
147c0 20 7d 0a 09 20 20 20 20 6b 65 79 6f 75 74 3d 54   }..    keyout=T
147d0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
147e0 76 5b 33 5d 29 3b 0a 09 20 20 20 20 70 65 6d 6f  v[3]);..    pemo
147f0 75 74 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  ut=Tcl_GetString
14800 28 6f 62 6a 76 5b 34 5d 29 3b 0a 09 20 20 20 20  (objv[4]);..    
14810 69 66 20 28 69 73 53 74 72 29 20 7b 0a 09 09 54  if (isStr) {...T
14820 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70  cl_SetVar(interp
14830 2c 6b 65 79 6f 75 74 2c 22 22 2c 30 29 3b 0a 09  ,keyout,"",0);..
14840 09 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65  .Tcl_SetVar(inte
14850 72 70 2c 70 65 6d 6f 75 74 2c 22 22 2c 30 29 3b  rp,pemout,"",0);
14860 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 66  ..    }...    if
14870 20 28 6f 62 6a 63 3e 3d 36 29 20 7b 0a 09 09 69   (objc>=6) {...i
14880 66 20 28 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65  f (Tcl_ListObjGe
14890 74 45 6c 65 6d 65 6e 74 73 28 69 6e 74 65 72 70  tElements(interp
148a0 2c 20 6f 62 6a 76 5b 35 5d 2c 20 26 6c 69 73 74  , objv[5], &list
148b0 63 2c 20 26 6c 69 73 74 76 29 20 21 3d 20 54 43  c, &listv) != TC
148c0 4c 5f 4f 4b 29 20 7b 0a 09 09 20 20 20 20 72 65  L_OK) {...    re
148d0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
148e0 09 09 7d 0a 0a 09 09 69 66 20 28 28 6c 69 73 74  ..}....if ((list
148f0 63 25 32 29 20 21 3d 20 30 29 20 7b 0a 09 09 20  c%2) != 0) {... 
14900 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74     Tcl_SetResult
14910 28 69 6e 74 65 72 70 2c 22 49 6e 66 6f 72 6d 61  (interp,"Informa
14920 74 69 6f 6e 20 6c 69 73 74 20 6d 75 73 74 20 68  tion list must h
14930 61 76 65 20 65 76 65 6e 20 6e 75 6d 62 65 72 20  ave even number 
14940 6f 66 20 61 72 67 75 6d 65 6e 74 73 22 2c 4e 55  of arguments",NU
14950 4c 4c 29 3b 0a 09 09 20 20 20 20 72 65 74 75 72  LL);...    retur
14960 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d  n TCL_ERROR;...}
14970 0a 09 09 66 6f 72 20 28 69 3d 30 3b 20 69 3c 6c  ...for (i=0; i<l
14980 69 73 74 63 3b 20 69 2b 3d 32 29 20 7b 0a 09 09  istc; i+=2) {...
14990 20 20 20 20 73 74 72 3d 54 63 6c 5f 47 65 74 53      str=Tcl_GetS
149a0 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 5d 29 3b  tring(listv[i]);
149b0 0a 09 09 20 20 20 20 69 66 20 28 73 74 72 63 6d  ...    if (strcm
149c0 70 28 73 74 72 2c 22 64 61 79 73 22 29 3d 3d 30  p(str,"days")==0
149d0 29 20 7b 0a 09 09 09 69 66 20 28 54 63 6c 5f 47  ) {....if (Tcl_G
149e0 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
149f0 65 72 70 2c 6c 69 73 74 76 5b 69 2b 31 5d 2c 26  erp,listv[i+1],&
14a00 64 61 79 73 29 21 3d 54 43 4c 5f 4f 4b 29 0a 09  days)!=TCL_OK)..
14a10 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
14a20 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20 20 7d 20  _ERROR;...    } 
14a30 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28  else if (strcmp(
14a40 73 74 72 2c 22 73 65 72 69 61 6c 22 29 3d 3d 30  str,"serial")==0
14a50 29 20 7b 0a 09 09 09 69 66 20 28 54 63 6c 5f 47  ) {....if (Tcl_G
14a60 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
14a70 65 72 70 2c 6c 69 73 74 76 5b 69 2b 31 5d 2c 26  erp,listv[i+1],&
14a80 73 65 72 69 61 6c 29 21 3d 54 43 4c 5f 4f 4b 29  serial)!=TCL_OK)
14a90 0a 09 09 09 20 20 20 20 72 65 74 75 72 6e 20 54  ....    return T
14aa0 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20 20  CL_ERROR;...    
14ab0 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d  } else if (strcm
14ac0 70 28 73 74 72 2c 22 43 22 29 3d 3d 30 29 20 7b  p(str,"C")==0) {
14ad0 0a 09 09 09 6b 5f 43 3d 54 63 6c 5f 47 65 74 53  ....k_C=Tcl_GetS
14ae0 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d  tring(listv[i+1]
14af0 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20  );...    } else 
14b00 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22  if (strcmp(str,"
14b10 53 54 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f  ST")==0) {....k_
14b20 53 54 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  ST=Tcl_GetString
14b30 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09  (listv[i+1]);...
14b40 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73      } else if (s
14b50 74 72 63 6d 70 28 73 74 72 2c 22 4c 22 29 3d 3d  trcmp(str,"L")==
14b60 30 29 20 7b 0a 09 09 09 6b 5f 4c 3d 54 63 6c 5f  0) {....k_L=Tcl_
14b70 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b  GetString(listv[
14b80 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65  i+1]);...    } e
14b90 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73  lse if (strcmp(s
14ba0 74 72 2c 22 4f 22 29 3d 3d 30 29 20 7b 0a 09 09  tr,"O")==0) {...
14bb0 09 6b 5f 4f 3d 54 63 6c 5f 47 65 74 53 74 72 69  .k_O=Tcl_GetStri
14bc0 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a  ng(listv[i+1]);.
14bd0 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ..    } else if 
14be0 28 73 74 72 63 6d 70 28 73 74 72 2c 22 4f 55 22  (strcmp(str,"OU"
14bf0 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4f 55 3d  )==0) {....k_OU=
14c00 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69  Tcl_GetString(li
14c10 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20  stv[i+1]);...   
14c20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63   } else if (strc
14c30 6d 70 28 73 74 72 2c 22 43 4e 22 29 3d 3d 30 29  mp(str,"CN")==0)
14c40 20 7b 0a 09 09 09 6b 5f 43 4e 3d 54 63 6c 5f 47   {....k_CN=Tcl_G
14c50 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69  etString(listv[i
14c60 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c  +1]);...    } el
14c70 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74  se if (strcmp(st
14c80 72 2c 22 45 6d 61 69 6c 22 29 3d 3d 30 29 20 7b  r,"Email")==0) {
14c90 0a 09 09 09 6b 5f 45 6d 61 69 6c 3d 54 63 6c 5f  ....k_Email=Tcl_
14ca0 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b  GetString(listv[
14cb0 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65  i+1]);...    } e
14cc0 6c 73 65 20 7b 0a 09 09 09 54 63 6c 5f 53 65 74  lse {....Tcl_Set
14cd0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 55  Result(interp,"U
14ce0 6e 6b 6e 6f 77 6e 20 70 61 72 61 6d 65 74 65 72  nknown parameter
14cf0 22 2c 4e 55 4c 4c 29 3b 0a 09 09 09 72 65 74 75  ",NULL);....retu
14d00 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09  rn TCL_ERROR;...
14d10 20 20 20 20 7d 0a 09 09 7d 0a 09 20 20 20 20 7d      }...}..    }
14d20 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45  ..#if OPENSSL_VE
14d30 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30  RSION_NUMBER < 0
14d40 78 33 30 30 30 30 30 30 30 4c 0a 09 20 20 20 20  x30000000L..    
14d50 62 6e 65 20 3d 20 42 4e 5f 6e 65 77 28 29 3b 0a  bne = BN_new();.
14d60 09 20 20 20 20 72 73 61 20 3d 20 52 53 41 5f 6e  .    rsa = RSA_n
14d70 65 77 28 29 3b 0a 09 20 20 20 20 70 6b 65 79 20  ew();..    pkey 
14d80 3d 20 45 56 50 5f 50 4b 45 59 5f 6e 65 77 28 29  = EVP_PKEY_new()
14d90 3b 0a 09 20 20 20 20 69 66 20 28 62 6e 65 20 3d  ;..    if (bne =
14da0 3d 20 4e 55 4c 4c 20 7c 7c 20 72 73 61 20 3d 3d  = NULL || rsa ==
14db0 20 4e 55 4c 4c 20 7c 7c 20 70 6b 65 79 20 3d 3d   NULL || pkey ==
14dc0 20 4e 55 4c 4c 20 7c 7c 20 21 42 4e 5f 73 65 74   NULL || !BN_set
14dd0 5f 77 6f 72 64 28 62 6e 65 2c 52 53 41 5f 46 34  _word(bne,RSA_F4
14de0 29 20 7c 7c 0a 09 09 21 52 53 41 5f 67 65 6e 65  ) ||...!RSA_gene
14df0 72 61 74 65 5f 6b 65 79 5f 65 78 28 72 73 61 2c  rate_key_ex(rsa,
14e00 20 6b 65 79 73 69 7a 65 2c 20 62 6e 65 2c 20 4e   keysize, bne, N
14e10 55 4c 4c 29 20 7c 7c 20 21 45 56 50 5f 50 4b 45  ULL) || !EVP_PKE
14e20 59 5f 61 73 73 69 67 6e 5f 52 53 41 28 70 6b 65  Y_assign_RSA(pke
14e30 79 2c 20 72 73 61 29 29 20 7b 0a 09 09 45 56 50  y, rsa)) {...EVP
14e40 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29  _PKEY_free(pkey)
14e50 3b 0a 09 09 2f 2a 20 52 53 41 5f 66 72 65 65 28  ;.../* RSA_free(
14e60 72 73 61 29 3b 20 66 72 65 65 64 20 62 79 20 45  rsa); freed by E
14e70 56 50 5f 50 4b 45 59 5f 66 72 65 65 20 2a 2f 0a  VP_PKEY_free */.
14e80 09 09 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a  ..BN_free(bne);.
14e90 23 65 6c 73 65 0a 09 20 20 20 20 70 6b 65 79 20  #else..    pkey 
14ea0 3d 20 45 56 50 5f 52 53 41 5f 67 65 6e 28 28 75  = EVP_RSA_gen((u
14eb0 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 6b 65 79  nsigned int) key
14ec0 73 69 7a 65 29 3b 0a 09 20 20 20 20 63 74 78 20  size);..    ctx 
14ed0 3d 20 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f 6e  = EVP_PKEY_CTX_n
14ee0 65 77 28 70 6b 65 79 2c 4e 55 4c 4c 29 3b 0a 09  ew(pkey,NULL);..
14ef0 20 20 20 20 69 66 20 28 70 6b 65 79 20 3d 3d 20      if (pkey == 
14f00 4e 55 4c 4c 20 7c 7c 20 63 74 78 20 3d 3d 20 4e  NULL || ctx == N
14f10 55 4c 4c 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59  ULL || !EVP_PKEY
14f20 5f 6b 65 79 67 65 6e 5f 69 6e 69 74 28 63 74 78  _keygen_init(ctx
14f30 29 20 7c 7c 0a 09 09 21 45 56 50 5f 50 4b 45 59  ) ||...!EVP_PKEY
14f40 5f 43 54 58 5f 73 65 74 5f 72 73 61 5f 6b 65 79  _CTX_set_rsa_key
14f50 67 65 6e 5f 62 69 74 73 28 63 74 78 2c 20 6b 65  gen_bits(ctx, ke
14f60 79 73 69 7a 65 29 20 7c 7c 20 21 45 56 50 5f 50  ysize) || !EVP_P
14f70 4b 45 59 5f 6b 65 79 67 65 6e 28 63 74 78 2c 20  KEY_keygen(ctx, 
14f80 26 70 6b 65 79 29 29 20 7b 0a 09 09 45 56 50 5f  &pkey)) {...EVP_
14f90 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b  PKEY_free(pkey);
14fa0 0a 09 09 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f  ...EVP_PKEY_CTX_
14fb0 66 72 65 65 28 63 74 78 29 3b 0a 23 65 6e 64 69  free(ctx);.#endi
14fc0 66 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c  f...Tcl_SetResul
14fd0 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 20  t(interp,"Error 
14fe0 67 65 6e 65 72 61 74 69 6e 67 20 70 72 69 76 61  generating priva
14ff0 74 65 20 6b 65 79 22 2c 4e 55 4c 4c 29 3b 0a 09  te key",NULL);..
15000 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
15010 52 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 7b  R;..    } else {
15020 0a 09 09 69 66 20 28 69 73 53 74 72 29 20 7b 0a  ...if (isStr) {.
15030 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65  ..    out=BIO_ne
15040 77 28 42 49 4f 5f 73 5f 6d 65 6d 28 29 29 3b 0a  w(BIO_s_mem());.
15050 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f  ..    PEM_write_
15060 62 69 6f 5f 50 72 69 76 61 74 65 4b 65 79 28 6f  bio_PrivateKey(o
15070 75 74 2c 70 6b 65 79 2c 4e 55 4c 4c 2c 4e 55 4c  ut,pkey,NULL,NUL
15080 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a  L,0,NULL,NULL);.
15090 09 09 20 20 20 20 69 3d 42 49 4f 5f 72 65 61 64  ..    i=BIO_read
150a0 28 6f 75 74 2c 62 75 66 66 65 72 2c 73 69 7a 65  (out,buffer,size
150b0 6f 66 28 62 75 66 66 65 72 29 2d 31 29 3b 0a 09  of(buffer)-1);..
150c0 09 20 20 20 20 69 3d 28 69 3c 30 29 20 3f 20 30  .    i=(i<0) ? 0
150d0 20 3a 20 69 3b 0a 09 09 20 20 20 20 62 75 66 66   : i;...    buff
150e0 65 72 5b 69 5d 3d 27 5c 30 27 3b 0a 09 09 20 20  er[i]='\0';...  
150f0 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74    Tcl_SetVar(int
15100 65 72 70 2c 6b 65 79 6f 75 74 2c 62 75 66 66 65  erp,keyout,buffe
15110 72 2c 30 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f  r,0);...    BIO_
15120 66 6c 75 73 68 28 6f 75 74 29 3b 0a 09 09 20 20  flush(out);...  
15130 20 20 42 49 4f 5f 66 72 65 65 28 6f 75 74 29 3b    BIO_free(out);
15140 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20  ...} else {...  
15150 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49    out=BIO_new(BI
15160 4f 5f 73 5f 66 69 6c 65 28 29 29 3b 0a 09 09 20  O_s_file());... 
15170 20 20 20 42 49 4f 5f 77 72 69 74 65 5f 66 69 6c     BIO_write_fil
15180 65 6e 61 6d 65 28 6f 75 74 2c 6b 65 79 6f 75 74  ename(out,keyout
15190 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 69  );...    PEM_wri
151a0 74 65 5f 62 69 6f 5f 50 72 69 76 61 74 65 4b 65  te_bio_PrivateKe
151b0 79 28 6f 75 74 2c 70 6b 65 79 2c 4e 55 4c 4c 2c  y(out,pkey,NULL,
151c0 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c  NULL,0,NULL,NULL
151d0 29 3b 0a 09 09 20 20 20 20 2f 2a 20 50 45 4d 5f  );...    /* PEM_
151e0 77 72 69 74 65 5f 62 69 6f 5f 52 53 41 50 72 69  write_bio_RSAPri
151f0 76 61 74 65 4b 65 79 28 6f 75 74 2c 20 72 73 61  vateKey(out, rsa
15200 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 30 2c  , NULL, NULL, 0,
15210 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 20 2a 2f   NULL, NULL); */
15220 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65 5f  ...    BIO_free_
15230 61 6c 6c 28 6f 75 74 29 3b 0a 09 20 09 7d 0a 0a  all(out);.. .}..
15240 09 09 69 66 20 28 28 63 65 72 74 3d 58 35 30 39  ..if ((cert=X509
15250 5f 6e 65 77 28 29 29 3d 3d 4e 55 4c 4c 29 20 7b  _new())==NULL) {
15260 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 52 65  ...    Tcl_SetRe
15270 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 72  sult(interp,"Err
15280 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 63 65  or generating ce
15290 72 74 69 66 69 63 61 74 65 20 72 65 71 75 65 73  rtificate reques
152a0 74 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20  t",NULL);...    
152b0 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b  EVP_PKEY_free(pk
152c0 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c  ey);.#if OPENSSL
152d0 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20  _VERSION_NUMBER 
152e0 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 09  < 0x30000000L...
152f0 20 20 20 20 42 4e 5f 66 72 65 65 28 62 6e 65 29      BN_free(bne)
15300 3b 0a 23 65 6e 64 69 66 0a 09 09 20 20 20 20 72  ;.#endif...    r
15310 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
15320 0a 09 09 7d 0a 0a 09 09 58 35 30 39 5f 73 65 74  ...}....X509_set
15330 5f 76 65 72 73 69 6f 6e 28 63 65 72 74 2c 32 29  _version(cert,2)
15340 3b 0a 09 09 41 53 4e 31 5f 49 4e 54 45 47 45 52  ;...ASN1_INTEGER
15350 5f 73 65 74 28 58 35 30 39 5f 67 65 74 5f 73 65  _set(X509_get_se
15360 72 69 61 6c 4e 75 6d 62 65 72 28 63 65 72 74 29  rialNumber(cert)
15370 2c 73 65 72 69 61 6c 29 3b 0a 09 09 58 35 30 39  ,serial);...X509
15380 5f 67 6d 74 69 6d 65 5f 61 64 6a 28 58 35 30 39  _gmtime_adj(X509
15390 5f 67 65 74 6d 5f 6e 6f 74 42 65 66 6f 72 65 28  _getm_notBefore(
153a0 63 65 72 74 29 2c 30 29 3b 0a 09 09 58 35 30 39  cert),0);...X509
153b0 5f 67 6d 74 69 6d 65 5f 61 64 6a 28 58 35 30 39  _gmtime_adj(X509
153c0 5f 67 65 74 6d 5f 6e 6f 74 41 66 74 65 72 28 63  _getm_notAfter(c
153d0 65 72 74 29 2c 28 6c 6f 6e 67 29 36 30 2a 36 30  ert),(long)60*60
153e0 2a 32 34 2a 64 61 79 73 29 3b 0a 09 09 58 35 30  *24*days);...X50
153f0 39 5f 73 65 74 5f 70 75 62 6b 65 79 28 63 65 72  9_set_pubkey(cer
15400 74 2c 70 6b 65 79 29 3b 0a 0a 09 09 6e 61 6d 65  t,pkey);....name
15410 3d 58 35 30 39 5f 67 65 74 5f 73 75 62 6a 65 63  =X509_get_subjec
15420 74 5f 6e 61 6d 65 28 63 65 72 74 29 3b 0a 0a 09  t_name(cert);...
15430 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65  .X509_NAME_add_e
15440 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65  ntry_by_txt(name
15450 2c 22 43 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41  ,"C", MBSTRING_A
15460 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67  SC, (const unsig
15470 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 43 2c  ned char *) k_C,
15480 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58   -1, -1, 0);...X
15490 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74  509_NAME_add_ent
154a0 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22  ry_by_txt(name,"
154b0 53 54 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53  ST", MBSTRING_AS
154c0 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e  C, (const unsign
154d0 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 53 54 2c  ed char *) k_ST,
154e0 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58   -1, -1, 0);...X
154f0 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74  509_NAME_add_ent
15500 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22  ry_by_txt(name,"
15510 4c 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43  L", MBSTRING_ASC
15520 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  , (const unsigne
15530 64 20 63 68 61 72 20 2a 29 20 6b 5f 4c 2c 20 2d  d char *) k_L, -
15540 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30  1, -1, 0);...X50
15550 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79  9_NAME_add_entry
15560 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4f 22  _by_txt(name,"O"
15570 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20  , MBSTRING_ASC, 
15580 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
15590 63 68 61 72 20 2a 29 20 6b 5f 4f 2c 20 2d 31 2c  char *) k_O, -1,
155a0 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f   -1, 0);...X509_
155b0 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62  NAME_add_entry_b
155c0 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4f 55 22 2c  y_txt(name,"OU",
155d0 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28   MBSTRING_ASC, (
155e0 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
155f0 68 61 72 20 2a 29 20 6b 5f 4f 55 2c 20 2d 31 2c  har *) k_OU, -1,
15600 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f   -1, 0);...X509_
15610 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62  NAME_add_entry_b
15620 79 5f 74 78 74 28 6e 61 6d 65 2c 22 43 4e 22 2c  y_txt(name,"CN",
15630 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28   MBSTRING_ASC, (
15640 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
15650 68 61 72 20 2a 29 20 6b 5f 43 4e 2c 20 2d 31 2c  har *) k_CN, -1,
15660 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f   -1, 0);...X509_
15670 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62  NAME_add_entry_b
15680 79 5f 74 78 74 28 6e 61 6d 65 2c 22 45 6d 61 69  y_txt(name,"Emai
15690 6c 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43  l", MBSTRING_ASC
156a0 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  , (const unsigne
156b0 64 20 63 68 61 72 20 2a 29 20 6b 5f 45 6d 61 69  d char *) k_Emai
156c0 6c 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 0a  l, -1, -1, 0);..
156d0 09 09 58 35 30 39 5f 73 65 74 5f 73 75 62 6a 65  ..X509_set_subje
156e0 63 74 5f 6e 61 6d 65 28 63 65 72 74 2c 6e 61 6d  ct_name(cert,nam
156f0 65 29 3b 0a 0a 09 09 69 66 20 28 21 58 35 30 39  e);....if (!X509
15700 5f 73 69 67 6e 28 63 65 72 74 2c 70 6b 65 79 2c  _sign(cert,pkey,
15710 45 56 50 5f 73 68 61 32 35 36 28 29 29 29 20 7b  EVP_sha256())) {
15720 0a 09 09 20 20 20 20 58 35 30 39 5f 66 72 65 65  ...    X509_free
15730 28 63 65 72 74 29 3b 0a 09 09 20 20 20 20 45 56  (cert);...    EV
15740 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79  P_PKEY_free(pkey
15750 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56  );.#if OPENSSL_V
15760 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20  ERSION_NUMBER < 
15770 30 78 33 30 30 30 30 30 30 30 4c 0a 09 09 20 20  0x30000000L...  
15780 20 20 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a    BN_free(bne);.
15790 23 65 6e 64 69 66 0a 09 09 20 20 20 20 54 63 6c  #endif...    Tcl
157a0 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
157b0 70 2c 22 45 72 72 6f 72 20 73 69 67 6e 69 6e 67  p,"Error signing
157c0 20 63 65 72 74 69 66 69 63 61 74 65 22 2c 4e 55   certificate",NU
157d0 4c 4c 29 3b 0a 09 09 20 20 20 20 72 65 74 75 72  LL);...    retur
157e0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d  n TCL_ERROR;...}
157f0 0a 0a 09 09 69 66 20 28 69 73 53 74 72 29 20 7b  ....if (isStr) {
15800 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e  ...    out=BIO_n
15810 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28 29 29 3b  ew(BIO_s_mem());
15820 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65  ...    PEM_write
15830 5f 62 69 6f 5f 58 35 30 39 28 6f 75 74 2c 63 65  _bio_X509(out,ce
15840 72 74 29 3b 0a 09 09 20 20 20 20 69 3d 42 49 4f  rt);...    i=BIO
15850 5f 72 65 61 64 28 6f 75 74 2c 62 75 66 66 65 72  _read(out,buffer
15860 2c 73 69 7a 65 6f 66 28 62 75 66 66 65 72 29 2d  ,sizeof(buffer)-
15870 31 29 3b 0a 09 09 20 20 20 20 69 3d 28 69 3c 30  1);...    i=(i<0
15880 29 20 3f 20 30 20 3a 20 69 3b 0a 09 09 20 20 20  ) ? 0 : i;...   
15890 20 62 75 66 66 65 72 5b 69 5d 3d 27 5c 30 27 3b   buffer[i]='\0';
158a0 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 56 61  ...    Tcl_SetVa
158b0 72 28 69 6e 74 65 72 70 2c 70 65 6d 6f 75 74 2c  r(interp,pemout,
158c0 62 75 66 66 65 72 2c 30 29 3b 0a 09 09 20 20 20  buffer,0);...   
158d0 20 42 49 4f 5f 66 6c 75 73 68 28 6f 75 74 29 3b   BIO_flush(out);
158e0 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65 28  ...    BIO_free(
158f0 6f 75 74 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b  out);...} else {
15900 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e  ...    out=BIO_n
15910 65 77 28 42 49 4f 5f 73 5f 66 69 6c 65 28 29 29  ew(BIO_s_file())
15920 3b 0a 09 09 20 20 20 20 42 49 4f 5f 77 72 69 74  ;...    BIO_writ
15930 65 5f 66 69 6c 65 6e 61 6d 65 28 6f 75 74 2c 70  e_filename(out,p
15940 65 6d 6f 75 74 29 3b 0a 09 09 20 20 20 20 50 45  emout);...    PE
15950 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 58 35 30 39  M_write_bio_X509
15960 28 6f 75 74 2c 63 65 72 74 29 3b 0a 09 09 20 20  (out,cert);...  
15970 20 20 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f    BIO_free_all(o
15980 75 74 29 3b 0a 09 09 7d 0a 0a 09 09 58 35 30 39  ut);...}....X509
15990 5f 66 72 65 65 28 63 65 72 74 29 3b 0a 09 09 45  _free(cert);...E
159a0 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65  VP_PKEY_free(pke
159b0 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f  y);.#if OPENSSL_
159c0 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c  VERSION_NUMBER <
159d0 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 09 42   0x30000000L...B
159e0 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6e  N_free(bne);.#en
159f0 64 69 66 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 62  dif..    }..}..b
15a00 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c  reak;.    defaul
15a10 74 3a 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d  t:..break;.    }
15a20 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
15a30 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a  OK;.}.../*******
15a40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f  *************/./
15a50 2a 20 49 6e 69 74 20 20 20 20 20 20 20 20 20 20  * Init          
15a60 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a     */./*********
15a70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
15a80 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a 0a 20 2a 20 54 6c 73  ------. *. * Tls
15ad0 5f 46 72 65 65 20 2d 2d 0a 20 2a 0a 20 2a 09 54  _Free --. *. *.T
15ae0 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c  his procedure cl
15af0 65 61 6e 73 20 75 70 20 77 68 65 6e 20 61 20 53  eans up when a S
15b00 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 64 20  SL socket based 
15b10 63 68 61 6e 6e 65 6c 0a 20 2a 09 69 73 20 63 6c  channel. *.is cl
15b20 6f 73 65 64 20 61 6e 64 20 69 74 73 20 72 65 66  osed and its ref
15b30 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 61 6c  erence count fal
15b40 6c 73 20 62 65 6c 6f 77 20 31 0a 20 2a 0a 20 2a  ls below 1. *. *
15b50 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 6e 6f 6e   Results:. *.non
15b60 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  e. *. * Side eff
15b70 65 63 74 73 3a 0a 20 2a 09 46 72 65 65 73 20 61  ects:. *.Frees a
15b80 6c 6c 20 74 68 65 20 73 74 61 74 65 0a 20 2a 0a  ll the state. *.
15b90 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
15ba0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15bb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15bc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15bd0 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 0a 54  -----. */.void.T
15be0 6c 73 5f 46 72 65 65 28 74 6c 73 5f 66 72 65 65  ls_Free(tls_free
15bf0 5f 74 79 70 65 20 2a 62 6c 6f 63 6b 50 74 72 29  _type *blockPtr)
15c00 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74   {.    State *st
15c10 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20  atePtr = (State 
15c20 2a 29 62 6c 6f 63 6b 50 74 72 3b 0a 0a 20 20 20  *)blockPtr;..   
15c30 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
15c40 22 29 3b 0a 0a 20 20 20 20 54 6c 73 5f 43 6c 65  ");..    Tls_Cle
15c50 61 6e 28 73 74 61 74 65 50 74 72 29 3b 0a 20 20  an(statePtr);.  
15c60 20 20 63 6b 66 72 65 65 28 62 6c 6f 63 6b 50 74    ckfree(blockPt
15c70 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d  r);.}.../*. *---
15c80 2d 2d 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a 0a 20 2a 20 54 6c 73 5f 43 6c 65 61 6e  . *. * Tls_Clean
15cd0 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70   --. *. *.This p
15ce0 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20  rocedure cleans 
15cf0 75 70 20 77 68 65 6e 20 61 20 53 53 4c 20 73 6f  up when a SSL so
15d00 63 6b 65 74 20 62 61 73 65 64 20 63 68 61 6e 6e  cket based chann
15d10 65 6c 0a 20 2a 09 69 73 20 63 6c 6f 73 65 64 20  el. *.is closed 
15d20 61 6e 64 20 69 74 73 20 72 65 66 65 72 65 6e 63  and its referenc
15d30 65 20 63 6f 75 6e 74 20 66 61 6c 6c 73 20 62 65  e count falls be
15d40 6c 6f 77 20 31 2e 20 20 54 68 69 73 20 73 68 6f  low 1.  This sho
15d50 75 6c 64 0a 20 2a 09 62 65 20 63 61 6c 6c 65 64  uld. *.be called
15d60 20 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 62   synchronously b
15d70 79 20 74 68 65 20 43 6c 6f 73 65 50 72 6f 63 2c  y the CloseProc,
15d80 20 6e 6f 74 20 69 6e 20 74 68 65 0a 20 2a 09 45   not in the. *.E
15d90 76 65 6e 74 75 61 6c 6c 79 46 72 65 65 20 63 61  ventuallyFree ca
15da0 6c 6c 62 61 63 6b 2e 0a 20 2a 0a 20 2a 20 52 65  llback.. *. * Re
15db0 73 75 6c 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20  sults:. *.none. 
15dc0 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
15dd0 73 3a 0a 20 2a 09 46 72 65 65 73 20 61 6c 6c 20  s:. *.Frees all 
15de0 74 68 65 20 73 74 61 74 65 0a 20 2a 0a 20 2a 2d  the state. *. *-
15df0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 20 2a 2f 0a 76 6f 69 64 20 54 6c 73 5f  --. */.void Tls_
15e40 43 6c 65 61 6e 28 53 74 61 74 65 20 2a 73 74 61  Clean(State *sta
15e50 74 65 50 74 72 29 20 7b 0a 20 20 20 20 64 70 72  tePtr) {.    dpr
15e60 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
15e70 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 77  .    /*.     * w
15e80 65 27 72 65 20 61 73 73 75 6d 69 6e 67 20 68 65  e're assuming he
15e90 72 65 20 74 68 61 74 20 77 65 27 72 65 20 73 69  re that we're si
15ea0 6e 67 6c 65 2d 74 68 72 65 61 64 65 64 0a 20 20  ngle-threaded.  
15eb0 20 20 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74     */.    if (st
15ec0 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 21 3d  atePtr->timer !=
15ed0 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e   (Tcl_TimerToken
15ee0 29 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44  ) NULL) {..Tcl_D
15ef0 65 6c 65 74 65 54 69 6d 65 72 48 61 6e 64 6c 65  eleteTimerHandle
15f00 72 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65  r(statePtr->time
15f10 72 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 74  r);..statePtr->t
15f20 69 6d 65 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  imer = NULL;.   
15f30 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76   }..    /* Remov
15f40 65 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 20  e callbacks */. 
15f50 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
15f60 3e 63 61 6c 6c 62 61 63 6b 29 20 7b 0a 09 54 63  >callback) {..Tc
15f70 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 73  l_DecrRefCount(s
15f80 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63  tatePtr->callbac
15f90 6b 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 63  k);..statePtr->c
15fa0 61 6c 6c 62 61 63 6b 20 3d 20 4e 55 4c 4c 3b 0a  allback = NULL;.
15fb0 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74      }.    if (st
15fc0 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64  atePtr->password
15fd0 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66  ) {..Tcl_DecrRef
15fe0 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e  Count(statePtr->
15ff0 70 61 73 73 77 6f 72 64 29 3b 0a 09 73 74 61 74  password);..stat
16000 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d  ePtr->password =
16010 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20   NULL;.    }.   
16020 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76   if (statePtr->v
16030 63 6d 64 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72  cmd) {..Tcl_Decr
16040 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74  RefCount(statePt
16050 72 2d 3e 76 63 6d 64 29 3b 0a 09 73 74 61 74 65  r->vcmd);..state
16060 50 74 72 2d 3e 76 63 6d 64 20 3d 20 4e 55 4c 4c  Ptr->vcmd = NULL
16070 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20  ;.    }..    if 
16080 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f  (statePtr->proto
16090 73 29 20 7b 0a 09 63 6b 66 72 65 65 28 73 74 61  s) {..ckfree(sta
160a0 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 29 3b 0a  tePtr->protos);.
160b0 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f  .statePtr->proto
160c0 73 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a  s = NULL;.    }.
160d0 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
160e0 72 2d 3e 62 69 6f 29 20 7b 0a 09 2f 2a 20 54 68  r->bio) {../* Th
160f0 69 73 20 77 69 6c 6c 20 63 61 6c 6c 20 53 53 4c  is will call SSL
16100 5f 73 68 75 74 64 6f 77 6e 2e 20 42 75 67 20 31  _shutdown. Bug 1
16110 34 31 34 30 34 35 20 2a 2f 0a 09 64 70 72 69 6e  414045 */..dprin
16120 74 66 28 22 42 49 4f 5f 66 72 65 65 5f 61 6c 6c  tf("BIO_free_all
16130 28 25 70 29 22 2c 20 73 74 61 74 65 50 74 72 2d  (%p)", statePtr-
16140 3e 62 69 6f 29 3b 0a 09 42 49 4f 5f 66 72 65 65  >bio);..BIO_free
16150 5f 61 6c 6c 28 73 74 61 74 65 50 74 72 2d 3e 62  _all(statePtr->b
16160 69 6f 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e  io);..statePtr->
16170 62 69 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  bio = NULL;.    
16180 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65  }..    if (state
16190 50 74 72 2d 3e 73 73 6c 29 20 7b 0a 09 64 70 72  Ptr->ssl) {..dpr
161a0 69 6e 74 66 28 22 53 53 4c 5f 66 72 65 65 28 25  intf("SSL_free(%
161b0 70 29 22 2c 20 73 74 61 74 65 50 74 72 2d 3e 73  p)", statePtr->s
161c0 73 6c 29 3b 0a 09 53 53 4c 5f 66 72 65 65 28 73  sl);..SSL_free(s
161d0 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09  tatePtr->ssl);..
161e0 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 20 3d 20  statePtr->ssl = 
161f0 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  NULL;.    }..   
16200 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63   if (statePtr->c
16210 74 78 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 66  tx) {..SSL_CTX_f
16220 72 65 65 28 73 74 61 74 65 50 74 72 2d 3e 63 74  ree(statePtr->ct
16230 78 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 63  x);..statePtr->c
16240 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  tx = NULL;.    }
16250 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 52  ..    dprintf("R
16260 65 74 75 72 6e 69 6e 67 22 29 3b 0a 7d 0a 0c 0a  eturning");.}...
16270 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
16280 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16290 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a 0a 20  -----------. *. 
162c0 2a 20 42 75 69 6c 64 20 49 6e 66 6f 20 43 6f 6d  * Build Info Com
162d0 6d 61 6e 64 20 2d 2d 0a 20 2a 0a 20 2a 09 43 72  mand --. *. *.Cr
162e0 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20  eate command to 
162f0 72 65 74 75 72 6e 20 62 75 69 6c 64 20 69 6e 66  return build inf
16300 6f 20 66 6f 72 20 70 61 63 6b 61 67 65 2e 0a 20  o for package.. 
16310 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
16320 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20  .A standard Tcl 
16330 72 65 73 75 6c 74 0a 20 2a 0a 20 2a 20 53 69 64  result. *. * Sid
16340 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 72  e effects:. *.Cr
16350 65 61 74 65 64 20 62 75 69 6c 64 2d 69 6e 66 6f  eated build-info
16360 20 63 6f 6d 6d 61 6e 64 2e 0a 20 2a 0a 20 2a 2d   command.. *. *-
16370 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16380 2d 2d 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a 2f 0a 0a 23 69 66 6e 64  -----. */..#ifnd
163c0 65 66 20 53 54 52 49 4e 47 49 46 59 0a 23 20 20  ef STRINGIFY.#  
163d0 64 65 66 69 6e 65 20 53 54 52 49 4e 47 49 46 59  define STRINGIFY
163e0 28 78 29 20 53 54 52 49 4e 47 49 46 59 31 28 78  (x) STRINGIFY1(x
163f0 29 0a 23 20 20 64 65 66 69 6e 65 20 53 54 52 49  ).#  define STRI
16400 4e 47 49 46 59 31 28 78 29 20 23 78 0a 23 65 6e  NGIFY1(x) #x.#en
16410 64 69 66 0a 0a 69 6e 74 0a 42 75 69 6c 64 49 6e  dif..int.BuildIn
16420 66 6f 43 6f 6d 6d 61 6e 64 28 54 63 6c 5f 49 6e  foCommand(Tcl_In
16430 74 65 72 70 2a 20 69 6e 74 65 72 70 29 20 7b 0a  terp* interp) {.
16440 20 20 20 20 54 63 6c 5f 43 6d 64 49 6e 66 6f 20      Tcl_CmdInfo 
16450 69 6e 66 6f 3b 0a 0a 20 20 20 20 69 66 20 28 54  info;..    if (T
16460 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64 49 6e 66  cl_GetCommandInf
16470 6f 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 63 6c  o(interp, "::tcl
16480 3a 3a 62 75 69 6c 64 2d 69 6e 66 6f 22 2c 20 26  ::build-info", &
16490 69 6e 66 6f 29 29 20 7b 0a 09 54 63 6c 5f 43 72  info)) {..Tcl_Cr
164a0 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
164b0 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 62  nterp, "::tls::b
164c0 75 69 6c 64 2d 69 6e 66 6f 22 2c 20 69 6e 66 6f  uild-info", info
164d0 2e 6f 62 6a 50 72 6f 63 2c 20 28 76 6f 69 64 20  .objProc, (void 
164e0 2a 29 28 0a 09 09 50 41 43 4b 41 47 45 5f 56 45  *)(...PACKAGE_VE
164f0 52 53 49 4f 4e 20 22 2b 22 20 53 54 52 49 4e 47  RSION "+" STRING
16500 49 46 59 28 54 4c 53 5f 56 45 52 53 49 4f 4e 5f  IFY(TLS_VERSION_
16510 55 55 49 44 29 0a 23 69 66 20 64 65 66 69 6e 65  UUID).#if define
16520 64 28 5f 5f 63 6c 61 6e 67 5f 5f 29 20 26 26 20  d(__clang__) && 
16530 64 65 66 69 6e 65 64 28 5f 5f 63 6c 61 6e 67 5f  defined(__clang_
16540 6d 61 6a 6f 72 5f 5f 29 0a 09 09 09 20 20 20 20  major__)....    
16550 22 2e 63 6c 61 6e 67 2d 22 20 53 54 52 49 4e 47  ".clang-" STRING
16560 49 46 59 28 5f 5f 63 6c 61 6e 67 5f 6d 61 6a 6f  IFY(__clang_majo
16570 72 5f 5f 29 0a 23 69 66 20 5f 5f 63 6c 61 6e 67  r__).#if __clang
16580 5f 6d 69 6e 6f 72 5f 5f 20 3c 20 31 30 0a 09 09  _minor__ < 10...
16590 09 20 20 20 20 22 30 22 0a 23 65 6e 64 69 66 0a  .    "0".#endif.
165a0 09 09 09 20 20 20 20 53 54 52 49 4e 47 49 46 59  ...    STRINGIFY
165b0 28 5f 5f 63 6c 61 6e 67 5f 6d 69 6e 6f 72 5f 5f  (__clang_minor__
165c0 29 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  ).#endif.#if def
165d0 69 6e 65 64 28 5f 5f 63 70 6c 75 73 70 6c 75 73  ined(__cplusplus
165e0 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f  ) && !defined(__
165f0 4f 42 4a 43 5f 5f 29 0a 09 09 09 20 20 20 20 22  OBJC__)....    "
16600 2e 63 70 6c 75 73 70 6c 75 73 22 0a 23 65 6e 64  .cplusplus".#end
16610 69 66 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  if.#ifndef NDEBU
16620 47 0a 09 09 09 20 20 20 20 22 2e 64 65 62 75 67  G....    ".debug
16630 22 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65  ".#endif.#if !de
16640 66 69 6e 65 64 28 5f 5f 63 6c 61 6e 67 5f 5f 29  fined(__clang__)
16650 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 49   && !defined(__I
16660 4e 54 45 4c 5f 43 4f 4d 50 49 4c 45 52 29 20 26  NTEL_COMPILER) &
16670 26 20 64 65 66 69 6e 65 64 28 5f 5f 47 4e 55 43  & defined(__GNUC
16680 5f 5f 29 0a 09 09 09 20 20 20 20 22 2e 67 63 63  __)....    ".gcc
16690 2d 22 20 53 54 52 49 4e 47 49 46 59 28 5f 5f 47  -" STRINGIFY(__G
166a0 4e 55 43 5f 5f 29 0a 23 69 66 20 5f 5f 47 4e 55  NUC__).#if __GNU
166b0 43 5f 4d 49 4e 4f 52 5f 5f 20 3c 20 31 30 0a 09  C_MINOR__ < 10..
166c0 09 09 20 20 20 20 22 30 22 0a 23 65 6e 64 69 66  ..    "0".#endif
166d0 0a 09 09 09 20 20 20 20 53 54 52 49 4e 47 49 46  ....    STRINGIF
166e0 59 28 5f 5f 47 4e 55 43 5f 4d 49 4e 4f 52 5f 5f  Y(__GNUC_MINOR__
166f0 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ).#endif.#ifdef 
16700 5f 5f 49 4e 54 45 4c 5f 43 4f 4d 50 49 4c 45 52  __INTEL_COMPILER
16710 0a 09 09 09 20 20 20 20 22 2e 69 63 63 2d 22 20  ....    ".icc-" 
16720 53 54 52 49 4e 47 49 46 59 28 5f 5f 49 4e 54 45  STRINGIFY(__INTE
16730 4c 5f 43 4f 4d 50 49 4c 45 52 29 0a 23 65 6e 64  L_COMPILER).#end
16740 69 66 0a 23 69 66 64 65 66 20 54 43 4c 5f 4d 45  if.#ifdef TCL_ME
16750 4d 5f 44 45 42 55 47 0a 09 09 09 20 20 20 20 22  M_DEBUG....    "
16760 2e 6d 65 6d 64 65 62 75 67 22 0a 23 65 6e 64 69  .memdebug".#endi
16770 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 4d  f.#if defined(_M
16780 53 43 5f 56 45 52 29 0a 09 09 09 20 20 20 20 22  SC_VER)....    "
16790 2e 6d 73 76 63 2d 22 20 53 54 52 49 4e 47 49 46  .msvc-" STRINGIF
167a0 59 28 5f 4d 53 43 5f 56 45 52 29 0a 23 65 6e 64  Y(_MSC_VER).#end
167b0 69 66 0a 23 69 66 64 65 66 20 55 53 45 5f 4e 4d  if.#ifdef USE_NM
167c0 41 4b 45 0a 09 09 09 20 20 20 20 22 2e 6e 6d 61  AKE....    ".nma
167d0 6b 65 22 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64  ke".#endif.#ifnd
167e0 65 66 20 54 43 4c 5f 43 46 47 5f 4f 50 54 49 4d  ef TCL_CFG_OPTIM
167f0 49 5a 45 44 0a 09 09 09 20 20 20 20 22 2e 6e 6f  IZED....    ".no
16800 2d 6f 70 74 69 6d 69 7a 65 22 0a 23 65 6e 64 69  -optimize".#endi
16810 66 0a 23 69 66 64 65 66 20 5f 5f 4f 42 4a 43 5f  f.#ifdef __OBJC_
16820 5f 0a 09 09 09 20 20 20 20 22 2e 6f 62 6a 65 63  _....    ".objec
16830 74 69 76 65 2d 63 22 0a 23 69 66 20 64 65 66 69  tive-c".#if defi
16840 6e 65 64 28 5f 5f 63 70 6c 75 73 70 6c 75 73 29  ned(__cplusplus)
16850 0a 09 09 09 20 20 20 20 22 70 6c 75 73 70 6c 75  ....    "plusplu
16860 73 22 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66  s".#endif.#endif
16870 0a 23 69 66 64 65 66 20 54 43 4c 5f 43 46 47 5f  .#ifdef TCL_CFG_
16880 50 52 4f 46 49 4c 45 44 0a 09 09 09 20 20 20 20  PROFILED....    
16890 22 2e 70 72 6f 66 69 6c 65 22 0a 23 65 6e 64 69  ".profile".#endi
168a0 66 0a 23 69 66 64 65 66 20 50 55 52 49 46 59 0a  f.#ifdef PURIFY.
168b0 09 09 09 20 20 20 20 22 2e 70 75 72 69 66 79 22  ...    ".purify"
168c0 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
168d0 54 41 54 49 43 5f 42 55 49 4c 44 0a 09 09 09 20  TATIC_BUILD.... 
168e0 20 20 20 22 2e 73 74 61 74 69 63 22 0a 23 65 6e     ".static".#en
168f0 64 69 66 0a 09 09 29 2c 20 4e 55 4c 4c 29 3b 0a  dif...), NULL);.
16900 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
16910 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a   TCL_OK;.}.../*.
16920 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
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 2a 0a 20 2a 0a 20 2a 20  --------*. *. * 
16960 54 6c 73 4c 69 62 53 68 75 74 64 6f 77 6e 20 2d  TlsLibShutdown -
16970 2d 0a 20 2a 0a 20 2a 09 53 68 75 74 64 6f 77 6e  -. *. *.Shutdown
16980 20 53 53 4c 20 6c 69 62 72 61 72 79 20 6f 6e 63   SSL library onc
16990 65 20 70 65 72 20 61 70 70 6c 69 63 61 74 69 6f  e per applicatio
169a0 6e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  n. *. * Results:
169b0 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54  . *.A standard T
169c0 43 4c 20 72 65 73 75 6c 74 0a 20 2a 0a 20 2a 20  CL result. *. * 
169d0 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
169e0 09 53 68 75 74 64 6f 77 6e 20 53 53 4c 20 6c 69  .Shutdown SSL li
169f0 62 72 61 72 79 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  brary. *. *-----
16a00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 2a 0a 20 2a 2f 0a 76 6f 69 64 20 54 6c 73 4c  -*. */.void TlsL
16a40 69 62 53 68 75 74 64 6f 77 6e 28 43 6c 69 65 6e  ibShutdown(Clien
16a50 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
16a60 29 20 7b 0a 20 20 20 20 64 70 72 69 6e 74 66 28  ) {.    dprintf(
16a70 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20  "Called");..    
16a80 42 49 4f 5f 63 6c 65 61 6e 75 70 28 29 3b 0a 7d  BIO_cleanup();.}
16a90 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
16aa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16ab0 2d 2d 2d 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 2a 0a 20  -------------*. 
16ad0 2a 0a 20 2a 09 54 6c 73 4c 69 62 49 6e 69 74 20  *. *.TlsLibInit 
16ae0 2d 2d 0a 20 2a 0a 20 2a 09 49 6e 69 74 69 61 6c  --. *. *.Initial
16af0 69 7a 65 73 20 53 53 4c 20 6c 69 62 72 61 72 79  izes SSL library
16b00 20 6f 6e 63 65 20 70 65 72 20 61 70 70 6c 69 63   once per applic
16b10 61 74 69 6f 6e 0a 20 2a 0a 20 2a 20 52 65 73 75  ation. *. * Resu
16b20 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61  lts:. *.A standa
16b30 72 64 20 54 63 6c 20 72 65 73 75 6c 74 0a 20 2a  rd Tcl result. *
16b40 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
16b50 3a 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a 65 73  :. *.Initializes
16b60 20 53 53 4c 20 6c 69 62 72 61 72 79 0a 20 2a 0a   SSL library. *.
16b70 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
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 2a 0a 20 2a 2f 0a 73 74  --------*. */.st
16bb0 61 74 69 63 20 69 6e 74 20 54 6c 73 4c 69 62 49  atic int TlsLibI
16bc0 6e 69 74 28 29 20 7b 0a 20 20 20 20 73 74 61 74  nit() {.    stat
16bd0 69 63 20 69 6e 74 20 69 6e 69 74 69 61 6c 69 7a  ic int initializ
16be0 65 64 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70 72  ed = 0;..    dpr
16bf0 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
16c00 0a 20 20 20 20 69 66 20 28 21 69 6e 69 74 69 61  .    if (!initia
16c10 6c 69 7a 65 64 29 20 7b 0a 09 2f 2a 20 49 6e 69  lized) {../* Ini
16c20 74 69 61 6c 69 7a 65 20 42 4f 54 48 20 6c 69 62  tialize BOTH lib
16c30 63 72 79 70 74 6f 20 61 6e 64 20 6c 69 62 73 73  crypto and libss
16c40 6c 2e 20 2a 2f 0a 09 69 66 20 28 21 4f 50 45 4e  l. */..if (!OPEN
16c50 53 53 4c 5f 69 6e 69 74 5f 73 73 6c 28 4f 50 45  SSL_init_ssl(OPE
16c60 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f 53  NSSL_INIT_LOAD_S
16c70 53 4c 5f 53 54 52 49 4e 47 53 20 7c 20 4f 50 45  SL_STRINGS | OPE
16c80 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f 43  NSSL_INIT_LOAD_C
16c90 52 59 50 54 4f 5f 53 54 52 49 4e 47 53 0a 09 20  RYPTO_STRINGS.. 
16ca0 20 20 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49     | OPENSSL_INI
16cb0 54 5f 41 44 44 5f 41 4c 4c 5f 43 49 50 48 45 52  T_ADD_ALL_CIPHER
16cc0 53 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54  S | OPENSSL_INIT
16cd0 5f 41 44 44 5f 41 4c 4c 5f 44 49 47 45 53 54 53  _ADD_ALL_DIGESTS
16ce0 0a 09 20 20 20 20 7c 20 4f 50 45 4e 53 53 4c 5f  ..    | OPENSSL_
16cf0 49 4e 49 54 5f 4c 4f 41 44 5f 43 4f 4e 46 49 47  INIT_LOAD_CONFIG
16d00 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f   | OPENSSL_INIT_
16d10 41 53 59 4e 43 2c 20 4e 55 4c 4c 29 29 20 7b 0a  ASYNC, NULL)) {.
16d20 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
16d30 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 43  ERROR;..}.../* C
16d40 72 65 61 74 65 20 42 49 4f 20 68 61 6e 64 6c 65  reate BIO handle
16d50 72 73 20 2a 2f 0a 09 42 49 4f 5f 6e 65 77 5f 74  rs */..BIO_new_t
16d60 63 6c 28 4e 55 4c 4c 2c 20 30 29 3b 0a 0a 09 2f  cl(NULL, 0);.../
16d70 2a 20 43 72 65 61 74 65 20 65 78 69 74 20 68 61  * Create exit ha
16d80 6e 64 6c 65 72 20 2a 2f 0a 09 54 63 6c 5f 43 72  ndler */..Tcl_Cr
16d90 65 61 74 65 45 78 69 74 48 61 6e 64 6c 65 72 28  eateExitHandler(
16da0 54 6c 73 4c 69 62 53 68 75 74 64 6f 77 6e 2c 20  TlsLibShutdown, 
16db0 4e 55 4c 4c 29 3b 0a 09 69 6e 69 74 69 61 6c 69  NULL);..initiali
16dc0 7a 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  zed = 1;.    }. 
16dd0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b     return TCL_OK
16de0 3b 0a 7d 0a 0c 0a 2f 2a 20 49 6e 69 74 20 73 63  ;.}.../* Init sc
16df0 72 69 70 74 20 2a 2f 0a 73 74 61 74 69 63 20 63  ript */.static c
16e00 6f 6e 73 74 20 63 68 61 72 20 74 6c 73 54 63 6c  onst char tlsTcl
16e10 49 6e 69 74 53 63 72 69 70 74 5b 5d 20 3d 20 7b  InitScript[] = {
16e20 0a 23 69 6e 63 6c 75 64 65 20 22 74 6c 73 2e 74  .#include "tls.t
16e30 63 6c 2e 68 22 0a 7d 3b 0a 0a 2f 2a 0a 20 2a 2d  cl.h".};../*. *-
16e40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a 0a 20 2a 20 54 6c 73 5f 49 6e 69  --. *. * Tls_Ini
16e90 74 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20  t --. *. *.This 
16ea0 69 73 20 61 20 70 61 63 6b 61 67 65 20 69 6e 69  is a package ini
16eb0 74 69 61 6c 69 7a 61 74 69 6f 6e 20 70 72 6f 63  tialization proc
16ec0 65 64 75 72 65 2c 20 77 68 69 63 68 20 69 73 20  edure, which is 
16ed0 63 61 6c 6c 65 64 0a 20 2a 09 62 79 20 54 43 4c  called. *.by TCL
16ee0 20 77 68 65 6e 20 74 68 69 73 20 70 61 63 6b 61   when this packa
16ef0 67 65 20 69 73 20 74 6f 20 62 65 20 61 64 64 65  ge is to be adde
16f00 64 20 74 6f 20 61 6e 20 69 6e 74 65 72 70 72 65  d to an interpre
16f10 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  ter.. *. * Resul
16f20 74 73 3a 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a  ts:. *.Initializ
16f30 65 73 20 73 74 72 75 63 74 75 72 65 73 20 61 6e  es structures an
16f40 64 20 63 72 65 61 74 65 73 20 63 6f 6d 6d 61 6e  d creates comman
16f50 64 73 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  ds.. *. * Side e
16f60 66 66 65 63 74 73 3a 0a 20 2a 09 20 43 72 65 61  ffects:. *. Crea
16f70 74 65 20 74 68 65 20 63 6f 6d 6d 61 6e 64 73 0a  te the commands.
16f80 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
16f90 2d 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 0a 20 2a 2f 0a 0a 23 69  --------. */..#i
16fd0 66 20 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53  f TCL_MAJOR_VERS
16fe0 49 4f 4e 20 3e 20 38 0a 23 64 65 66 69 6e 65 20  ION > 8.#define 
16ff0 4d 49 4e 5f 56 45 52 53 49 4f 4e 20 22 39 2e 30  MIN_VERSION "9.0
17000 22 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  ".#else.#define 
17010 4d 49 4e 5f 56 45 52 53 49 4f 4e 20 22 38 2e 35  MIN_VERSION "8.5
17020 22 0a 23 65 6e 64 69 66 0a 0a 44 4c 4c 45 58 50  ".#endif..DLLEXP
17030 4f 52 54 20 69 6e 74 20 54 6c 73 5f 49 6e 69 74  ORT int Tls_Init
17040 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
17050 65 72 70 29 20 7b 0a 0a 20 20 20 20 64 70 72 69  erp) {..    dpri
17060 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a  ntf("Called");..
17070 23 69 66 64 65 66 20 55 53 45 5f 54 43 4c 5f 53  #ifdef USE_TCL_S
17080 54 55 42 53 0a 20 20 20 20 69 66 20 28 54 63 6c  TUBS.    if (Tcl
17090 5f 49 6e 69 74 53 74 75 62 73 28 69 6e 74 65 72  _InitStubs(inter
170a0 70 2c 20 4d 49 4e 5f 56 45 52 53 49 4f 4e 2c 20  p, MIN_VERSION, 
170b0 30 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72  0) == NULL) {..r
170c0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
170d0 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20  .    }.#else.   
170e0 20 69 66 20 28 54 63 6c 5f 50 6b 67 52 65 71 75   if (Tcl_PkgRequ
170f0 69 72 65 45 78 28 69 6e 74 65 72 70 2c 20 22 54  ireEx(interp, "T
17100 63 6c 22 2c 20 4d 49 4e 5f 56 45 52 53 49 4f 4e  cl", MIN_VERSION
17110 2c 20 30 2c 20 4e 55 4c 4c 29 20 3d 3d 20 4e 55  , 0, NULL) == NU
17120 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43  LL) {..return TC
17130 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 23  L_ERROR;.    }.#
17140 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 20 28 54  endif..    if (T
17150 6c 73 4c 69 62 49 6e 69 74 28 29 20 21 3d 20 54  lsLibInit() != T
17160 43 4c 5f 4f 4b 29 20 7b 0a 09 54 63 6c 5f 41 70  CL_OK) {..Tcl_Ap
17170 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
17180 70 2c 20 22 63 6f 75 6c 64 20 6e 6f 74 20 69 6e  p, "could not in
17190 69 74 69 61 6c 69 7a 65 20 53 53 4c 20 6c 69 62  itialize SSL lib
171a0 72 61 72 79 22 2c 20 28 63 68 61 72 20 2a 29 20  rary", (char *) 
171b0 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54  NULL);..return T
171c0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
171d0 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f  .    Tcl_CreateO
171e0 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  bjCommand(interp
171f0 2c 20 22 3a 3a 74 6c 73 3a 3a 63 69 70 68 65 72  , "::tls::cipher
17200 73 22 2c 20 43 69 70 68 65 72 73 4f 62 6a 43 6d  s", CiphersObjCm
17210 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20  d, (ClientData) 
17220 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65  NULL, (Tcl_CmdDe
17230 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c  leteProc *) NULL
17240 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74  );.    Tcl_Creat
17250 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eObjCommand(inte
17260 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 63 6f 6e 6e  rp, "::tls::conn
17270 65 63 74 69 6f 6e 22 2c 20 43 6f 6e 6e 65 63 74  ection", Connect
17280 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 2c 20 28  ionInfoObjCmd, (
17290 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c  ClientData) NULL
172a0 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65  , (Tcl_CmdDelete
172b0 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20  Proc *) NULL);. 
172c0 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a     Tcl_CreateObj
172d0 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
172e0 22 3a 3a 74 6c 73 3a 3a 68 61 6e 64 73 68 61 6b  "::tls::handshak
172f0 65 22 2c 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a  e", HandshakeObj
17300 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61  Cmd, (ClientData
17310 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64  ) NULL, (Tcl_Cmd
17320 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55  DeleteProc *) NU
17330 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65  LL);.    Tcl_Cre
17340 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e  ateObjCommand(in
17350 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 69 6d  terp, "::tls::im
17360 70 6f 72 74 22 2c 20 49 6d 70 6f 72 74 4f 62 6a  port", ImportObj
17370 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61  Cmd, (ClientData
17380 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64  ) NULL, (Tcl_Cmd
17390 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55  DeleteProc *) NU
173a0 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65  LL);.    Tcl_Cre
173b0 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e  ateObjCommand(in
173c0 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 75 6e  terp, "::tls::un
173d0 69 6d 70 6f 72 74 22 2c 20 55 6e 69 6d 70 6f 72  import", Unimpor
173e0 74 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74  tObjCmd, (Client
173f0 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c  Data) NULL, (Tcl
17400 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a  _CmdDeleteProc *
17410 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c  ) NULL);.    Tcl
17420 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e  _CreateObjComman
17430 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73  d(interp, "::tls
17440 3a 3a 75 6e 73 74 61 63 6b 22 2c 20 55 6e 69 6d  ::unstack", Unim
17450 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 28 43 6c 69  portObjCmd, (Cli
17460 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28  entData) NULL, (
17470 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f  Tcl_CmdDeletePro
17480 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  c *) NULL);.    
17490 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d  Tcl_CreateObjCom
174a0 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a  mand(interp, "::
174b0 74 6c 73 3a 3a 73 74 61 74 75 73 22 2c 20 53 74  tls::status", St
174c0 61 74 75 73 4f 62 6a 43 6d 64 2c 20 28 43 6c 69  atusObjCmd, (Cli
174d0 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28  entData) NULL, (
174e0 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f  Tcl_CmdDeletePro
174f0 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  c *) NULL);.    
17500 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d  Tcl_CreateObjCom
17510 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a  mand(interp, "::
17520 74 6c 73 3a 3a 76 65 72 73 69 6f 6e 22 2c 20 56  tls::version", V
17530 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 2c 20 28 43  ersionObjCmd, (C
17540 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c  lientData) NULL,
17550 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50   (Tcl_CmdDeleteP
17560 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20  roc *) NULL);.  
17570 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43    Tcl_CreateObjC
17580 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22  ommand(interp, "
17590 3a 3a 74 6c 73 3a 3a 6d 69 73 63 22 2c 20 4d 69  ::tls::misc", Mi
175a0 73 63 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e  scObjCmd, (Clien
175b0 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63  tData) NULL, (Tc
175c0 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20  l_CmdDeleteProc 
175d0 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63  *) NULL);.    Tc
175e0 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61  l_CreateObjComma
175f0 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c  nd(interp, "::tl
17600 73 3a 3a 70 72 6f 74 6f 63 6f 6c 73 22 2c 20 50  s::protocols", P
17610 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 2c 20  rotocolsObjCmd, 
17620 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c  (ClientData) NUL
17630 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74  L, (Tcl_CmdDelet
17640 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a  eProc *) NULL);.
17650 0a 20 20 20 20 42 75 69 6c 64 49 6e 66 6f 43 6f  .    BuildInfoCo
17660 6d 6d 61 6e 64 28 69 6e 74 65 72 70 29 3b 0a 0a  mmand(interp);..
17670 20 20 20 20 69 66 20 28 69 6e 74 65 72 70 20 26      if (interp &
17680 26 20 54 63 6c 5f 45 76 61 6c 28 69 6e 74 65 72  & Tcl_Eval(inter
17690 70 2c 20 74 6c 73 54 63 6c 49 6e 69 74 53 63 72  p, tlsTclInitScr
176a0 69 70 74 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20  ipt) != TCL_OK) 
176b0 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  {..return TCL_ER
176c0 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
176d0 72 65 74 75 72 6e 20 54 63 6c 5f 50 6b 67 50 72  return Tcl_PkgPr
176e0 6f 76 69 64 65 28 69 6e 74 65 72 70 2c 20 50 41  ovide(interp, PA
176f0 43 4b 41 47 45 5f 4e 41 4d 45 2c 20 50 41 43 4b  CKAGE_NAME, PACK
17700 41 47 45 5f 56 45 52 53 49 4f 4e 29 3b 0a 7d 0a  AGE_VERSION);.}.
17710 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
17720 2d 2d 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 0a 20 2a 0a 20 2a 09  ---------. *. *.
17760 54 6c 73 5f 53 61 66 65 49 6e 69 74 20 2d 2d 0a  Tls_SafeInit --.
17770 20 2a 0a 20 2a 09 54 68 69 73 20 69 73 20 61 20   *. *.This is a 
17780 70 61 63 6b 61 67 65 20 69 6e 69 74 69 61 6c 69  package initiali
17790 7a 61 74 69 6f 6e 20 70 72 6f 63 65 64 75 72 65  zation procedure
177a0 20 66 6f 72 20 73 61 66 65 20 69 6e 74 65 72 70   for safe interp
177b0 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  s.. *. * Results
177c0 3a 0a 20 2a 09 53 61 6d 65 20 61 73 20 6f 66 20  :. *.Same as of 
177d0 27 54 6c 73 5f 49 6e 69 74 27 0a 20 2a 0a 20 2a  'Tls_Init'. *. *
177e0 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
177f0 2a 09 53 61 6d 65 20 61 73 20 6f 66 20 27 54 6c  *.Same as of 'Tl
17800 73 5f 49 6e 69 74 27 0a 20 2a 0a 20 2a 2d 2d 2d  s_Init'. *. *---
17810 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 20 2a 2f 0a 44 4c 4c 45 58 50 4f 52 54 20 69  . */.DLLEXPORT i
17860 6e 74 20 54 6c 73 5f 53 61 66 65 49 6e 69 74 28  nt Tls_SafeInit(
17870 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
17880 72 70 29 20 7b 0a 20 20 20 20 64 70 72 69 6e 74  rp) {.    dprint
17890 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 20 20 20  f("Called");.   
178a0 20 72 65 74 75 72 6e 20 54 6c 73 5f 49 6e 69 74   return Tls_Init
178b0 28 69 6e 74 65 72 70 29 3b 0a 7d 0a              (interp);.}.