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 66 69 6c 65 2c 0a 09   char *CAfile,..
0610: 09 63 68 61 72 20 2a 63 69 70 68 65 72 73 2c 20  .char *ciphers, 
0620: 63 68 61 72 20 2a 63 69 70 68 65 72 73 75 69 74  char *ciphersuit
0630: 65 73 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 63  es, int level, c
0640: 68 61 72 20 2a 44 48 70 61 72 61 6d 73 29 3b 0a  har *DHparams);.
0650: 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f  .#define TLS_PRO
0660: 54 4f 5f 53 53 4c 32 09 09 30 78 30 31 0a 23 64  TO_SSL2..0x01.#d
0670: 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f  efine TLS_PROTO_
0680: 53 53 4c 33 09 09 30 78 30 32 0a 23 64 65 66 69  SSL3..0x02.#defi
0690: 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53  ne TLS_PROTO_TLS
06a0: 31 09 09 30 78 30 34 0a 23 64 65 66 69 6e 65 20  1..0x04.#define 
06b0: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31  TLS_PROTO_TLS1_1
06c0: 09 30 78 30 38 0a 23 64 65 66 69 6e 65 20 54 4c  .0x08.#define TL
06d0: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 09 30  S_PROTO_TLS1_2.0
06e0: 78 31 30 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f  x10.#define TLS_
06f0: 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 09 30 78 32  PROTO_TLS1_3.0x2
0700: 30 0a 23 64 65 66 69 6e 65 20 45 4e 41 42 4c 45  0.#define ENABLE
0710: 44 28 66 6c 61 67 2c 20 6d 61 73 6b 29 09 28 28  D(flag, mask).((
0720: 28 66 6c 61 67 29 20 26 20 28 6d 61 73 6b 29 29  (flag) & (mask))
0730: 20 3d 3d 20 28 6d 61 73 6b 29 29 0a 0a 23 64 65   == (mask))..#de
0740: 66 69 6e 65 20 53 53 4c 4b 45 59 4c 4f 47 46 49  fine SSLKEYLOGFI
0750: 4c 45 09 09 22 53 53 4c 4b 45 59 4c 4f 47 46 49  LE.."SSLKEYLOGFI
0760: 4c 45 22 0a 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  LE"..../********
0770: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a  ************/./*
0780: 20 43 61 6c 6c 62 61 63 6b 73 20 20 20 20 20 20   Callbacks      
0790: 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a    */./**********
07a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a  **********/../*.
07b0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
07c0: 2d 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 0a 20 2a 0a 20 2a 20 45 76 61 6c  -----. *. * Eval
0800: 20 43 61 6c 6c 62 61 63 6b 20 43 6f 6d 6d 61 6e   Callback Comman
0810: 64 20 2d 2d 0a 20 2a 0a 20 2a 09 45 76 61 6c 20  d --. *. *.Eval 
0820: 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64  callback command
0830: 20 61 6e 64 20 63 61 74 63 68 20 61 6e 79 20 65   and catch any e
0840: 72 72 6f 72 73 0a 20 2a 0a 20 2a 20 52 65 73 75  rrors. *. * Resu
0850: 6c 74 73 3a 0a 20 2a 09 30 20 3d 20 43 6f 6d 6d  lts:. *.0 = Comm
0860: 61 6e 64 20 72 65 74 75 72 6e 65 64 20 66 61 69  and returned fai
0870: 6c 20 6f 72 20 65 76 61 6c 20 72 65 74 75 72 6e  l or eval return
0880: 65 64 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 09  ed TCL_ERROR. *.
0890: 31 20 3d 20 43 6f 6d 6d 61 6e 64 20 72 65 74 75  1 = Command retu
08a0: 72 6e 65 64 20 73 75 63 63 65 73 73 20 6f 72 20  rned success or 
08b0: 65 76 61 6c 20 72 65 74 75 72 6e 65 64 20 54 43  eval returned TC
08c0: 4c 5f 4f 4b 0a 20 2a 0a 20 2a 20 53 69 64 65 20  L_OK. *. * Side 
08d0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 45 76 61 6c  effects:. *.Eval
08e0: 75 61 74 65 73 20 63 61 6c 6c 62 61 63 6b 20 63  uates callback c
08f0: 6f 6d 6d 61 6e 64 0a 20 2a 0a 20 2a 2d 2d 2d 2d  ommand. *. *----
0900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a  ---------------.
0940: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 45   */.static int.E
0950: 76 61 6c 43 61 6c 6c 62 61 63 6b 28 54 63 6c 5f  valCallback(Tcl_
0960: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
0970: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 2c  State *statePtr,
0980: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72   Tcl_Obj *cmdPtr
0990: 29 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65  ) {.    int code
09a0: 2c 20 6f 6b 20 3d 20 30 3b 0a 0a 20 20 20 20 64  , ok = 0;..    d
09b0: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
09c0: 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65  ;..    Tcl_Prese
09d0: 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29  rve((ClientData)
09e0: 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63   interp);.    Tc
09f0: 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 65  l_Preserve((Clie
0a00: 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72  ntData) statePtr
0a10: 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20  );..    /* Eval 
0a20: 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 73 75  callback with su
0a30: 63 63 65 73 73 20 66 6f 72 20 6f 6b 20 6f 72 20  ccess for ok or 
0a40: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 31 2c 20  return value 1, 
0a50: 66 61 69 6c 20 66 6f 72 20 65 72 72 6f 72 20 6f  fail for error o
0a60: 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 30  r return value 0
0a70: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 52 65 73 65   */.    Tcl_Rese
0a80: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b  tResult(interp);
0a90: 0a 20 20 20 20 63 6f 64 65 20 3d 20 54 63 6c 5f  .    code = Tcl_
0aa0: 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70  EvalObjEx(interp
0ab0: 2c 20 63 6d 64 50 74 72 2c 20 54 43 4c 5f 45 56  , cmdPtr, TCL_EV
0ac0: 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 20 20  AL_GLOBAL);.    
0ad0: 64 70 72 69 6e 74 66 28 22 45 76 61 6c 43 61 6c  dprintf("EvalCal
0ae0: 6c 62 61 63 6b 3a 20 25 64 22 2c 20 63 6f 64 65  lback: %d", code
0af0: 29 3b 0a 20 20 20 20 69 66 20 28 63 6f 64 65 20  );.    if (code 
0b00: 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 2f 2a  == TCL_OK) {../*
0b10: 20 43 68 65 63 6b 20 72 65 73 75 6c 74 20 66 6f   Check result fo
0b20: 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 2a  r return value *
0b30: 2f 0a 09 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75  /..Tcl_Obj *resu
0b40: 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52  lt = Tcl_GetObjR
0b50: 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09  esult(interp);..
0b60: 69 66 20 28 72 65 73 75 6c 74 20 3d 3d 20 4e 55  if (result == NU
0b70: 4c 4c 20 7c 7c 20 54 63 6c 5f 47 65 74 49 6e 74  LL || Tcl_GetInt
0b80: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
0b90: 72 65 73 75 6c 74 2c 20 26 6f 6b 29 20 21 3d 20  result, &ok) != 
0ba0: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 6f  TCL_OK) {..    o
0bb0: 6b 20 3d 20 31 3b 0a 09 7d 0a 09 64 70 72 69 6e  k = 1;..}..dprin
0bc0: 74 66 28 22 52 65 73 75 6c 74 3a 20 25 64 22 2c  tf("Result: %d",
0bd0: 20 6f 6b 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65   ok);.    } else
0be0: 20 7b 0a 09 2f 2a 20 45 72 72 6f 72 20 2d 20 72   {../* Error - r
0bf0: 65 6a 65 63 74 20 74 68 65 20 63 65 72 74 69 66  eject the certif
0c00: 69 63 61 74 65 20 2a 2f 0a 09 64 70 72 69 6e 74  icate */..dprint
0c10: 66 28 22 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e  f("Tcl_Backgroun
0c20: 64 45 72 72 6f 72 22 29 3b 0a 23 69 66 20 28 54  dError");.#if (T
0c30: 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e  CL_MAJOR_VERSION
0c40: 20 3d 3d 20 38 29 20 26 26 20 28 54 43 4c 5f 4d   == 8) && (TCL_M
0c50: 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20 36  INOR_VERSION < 6
0c60: 29 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e  )..Tcl_Backgroun
0c70: 64 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a  dError(interp);.
0c80: 23 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63 6b 67  #else..Tcl_Backg
0c90: 72 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e 28 69  roundException(i
0ca0: 6e 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a 23 65  nterp, code);.#e
0cb0: 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ndif.    }..    
0cc0: 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69  Tcl_Release((Cli
0cd0: 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74  entData) statePt
0ce0: 72 29 3b 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65  r);.    Tcl_Rele
0cf0: 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29  ase((ClientData)
0d00: 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 72 65   interp);.    re
0d10: 74 75 72 6e 20 6f 6b 3b 0a 7d 0a 0c 0a 2f 2a 0a  turn ok;.}.../*.
0d20: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
0d30: 2d 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 0a 20 2a 0a 20 2a 20 49 6e 66 6f  -----. *. * Info
0d70: 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20  Callback --. *. 
0d80: 2a 09 4d 6f 6e 69 74 6f 72 73 20 53 53 4c 20 63  *.Monitors SSL c
0d90: 6f 6e 6e 65 63 74 69 6f 6e 20 70 72 6f 63 65 73  onnection proces
0da0: 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  s. *. * Results:
0db0: 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53  . *.None. *. * S
0dc0: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
0dd0: 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28  Calls callback (
0de0: 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20  if defined). *. 
0df0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
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 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ----. */.static 
0e40: 76 6f 69 64 0a 49 6e 66 6f 43 61 6c 6c 62 61 63  void.InfoCallbac
0e50: 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c  k(const SSL *ssl
0e60: 2c 20 69 6e 74 20 77 68 65 72 65 2c 20 69 6e 74  , int where, int
0e70: 20 72 65 74 29 20 7b 0a 20 20 20 20 53 74 61 74   ret) {.    Stat
0e80: 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53  e *statePtr = (S
0e90: 74 61 74 65 2a 29 53 53 4c 5f 67 65 74 5f 61 70  tate*)SSL_get_ap
0ea0: 70 5f 64 61 74 61 28 28 53 53 4c 20 2a 29 73 73  p_data((SSL *)ss
0eb0: 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65  l);.    Tcl_Inte
0ec0: 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61  rp *interp.= sta
0ed0: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20  tePtr->interp;. 
0ee0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50     Tcl_Obj *cmdP
0ef0: 74 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  tr;.    const ch
0f00: 61 72 20 2a 6d 61 6a 6f 72 2c 20 2a 6d 69 6e 6f  ar *major, *mino
0f10: 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  r;..    dprintf(
0f20: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20  "Called");..    
0f30: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61  if (statePtr->ca
0f40: 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f  llback == (Tcl_O
0f50: 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74  bj*)NULL) {..ret
0f60: 75 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  urn;.    }..    
0f70: 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f  if (where & SSL_
0f80: 43 42 5f 48 41 4e 44 53 48 41 4b 45 5f 53 54 41  CB_HANDSHAKE_STA
0f90: 52 54 29 20 7b 0a 09 6d 61 6a 6f 72 20 3d 20 22  RT) {..major = "
0fa0: 68 61 6e 64 73 68 61 6b 65 22 3b 0a 09 6d 69 6e  handshake";..min
0fb0: 6f 72 20 3d 20 22 73 74 61 72 74 22 3b 0a 20 20  or = "start";.  
0fc0: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 77 68 65    } else if (whe
0fd0: 72 65 20 26 20 53 53 4c 5f 43 42 5f 48 41 4e 44  re & SSL_CB_HAND
0fe0: 53 48 41 4b 45 5f 44 4f 4e 45 29 20 7b 0a 09 6d  SHAKE_DONE) {..m
0ff0: 61 6a 6f 72 20 3d 20 22 68 61 6e 64 73 68 61 6b  ajor = "handshak
1000: 65 22 3b 0a 09 6d 69 6e 6f 72 20 3d 20 22 64 6f  e";..minor = "do
1010: 6e 65 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  ne";.    } else 
1020: 7b 0a 09 69 66 20 28 77 68 65 72 65 20 26 20 53  {..if (where & S
1030: 53 4c 5f 43 42 5f 41 4c 45 52 54 29 09 09 6d 61  SL_CB_ALERT)..ma
1040: 6a 6f 72 20 3d 20 22 61 6c 65 72 74 22 3b 0a 09  jor = "alert";..
1050: 65 6c 73 65 20 69 66 20 28 77 68 65 72 65 20 26  else if (where &
1060: 20 53 53 4c 5f 53 54 5f 43 4f 4e 4e 45 43 54 29   SSL_ST_CONNECT)
1070: 09 6d 61 6a 6f 72 20 3d 20 22 63 6f 6e 6e 65 63  .major = "connec
1080: 74 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 68  t";..else if (wh
1090: 65 72 65 20 26 20 53 53 4c 5f 53 54 5f 41 43 43  ere & SSL_ST_ACC
10a0: 45 50 54 29 09 09 6d 61 6a 6f 72 20 3d 20 22 61  EPT)..major = "a
10b0: 63 63 65 70 74 22 3b 0a 09 65 6c 73 65 09 09 09  ccept";..else...
10c0: 09 09 6d 61 6a 6f 72 20 3d 20 22 75 6e 6b 6e 6f  ..major = "unkno
10d0: 77 6e 22 3b 0a 0a 09 69 66 20 28 77 68 65 72 65  wn";...if (where
10e0: 20 26 20 53 53 4c 5f 43 42 5f 52 45 41 44 29 09   & SSL_CB_READ).
10f0: 09 6d 69 6e 6f 72 20 3d 20 22 72 65 61 64 22 3b  .minor = "read";
1100: 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65 72 65  ..else if (where
1110: 20 26 20 53 53 4c 5f 43 42 5f 57 52 49 54 45 29   & SSL_CB_WRITE)
1120: 09 09 6d 69 6e 6f 72 20 3d 20 22 77 72 69 74 65  ..minor = "write
1130: 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65  ";..else if (whe
1140: 72 65 20 26 20 53 53 4c 5f 43 42 5f 4c 4f 4f 50  re & SSL_CB_LOOP
1150: 29 09 09 6d 69 6e 6f 72 20 3d 20 22 6c 6f 6f 70  )..minor = "loop
1160: 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65  ";..else if (whe
1170: 72 65 20 26 20 53 53 4c 5f 43 42 5f 45 58 49 54  re & SSL_CB_EXIT
1180: 29 09 09 6d 69 6e 6f 72 20 3d 20 22 65 78 69 74  )..minor = "exit
1190: 22 3b 0a 09 65 6c 73 65 09 09 09 09 09 6d 69 6e  ";..else.....min
11a0: 6f 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a  or = "unknown";.
11b0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72      }..    /* Cr
11c0: 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20  eate command to 
11d0: 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 63 68  eval with fn, ch
11e0: 61 6e 2c 20 6d 61 6a 6f 72 2c 20 6d 69 6e 6f 72  an, major, minor
11f0: 2c 20 6d 65 73 73 61 67 65 2c 20 61 6e 64 20 74  , message, and t
1200: 79 70 65 20 61 72 67 73 20 2a 2f 0a 20 20 20 20  ype args */.    
1210: 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70  cmdPtr = Tcl_Dup
1220: 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50  licateObj(stateP
1230: 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 20  tr->callback);. 
1240: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
1250: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
1260: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
1270: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 69 6e  NewStringObj("in
1280: 66 6f 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54  fo", -1));.    T
1290: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
12a0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
12b0: 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c  cmdPtr,..    Tcl
12c0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63  _NewStringObj(Tc
12d0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65  l_GetChannelName
12e0: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29  (statePtr->self)
12f0: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f  , -1));.    Tcl_
1300: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
1310: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
1320: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
1330: 6e 67 4f 62 6a 28 6d 61 6a 6f 72 2c 20 2d 31 29  ngObj(major, -1)
1340: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
1350: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
1360: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
1370: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
1380: 28 6d 69 6e 6f 72 2c 20 2d 31 29 29 3b 0a 0a 20  (minor, -1));.. 
1390: 20 20 20 69 66 20 28 77 68 65 72 65 20 26 20 53     if (where & S
13a0: 53 4c 5f 43 42 5f 41 4c 45 52 54 29 20 7b 0a 09  SL_CB_ALERT) {..
13b0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
13c0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
13d0: 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63   cmdPtr,..    Tc
13e0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53  l_NewStringObj(S
13f0: 53 4c 5f 61 6c 65 72 74 5f 64 65 73 63 5f 73 74  SL_alert_desc_st
1400: 72 69 6e 67 5f 6c 6f 6e 67 28 72 65 74 29 2c 20  ring_long(ret), 
1410: 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f  -1));..Tcl_ListO
1420: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
1430: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a  interp, cmdPtr,.
1440: 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69  .    Tcl_NewStri
1450: 6e 67 4f 62 6a 28 53 53 4c 5f 61 6c 65 72 74 5f  ngObj(SSL_alert_
1460: 74 79 70 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67  type_string_long
1470: 28 72 65 74 29 2c 20 2d 31 29 29 3b 0a 20 20 20  (ret), -1));.   
1480: 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 4c   } else {..Tcl_L
1490: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
14a0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
14b0: 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77  tr,..    Tcl_New
14c0: 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 73 74  StringObj(SSL_st
14d0: 61 74 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28  ate_string_long(
14e0: 73 73 6c 29 2c 20 2d 31 29 29 3b 0a 09 54 63 6c  ssl), -1));..Tcl
14f0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
1500: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
1510: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  dPtr, Tcl_NewStr
1520: 69 6e 67 4f 62 6a 28 22 69 6e 66 6f 22 2c 20 2d  ingObj("info", -
1530: 31 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  1));.    }..    
1540: 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b  /* Eval callback
1550: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20   command */.    
1560: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
1570: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 45 76  (cmdPtr);.    Ev
1580: 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72  alCallback(inter
1590: 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64  p, statePtr, cmd
15a0: 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65  Ptr);.    Tcl_De
15b0: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74  crRefCount(cmdPt
15c0: 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d  r);.}.../*. *---
15d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 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: 0a 20 2a 0a 20 2a 20 4d 65 73 73 61 67 65 43 61  . *. * MessageCa
1620: 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09  llback --. *. *.
1630: 4d 6f 6e 69 74 6f 72 73 20 53 53 4c 20 70 72 6f  Monitors SSL pro
1640: 74 6f 63 6f 6c 20 6d 65 73 73 61 67 65 73 0a 20  tocol messages. 
1650: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
1660: 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65  .None. *. * Side
1670: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c   effects:. *.Cal
1680: 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20  ls callback (if 
1690: 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 2d 2d  defined). *. *--
16a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 50  -. */.#ifndef OP
16f0: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 5f 54 52 41  ENSSL_NO_SSL_TRA
1700: 43 45 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 4d  CE.static void.M
1710: 65 73 73 61 67 65 43 61 6c 6c 62 61 63 6b 28 69  essageCallback(i
1720: 6e 74 20 77 72 69 74 65 5f 70 2c 20 69 6e 74 20  nt write_p, int 
1730: 76 65 72 73 69 6f 6e 2c 20 69 6e 74 20 63 6f 6e  version, int con
1740: 74 65 6e 74 5f 74 79 70 65 2c 20 63 6f 6e 73 74  tent_type, const
1750: 20 76 6f 69 64 20 2a 62 75 66 2c 20 73 69 7a 65   void *buf, size
1760: 5f 74 20 6c 65 6e 2c 20 53 53 4c 20 2a 73 73 6c  _t len, SSL *ssl
1770: 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a 20  , void *arg) {. 
1780: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50     State *stateP
1790: 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 72 67  tr = (State*)arg
17a0: 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70  ;.    Tcl_Interp
17b0: 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65   *interp.= state
17c0: 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20  Ptr->interp;.   
17d0: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72   Tcl_Obj *cmdPtr
17e0: 3b 0a 20 20 20 20 63 68 61 72 20 2a 76 65 72 2c  ;.    char *ver,
17f0: 20 2a 74 79 70 65 3b 0a 20 20 20 20 42 49 4f 20   *type;.    BIO 
1800: 2a 62 69 6f 3b 0a 20 20 20 20 63 68 61 72 20 62  *bio;.    char b
1810: 75 66 66 65 72 5b 31 35 30 30 30 5d 3b 0a 20 20  uffer[15000];.  
1820: 20 20 62 75 66 66 65 72 5b 30 5d 20 3d 20 30 3b    buffer[0] = 0;
1830: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
1840: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66  alled");..    if
1850: 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c   (statePtr->call
1860: 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a  back == (Tcl_Obj
1870: 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  *)NULL) {..retur
1880: 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 77  n;.    }..    sw
1890: 69 74 63 68 28 76 65 72 73 69 6f 6e 29 20 7b 0a  itch(version) {.
18a0: 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53  #if OPENSSL_VERS
18b0: 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31  ION_NUMBER < 0x1
18c0: 30 31 30 30 30 30 30 4c 20 26 26 20 21 64 65 66  0100000L && !def
18d0: 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26  ined(NO_SSL2) &&
18e0: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
18f0: 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20 63  L_NO_SSL2).    c
1900: 61 73 65 20 53 53 4c 32 5f 56 45 52 53 49 4f 4e  ase SSL2_VERSION
1910: 3a 0a 09 76 65 72 20 3d 20 22 53 53 4c 76 32 22  :..ver = "SSLv2"
1920: 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66  ;..break;.#endif
1930: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f  .#if !defined(NO
1940: 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e  _SSL3) && !defin
1950: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53  ed(OPENSSL_NO_SS
1960: 4c 33 29 0a 20 20 20 20 63 61 73 65 20 53 53 4c  L3).    case SSL
1970: 33 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65 72 20  3_VERSION:..ver 
1980: 3d 20 22 53 53 4c 76 33 22 3b 0a 09 62 72 65 61  = "SSLv3";..brea
1990: 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61  k;.#endif.    ca
19a0: 73 65 20 54 4c 53 31 5f 56 45 52 53 49 4f 4e 3a  se TLS1_VERSION:
19b0: 0a 09 76 65 72 20 3d 20 22 54 4c 53 76 31 22 3b  ..ver = "TLSv1";
19c0: 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ..break;.    cas
19d0: 65 20 54 4c 53 31 5f 31 5f 56 45 52 53 49 4f 4e  e TLS1_1_VERSION
19e0: 3a 0a 09 76 65 72 20 3d 20 22 54 4c 53 76 31 2e  :..ver = "TLSv1.
19f0: 31 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20  1";..break;.    
1a00: 63 61 73 65 20 54 4c 53 31 5f 32 5f 56 45 52 53  case TLS1_2_VERS
1a10: 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 54 4c 53  ION:..ver = "TLS
1a20: 76 31 2e 32 22 3b 0a 09 62 72 65 61 6b 3b 0a 20  v1.2";..break;. 
1a30: 20 20 20 63 61 73 65 20 54 4c 53 31 5f 33 5f 56     case TLS1_3_V
1a40: 45 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22  ERSION:..ver = "
1a50: 54 4c 53 76 31 2e 33 22 3b 0a 09 62 72 65 61 6b  TLSv1.3";..break
1a60: 3b 0a 20 20 20 20 63 61 73 65 20 30 3a 0a 09 76  ;.    case 0:..v
1a70: 65 72 20 3d 20 22 6e 6f 6e 65 22 3b 0a 09 62 72  er = "none";..br
1a80: 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74  eak;.    default
1a90: 3a 0a 09 76 65 72 20 3d 20 22 75 6e 6b 6e 6f 77  :..ver = "unknow
1aa0: 6e 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20  n";..break;.    
1ab0: 7d 0a 0a 20 20 20 20 73 77 69 74 63 68 20 28 63  }..    switch (c
1ac0: 6f 6e 74 65 6e 74 5f 74 79 70 65 29 20 7b 0a 20  ontent_type) {. 
1ad0: 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52 54 5f     case SSL3_RT_
1ae0: 48 45 41 44 45 52 3a 0a 09 74 79 70 65 20 3d 20  HEADER:..type = 
1af0: 22 48 65 61 64 65 72 22 3b 0a 09 62 72 65 61 6b  "Header";..break
1b00: 3b 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f  ;.    case SSL3_
1b10: 52 54 5f 49 4e 4e 45 52 5f 43 4f 4e 54 45 4e 54  RT_INNER_CONTENT
1b20: 5f 54 59 50 45 3a 0a 09 74 79 70 65 20 3d 20 22  _TYPE:..type = "
1b30: 49 6e 6e 65 72 20 43 6f 6e 74 65 6e 74 20 54 79  Inner Content Ty
1b40: 70 65 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20  pe";..break;.   
1b50: 20 63 61 73 65 20 53 53 4c 33 5f 52 54 5f 43 48   case SSL3_RT_CH
1b60: 41 4e 47 45 5f 43 49 50 48 45 52 5f 53 50 45 43  ANGE_CIPHER_SPEC
1b70: 3a 0a 09 74 79 70 65 20 3d 20 22 43 68 61 6e 67  :..type = "Chang
1b80: 65 20 43 69 70 68 65 72 22 3b 0a 09 62 72 65 61  e Cipher";..brea
1b90: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33  k;.    case SSL3
1ba0: 5f 52 54 5f 41 4c 45 52 54 3a 0a 09 74 79 70 65  _RT_ALERT:..type
1bb0: 20 3d 20 22 41 6c 65 72 74 22 3b 0a 09 62 72 65   = "Alert";..bre
1bc0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 53 4c  ak;.    case SSL
1bd0: 33 5f 52 54 5f 48 41 4e 44 53 48 41 4b 45 3a 0a  3_RT_HANDSHAKE:.
1be0: 09 74 79 70 65 20 3d 20 22 48 61 6e 64 73 68 61  .type = "Handsha
1bf0: 6b 65 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20  ke";..break;.   
1c00: 20 63 61 73 65 20 53 53 4c 33 5f 52 54 5f 41 50   case SSL3_RT_AP
1c10: 50 4c 49 43 41 54 49 4f 4e 5f 44 41 54 41 3a 0a  PLICATION_DATA:.
1c20: 09 74 79 70 65 20 3d 20 22 41 70 70 20 44 61 74  .type = "App Dat
1c30: 61 22 3b 0a 09 62 72 65 61 6b 3b 0a 23 69 66 20  a";..break;.#if 
1c40: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f  OPENSSL_VERSION_
1c50: 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30  NUMBER < 0x30000
1c60: 30 30 30 4c 0a 20 20 20 20 63 61 73 65 20 44 54  000L.    case DT
1c70: 4c 53 31 5f 52 54 5f 48 45 41 52 54 42 45 41 54  LS1_RT_HEARTBEAT
1c80: 3a 0a 09 74 79 70 65 20 3d 20 22 48 65 61 72 74  :..type = "Heart
1c90: 62 65 61 74 22 3b 0a 09 62 72 65 61 6b 3b 0a 23  beat";..break;.#
1ca0: 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c  endif.    defaul
1cb0: 74 3a 0a 09 74 79 70 65 20 3d 20 22 75 6e 6b 6e  t:..type = "unkn
1cc0: 6f 77 6e 22 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  own";.    }..   
1cd0: 20 2f 2a 20 4e 65 65 64 73 20 63 6f 6d 70 69 6c   /* Needs compil
1ce0: 65 20 74 69 6d 65 20 6f 70 74 69 6f 6e 20 22 65  e time option "e
1cf0: 6e 61 62 6c 65 2d 73 73 6c 2d 74 72 61 63 65 22  nable-ssl-trace"
1d00: 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 28 62 69  . */.    if ((bi
1d10: 6f 20 3d 20 42 49 4f 5f 6e 65 77 28 42 49 4f 5f  o = BIO_new(BIO_
1d20: 73 5f 6d 65 6d 28 29 29 29 20 21 3d 20 4e 55 4c  s_mem())) != NUL
1d30: 4c 29 20 7b 0a 09 69 6e 74 20 6e 3b 0a 09 53 53  L) {..int n;..SS
1d40: 4c 5f 74 72 61 63 65 28 77 72 69 74 65 5f 70 2c  L_trace(write_p,
1d50: 20 76 65 72 73 69 6f 6e 2c 20 63 6f 6e 74 65 6e   version, conten
1d60: 74 5f 74 79 70 65 2c 20 62 75 66 2c 20 6c 65 6e  t_type, buf, len
1d70: 2c 20 73 73 6c 2c 20 28 76 6f 69 64 20 2a 29 62  , ssl, (void *)b
1d80: 69 6f 29 3b 0a 09 6e 20 3d 20 42 49 4f 5f 72 65  io);..n = BIO_re
1d90: 61 64 28 62 69 6f 2c 20 62 75 66 66 65 72 2c 20  ad(bio, buffer, 
1da0: 42 49 4f 5f 70 65 6e 64 69 6e 67 28 62 69 6f 29  BIO_pending(bio)
1db0: 20 3c 20 31 35 30 30 30 20 3f 20 42 49 4f 5f 70   < 15000 ? BIO_p
1dc0: 65 6e 64 69 6e 67 28 62 69 6f 29 20 3a 20 31 34  ending(bio) : 14
1dd0: 39 39 39 29 3b 0a 09 6e 20 3d 20 28 6e 3c 30 29  999);..n = (n<0)
1de0: 20 3f 20 30 20 3a 20 6e 3b 0a 09 62 75 66 66 65   ? 0 : n;..buffe
1df0: 72 5b 6e 5d 20 3d 20 30 3b 0a 09 28 76 6f 69 64  r[n] = 0;..(void
1e00: 29 42 49 4f 5f 66 6c 75 73 68 28 62 69 6f 29 3b  )BIO_flush(bio);
1e10: 0a 09 42 49 4f 5f 66 72 65 65 28 62 69 6f 29 3b  ..BIO_free(bio);
1e20: 0a 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e  .   }..    dprin
1e30: 74 66 28 22 4d 65 73 73 61 67 65 20 64 69 72 65  tf("Message dire
1e40: 63 74 69 6f 6e 3d 25 64 2c 20 76 65 72 3d 25 73  ction=%d, ver=%s
1e50: 2c 20 74 79 70 65 3d 25 73 2c 20 6d 65 73 73 61  , type=%s, messa
1e60: 67 65 3d 25 73 22 2c 20 77 72 69 74 65 5f 70 2c  ge=%s", write_p,
1e70: 20 76 65 72 2c 20 74 79 70 65 2c 20 26 62 75 66   ver, type, &buf
1e80: 66 65 72 5b 30 5d 29 3b 0a 0a 20 20 20 20 2f 2a  fer[0]);..    /*
1e90: 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20   Create command 
1ea0: 74 6f 20 65 76 61 6c 20 77 69 74 68 20 66 6e 2c  to eval with fn,
1eb0: 20 63 68 61 6e 2c 20 64 69 72 65 63 74 69 6f 6e   chan, direction
1ec0: 2c 20 76 65 72 73 69 6f 6e 2c 20 74 79 70 65 2c  , version, type,
1ed0: 20 61 6e 64 20 6d 65 73 73 61 67 65 20 61 72 67   and message arg
1ee0: 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20  s */.    cmdPtr 
1ef0: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f  = Tcl_DuplicateO
1f00: 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c  bj(statePtr->cal
1f10: 6c 62 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f  lback);.    Tcl_
1f20: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
1f30: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
1f40: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
1f50: 6e 67 4f 62 6a 28 22 6d 65 73 73 61 67 65 22 2c  ngObj("message",
1f60: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c   -1));.    Tcl_L
1f70: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
1f80: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
1f90: 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77  tr,..    Tcl_New
1fa0: 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65  StringObj(Tcl_Ge
1fb0: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61  tChannelName(sta
1fc0: 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31  tePtr->self), -1
1fd0: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
1fe0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
1ff0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
2000: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
2010: 6a 28 77 72 69 74 65 5f 70 20 3f 20 22 53 65 6e  j(write_p ? "Sen
2020: 74 22 20 3a 20 22 52 65 63 65 69 76 65 64 22 2c  t" : "Received",
2030: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c   -1));.    Tcl_L
2040: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
2050: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
2060: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
2070: 67 4f 62 6a 28 76 65 72 2c 20 2d 31 29 29 3b 0a  gObj(ver, -1));.
2080: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
2090: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
20a0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c  erp, cmdPtr, Tcl
20b0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 74 79  _NewStringObj(ty
20c0: 70 65 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63  pe, -1));.    Tc
20d0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
20e0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
20f0: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  mdPtr, Tcl_NewSt
2100: 72 69 6e 67 4f 62 6a 28 62 75 66 66 65 72 2c 20  ringObj(buffer, 
2110: 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76  -1));..    /* Ev
2120: 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d  al callback comm
2130: 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49  and */.    Tcl_I
2140: 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50  ncrRefCount(cmdP
2150: 74 72 29 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c  tr);.    EvalCal
2160: 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74  lback(interp, st
2170: 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b  atePtr, cmdPtr);
2180: 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66  .    Tcl_DecrRef
2190: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 7d  Count(cmdPtr);.}
21a0: 0a 23 65 6e 64 69 66 0a 0c 0a 2f 2a 0a 20 2a 2d  .#endif.../*. *-
21b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 20 2a 0a 20 2a 20 56 65 72 69 66 79 43  --. *. * VerifyC
2200: 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a  allback --. *. *
2210: 09 4d 6f 6e 69 74 6f 72 73 20 53 53 4c 20 63 65  .Monitors SSL ce
2220: 72 74 69 66 69 63 61 74 65 20 76 61 6c 69 64 61  rtificate valida
2230: 74 69 6f 6e 20 70 72 6f 63 65 73 73 2e 20 55 73  tion process. Us
2240: 65 64 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68  ed to control th
2250: 65 0a 20 2a 09 62 65 68 61 76 69 6f 72 20 77 68  e. *.behavior wh
2260: 65 6e 20 74 68 65 20 53 53 4c 5f 56 45 52 49 46  en the SSL_VERIF
2270: 59 5f 50 45 45 52 20 66 6c 61 67 20 69 73 20 73  Y_PEER flag is s
2280: 65 74 2e 20 54 68 69 73 20 69 73 20 63 61 6c 6c  et. This is call
2290: 65 64 0a 20 2a 09 77 68 65 6e 65 76 65 72 20 61  ed. *.whenever a
22a0: 20 63 65 72 74 69 66 69 63 61 74 65 20 69 73 20   certificate is 
22b0: 69 6e 73 70 65 63 74 65 64 20 6f 72 20 64 65 63  inspected or dec
22c0: 69 64 65 64 20 69 6e 76 61 6c 69 64 2e 20 43 61  ided invalid. Ca
22d0: 6c 6c 65 64 20 66 6f 72 0a 20 2a 09 65 61 63 68  lled for. *.each
22e0: 20 63 65 72 74 69 66 69 63 61 74 65 20 69 6e 20   certificate in 
22f0: 74 68 65 20 63 65 72 74 20 63 68 61 69 6e 2e 0a  the cert chain..
2300: 20 2a 0a 20 2a 20 43 68 65 63 6b 73 3a 0a 20 2a   *. * Checks:. *
2310: 09 54 68 65 20 63 65 72 74 69 66 69 63 61 74 65  .The certificate
2320: 20 63 68 61 69 6e 20 69 73 20 63 68 65 63 6b 65   chain is checke
2330: 64 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 20  d starting with 
2340: 74 68 65 20 64 65 65 70 65 73 74 20 6e 65 73 74  the deepest nest
2350: 69 6e 67 20 6c 65 76 65 6c 0a 20 2a 09 20 20 28  ing level. *.  (
2360: 74 68 65 20 72 6f 6f 74 20 43 41 20 63 65 72 74  the root CA cert
2370: 69 66 69 63 61 74 65 29 20 61 6e 64 20 77 6f 72  ificate) and wor
2380: 6b 65 64 20 75 70 77 61 72 64 20 74 6f 20 74 68  ked upward to th
2390: 65 20 70 65 65 72 27 73 20 63 65 72 74 69 66 69  e peer's certifi
23a0: 63 61 74 65 2e 0a 20 2a 09 41 6c 6c 20 73 69 67  cate.. *.All sig
23b0: 6e 61 74 75 72 65 73 20 61 72 65 20 76 61 6c 69  natures are vali
23c0: 64 2c 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20  d, current time 
23d0: 69 73 20 77 69 74 68 69 6e 20 66 69 72 73 74 20  is within first 
23e0: 61 6e 64 20 6c 61 73 74 20 76 61 6c 69 64 69 74  and last validit
23f0: 79 20 74 69 6d 65 2e 0a 20 2a 09 43 68 65 63 6b  y time.. *.Check
2400: 20 74 68 61 74 20 74 68 65 20 63 65 72 74 69 66   that the certif
2410: 69 63 61 74 65 20 69 73 20 69 73 73 75 65 64 20  icate is issued 
2420: 62 79 20 74 68 65 20 69 73 73 75 65 72 20 63 65  by the issuer ce
2430: 72 74 69 66 69 63 61 74 65 20 69 73 73 75 65 72  rtificate issuer
2440: 2e 0a 20 2a 09 43 68 65 63 6b 20 74 68 65 20 72  .. *.Check the r
2450: 65 76 6f 63 61 74 69 6f 6e 20 73 74 61 74 75 73  evocation status
2460: 20 66 6f 72 20 65 61 63 68 20 63 65 72 74 69 66   for each certif
2470: 69 63 61 74 65 2e 0a 20 2a 09 43 68 65 63 6b 20  icate.. *.Check 
2480: 74 68 65 20 76 61 6c 69 64 69 74 79 20 6f 66 20  the validity of 
2490: 74 68 65 20 67 69 76 65 6e 20 43 52 4c 20 61 6e  the given CRL an
24a0: 64 20 74 68 65 20 63 65 72 74 20 72 65 76 6f 63  d the cert revoc
24b0: 61 74 69 6f 6e 20 73 74 61 74 75 73 2e 0a 20 2a  ation status.. *
24c0: 09 43 68 65 63 6b 20 74 68 65 20 70 6f 6c 69 63  .Check the polic
24d0: 69 65 73 20 6f 66 20 61 6c 6c 20 74 68 65 20 63  ies of all the c
24e0: 65 72 74 69 66 69 63 61 74 65 73 0a 20 2a 0a 20  ertificates. *. 
24f0: 2a 20 41 72 67 73 0a 20 2a 09 70 72 65 76 65 72  * Args. *.prever
2500: 69 66 79 5f 6f 6b 20 69 6e 64 69 63 61 74 65 73  ify_ok indicates
2510: 20 77 68 65 74 68 65 72 20 74 68 65 20 63 65 72   whether the cer
2520: 74 69 66 69 63 61 74 65 20 76 65 72 69 66 69 63  tificate verific
2530: 61 74 69 6f 6e 20 70 61 73 73 65 64 20 28 31 29  ation passed (1)
2540: 20 6f 72 20 6e 6f 74 20 28 30 29 0a 20 2a 0a 20   or not (0). *. 
2550: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20  * Results:. *.A 
2560: 63 61 6c 6c 62 61 63 6b 20 62 6f 75 6e 64 20 74  callback bound t
2570: 6f 20 74 68 65 20 73 6f 63 6b 65 74 20 6d 61 79  o the socket may
2580: 20 72 65 74 75 72 6e 20 6f 6e 65 20 6f 66 3a 0a   return one of:.
2590: 20 2a 09 20 20 20 20 30 09 09 09 2d 20 74 68 65   *.    0...- the
25a0: 20 63 65 72 74 69 66 69 63 61 74 65 20 69 73 20   certificate is 
25b0: 64 65 65 6d 65 64 20 69 6e 76 61 6c 69 64 2c 20  deemed invalid, 
25c0: 73 65 6e 64 20 76 65 72 69 66 69 63 61 74 69 6f  send verificatio
25d0: 6e 0a 20 2a 09 09 09 09 20 20 66 61 69 6c 75 72  n. *....  failur
25e0: 65 20 61 6c 65 72 74 20 74 6f 20 70 65 65 72 2c  e alert to peer,
25f0: 20 61 6e 64 20 74 65 72 6d 69 6e 61 74 65 20 68   and terminate h
2600: 61 6e 64 73 68 61 6b 65 2e 0a 20 2a 09 20 20 20  andshake.. *.   
2610: 20 31 09 09 09 2d 20 74 68 65 20 63 65 72 74 69   1...- the certi
2620: 66 69 63 61 74 65 20 69 73 20 64 65 65 6d 65 64  ficate is deemed
2630: 20 76 61 6c 69 64 2c 20 63 6f 6e 74 69 6e 75 65   valid, continue
2640: 20 77 69 74 68 20 68 61 6e 64 73 68 61 6b 65 2e   with handshake.
2650: 0a 20 2a 09 20 20 20 20 65 6d 70 74 79 20 73 74  . *.    empty st
2660: 72 69 6e 67 09 2d 20 6e 6f 20 63 68 61 6e 67 65  ring.- no change
2670: 20 74 6f 20 63 65 72 74 69 66 69 63 61 74 65 20   to certificate 
2680: 76 61 6c 69 64 61 74 69 6f 6e 0a 20 2a 0a 20 2a  validation. *. *
2690: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
26a0: 2a 09 54 68 65 20 65 72 72 20 66 69 65 6c 64 20  *.The err field 
26b0: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79  of the currently
26c0: 20 6f 70 65 72 61 74 69 76 65 20 53 74 61 74 65   operative State
26d0: 20 69 73 20 73 65 74 0a 20 2a 09 20 20 74 6f 20   is set. *.  to 
26e0: 61 20 73 74 72 69 6e 67 20 64 65 73 63 72 69 62  a string describ
26f0: 69 6e 67 20 74 68 65 20 53 53 4c 20 6e 65 67 6f  ing the SSL nego
2700: 74 69 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 20  tiation failure 
2710: 72 65 61 73 6f 6e 0a 20 2a 0a 20 2a 2d 2d 2d 2d  reason. *. *----
2720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a  ---------------.
2760: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 56   */.static int.V
2770: 65 72 69 66 79 43 61 6c 6c 62 61 63 6b 28 69 6e  erifyCallback(in
2780: 74 20 6f 6b 2c 20 58 35 30 39 5f 53 54 4f 52 45  t ok, X509_STORE
2790: 5f 43 54 58 20 2a 63 74 78 29 20 7b 0a 20 20 20  _CTX *ctx) {.   
27a0: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72   Tcl_Obj *cmdPtr
27b0: 3b 0a 20 20 20 20 53 53 4c 20 20 20 2a 73 73 6c  ;.    SSL   *ssl
27c0: 09 09 3d 20 28 53 53 4c 2a 29 58 35 30 39 5f 53  ..= (SSL*)X509_S
27d0: 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f 65 78 5f  TORE_CTX_get_ex_
27e0: 64 61 74 61 28 63 74 78 2c 20 53 53 4c 5f 67 65  data(ctx, SSL_ge
27f0: 74 5f 65 78 5f 64 61 74 61 5f 58 35 30 39 5f 53  t_ex_data_X509_S
2800: 54 4f 52 45 5f 43 54 58 5f 69 64 78 28 29 29 3b  TORE_CTX_idx());
2810: 0a 20 20 20 20 58 35 30 39 20 20 2a 63 65 72 74  .    X509  *cert
2820: 09 09 3d 20 58 35 30 39 5f 53 54 4f 52 45 5f 43  ..= X509_STORE_C
2830: 54 58 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 63  TX_get_current_c
2840: 65 72 74 28 63 74 78 29 3b 0a 20 20 20 20 53 74  ert(ctx);.    St
2850: 61 74 65 20 2a 73 74 61 74 65 50 74 72 09 3d 20  ate *statePtr.= 
2860: 28 53 74 61 74 65 2a 29 53 53 4c 5f 67 65 74 5f  (State*)SSL_get_
2870: 61 70 70 5f 64 61 74 61 28 73 73 6c 29 3b 0a 20  app_data(ssl);. 
2880: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69     Tcl_Interp *i
2890: 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72  nterp.= statePtr
28a0: 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 69 6e  ->interp;.    in
28b0: 74 20 64 65 70 74 68 09 09 3d 20 58 35 30 39 5f  t depth..= X509_
28c0: 53 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f 65 72  STORE_CTX_get_er
28d0: 72 6f 72 5f 64 65 70 74 68 28 63 74 78 29 3b 0a  ror_depth(ctx);.
28e0: 20 20 20 20 69 6e 74 20 65 72 72 09 09 3d 20 58      int err..= X
28f0: 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65  509_STORE_CTX_ge
2900: 74 5f 65 72 72 6f 72 28 63 74 78 29 3b 0a 0a 20  t_error(ctx);.. 
2910: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
2920: 65 64 22 29 3b 0a 20 20 20 20 64 70 72 69 6e 74  ed");.    dprint
2930: 66 28 22 56 65 72 69 66 79 43 61 6c 6c 62 61 63  f("VerifyCallbac
2940: 6b 3a 20 25 64 22 2c 20 6f 6b 29 3b 0a 0a 20 20  k: %d", ok);..  
2950: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
2960: 76 63 6d 64 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a  vcmd == (Tcl_Obj
2970: 2a 29 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 20 55 73  *)NULL) {../* Us
2980: 65 20 6f 6b 20 76 61 6c 75 65 20 69 66 20 76 65  e ok value if ve
2990: 72 69 66 69 63 61 74 69 6f 6e 20 69 73 20 72 65  rification is re
29a0: 71 75 69 72 65 64 20 2a 2f 0a 09 69 66 20 28 73  quired */..if (s
29b0: 74 61 74 65 50 74 72 2d 3e 76 66 6c 61 67 73 20  tatePtr->vflags 
29c0: 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 46 41 49  & SSL_VERIFY_FAI
29d0: 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 52  L_IF_NO_PEER_CER
29e0: 54 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e  T) {..    return
29f0: 20 6f 6b 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09   ok;..} else {..
2a00: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 09 7d      return 1;..}
2a10: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
2a20: 63 65 72 74 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20  cert == NULL || 
2a30: 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ssl == NULL) {..
2a40: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
2a50: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 56 65  .    dprintf("Ve
2a60: 72 69 66 79 43 61 6c 6c 62 61 63 6b 3a 20 65 76  rifyCallback: ev
2a70: 61 6c 20 63 61 6c 6c 62 61 63 6b 22 29 3b 0a 0a  al callback");..
2a80: 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f      /* Create co
2a90: 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 77 69  mmand to eval wi
2aa0: 74 68 20 66 6e 2c 20 63 68 61 6e 2c 20 64 65 70  th fn, chan, dep
2ab0: 74 68 2c 20 63 65 72 74 20 69 6e 66 6f 20 6c 69  th, cert info li
2ac0: 73 74 2c 20 73 74 61 74 75 73 2c 20 61 6e 64 20  st, status, and 
2ad0: 65 72 72 6f 72 20 61 72 67 73 20 2a 2f 0a 20 20  error args */.  
2ae0: 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44    cmdPtr = Tcl_D
2af0: 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74  uplicateObj(stat
2b00: 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20  ePtr->vcmd);.   
2b10: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
2b20: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
2b30: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
2b40: 77 53 74 72 69 6e 67 4f 62 6a 28 22 76 65 72 69  wStringObj("veri
2b50: 66 79 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54  fy", -1));.    T
2b60: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
2b70: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
2b80: 63 6d 64 50 74 72 2c 0a 09 54 63 6c 5f 4e 65 77  cmdPtr,..Tcl_New
2b90: 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65  StringObj(Tcl_Ge
2ba0: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61  tChannelName(sta
2bb0: 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31  tePtr->self), -1
2bc0: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
2bd0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
2be0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
2bf0: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 64   Tcl_NewIntObj(d
2c00: 65 70 74 68 29 29 3b 0a 20 20 20 20 54 63 6c 5f  epth));.    Tcl_
2c10: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
2c20: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
2c30: 50 74 72 2c 20 54 6c 73 5f 4e 65 77 58 35 30 39  Ptr, Tls_NewX509
2c40: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 63 65 72 74  Obj(interp, cert
2c50: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
2c60: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
2c70: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
2c80: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6f   Tcl_NewIntObj(o
2c90: 6b 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  k));.    Tcl_Lis
2ca0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
2cb0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
2cc0: 2c 0a 09 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  ,..Tcl_NewString
2cd0: 4f 62 6a 28 28 63 68 61 72 2a 29 58 35 30 39 5f  Obj((char*)X509_
2ce0: 76 65 72 69 66 79 5f 63 65 72 74 5f 65 72 72 6f  verify_cert_erro
2cf0: 72 5f 73 74 72 69 6e 67 28 65 72 72 29 2c 20 2d  r_string(err), -
2d00: 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 65  1));..    /* Pre
2d10: 76 65 6e 74 20 49 2f 4f 20 77 68 69 6c 65 20 63  vent I/O while c
2d20: 61 6c 6c 62 61 63 6b 20 69 73 20 69 6e 20 70 72  allback is in pr
2d30: 6f 67 72 65 73 73 20 2a 2f 0a 20 20 20 20 2f 2a  ogress */.    /*
2d40: 20 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73   statePtr->flags
2d50: 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c   |= TLS_TCL_CALL
2d60: 42 41 43 4b 3b 20 2a 2f 0a 0a 20 20 20 20 2f 2a  BACK; */..    /*
2d70: 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63   Eval callback c
2d80: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63  ommand */.    Tc
2d90: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63  l_IncrRefCount(c
2da0: 6d 64 50 74 72 29 3b 0a 20 20 20 20 6f 6b 20 3d  mdPtr);.    ok =
2db0: 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e   EvalCallback(in
2dc0: 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20  terp, statePtr, 
2dd0: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63 6c  cmdPtr);.    Tcl
2de0: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d  _DecrRefCount(cm
2df0: 64 50 74 72 29 3b 0a 0a 20 20 20 20 64 70 72 69  dPtr);..    dpri
2e00: 6e 74 66 28 22 56 65 72 69 66 79 43 61 6c 6c 62  ntf("VerifyCallb
2e10: 61 63 6b 3a 20 63 6f 6d 6d 61 6e 64 20 72 65 73  ack: command res
2e20: 75 6c 74 20 3d 20 25 64 22 2c 20 6f 6b 29 3b 0a  ult = %d", ok);.
2e30: 0a 20 20 20 20 2f 2a 20 73 74 61 74 65 50 74 72  .    /* statePtr
2e40: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 54 4c 53  ->flags &= ~(TLS
2e50: 5f 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 29 3b 20  _TCL_CALLBACK); 
2e60: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 6b  */.    return ok
2e70: 3b 09 2f 2a 20 42 79 20 64 65 66 61 75 6c 74 2c  ;./* By default,
2e80: 20 6c 65 61 76 65 20 76 65 72 69 66 69 63 61 74   leave verificat
2e90: 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e 20 2a  ion unchanged. *
2ea0: 2f 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  /.}.../*. *-----
2eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
2ef0: 2a 0a 20 2a 20 54 6c 73 5f 45 72 72 6f 72 20 2d  *. * Tls_Error -
2f00: 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 73 20 63 61  -. *. *.Calls ca
2f10: 6c 6c 62 61 63 6b 20 77 69 74 68 20 65 72 72 6f  llback with erro
2f20: 72 20 6d 65 73 73 61 67 65 2e 0a 20 2a 0a 20 2a  r message.. *. *
2f30: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
2f40: 2a 09 54 68 65 20 65 72 72 20 66 69 65 6c 64 20  *.The err field 
2f50: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79  of the currently
2f60: 20 6f 70 65 72 61 74 69 76 65 20 53 74 61 74 65   operative State
2f70: 20 69 73 20 73 65 74 0a 20 2a 09 20 20 74 6f 20   is set. *.  to 
2f80: 61 20 73 74 72 69 6e 67 20 64 65 73 63 72 69 62  a string describ
2f90: 69 6e 67 20 74 68 65 20 53 53 4c 20 6e 65 67 6f  ing the SSL nego
2fa0: 74 69 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 20  tiation failure 
2fb0: 72 65 61 73 6f 6e 0a 20 2a 0a 20 2a 2d 2d 2d 2d  reason. *. *----
2fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
3000: 20 2a 2f 0a 76 6f 69 64 0a 54 6c 73 5f 45 72 72   */.void.Tls_Err
3010: 6f 72 28 53 74 61 74 65 20 2a 73 74 61 74 65 50  or(State *stateP
3020: 74 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tr, const char *
3030: 6d 73 67 29 20 7b 0a 20 20 20 20 54 63 6c 5f 49  msg) {.    Tcl_I
3040: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20  nterp *interp.= 
3050: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70  statePtr->interp
3060: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63  ;.    Tcl_Obj *c
3070: 6d 64 50 74 72 2c 20 2a 6c 69 73 74 50 74 72 3b  mdPtr, *listPtr;
3080: 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f  .    unsigned lo
3090: 6e 67 20 65 72 72 3b 0a 20 20 20 20 73 74 61 74  ng err;.    stat
30a0: 65 50 74 72 2d 3e 65 72 72 20 3d 20 6d 73 67 3b  ePtr->err = msg;
30b0: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
30c0: 61 6c 6c 65 64 20 77 69 74 68 20 6d 65 73 73 61  alled with messa
30d0: 67 65 20 25 73 22 2c 20 6d 73 67 29 3b 0a 0a 20  ge %s", msg);.. 
30e0: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
30f0: 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 63  >callback == (Tc
3100: 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09  l_Obj*)NULL) {..
3110: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20  return;.    }.. 
3120: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d     /* Create com
3130: 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 77 69 74  mand to eval wit
3140: 68 20 66 6e 2c 20 63 68 61 6e 2c 20 61 6e 64 20  h fn, chan, and 
3150: 6d 65 73 73 61 67 65 20 61 72 67 73 20 2a 2f 0a  message args */.
3160: 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c      cmdPtr = Tcl
3170: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74  _DuplicateObj(st
3180: 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b  atePtr->callback
3190: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
31a0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
31b0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
31c0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
31d0: 28 22 65 72 72 6f 72 22 2c 20 2d 31 29 29 3b 0a  ("error", -1));.
31e0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
31f0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
3200: 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20  erp, cmdPtr,..  
3210: 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f    Tcl_NewStringO
3220: 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  bj(Tcl_GetChanne
3230: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e  lName(statePtr->
3240: 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20  self), -1));.   
3250: 20 69 66 20 28 6d 73 67 20 21 3d 20 4e 55 4c 4c   if (msg != NULL
3260: 29 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a  ) {..Tcl_ListObj
3270: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
3280: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
3290: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d  l_NewStringObj(m
32a0: 73 67 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 7d  sg, -1));..    }
32b0: 20 65 6c 73 65 20 69 66 20 28 28 6d 73 67 20 3d   else if ((msg =
32c0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 54   Tcl_GetString(T
32d0: 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_GetObjResult(
32e0: 69 6e 74 65 72 70 29 29 29 20 21 3d 20 4e 55 4c  interp))) != NUL
32f0: 4c 29 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62  L) {..Tcl_ListOb
3300: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
3310: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54  nterp, cmdPtr, T
3320: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
3330: 6d 73 67 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20  msg, -1));..    
3340: 7d 20 65 6c 73 65 20 7b 0a 09 6c 69 73 74 50 74  } else {..listPt
3350: 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f  r = Tcl_NewListO
3360: 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 09 77 68  bj(0, NULL);..wh
3370: 69 6c 65 20 28 28 65 72 72 20 3d 20 45 52 52 5f  ile ((err = ERR_
3380: 67 65 74 5f 65 72 72 6f 72 28 29 29 20 21 3d 20  get_error()) != 
3390: 30 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69  0) {..    Tcl_Li
33a0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
33b0: 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 50  nt(interp, listP
33c0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
33d0: 67 4f 62 6a 28 45 52 52 5f 72 65 61 73 6f 6e 5f  gObj(ERR_reason_
33e0: 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 65 72 72  error_string(err
33f0: 29 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 54 63 6c  ), -1));..}..Tcl
3400: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
3410: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
3420: 64 50 74 72 2c 20 6c 69 73 74 50 74 72 29 3b 0a  dPtr, listPtr);.
3430: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 76      }..    /* Ev
3440: 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d  al callback comm
3450: 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49  and */.    Tcl_I
3460: 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50  ncrRefCount(cmdP
3470: 74 72 29 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c  tr);.    EvalCal
3480: 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74  lback(interp, st
3490: 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b  atePtr, cmdPtr);
34a0: 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66  .    Tcl_DecrRef
34b0: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 7d  Count(cmdPtr);.}
34c0: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
34d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
34e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
34f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
3510: 2a 20 4b 65 79 4c 6f 67 43 61 6c 6c 62 61 63 6b  * KeyLogCallback
3520: 20 2d 2d 0a 20 2a 0a 20 2a 09 57 72 69 74 65 20   --. *. *.Write 
3530: 72 65 63 65 69 76 65 64 20 6b 65 79 20 64 61 74  received key dat
3540: 61 20 74 6f 20 6c 6f 67 20 66 69 6c 65 2e 0a 20  a to log file.. 
3550: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
3560: 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a  s:. *.none. *. *
3570: 2d 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 0a 20 2a 2f 0a 76 6f 69 64 20 4b 65 79  ---. */.void Key
35c0: 4c 6f 67 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73  LogCallback(cons
35d0: 74 20 53 53 4c 20 2a 73 73 6c 2c 20 63 6f 6e 73  t SSL *ssl, cons
35e0: 74 20 63 68 61 72 20 2a 6c 69 6e 65 29 20 7b 0a  t char *line) {.
35f0: 20 20 20 20 63 68 61 72 20 2a 73 74 72 20 3d 20      char *str = 
3600: 67 65 74 65 6e 76 28 53 53 4c 4b 45 59 4c 4f 47  getenv(SSLKEYLOG
3610: 46 49 4c 45 29 3b 0a 20 20 20 20 46 49 4c 45 20  FILE);.    FILE 
3620: 2a 66 64 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74  *fd;..    dprint
3630: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20  f("Called");..  
3640: 20 20 69 66 20 28 73 74 72 29 20 7b 0a 09 66 64    if (str) {..fd
3650: 20 3d 20 66 6f 70 65 6e 28 73 74 72 2c 20 22 61   = fopen(str, "a
3660: 22 29 3b 0a 09 66 70 72 69 6e 74 66 28 66 64 2c  ");..fprintf(fd,
3670: 20 22 25 73 5c 6e 22 2c 6c 69 6e 65 29 3b 0a 09   "%s\n",line);..
3680: 66 63 6c 6f 73 65 28 66 64 29 3b 0a 20 20 20 20  fclose(fd);.    
3690: 7d 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  }.}.../*. *-----
36a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
36b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
36c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
36d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
36e0: 2a 0a 20 2a 20 50 61 73 73 77 6f 72 64 20 43 61  *. * Password Ca
36f0: 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09  llback --. *. *.
3700: 43 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 70 61  Called when a pa
3710: 73 73 77 6f 72 64 20 69 73 20 6e 65 65 64 65 64  ssword is needed
3720: 20 66 6f 72 20 61 20 70 72 69 76 61 74 65 20 6b   for a private k
3730: 65 79 20 77 68 65 6e 20 6c 6f 61 64 69 6e 67 0a  ey when loading.
3740: 20 2a 09 6f 72 20 73 74 6f 72 69 6e 67 20 61 20   *.or storing a 
3750: 50 45 4d 20 63 65 72 74 69 66 69 63 61 74 65 20  PEM certificate 
3760: 77 69 74 68 20 65 6e 63 72 79 70 74 69 6f 6e 2e  with encryption.
3770: 20 45 76 61 6c 73 20 63 61 6c 6c 62 61 63 6b 0a   Evals callback.
3780: 20 2a 09 73 63 72 69 70 74 20 61 6e 64 20 72 65   *.script and re
3790: 74 75 72 6e 73 20 74 68 65 20 72 65 73 75 6c 74  turns the result
37a0: 20 61 73 20 74 68 65 20 70 61 73 73 77 6f 72 64   as the password
37b0: 20 73 74 72 69 6e 67 20 69 6e 20 62 75 66 2e 0a   string in buf..
37c0: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
37d0: 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64  *.None. *. * Sid
37e0: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61  e effects:. *.Ca
37f0: 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66  lls callback (if
3800: 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20   defined). *. * 
3810: 52 65 74 75 72 6e 73 3a 0a 20 2a 09 50 61 73 73  Returns:. *.Pass
3820: 77 6f 72 64 20 73 69 7a 65 20 69 6e 20 62 79 74  word size in byt
3830: 65 73 20 6f 72 20 2d 31 20 66 6f 72 20 61 6e 20  es or -1 for an 
3840: 65 72 72 6f 72 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d  error.. *. *----
3850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
3890: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 50   */.static int.P
38a0: 61 73 73 77 6f 72 64 43 61 6c 6c 62 61 63 6b 28  asswordCallback(
38b0: 63 68 61 72 20 2a 62 75 66 2c 20 69 6e 74 20 73  char *buf, int s
38c0: 69 7a 65 2c 20 69 6e 74 20 72 77 66 6c 61 67 2c  ize, int rwflag,
38d0: 20 76 6f 69 64 20 2a 75 64 61 74 61 29 20 7b 0a   void *udata) {.
38e0: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65      State *state
38f0: 50 74 72 09 3d 20 28 53 74 61 74 65 20 2a 29 20  Ptr.= (State *) 
3900: 75 64 61 74 61 3b 0a 20 20 20 20 54 63 6c 5f 49  udata;.    Tcl_I
3910: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20  nterp *interp.= 
3920: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70  statePtr->interp
3930: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63  ;.    Tcl_Obj *c
3940: 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 63  mdPtr;.    int c
3950: 6f 64 65 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a  ode;.    Tcl_Siz
3960: 65 20 6c 65 6e 3b 0a 0a 20 20 20 20 64 70 72 69  e len;..    dpri
3970: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a  ntf("Called");..
3980: 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20 63 61 6c      /* If no cal
3990: 6c 62 61 63 6b 2c 20 75 73 65 20 64 65 66 61 75  lback, use defau
39a0: 6c 74 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20  lt callback */. 
39b0: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
39c0: 3e 70 61 73 73 77 6f 72 64 20 3d 3d 20 4e 55 4c  >password == NUL
39d0: 4c 29 20 7b 0a 09 69 66 20 28 54 63 6c 5f 45 76  L) {..if (Tcl_Ev
39e0: 61 6c 45 78 28 69 6e 74 65 72 70 2c 20 22 74 6c  alEx(interp, "tl
39f0: 73 3a 3a 70 61 73 73 77 6f 72 64 22 2c 20 2d 31  s::password", -1
3a00: 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41  , TCL_EVAL_GLOBA
3a10: 4c 29 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a  L) == TCL_OK) {.
3a20: 09 20 20 20 20 63 68 61 72 20 2a 72 65 74 20 3d  .    char *ret =
3a30: 20 28 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 65   (char *) Tcl_Ge
3a40: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 54  tStringFromObj(T
3a50: 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_GetObjResult(
3a60: 69 6e 74 65 72 70 29 2c 20 26 6c 65 6e 29 3b 0a  interp), &len);.
3a70: 09 20 20 20 20 69 66 20 28 6c 65 6e 20 3e 20 28  .    if (len > (
3a80: 54 63 6c 5f 53 69 7a 65 29 20 73 69 7a 65 2d 31  Tcl_Size) size-1
3a90: 29 20 7b 0a 09 09 6c 65 6e 20 3d 20 28 54 63 6c  ) {...len = (Tcl
3aa0: 5f 53 69 7a 65 29 20 73 69 7a 65 2d 31 3b 0a 09  _Size) size-1;..
3ab0: 20 20 20 20 7d 0a 09 20 20 20 20 73 74 72 6e 63      }..    strnc
3ac0: 70 79 28 62 75 66 2c 20 72 65 74 2c 20 28 73 69  py(buf, ret, (si
3ad0: 7a 65 5f 74 29 20 6c 65 6e 29 3b 0a 09 20 20 20  ze_t) len);..   
3ae0: 20 62 75 66 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27   buf[len] = '\0'
3af0: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 28 69  ;..    return (i
3b00: 6e 74 29 20 6c 65 6e 3b 0a 09 7d 20 65 6c 73 65  nt) len;..} else
3b10: 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 2d   {..    return -
3b20: 31 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20  1;..}.    }..   
3b30: 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61   /* Create comma
3b40: 6e 64 20 74 6f 20 65 76 61 6c 20 77 69 74 68 20  nd to eval with 
3b50: 66 6e 2c 20 72 77 66 6c 61 67 2c 20 61 6e 64 20  fn, rwflag, and 
3b60: 73 69 7a 65 20 61 72 67 73 20 2a 2f 0a 20 20 20  size args */.   
3b70: 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75   cmdPtr = Tcl_Du
3b80: 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65  plicateObj(state
3b90: 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a  Ptr->password);.
3ba0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
3bb0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
3bc0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c  erp, cmdPtr, Tcl
3bd0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 70  _NewStringObj("p
3be0: 61 73 73 77 6f 72 64 22 2c 20 2d 31 29 29 3b 0a  assword", -1));.
3bf0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
3c00: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
3c10: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c  erp, cmdPtr, Tcl
3c20: 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 77 66 6c 61  _NewIntObj(rwfla
3c30: 67 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  g));.    Tcl_Lis
3c40: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
3c50: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
3c60: 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
3c70: 73 69 7a 65 29 29 3b 0a 0a 20 20 20 20 54 63 6c  size));..    Tcl
3c80: 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e  _Preserve((Clien
3c90: 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a  tData) interp);.
3ca0: 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65      Tcl_Preserve
3cb0: 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74  ((ClientData) st
3cc0: 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a  atePtr);..    /*
3cd0: 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63   Eval callback c
3ce0: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63  ommand */.    Tc
3cf0: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63  l_IncrRefCount(c
3d00: 6d 64 50 74 72 29 3b 0a 20 20 20 20 63 6f 64 65  mdPtr);.    code
3d10: 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78   = Tcl_EvalObjEx
3d20: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
3d30: 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c   TCL_EVAL_GLOBAL
3d40: 29 3b 0a 20 20 20 20 69 66 20 28 63 6f 64 65 20  );.    if (code 
3d50: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 23 69 66  != TCL_OK) {.#if
3d60: 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53   (TCL_MAJOR_VERS
3d70: 49 4f 4e 20 3d 3d 20 38 29 20 26 26 20 28 54 43  ION == 8) && (TC
3d80: 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 20  L_MINOR_VERSION 
3d90: 3c 20 36 29 0a 09 54 63 6c 5f 42 61 63 6b 67 72  < 6)..Tcl_Backgr
3da0: 6f 75 6e 64 45 72 72 6f 72 28 69 6e 74 65 72 70  oundError(interp
3db0: 29 3b 0a 23 65 6c 73 65 0a 09 54 63 6c 5f 42 61  );.#else..Tcl_Ba
3dc0: 63 6b 67 72 6f 75 6e 64 45 78 63 65 70 74 69 6f  ckgroundExceptio
3dd0: 6e 28 69 6e 74 65 72 70 2c 20 63 6f 64 65 29 3b  n(interp, code);
3de0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
3df0: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
3e00: 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20  nt(cmdPtr);..   
3e10: 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c   Tcl_Release((Cl
3e20: 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50  ientData) stateP
3e30: 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  tr);..    /* If 
3e40: 73 75 63 63 65 73 73 66 75 6c 2c 20 70 61 73 73  successful, pass
3e50: 20 62 61 63 6b 20 70 61 73 73 77 6f 72 64 20 73   back password s
3e60: 74 72 69 6e 67 20 61 6e 64 20 74 72 75 6e 63 61  tring and trunca
3e70: 74 65 20 69 66 20 74 6f 6f 20 6c 6f 6e 67 20 2a  te if too long *
3e80: 2f 0a 20 20 20 20 69 66 20 28 63 6f 64 65 20 3d  /.    if (code =
3e90: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 63 68 61  = TCL_OK) {..cha
3ea0: 72 20 2a 72 65 74 20 3d 20 28 63 68 61 72 20 2a  r *ret = (char *
3eb0: 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  ) Tcl_GetStringF
3ec0: 72 6f 6d 4f 62 6a 28 54 63 6c 5f 47 65 74 4f 62  romObj(Tcl_GetOb
3ed0: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 2c  jResult(interp),
3ee0: 20 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e   &len);..if (len
3ef0: 20 3e 20 28 54 63 6c 5f 53 69 7a 65 29 20 73 69   > (Tcl_Size) si
3f00: 7a 65 2d 31 29 20 7b 0a 09 20 20 20 20 6c 65 6e  ze-1) {..    len
3f10: 20 3d 20 28 54 63 6c 5f 53 69 7a 65 29 20 73 69   = (Tcl_Size) si
3f20: 7a 65 2d 31 3b 0a 09 7d 0a 09 73 74 72 6e 63 70  ze-1;..}..strncp
3f30: 79 28 62 75 66 2c 20 72 65 74 2c 20 28 73 69 7a  y(buf, ret, (siz
3f40: 65 5f 74 29 20 6c 65 6e 29 3b 0a 09 62 75 66 5b  e_t) len);..buf[
3f50: 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 09 54 63  len] = '\0';..Tc
3f60: 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e  l_Release((Clien
3f70: 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a  tData) interp);.
3f80: 09 72 65 74 75 72 6e 20 28 69 6e 74 29 20 6c 65  .return (int) le
3f90: 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c  n;.    }.    Tcl
3fa0: 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74  _Release((Client
3fb0: 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20  Data) interp);. 
3fc0: 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a     return -1;.}.
3fd0: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
3fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
4020: 20 53 65 73 73 69 6f 6e 20 43 61 6c 6c 62 61 63   Session Callbac
4030: 6b 20 66 6f 72 20 43 6c 69 65 6e 74 73 20 2d 2d  k for Clients --
4040: 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 77 68  . *. *.Called wh
4050: 65 6e 20 61 20 6e 65 77 20 73 65 73 73 69 6f 6e  en a new session
4060: 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65   is added to the
4070: 20 63 61 63 68 65 2e 20 49 6e 20 54 4c 53 20 31   cache. In TLS 1
4080: 2e 33 0a 20 2a 09 74 68 69 73 20 6d 61 79 20 62  .3. *.this may b
4090: 65 20 72 65 63 65 69 76 65 64 20 6d 75 6c 74 69  e received multi
40a0: 70 6c 65 20 74 69 6d 65 73 20 61 66 74 65 72 20  ple times after 
40b0: 74 68 65 20 68 61 6e 64 73 68 61 6b 65 2e 20 46  the handshake. F
40c0: 6f 72 0a 20 2a 09 65 61 72 6c 69 65 72 20 76 65  or. *.earlier ve
40d0: 72 73 69 6f 6e 73 2c 20 74 68 69 73 20 77 69 6c  rsions, this wil
40e0: 6c 20 62 65 20 72 65 63 65 69 76 65 64 20 64 75  l be received du
40f0: 72 69 6e 67 20 74 68 65 20 68 61 6e 64 73 68 61  ring the handsha
4100: 6b 65 2e 0a 20 2a 09 54 68 69 73 20 69 73 20 74  ke.. *.This is t
4110: 68 65 20 70 72 65 66 65 72 72 65 64 20 77 61 79  he preferred way
4120: 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 72 65 73   to obtain a res
4130: 75 6d 61 62 6c 65 20 73 65 73 73 69 6f 6e 2e 0a  umable session..
4140: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
4150: 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64  *.None. *. * Sid
4160: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61  e effects:. *.Ca
4170: 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66  lls callback (if
4180: 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20   defined). *. * 
4190: 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a  Return codes:. *
41a0: 09 30 20 3d 20 65 72 72 6f 72 20 77 68 65 72 65  .0 = error where
41b0: 20 73 65 73 73 69 6f 6e 20 77 69 6c 6c 20 62 65   session will be
41c0: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 6d   immediately rem
41d0: 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 69 6e  oved from the in
41e0: 74 65 72 6e 61 6c 20 63 61 63 68 65 2e 0a 20 2a  ternal cache.. *
41f0: 09 31 20 3d 20 73 75 63 63 65 73 73 20 77 68 65  .1 = success whe
4200: 72 65 20 61 70 70 20 72 65 74 61 69 6e 73 20 73  re app retains s
4210: 65 73 73 69 6f 6e 20 69 6e 20 73 65 73 73 69 6f  ession in sessio
4220: 6e 20 63 61 63 68 65 2c 20 61 6e 64 20 6d 75 73  n cache, and mus
4230: 74 20 63 61 6c 6c 20 53 53 4c 5f 53 45 53 53 49  t call SSL_SESSI
4240: 4f 4e 5f 66 72 65 65 28 29 20 77 68 65 6e 20 64  ON_free() when d
4250: 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  one.. *. *------
4260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
42a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 65 73  /.static int.Ses
42b0: 73 69 6f 6e 43 61 6c 6c 62 61 63 6b 28 53 53 4c  sionCallback(SSL
42c0: 20 2a 73 73 6c 2c 20 53 53 4c 5f 53 45 53 53 49   *ssl, SSL_SESSI
42d0: 4f 4e 20 2a 73 65 73 73 69 6f 6e 29 20 7b 0a 20  ON *session) {. 
42e0: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50     State *stateP
42f0: 74 72 20 3d 20 28 53 74 61 74 65 2a 29 53 53 4c  tr = (State*)SSL
4300: 5f 67 65 74 5f 61 70 70 5f 64 61 74 61 28 28 53  _get_app_data((S
4310: 53 4c 20 2a 29 73 73 6c 29 3b 0a 20 20 20 20 54  SL *)ssl);.    T
4320: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
4330: 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e  p.= statePtr->in
4340: 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62  terp;.    Tcl_Ob
4350: 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 63  j *cmdPtr;.    c
4360: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
4370: 61 72 20 2a 74 69 63 6b 65 74 3b 0a 20 20 20 20  ar *ticket;.    
4380: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
4390: 68 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 3b  har *session_id;
43a0: 0a 20 20 20 20 73 69 7a 65 5f 74 20 6c 65 6e 32  .    size_t len2
43b0: 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69  ;.    unsigned i
43c0: 6e 74 20 75 6c 65 6e 3b 0a 0a 20 20 20 20 64 70  nt ulen;..    dp
43d0: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
43e0: 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  ..    if (stateP
43f0: 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20  tr->callback == 
4400: 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20  (Tcl_Obj*)NULL) 
4410: 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c  {..return SSL_TL
4420: 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20  SEXT_ERR_OK;.   
4430: 20 7d 20 65 6c 73 65 20 69 66 20 28 73 73 6c 20   } else if (ssl 
4440: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75  == NULL) {..retu
4450: 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52  rn SSL_TLSEXT_ER
4460: 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a  R_NOACK;.    }..
4470: 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f      /* Create co
4480: 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 77 69  mmand to eval wi
4490: 74 68 20 66 6e 2c 20 63 68 61 6e 2c 20 73 65 73  th fn, chan, ses
44a0: 73 69 6f 6e 20 69 64 2c 20 73 65 73 73 69 6f 6e  sion id, session
44b0: 20 74 69 63 6b 65 74 2c 20 61 6e 64 20 6c 69 66   ticket, and lif
44c0: 65 74 69 6d 65 20 61 72 67 73 20 2a 2f 0a 20 20  etime args */.  
44d0: 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44    cmdPtr = Tcl_D
44e0: 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74  uplicateObj(stat
44f0: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b  ePtr->callback);
4500: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
4510: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
4520: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
4530: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
4540: 73 65 73 73 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a  session", -1));.
4550: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
4560: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
4570: 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20  erp, cmdPtr,..  
4580: 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f    Tcl_NewStringO
4590: 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  bj(Tcl_GetChanne
45a0: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e  lName(statePtr->
45b0: 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 0a 20 20  self), -1));..  
45c0: 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 69 64 20    /* Session id 
45d0: 2a 2f 0a 20 20 20 20 73 65 73 73 69 6f 6e 5f 69  */.    session_i
45e0: 64 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f  d = SSL_SESSION_
45f0: 67 65 74 5f 69 64 28 73 65 73 73 69 6f 6e 2c 20  get_id(session, 
4600: 26 75 6c 65 6e 29 3b 0a 20 20 20 20 54 63 6c 5f  &ulen);.    Tcl_
4610: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
4620: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
4630: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65  Ptr, Tcl_NewByte
4640: 41 72 72 61 79 4f 62 6a 28 73 65 73 73 69 6f 6e  ArrayObj(session
4650: 5f 69 64 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20  _id, (Tcl_Size) 
4660: 75 6c 65 6e 29 29 3b 0a 0a 20 20 20 20 2f 2a 20  ulen));..    /* 
4670: 53 65 73 73 69 6f 6e 20 74 69 63 6b 65 74 20 2a  Session ticket *
4680: 2f 0a 20 20 20 20 53 53 4c 5f 53 45 53 53 49 4f  /.    SSL_SESSIO
4690: 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74 28 73 65  N_get0_ticket(se
46a0: 73 73 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20  ssion, &ticket, 
46b0: 26 6c 65 6e 32 29 3b 0a 20 20 20 20 54 63 6c 5f  &len2);.    Tcl_
46c0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
46d0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
46e0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65  Ptr, Tcl_NewByte
46f0: 41 72 72 61 79 4f 62 6a 28 74 69 63 6b 65 74 2c  ArrayObj(ticket,
4700: 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32   (Tcl_Size) len2
4710: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c 69 66 65  ));..    /* Life
4720: 74 69 6d 65 20 2d 20 6e 75 6d 62 65 72 20 6f 66  time - number of
4730: 20 73 65 63 6f 6e 64 73 20 2a 2f 0a 20 20 20 20   seconds */.    
4740: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
4750: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
4760: 20 63 6d 64 50 74 72 2c 0a 09 54 63 6c 5f 4e 65   cmdPtr,..Tcl_Ne
4770: 77 4c 6f 6e 67 4f 62 6a 28 28 6c 6f 6e 67 29 20  wLongObj((long) 
4780: 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f  SSL_SESSION_get_
4790: 74 69 63 6b 65 74 5f 6c 69 66 65 74 69 6d 65 5f  ticket_lifetime_
47a0: 68 69 6e 74 28 73 65 73 73 69 6f 6e 29 29 29 3b  hint(session)));
47b0: 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61  ..    /* Eval ca
47c0: 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a  llback command *
47d0: 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  /.    Tcl_IncrRe
47e0: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a  fCount(cmdPtr);.
47f0: 20 20 20 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b      EvalCallback
4800: 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74  (interp, statePt
4810: 72 2c 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20  r, cmdPtr);.    
4820: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
4830: 28 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20 2f  (cmdPtr);..    /
4840: 2a 20 52 65 74 75 72 6e 20 30 20 66 6f 72 20 6e  * Return 0 for n
4850: 6f 77 20 75 6e 74 69 6c 20 73 65 73 73 69 6f 6e  ow until session
4860: 20 68 61 6e 64 6c 69 6e 67 20 69 73 20 63 6f 6d   handling is com
4870: 70 6c 65 74 65 20 2a 2f 0a 20 20 20 20 72 65 74  plete */.    ret
4880: 75 72 6e 20 30 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  urn 0;.}.../*. *
4890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
48a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
48b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
48c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
48d0: 2d 2d 2d 0a 20 2a 0a 20 2a 20 41 4c 50 4e 20 43  ---. *. * ALPN C
48e0: 61 6c 6c 62 61 63 6b 20 66 6f 72 20 53 65 72 76  allback for Serv
48f0: 65 72 73 20 61 6e 64 20 4e 50 4e 20 43 61 6c 6c  ers and NPN Call
4900: 62 61 63 6b 20 66 6f 72 20 43 6c 69 65 6e 74 73  back for Clients
4910: 20 2d 2d 0a 20 2a 0a 20 2a 09 50 65 72 66 6f 72   --. *. *.Perfor
4920: 6d 20 70 72 6f 74 6f 63 6f 6c 20 28 68 74 74 70  m protocol (http
4930: 2f 31 2e 31 2c 20 68 32 2c 20 68 33 2c 20 65 74  /1.1, h2, h3, et
4940: 63 2e 29 20 73 65 6c 65 63 74 69 6f 6e 20 66 6f  c.) selection fo
4950: 72 20 74 68 65 0a 20 2a 09 69 6e 63 6f 6d 69 6e  r the. *.incomin
4960: 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 43 61  g connection. Ca
4970: 6c 6c 65 64 20 61 66 74 65 72 20 48 65 6c 6c 6f  lled after Hello
4980: 20 61 6e 64 20 73 65 72 76 65 72 20 63 61 6c 6c   and server call
4990: 62 61 63 6b 73 2e 0a 20 2a 09 57 68 65 72 65 20  backs.. *.Where 
49a0: 27 6f 75 74 27 20 69 73 20 73 65 6c 65 63 74 65  'out' is selecte
49b0: 64 20 70 72 6f 74 6f 63 6f 6c 20 61 6e 64 20 27  d protocol and '
49c0: 69 6e 27 20 69 73 20 74 68 65 20 70 65 65 72 20  in' is the peer 
49d0: 61 64 76 65 72 74 69 73 65 64 20 6c 69 73 74 2e  advertised list.
49e0: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
49f0: 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69   *.None. *. * Si
4a00: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43  de effects:. *.C
4a10: 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69  alls callback (i
4a20: 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a  f defined). *. *
4a30: 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20   Return codes:. 
4a40: 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52  *.SSL_TLSEXT_ERR
4a50: 5f 4f 4b 3a 20 41 4c 50 4e 20 70 72 6f 74 6f 63  _OK: ALPN protoc
4a60: 6f 6c 20 73 65 6c 65 63 74 65 64 2e 20 54 68 65  ol selected. The
4a70: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74   connection cont
4a80: 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c  inues.. *.SSL_TL
4a90: 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46  SEXT_ERR_ALERT_F
4aa0: 41 54 41 4c 3a 20 54 68 65 72 65 20 77 61 73 20  ATAL: There was 
4ab0: 6e 6f 20 6f 76 65 72 6c 61 70 20 62 65 74 77 65  no overlap betwe
4ac0: 65 6e 20 74 68 65 20 63 6c 69 65 6e 74 27 73 0a  en the client's.
4ad0: 20 2a 09 20 20 20 20 73 75 70 70 6c 69 65 64 20   *.    supplied 
4ae0: 6c 69 73 74 20 61 6e 64 20 74 68 65 20 73 65 72  list and the ser
4af0: 76 65 72 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ver configuratio
4b00: 6e 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f  n. The connectio
4b10: 6e 20 77 69 6c 6c 20 62 65 20 61 62 6f 72 74 65  n will be aborte
4b20: 64 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54  d.. *.SSL_TLSEXT
4b30: 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20 41 4c 50 4e  _ERR_NOACK: ALPN
4b40: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 65   protocol not se
4b50: 6c 65 63 74 65 64 2c 20 65 2e 67 2e 2c 20 62 65  lected, e.g., be
4b60: 63 61 75 73 65 20 6e 6f 20 41 4c 50 4e 0a 20 2a  cause no ALPN. *
4b70: 09 20 20 20 20 70 72 6f 74 6f 63 6f 6c 73 20 61  .    protocols a
4b80: 72 65 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f  re configured fo
4b90: 72 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f  r this connectio
4ba0: 6e 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f  n. The connectio
4bb0: 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 0a  n continues.. *.
4bc0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
4bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4c00: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63  -----. */.static
4c10: 20 69 6e 74 0a 41 4c 50 4e 43 61 6c 6c 62 61 63   int.ALPNCallbac
4c20: 6b 28 53 53 4c 20 2a 73 73 6c 2c 20 63 6f 6e 73  k(SSL *ssl, cons
4c30: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
4c40: 2a 2a 6f 75 74 2c 20 75 6e 73 69 67 6e 65 64 20  **out, unsigned 
4c50: 63 68 61 72 20 2a 6f 75 74 6c 65 6e 2c 0a 09 63  char *outlen,..c
4c60: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
4c70: 61 72 20 2a 69 6e 2c 20 75 6e 73 69 67 6e 65 64  ar *in, unsigned
4c80: 20 69 6e 74 20 69 6e 6c 65 6e 2c 20 76 6f 69 64   int inlen, void
4c90: 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61   *arg) {.    Sta
4ca0: 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28  te *statePtr = (
4cb0: 53 74 61 74 65 2a 29 61 72 67 3b 0a 20 20 20 20  State*)arg;.    
4cc0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
4cd0: 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69  rp.= statePtr->i
4ce0: 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f  nterp;.    Tcl_O
4cf0: 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20  bj *cmdPtr;.    
4d00: 69 6e 74 20 63 6f 64 65 2c 20 72 65 73 3b 0a 0a  int code, res;..
4d10: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
4d20: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28  led");..    if (
4d30: 73 73 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61  ssl == NULL || a
4d40: 72 67 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72  rg == NULL) {..r
4d50: 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54  eturn SSL_TLSEXT
4d60: 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20  _ERR_NOACK;.    
4d70: 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63 74  }..    /* Select
4d80: 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 20 20 20   protocol */.   
4d90: 20 69 66 20 28 53 53 4c 5f 73 65 6c 65 63 74 5f   if (SSL_select_
4da0: 6e 65 78 74 5f 70 72 6f 74 6f 28 28 75 6e 73 69  next_proto((unsi
4db0: 67 6e 65 64 20 63 68 61 72 20 2a 2a 29 20 6f 75  gned char **) ou
4dc0: 74 2c 20 6f 75 74 6c 65 6e 2c 20 73 74 61 74 65  t, outlen, state
4dd0: 50 74 72 2d 3e 70 72 6f 74 6f 73 2c 20 73 74 61  Ptr->protos, sta
4de0: 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65  tePtr->protos_le
4df0: 6e 2c 0a 09 69 6e 2c 20 69 6e 6c 65 6e 29 20 3d  n,..in, inlen) =
4e00: 3d 20 4f 50 45 4e 53 53 4c 5f 4e 50 4e 5f 4e 45  = OPENSSL_NPN_NE
4e10: 47 4f 54 49 41 54 45 44 29 20 7b 0a 09 2f 2a 20  GOTIATED) {../* 
4e20: 4d 61 74 63 68 20 66 6f 75 6e 64 20 2a 2f 0a 09  Match found */..
4e30: 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54  res = SSL_TLSEXT
4e40: 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65  _ERR_OK;.    } e
4e50: 6c 73 65 20 7b 0a 09 2f 2a 20 4f 50 45 4e 53 53  lse {../* OPENSS
4e60: 4c 5f 4e 50 4e 5f 4e 4f 5f 4f 56 45 52 4c 41 50  L_NPN_NO_OVERLAP
4e70: 20 3d 20 4e 6f 20 6f 76 65 72 6c 61 70 2c 20 73   = No overlap, s
4e80: 6f 20 75 73 65 20 66 69 72 73 74 20 69 74 65 6d  o use first item
4e90: 20 66 72 6f 6d 20 63 6c 69 65 6e 74 20 70 72 6f   from client pro
4ea0: 74 6f 63 6f 6c 20 6c 69 73 74 20 2a 2f 0a 09 72  tocol list */..r
4eb0: 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f  es = SSL_TLSEXT_
4ec0: 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d  ERR_NOACK;.    }
4ed0: 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  ..    if (stateP
4ee0: 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63 6c  tr->vcmd == (Tcl
4ef0: 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72  _Obj*)NULL) {..r
4f00: 65 74 75 72 6e 20 72 65 73 3b 0a 20 20 20 20 7d  eturn res;.    }
4f10: 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20  ..    /* Create 
4f20: 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20  command to eval 
4f30: 77 69 74 68 20 66 6e 2c 20 63 68 61 6e 2c 20 64  with fn, chan, d
4f40: 65 70 74 68 2c 20 63 65 72 74 20 69 6e 66 6f 20  epth, cert info 
4f50: 6c 69 73 74 2c 20 73 74 61 74 75 73 2c 20 61 6e  list, status, an
4f60: 64 20 65 72 72 6f 72 20 61 72 67 73 20 2a 2f 0a  d error args */.
4f70: 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c      cmdPtr = Tcl
4f80: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74  _DuplicateObj(st
4f90: 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20  atePtr->vcmd);. 
4fa0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
4fb0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
4fc0: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
4fd0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 61 6c  NewStringObj("al
4fe0: 70 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54  pn", -1));.    T
4ff0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
5000: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
5010: 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c  cmdPtr,..    Tcl
5020: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63  _NewStringObj(Tc
5030: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65  l_GetChannelName
5040: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29  (statePtr->self)
5050: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f  , -1));.    Tcl_
5060: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
5070: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
5080: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
5090: 6e 67 4f 62 6a 28 28 63 6f 6e 73 74 20 63 68 61  ngObj((const cha
50a0: 72 20 2a 29 20 2a 6f 75 74 2c 20 2d 31 29 29 3b  r *) *out, -1));
50b0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
50c0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
50d0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
50e0: 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28  l_NewBooleanObj(
50f0: 72 65 73 20 3d 3d 20 53 53 4c 5f 54 4c 53 45 58  res == SSL_TLSEX
5100: 54 5f 45 52 52 5f 4f 4b 29 29 3b 0a 0a 20 20 20  T_ERR_OK));..   
5110: 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63   /* Eval callbac
5120: 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20  k command */.   
5130: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
5140: 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 69  t(cmdPtr);.    i
5150: 66 20 28 28 63 6f 64 65 20 3d 20 45 76 61 6c 43  f ((code = EvalC
5160: 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20  allback(interp, 
5170: 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72  statePtr, cmdPtr
5180: 29 29 20 3e 20 31 29 20 7b 0a 09 72 65 73 20 3d  )) > 1) {..res =
5190: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f   SSL_TLSEXT_ERR_
51a0: 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 20 65 6c 73  NOACK;.    } els
51b0: 65 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 31 29  e if (code == 1)
51c0: 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c   {..res = SSL_TL
51d0: 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20  SEXT_ERR_OK;.   
51e0: 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d   } else {..res =
51f0: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f   SSL_TLSEXT_ERR_
5200: 41 4c 45 52 54 5f 46 41 54 41 4c 3b 0a 20 20 20  ALERT_FATAL;.   
5210: 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52   }.    Tcl_DecrR
5220: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b  efCount(cmdPtr);
5230: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 3b  .    return res;
5240: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
5250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
5290: 0a 20 2a 20 41 64 76 65 72 74 69 73 65 20 50 72  . * Advertise Pr
52a0: 6f 74 6f 63 6f 6c 73 20 43 61 6c 6c 62 61 63 6b  otocols Callback
52b0: 20 66 6f 72 20 4e 65 78 74 20 50 72 6f 74 6f 63   for Next Protoc
52c0: 6f 6c 20 4e 65 67 6f 74 69 61 74 69 6f 6e 20 28  ol Negotiation (
52d0: 4e 50 4e 29 20 69 6e 20 53 65 72 76 65 72 48 65  NPN) in ServerHe
52e0: 6c 6c 6f 20 2d 2d 0a 20 2a 0a 20 2a 09 63 61 6c  llo --. *. *.cal
52f0: 6c 65 64 20 77 68 65 6e 20 61 20 54 4c 53 20 73  led when a TLS s
5300: 65 72 76 65 72 20 6e 65 65 64 73 20 61 20 6c 69  erver needs a li
5310: 73 74 20 6f 66 20 73 75 70 70 6f 72 74 65 64 20  st of supported 
5320: 70 72 6f 74 6f 63 6f 6c 73 20 66 6f 72 20 4e 65  protocols for Ne
5330: 78 74 0a 20 2a 09 50 72 6f 74 6f 63 6f 6c 20 4e  xt. *.Protocol N
5340: 65 67 6f 74 69 61 74 69 6f 6e 2e 0a 20 2a 0a 20  egotiation.. *. 
5350: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f  * Results:. *.No
5360: 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  ne. *. * Side ef
5370: 66 65 63 74 73 3a 0a 20 2a 0a 20 2a 20 52 65 74  fects:. *. * Ret
5380: 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53  urn codes:. *.SS
5390: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3a  L_TLSEXT_ERR_OK:
53a0: 20 4e 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 73 65   NPN protocol se
53b0: 6c 65 63 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e  lected. The conn
53c0: 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73  ection continues
53d0: 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f  .. *.SSL_TLSEXT_
53e0: 45 52 52 5f 4e 4f 41 43 4b 3a 20 4e 50 4e 20 70  ERR_NOACK: NPN p
53f0: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 65 6c 65  rotocol not sele
5400: 63 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63  cted. The connec
5410: 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a  tion continues..
5420: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
5430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5460: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 23 69 66  --------. */.#if
5470: 64 65 66 20 55 53 45 5f 4e 50 4e 0a 73 74 61 74  def USE_NPN.stat
5480: 69 63 20 69 6e 74 0a 4e 50 4e 43 61 6c 6c 62 61  ic int.NPNCallba
5490: 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73  ck(const SSL *ss
54a0: 6c 2c 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  l, const unsigne
54b0: 64 20 63 68 61 72 20 2a 2a 6f 75 74 2c 20 75 6e  d char **out, un
54c0: 73 69 67 6e 65 64 20 69 6e 74 20 2a 6f 75 74 6c  signed int *outl
54d0: 65 6e 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b  en, void *arg) {
54e0: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74  .    State *stat
54f0: 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61  ePtr = (State*)a
5500: 72 67 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66  rg;..    dprintf
5510: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20  ("Called");..   
5520: 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c   if (ssl == NULL
5530: 20 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 4c 4c 29   || arg == NULL)
5540: 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54   {..return SSL_T
5550: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b  LSEXT_ERR_NOACK;
5560: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  .    }..    /* S
5570: 65 74 20 70 72 6f 74 6f 63 6f 6c 73 20 6c 69 73  et protocols lis
5580: 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61  t */.    if (sta
5590: 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21 3d  tePtr->protos !=
55a0: 20 4e 55 4c 4c 29 20 7b 0a 09 2a 6f 75 74 20 3d   NULL) {..*out =
55b0: 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f   statePtr->proto
55c0: 73 3b 0a 09 2a 6f 75 74 6c 65 6e 20 3d 20 73 74  s;..*outlen = st
55d0: 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c  atePtr->protos_l
55e0: 65 6e 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  en;.    } else {
55f0: 0a 09 2a 6f 75 74 20 3d 20 4e 55 4c 4c 3b 0a 09  ..*out = NULL;..
5600: 2a 6f 75 74 6c 65 6e 20 3d 20 30 3b 0a 09 72 65  *outlen = 0;..re
5610: 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f  turn SSL_TLSEXT_
5620: 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d  ERR_NOACK;.    }
5630: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 53 4c 5f  .    return SSL_
5640: 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 7d  TLSEXT_ERR_OK;.}
5650: 0a 23 65 6e 64 69 66 0a 0c 0a 2f 2a 0a 20 2a 2d  .#endif.../*. *-
5660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
56a0: 2d 2d 0a 20 2a 0a 20 2a 20 53 4e 49 20 43 61 6c  --. *. * SNI Cal
56b0: 6c 62 61 63 6b 20 66 6f 72 20 53 65 72 76 65 72  lback for Server
56c0: 73 20 2d 2d 0a 20 2a 0a 20 2a 09 50 65 72 66 6f  s --. *. *.Perfo
56d0: 72 6d 20 73 65 72 76 65 72 2d 73 69 64 65 20 53  rm server-side S
56e0: 4e 49 20 68 6f 73 74 6e 61 6d 65 20 73 65 6c 65  NI hostname sele
56f0: 63 74 69 6f 6e 20 61 66 74 65 72 20 72 65 63 65  ction after rece
5700: 69 76 69 6e 67 20 53 4e 49 20 65 78 74 65 6e 73  iving SNI extens
5710: 69 6f 6e 0a 20 2a 09 69 6e 20 43 6c 69 65 6e 74  ion. *.in Client
5720: 20 48 65 6c 6c 6f 2e 20 43 61 6c 6c 65 64 20 61   Hello. Called a
5730: 66 74 65 72 20 68 65 6c 6c 6f 20 63 61 6c 6c 62  fter hello callb
5740: 61 63 6b 20 62 75 74 20 62 65 66 6f 72 65 20 41  ack but before A
5750: 4c 50 4e 20 63 61 6c 6c 62 61 63 6b 2e 0a 20 2a  LPN callback.. *
5760: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
5770: 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20  None. *. * Side 
5780: 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c  effects:. *.Call
5790: 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64  s callback (if d
57a0: 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65  efined). *. * Re
57b0: 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53  turn codes:. *.S
57c0: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b  SL_TLSEXT_ERR_OK
57d0: 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69  : SNI hostname i
57e0: 73 20 61 63 63 65 70 74 65 64 2e 20 54 68 65 20  s accepted. The 
57f0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69  connection conti
5800: 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53  nues.. *.SSL_TLS
5810: 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41  EXT_ERR_ALERT_FA
5820: 54 41 4c 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d  TAL: SNI hostnam
5830: 65 20 69 73 20 6e 6f 74 20 61 63 63 65 70 74 65  e is not accepte
5840: 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f  d. The connectio
5850: 6e 0a 20 2a 09 20 20 20 20 69 73 20 61 62 6f 72  n. *.    is abor
5860: 74 65 64 2e 20 44 65 66 61 75 6c 74 20 66 6f 72  ted. Default for
5870: 20 61 6c 65 72 74 20 69 73 20 53 53 4c 5f 41 44   alert is SSL_AD
5880: 5f 55 4e 52 45 43 4f 47 4e 49 5a 45 44 5f 4e 41  _UNRECOGNIZED_NA
5890: 4d 45 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58  ME.. *.SSL_TLSEX
58a0: 54 5f 45 52 52 5f 41 4c 45 52 54 5f 57 41 52 4e  T_ERR_ALERT_WARN
58b0: 49 4e 47 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d  ING: SNI hostnam
58c0: 65 20 69 73 20 6e 6f 74 20 61 63 63 65 70 74 65  e is not accepte
58d0: 64 2c 20 77 61 72 6e 69 6e 67 20 61 6c 65 72 74  d, warning alert
58e0: 0a 20 2a 09 20 20 20 20 73 65 6e 74 20 28 6e 6f  . *.    sent (no
58f0: 74 20 73 75 70 70 6f 72 74 65 64 20 69 6e 20 54  t supported in T
5900: 4c 53 76 31 2e 33 29 2e 20 54 68 65 20 63 6f 6e  LSv1.3). The con
5910: 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65  nection continue
5920: 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54  s.. *.SSL_TLSEXT
5930: 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20 53 4e 49 20  _ERR_NOACK: SNI 
5940: 68 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74 20  hostname is not 
5950: 61 63 63 65 70 74 65 64 20 61 6e 64 20 6e 6f 74  accepted and not
5960: 20 61 63 6b 6e 6f 77 6c 65 64 67 65 64 2c 0a 20   acknowledged,. 
5970: 2a 09 20 20 20 20 65 2e 67 2e 20 69 66 20 53 4e  *.    e.g. if SN
5980: 49 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 63  I has not been c
5990: 6f 6e 66 69 67 75 72 65 64 2e 20 54 68 65 20 63  onfigured. The c
59a0: 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e  onnection contin
59b0: 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  ues.. *. *------
59c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
59d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
59e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
59f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
5a00: 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 4e 49  /.static int.SNI
5a10: 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53  Callback(const S
5a20: 53 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 2a 61 6c  SL *ssl, int *al
5a30: 65 72 74 2c 20 76 6f 69 64 20 2a 61 72 67 29 20  ert, void *arg) 
5a40: 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61  {.    State *sta
5a50: 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29  tePtr = (State*)
5a60: 61 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74  arg;.    Tcl_Int
5a70: 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74  erp *interp.= st
5a80: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a  atePtr->interp;.
5a90: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64      Tcl_Obj *cmd
5aa0: 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64  Ptr;.    int cod
5ab0: 65 2c 20 72 65 73 3b 0a 20 20 20 20 63 6f 6e 73  e, res;.    cons
5ac0: 74 20 63 68 61 72 20 2a 73 65 72 76 65 72 6e 61  t char *serverna
5ad0: 6d 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20  me = NULL;..    
5ae0: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
5af0: 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 73 6c 20  );..    if (ssl 
5b00: 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 3d  == NULL || arg =
5b10: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  = NULL) {..retur
5b20: 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52  n SSL_TLSEXT_ERR
5b30: 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20  _NOACK;.    }.. 
5b40: 20 20 20 2f 2a 20 4f 6e 6c 79 20 77 6f 72 6b 73     /* Only works
5b50: 20 66 6f 72 20 54 4c 53 20 31 2e 32 20 61 6e 64   for TLS 1.2 and
5b60: 20 65 61 72 6c 69 65 72 20 2a 2f 0a 20 20 20 20   earlier */.    
5b70: 73 65 72 76 65 72 6e 61 6d 65 20 3d 20 53 53 4c  servername = SSL
5b80: 5f 67 65 74 5f 73 65 72 76 65 72 6e 61 6d 65 28  _get_servername(
5b90: 73 73 6c 2c 20 54 4c 53 45 58 54 5f 4e 41 4d 45  ssl, TLSEXT_NAME
5ba0: 54 59 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 3b  TYPE_host_name);
5bb0: 0a 20 20 20 20 69 66 20 28 21 73 65 72 76 65 72  .    if (!server
5bc0: 6e 61 6d 65 20 7c 7c 20 73 65 72 76 65 72 6e 61  name || serverna
5bd0: 6d 65 5b 30 5d 20 3d 3d 20 27 5c 30 27 29 20 7b  me[0] == '\0') {
5be0: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53  ..return SSL_TLS
5bf0: 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20  EXT_ERR_NOACK;. 
5c00: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 74     }..    if (st
5c10: 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 3d 20  atePtr->vcmd == 
5c20: 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20  (Tcl_Obj*)NULL) 
5c30: 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c  {..return SSL_TL
5c40: 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20  SEXT_ERR_OK;.   
5c50: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74   }..    /* Creat
5c60: 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61  e command to eva
5c70: 6c 20 77 69 74 68 20 66 6e 2c 20 63 68 61 6e 2c  l with fn, chan,
5c80: 20 61 6e 64 20 73 65 72 76 65 72 20 6e 61 6d 65   and server name
5c90: 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 63 6d 64   args */.    cmd
5ca0: 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63  Ptr = Tcl_Duplic
5cb0: 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d  ateObj(statePtr-
5cc0: 3e 76 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f  >vcmd);.    Tcl_
5cd0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
5ce0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
5cf0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
5d00: 6e 67 4f 62 6a 28 22 73 6e 69 22 2c 20 2d 31 29  ngObj("sni", -1)
5d10: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
5d20: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
5d30: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a  interp, cmdPtr,.
5d40: 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69  .    Tcl_NewStri
5d50: 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61  ngObj(Tcl_GetCha
5d60: 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74  nnelName(statePt
5d70: 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a  r->self), -1));.
5d80: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
5d90: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
5da0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c  erp, cmdPtr, Tcl
5db0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 65  _NewStringObj(se
5dc0: 72 76 65 72 6e 61 6d 65 20 2c 20 2d 31 29 29 3b  rvername , -1));
5dd0: 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61  ..    /* Eval ca
5de0: 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a  llback command *
5df0: 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  /.    Tcl_IncrRe
5e00: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a  fCount(cmdPtr);.
5e10: 20 20 20 20 69 66 20 28 28 63 6f 64 65 20 3d 20      if ((code = 
5e20: 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74  EvalCallback(int
5e30: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63  erp, statePtr, c
5e40: 6d 64 50 74 72 29 29 20 3e 20 31 29 20 7b 0a 09  mdPtr)) > 1) {..
5e50: 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54  res = SSL_TLSEXT
5e60: 5f 45 52 52 5f 41 4c 45 52 54 5f 57 41 52 4e 49  _ERR_ALERT_WARNI
5e70: 4e 47 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53  NG;..*alert = SS
5e80: 4c 5f 41 44 5f 55 4e 52 45 43 4f 47 4e 49 5a 45  L_AD_UNRECOGNIZE
5e90: 44 5f 4e 41 4d 45 3b 20 2f 2a 20 4e 6f 74 20 73  D_NAME; /* Not s
5ea0: 75 70 70 6f 72 74 65 64 20 62 79 20 54 4c 53 20  upported by TLS 
5eb0: 31 2e 33 20 2a 2f 0a 20 20 20 20 7d 20 65 6c 73  1.3 */.    } els
5ec0: 65 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 31 29  e if (code == 1)
5ed0: 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c   {..res = SSL_TL
5ee0: 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20  SEXT_ERR_OK;.   
5ef0: 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d   } else {..res =
5f00: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f   SSL_TLSEXT_ERR_
5f10: 41 4c 45 52 54 5f 46 41 54 41 4c 3b 0a 09 2a 61  ALERT_FATAL;..*a
5f20: 6c 65 72 74 20 3d 20 53 53 4c 5f 41 44 5f 55 4e  lert = SSL_AD_UN
5f30: 52 45 43 4f 47 4e 49 5a 45 44 5f 4e 41 4d 45 3b  RECOGNIZED_NAME;
5f40: 20 2f 2a 20 4e 6f 74 20 73 75 70 70 6f 72 74 65   /* Not supporte
5f50: 64 20 62 79 20 54 4c 53 20 31 2e 33 20 2a 2f 0a  d by TLS 1.3 */.
5f60: 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65      }.    Tcl_De
5f70: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74  crRefCount(cmdPt
5f80: 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  r);.    return r
5f90: 65 73 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d  es;.}.../*. *---
5fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5fe0: 0a 20 2a 0a 20 2a 20 43 6c 69 65 6e 74 48 65 6c  . *. * ClientHel
5ff0: 6c 6f 20 48 61 6e 64 73 68 61 6b 65 20 43 61 6c  lo Handshake Cal
6000: 6c 62 61 63 6b 20 66 6f 72 20 53 65 72 76 65 72  lback for Server
6010: 73 20 2d 2d 0a 20 2a 0a 20 2a 09 55 73 65 64 20  s --. *. *.Used 
6020: 62 79 20 73 65 72 76 65 72 20 74 6f 20 65 78 61  by server to exa
6030: 6d 69 6e 65 20 74 68 65 20 73 65 72 76 65 72 20  mine the server 
6040: 6e 61 6d 65 20 69 6e 64 69 63 61 74 69 6f 6e 20  name indication 
6050: 28 53 4e 49 29 20 65 78 74 65 6e 73 69 6f 6e 0a  (SNI) extension.
6060: 20 2a 09 70 72 6f 76 69 64 65 64 20 62 79 20 74   *.provided by t
6070: 68 65 20 63 6c 69 65 6e 74 20 69 6e 20 6f 72 64  he client in ord
6080: 65 72 20 74 6f 20 73 65 6c 65 63 74 20 61 6e 20  er to select an 
6090: 61 70 70 72 6f 70 72 69 61 74 65 20 63 65 72 74  appropriate cert
60a0: 69 66 69 63 61 74 65 20 74 6f 0a 20 2a 09 70 72  ificate to. *.pr
60b0: 65 73 65 6e 74 2c 20 61 6e 64 20 6d 61 6b 65 20  esent, and make 
60c0: 6f 74 68 65 72 20 63 6f 6e 66 69 67 75 72 61 74  other configurat
60d0: 69 6f 6e 20 61 64 6a 75 73 74 6d 65 6e 74 73 20  ion adjustments 
60e0: 72 65 6c 65 76 61 6e 74 20 74 6f 20 74 68 61 74  relevant to that
60f0: 20 73 65 72 76 65 72 0a 20 2a 09 6e 61 6d 65 20   server. *.name 
6100: 61 6e 64 20 69 74 73 20 63 6f 6e 66 69 67 75 72  and its configur
6110: 61 74 69 6f 6e 2e 20 54 68 69 73 20 69 6e 63 6c  ation. This incl
6120: 75 64 65 73 20 73 77 61 70 70 69 6e 67 20 6f 75  udes swapping ou
6130: 74 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64  t the associated
6140: 0a 20 2a 09 53 53 4c 5f 43 54 58 20 70 6f 69 6e  . *.SSL_CTX poin
6150: 74 65 72 2c 20 6d 6f 64 69 66 79 69 6e 67 20 74  ter, modifying t
6160: 68 65 20 73 65 72 76 65 72 27 73 20 6c 69 73 74  he server's list
6170: 20 6f 66 20 70 65 72 6d 69 74 74 65 64 20 54 4c   of permitted TL
6180: 53 20 76 65 72 73 69 6f 6e 73 2c 0a 20 2a 09 63  S versions,. *.c
6190: 68 61 6e 67 69 6e 67 20 74 68 65 20 73 65 72 76  hanging the serv
61a0: 65 72 27 73 20 63 69 70 68 65 72 20 6c 69 73 74  er's cipher list
61b0: 20 69 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f 20   in response to 
61c0: 74 68 65 20 63 6c 69 65 6e 74 27 73 20 63 69 70  the client's cip
61d0: 68 65 72 20 6c 69 73 74 2c 20 65 74 63 2e 0a 20  her list, etc.. 
61e0: 2a 09 43 61 6c 6c 65 64 20 62 65 66 6f 72 65 20  *.Called before 
61f0: 53 4e 49 20 61 6e 64 20 41 4c 50 4e 20 63 61 6c  SNI and ALPN cal
6200: 6c 62 61 63 6b 73 2e 0a 20 2a 0a 20 2a 20 52 65  lbacks.. *. * Re
6210: 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20  sults:. *.None. 
6220: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
6230: 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c  s:. *.Calls call
6240: 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64  back (if defined
6250: 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63  ). *. * Return c
6260: 6f 64 65 73 3a 0a 20 2a 09 53 53 4c 5f 43 4c 49  odes:. *.SSL_CLI
6270: 45 4e 54 5f 48 45 4c 4c 4f 5f 52 45 54 52 59 3a  ENT_HELLO_RETRY:
6280: 20 73 75 73 70 65 6e 64 20 74 68 65 20 68 61 6e   suspend the han
6290: 64 73 68 61 6b 65 2c 20 61 6e 64 20 74 68 65 20  dshake, and the 
62a0: 68 61 6e 64 73 68 61 6b 65 20 66 75 6e 63 74 69  handshake functi
62b0: 6f 6e 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 69  on will return i
62c0: 6d 6d 65 64 69 61 74 65 6c 79 0a 20 2a 09 53 53  mmediately. *.SS
62d0: 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45  L_CLIENT_HELLO_E
62e0: 52 52 4f 52 3a 20 66 61 69 6c 75 72 65 2c 20 74  RROR: failure, t
62f0: 65 72 6d 69 6e 61 74 65 20 63 6f 6e 6e 65 63 74  erminate connect
6300: 69 6f 6e 2e 20 53 65 74 20 61 6c 65 72 74 20 74  ion. Set alert t
6310: 6f 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 2a  o error code.. *
6320: 09 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c  .SSL_CLIENT_HELL
6330: 4f 5f 53 55 43 43 45 53 53 3a 20 73 75 63 63 65  O_SUCCESS: succe
6340: 73 73 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  ss. *. *--------
6350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
6390: 73 74 61 74 69 63 20 69 6e 74 0a 48 65 6c 6c 6f  static int.Hello
63a0: 43 61 6c 6c 62 61 63 6b 28 53 53 4c 20 2a 73 73  Callback(SSL *ss
63b0: 6c 2c 20 69 6e 74 20 2a 61 6c 65 72 74 2c 20 76  l, int *alert, v
63c0: 6f 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 20  oid *arg) {.    
63d0: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20  State *statePtr 
63e0: 3d 20 28 53 74 61 74 65 2a 29 61 72 67 3b 0a 20  = (State*)arg;. 
63f0: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69     Tcl_Interp *i
6400: 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72  nterp.= statePtr
6410: 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63  ->interp;.    Tc
6420: 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20  l_Obj *cmdPtr;. 
6430: 20 20 20 69 6e 74 20 63 6f 64 65 2c 20 72 65 73     int code, res
6440: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
6450: 20 2a 73 65 72 76 65 72 6e 61 6d 65 3b 0a 20 20   *servername;.  
6460: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
6470: 20 63 68 61 72 20 2a 70 3b 0a 20 20 20 20 73 69   char *p;.    si
6480: 7a 65 5f 74 20 6c 65 6e 2c 20 72 65 6d 61 69 6e  ze_t len, remain
6490: 69 6e 67 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74  ing;..    dprint
64a0: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20  f("Called");..  
64b0: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
64c0: 76 63 6d 64 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a  vcmd == (Tcl_Obj
64d0: 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  *)NULL) {..retur
64e0: 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c  n SSL_CLIENT_HEL
64f0: 4c 4f 5f 53 55 43 43 45 53 53 3b 0a 20 20 20 20  LO_SUCCESS;.    
6500: 7d 20 65 6c 73 65 20 69 66 20 28 73 73 6c 20 3d  } else if (ssl =
6510: 3d 20 28 63 6f 6e 73 74 20 53 53 4c 20 2a 29 4e  = (const SSL *)N
6520: 55 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 28 76  ULL || arg == (v
6530: 6f 69 64 20 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72  oid *)NULL) {..r
6540: 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54  eturn SSL_CLIENT
6550: 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20  _HELLO_ERROR;.  
6560: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20    }..    /* Get 
6570: 6e 61 6d 65 73 20 2a 2f 0a 20 20 20 20 69 66 20  names */.    if 
6580: 28 21 53 53 4c 5f 63 6c 69 65 6e 74 5f 68 65 6c  (!SSL_client_hel
6590: 6c 6f 5f 67 65 74 30 5f 65 78 74 28 73 73 6c 2c  lo_get0_ext(ssl,
65a0: 20 54 4c 53 45 58 54 5f 54 59 50 45 5f 73 65 72   TLSEXT_TYPE_ser
65b0: 76 65 72 5f 6e 61 6d 65 2c 20 26 70 2c 20 26 72  ver_name, &p, &r
65c0: 65 6d 61 69 6e 69 6e 67 29 20 7c 7c 20 72 65 6d  emaining) || rem
65d0: 61 69 6e 69 6e 67 20 3c 3d 20 32 29 20 7b 0a 09  aining <= 2) {..
65e0: 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 53  *alert = SSL_R_S
65f0: 53 4c 56 33 5f 41 4c 45 52 54 5f 49 4c 4c 45 47  SLV3_ALERT_ILLEG
6600: 41 4c 5f 50 41 52 41 4d 45 54 45 52 3b 0a 09 72  AL_PARAMETER;..r
6610: 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54  eturn SSL_CLIENT
6620: 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20  _HELLO_ERROR;.  
6630: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72    }..    /* Extr
6640: 61 63 74 20 74 68 65 20 6c 65 6e 67 74 68 20 6f  act the length o
6650: 66 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6c  f the supplied l
6660: 69 73 74 20 6f 66 20 6e 61 6d 65 73 2e 20 2a 2f  ist of names. */
6670: 0a 20 20 20 20 6c 65 6e 20 3d 20 28 2a 28 70 2b  .    len = (*(p+
6680: 2b 29 20 3c 3c 20 38 29 3b 0a 20 20 20 20 6c 65  +) << 8);.    le
6690: 6e 20 2b 3d 20 2a 28 70 2b 2b 29 3b 0a 20 20 20  n += *(p++);.   
66a0: 20 69 66 20 28 6c 65 6e 20 2b 20 32 20 21 3d 20   if (len + 2 != 
66b0: 72 65 6d 61 69 6e 69 6e 67 29 20 7b 0a 09 2a 61  remaining) {..*a
66c0: 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 53 53 4c  lert = SSL_R_SSL
66d0: 56 33 5f 41 4c 45 52 54 5f 49 4c 4c 45 47 41 4c  V3_ALERT_ILLEGAL
66e0: 5f 50 41 52 41 4d 45 54 45 52 3b 0a 09 72 65 74  _PARAMETER;..ret
66f0: 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48  urn SSL_CLIENT_H
6700: 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20  ELLO_ERROR;.    
6710: 7d 0a 20 20 20 20 72 65 6d 61 69 6e 69 6e 67 20  }.    remaining 
6720: 3d 20 6c 65 6e 3b 0a 0a 20 20 20 20 2f 2a 20 54  = len;..    /* T
6730: 68 65 20 6c 69 73 74 20 69 6e 20 70 72 61 63 74  he list in pract
6740: 69 63 65 20 6f 6e 6c 79 20 68 61 73 20 61 20 73  ice only has a s
6750: 69 6e 67 6c 65 20 65 6c 65 6d 65 6e 74 2c 20 73  ingle element, s
6760: 6f 20 77 65 20 6f 6e 6c 79 20 63 6f 6e 73 69 64  o we only consid
6770: 65 72 20 74 68 65 20 66 69 72 73 74 20 6f 6e 65  er the first one
6780: 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 72 65 6d  . */.    if (rem
6790: 61 69 6e 69 6e 67 20 3d 3d 20 30 20 7c 7c 20 2a  aining == 0 || *
67a0: 70 2b 2b 20 21 3d 20 54 4c 53 45 58 54 5f 4e 41  p++ != TLSEXT_NA
67b0: 4d 45 54 59 50 45 5f 68 6f 73 74 5f 6e 61 6d 65  METYPE_host_name
67c0: 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53  ) {..*alert = SS
67d0: 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f  L_R_TLSV1_ALERT_
67e0: 49 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a  INTERNAL_ERROR;.
67f0: 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45  .return SSL_CLIE
6800: 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a  NT_HELLO_ERROR;.
6810: 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e      }.    remain
6820: 69 6e 67 2d 2d 3b 0a 0a 20 20 20 20 2f 2a 20 4e  ing--;..    /* N
6830: 6f 77 20 77 65 20 63 61 6e 20 66 69 6e 61 6c 6c  ow we can finall
6840: 79 20 70 75 6c 6c 20 6f 75 74 20 74 68 65 20 62  y pull out the b
6850: 79 74 65 20 61 72 72 61 79 20 77 69 74 68 20 74  yte array with t
6860: 68 65 20 61 63 74 75 61 6c 20 68 6f 73 74 6e 61  he actual hostna
6870: 6d 65 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 72  me. */.    if (r
6880: 65 6d 61 69 6e 69 6e 67 20 3c 3d 20 32 29 20 7b  emaining <= 2) {
6890: 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52  ..*alert = SSL_R
68a0: 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49 4e 54  _TLSV1_ALERT_INT
68b0: 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09 72 65  ERNAL_ERROR;..re
68c0: 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f  turn SSL_CLIENT_
68d0: 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20  HELLO_ERROR;.   
68e0: 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 28 2a 28   }.    len = (*(
68f0: 70 2b 2b 29 20 3c 3c 20 38 29 3b 0a 20 20 20 20  p++) << 8);.    
6900: 6c 65 6e 20 2b 3d 20 2a 28 70 2b 2b 29 3b 0a 20  len += *(p++);. 
6910: 20 20 20 69 66 20 28 6c 65 6e 20 2b 20 32 20 3e     if (len + 2 >
6920: 20 72 65 6d 61 69 6e 69 6e 67 29 20 7b 0a 09 2a   remaining) {..*
6930: 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c  alert = SSL_R_TL
6940: 53 56 31 5f 41 4c 45 52 54 5f 49 4e 54 45 52 4e  SV1_ALERT_INTERN
6950: 41 4c 5f 45 52 52 4f 52 3b 0a 09 72 65 74 75 72  AL_ERROR;..retur
6960: 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c  n SSL_CLIENT_HEL
6970: 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  LO_ERROR;.    }.
6980: 20 20 20 20 72 65 6d 61 69 6e 69 6e 67 20 3d 20      remaining = 
6990: 6c 65 6e 3b 0a 20 20 20 20 73 65 72 76 65 72 6e  len;.    servern
69a0: 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ame = (const cha
69b0: 72 20 2a 29 70 3b 0a 0a 20 20 20 20 2f 2a 20 43  r *)p;..    /* C
69c0: 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f  reate command to
69d0: 20 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 63   eval with fn, c
69e0: 68 61 6e 2c 20 61 6e 64 20 73 65 72 76 65 72 20  han, and server 
69f0: 6e 61 6d 65 20 61 72 67 73 20 2a 2f 0a 20 20 20  name args */.   
6a00: 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75   cmdPtr = Tcl_Du
6a10: 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65  plicateObj(state
6a20: 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20 20  Ptr->vcmd);.    
6a30: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
6a40: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
6a50: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77   cmdPtr, Tcl_New
6a60: 53 74 72 69 6e 67 4f 62 6a 28 22 68 65 6c 6c 6f  StringObj("hello
6a70: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c  ", -1));.    Tcl
6a80: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
6a90: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
6aa0: 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e  dPtr,..    Tcl_N
6ab0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f  ewStringObj(Tcl_
6ac0: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73  GetChannelName(s
6ad0: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20  tatePtr->self), 
6ae0: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  -1));.    Tcl_Li
6af0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
6b00: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
6b10: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
6b20: 4f 62 6a 28 73 65 72 76 65 72 6e 61 6d 65 2c 20  Obj(servername, 
6b30: 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 29 29  (Tcl_Size) len))
6b40: 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63  ;..    /* Eval c
6b50: 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20  allback command 
6b60: 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52  */.    Tcl_IncrR
6b70: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b  efCount(cmdPtr);
6b80: 0a 20 20 20 20 69 66 20 28 28 63 6f 64 65 20 3d  .    if ((code =
6b90: 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e   EvalCallback(in
6ba0: 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20  terp, statePtr, 
6bb0: 63 6d 64 50 74 72 29 29 20 3e 20 31 29 20 7b 0a  cmdPtr)) > 1) {.
6bc0: 09 72 65 73 20 3d 20 53 53 4c 5f 43 4c 49 45 4e  .res = SSL_CLIEN
6bd0: 54 5f 48 45 4c 4c 4f 5f 52 45 54 52 59 3b 0a 09  T_HELLO_RETRY;..
6be0: 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54  *alert = SSL_R_T
6bf0: 4c 53 56 31 5f 41 4c 45 52 54 5f 55 53 45 52 5f  LSV1_ALERT_USER_
6c00: 43 41 4e 43 45 4c 4c 45 44 3b 0a 20 20 20 20 7d  CANCELLED;.    }
6c10: 20 65 6c 73 65 20 69 66 20 28 63 6f 64 65 20 3d   else if (code =
6c20: 3d 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53  = 1) {..res = SS
6c30: 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 53  L_CLIENT_HELLO_S
6c40: 55 43 43 45 53 53 3b 0a 20 20 20 20 7d 20 65 6c  UCCESS;.    } el
6c50: 73 65 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f  se {..res = SSL_
6c60: 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52  CLIENT_HELLO_ERR
6c70: 4f 52 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53  OR;..*alert = SS
6c80: 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f  L_R_TLSV1_ALERT_
6c90: 49 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a  INTERNAL_ERROR;.
6ca0: 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65      }.    Tcl_De
6cb0: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74  crRefCount(cmdPt
6cc0: 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  r);.    return r
6cd0: 65 73 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a  es;.}.../*******
6ce0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f  *************/./
6cf0: 2a 20 43 6f 6d 6d 61 6e 64 73 20 20 20 20 20 20  * Commands      
6d00: 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a     */./*********
6d10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
6d20: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
6d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d60: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 69 70  ------. *. * Cip
6d70: 68 65 72 73 4f 62 6a 43 6d 64 20 2d 2d 20 6c 69  hersObjCmd -- li
6d80: 73 74 20 61 76 61 69 6c 61 62 6c 65 20 63 69 70  st available cip
6d90: 68 65 72 73 0a 20 2a 0a 20 2a 09 54 68 69 73 20  hers. *. *.This 
6da0: 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76  procedure is inv
6db0: 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20  oked to process 
6dc0: 74 68 65 20 22 74 6c 73 3a 3a 63 69 70 68 65 72  the "tls::cipher
6dd0: 73 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 09 74 6f  s" command. *.to
6de0: 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65 20   list available 
6df0: 63 69 70 68 65 72 73 2c 20 62 61 73 65 64 20 75  ciphers, based u
6e00: 70 6f 6e 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c  pon protocol sel
6e10: 65 63 74 65 64 2e 0a 20 2a 0a 20 2a 20 52 65 73  ected.. *. * Res
6e20: 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64  ults:. *.A stand
6e30: 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 20 6c  ard Tcl result l
6e40: 69 73 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  ist.. *. * Side 
6e50: 65 66 66 65 63 74 73 3a 0a 20 2a 09 63 6f 6e 73  effects:. *.cons
6e60: 74 72 75 63 74 73 20 61 6e 64 20 64 65 73 74 72  tructs and destr
6e70: 6f 79 73 20 53 53 4c 20 63 6f 6e 74 65 78 74 20  oys SSL context 
6e80: 28 43 54 58 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  (CTX). *. *-----
6e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
6ed0: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
6ee0: 63 68 61 72 20 2a 70 72 6f 74 6f 63 6f 6c 73 5b  char *protocols[
6ef0: 5d 20 3d 20 7b 0a 09 22 73 73 6c 32 22 2c 20 22  ] = {.."ssl2", "
6f00: 73 73 6c 33 22 2c 20 22 74 6c 73 31 22 2c 20 22  ssl3", "tls1", "
6f10: 74 6c 73 31 2e 31 22 2c 20 22 74 6c 73 31 2e 32  tls1.1", "tls1.2
6f20: 22 2c 20 22 74 6c 73 31 2e 33 22 2c 20 4e 55 4c  ", "tls1.3", NUL
6f30: 4c 0a 7d 3b 0a 65 6e 75 6d 20 70 72 6f 74 6f 63  L.};.enum protoc
6f40: 6f 6c 20 7b 0a 20 20 20 20 54 4c 53 5f 53 53 4c  ol {.    TLS_SSL
6f50: 32 2c 20 54 4c 53 5f 53 53 4c 33 2c 20 54 4c 53  2, TLS_SSL3, TLS
6f60: 5f 54 4c 53 31 2c 20 54 4c 53 5f 54 4c 53 31 5f  _TLS1, TLS_TLS1_
6f70: 31 2c 20 54 4c 53 5f 54 4c 53 31 5f 32 2c 20 54  1, TLS_TLS1_2, T
6f80: 4c 53 5f 54 4c 53 31 5f 33 2c 20 54 4c 53 5f 4e  LS_TLS1_3, TLS_N
6f90: 4f 4e 45 0a 7d 3b 0a 0a 73 74 61 74 69 63 20 69  ONE.};..static i
6fa0: 6e 74 0a 43 69 70 68 65 72 73 4f 62 6a 43 6d 64  nt.CiphersObjCmd
6fb0: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65  (ClientData clie
6fc0: 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65  ntData, Tcl_Inte
6fd0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20  rp *interp, int 
6fe0: 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63  objc, Tcl_Obj *c
6ff0: 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20  onst objv[]) {. 
7000: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50     Tcl_Obj *objP
7010: 74 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53  tr = NULL;.    S
7020: 53 4c 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e 55  SL_CTX *ctx = NU
7030: 4c 4c 3b 0a 20 20 20 20 53 53 4c 20 2a 73 73 6c  LL;.    SSL *ssl
7040: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 54 41   = NULL;.    STA
7050: 43 4b 5f 4f 46 28 53 53 4c 5f 43 49 50 48 45 52  CK_OF(SSL_CIPHER
7060: 29 20 2a 73 6b 3b 0a 20 20 20 20 63 68 61 72 20  ) *sk;.    char 
7070: 62 75 66 5b 42 55 46 53 49 5a 5d 3b 0a 20 20 20  buf[BUFSIZ];.   
7080: 20 69 6e 74 20 69 6e 64 65 78 2c 20 76 65 72 62   int index, verb
7090: 6f 73 65 20 3d 20 30 2c 20 75 73 65 5f 73 75 70  ose = 0, use_sup
70a0: 70 6f 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20  ported = 0;.    
70b0: 63 6f 6e 73 74 20 53 53 4c 5f 4d 45 54 48 4f 44  const SSL_METHOD
70c0: 20 2a 6d 65 74 68 6f 64 3b 0a 20 20 20 20 28 76   *method;.    (v
70d0: 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 74 61 3b  oid) clientData;
70e0: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
70f0: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66  alled");..    if
7100: 20 28 28 6f 62 6a 63 20 3c 20 32 29 20 7c 7c 20   ((objc < 2) || 
7110: 28 6f 62 6a 63 20 3e 20 34 29 29 20 7b 0a 09 54  (objc > 4)) {..T
7120: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
7130: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
7140: 20 22 70 72 6f 74 6f 63 6f 6c 20 3f 76 65 72 62   "protocol ?verb
7150: 6f 73 65 3f 20 3f 73 75 70 70 6f 72 74 65 64 3f  ose? ?supported?
7160: 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  ");..return TCL_
7170: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
7180: 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 65   if (Tcl_GetInde
7190: 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  xFromObj(interp,
71a0: 20 6f 62 6a 76 5b 31 5d 2c 20 70 72 6f 74 6f 63   objv[1], protoc
71b0: 6f 6c 73 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c  ols, "protocol",
71c0: 20 30 2c 20 26 69 6e 64 65 78 29 20 21 3d 20 54   0, &index) != T
71d0: 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e  CL_OK) {..return
71e0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
71f0: 7d 0a 20 20 20 20 69 66 20 28 28 6f 62 6a 63 20  }.    if ((objc 
7200: 3e 20 32 29 20 26 26 20 54 63 6c 5f 47 65 74 42  > 2) && Tcl_GetB
7210: 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e  ooleanFromObj(in
7220: 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
7230: 76 65 72 62 6f 73 65 29 20 21 3d 20 54 43 4c 5f  verbose) != TCL_
7240: 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43  OK) {..return TC
7250: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
7260: 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3e 20 33     if ((objc > 3
7270: 29 20 26 26 20 54 63 6c 5f 47 65 74 42 6f 6f 6c  ) && Tcl_GetBool
7280: 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  eanFromObj(inter
7290: 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 75 73 65  p, objv[3], &use
72a0: 5f 73 75 70 70 6f 72 74 65 64 29 20 21 3d 20 54  _supported) != T
72b0: 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e  CL_OK) {..return
72c0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
72d0: 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72  }..    ERR_clear
72e0: 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 73  _error();..    s
72f0: 77 69 74 63 68 20 28 28 65 6e 75 6d 20 70 72 6f  witch ((enum pro
7300: 74 6f 63 6f 6c 29 69 6e 64 65 78 29 20 7b 0a 09  tocol)index) {..
7310: 63 61 73 65 20 54 4c 53 5f 53 53 4c 32 3a 0a 23  case TLS_SSL2:.#
7320: 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49  if OPENSSL_VERSI
7330: 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 78 31  ON_NUMBER >= 0x1
7340: 30 31 30 30 30 30 30 4c 20 7c 7c 20 64 65 66 69  0100000L || defi
7350: 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 7c 7c 20  ned(NO_SSL2) || 
7360: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
7370: 4e 4f 5f 53 53 4c 32 29 0a 09 20 20 20 20 54 63  NO_SSL2)..    Tc
7380: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
7390: 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73  nterp, protocols
73a0: 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74  [index], ": prot
73b0: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74  ocol not support
73c0: 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  ed", (char *) NU
73d0: 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e  LL);..    return
73e0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73   TCL_ERROR;.#els
73f0: 65 0a 09 20 20 20 20 6d 65 74 68 6f 64 20 3d 20  e..    method = 
7400: 53 53 4c 76 32 5f 6d 65 74 68 6f 64 28 29 3b 20  SSLv2_method(); 
7410: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63  break;.#endif..c
7420: 61 73 65 20 54 4c 53 5f 53 53 4c 33 3a 0a 23 69  ase TLS_SSL3:.#i
7430: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c  f defined(NO_SSL
7440: 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50  3) || defined(OP
7450: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 7c  ENSSL_NO_SSL3) |
7460: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  | defined(OPENSS
7470: 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44  L_NO_SSL3_METHOD
7480: 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  )..    Tcl_Appen
7490: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
74a0: 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d  protocols[index]
74b0: 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f  , ": protocol no
74c0: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63  t supported", (c
74d0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20  har *) NULL);.. 
74e0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
74f0: 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20  ROR;.#else..    
7500: 6d 65 74 68 6f 64 20 3d 20 53 53 4c 76 33 5f 6d  method = SSLv3_m
7510: 65 74 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a  ethod(); break;.
7520: 23 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53  #endif..case TLS
7530: 5f 54 4c 53 31 3a 0a 23 69 66 20 64 65 66 69 6e  _TLS1:.#if defin
7540: 65 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64  ed(NO_TLS1) || d
7550: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
7560: 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e  O_TLS1) || defin
7570: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
7580: 53 31 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20  S1_METHOD)..    
7590: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
75a0: 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f  (interp, protoco
75b0: 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72  ls[index], ": pr
75c0: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f  otocol not suppo
75d0: 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20  rted", (char *) 
75e0: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75  NULL);..    retu
75f0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65  rn TCL_ERROR;.#e
7600: 6c 73 65 0a 09 20 20 20 20 6d 65 74 68 6f 64 20  lse..    method 
7610: 3d 20 54 4c 53 76 31 5f 6d 65 74 68 6f 64 28 29  = TLSv1_method()
7620: 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a  ; break;.#endif.
7630: 09 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 5f 31  .case TLS_TLS1_1
7640: 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f  :.#if defined(NO
7650: 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69  _TLS1_1) || defi
7660: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
7670: 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65  LS1_1) || define
7680: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
7690: 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20  1_1_METHOD)..   
76a0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
76b0: 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63  t(interp, protoc
76c0: 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70  ols[index], ": p
76d0: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70  rotocol not supp
76e0: 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29  orted", (char *)
76f0: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74   NULL);..    ret
7700: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23  urn TCL_ERROR;.#
7710: 65 6c 73 65 0a 09 20 20 20 20 6d 65 74 68 6f 64  else..    method
7720: 20 3d 20 54 4c 53 76 31 5f 31 5f 6d 65 74 68 6f   = TLSv1_1_metho
7730: 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64  d(); break;.#end
7740: 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c 53  if..case TLS_TLS
7750: 31 5f 32 3a 0a 23 69 66 20 64 65 66 69 6e 65 64  1_2:.#if defined
7760: 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64  (NO_TLS1_2) || d
7770: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
7780: 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66  O_TLS1_2) || def
7790: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
77a0: 54 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 09  TLS1_2_METHOD)..
77b0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
77c0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f  sult(interp, pro
77d0: 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22  tocols[index], "
77e0: 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73  : protocol not s
77f0: 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72  upported", (char
7800: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20   *) NULL);..    
7810: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
7820: 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 74  ;.#else..    met
7830: 68 6f 64 20 3d 20 54 4c 53 76 31 5f 32 5f 6d 65  hod = TLSv1_2_me
7840: 74 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23  thod(); break;.#
7850: 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f  endif..case TLS_
7860: 54 4c 53 31 5f 33 3a 0a 23 69 66 20 64 65 66 69  TLS1_3:.#if defi
7870: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c  ned(NO_TLS1_3) |
7880: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  | defined(OPENSS
7890: 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 09 20 20  L_NO_TLS1_3)..  
78a0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
78b0: 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f  lt(interp, proto
78c0: 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20  cols[index], ": 
78d0: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70  protocol not sup
78e0: 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a  ported", (char *
78f0: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65  ) NULL);..    re
7900: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
7910: 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 74 68 6f  #else..    metho
7920: 64 20 3d 20 54 4c 53 5f 6d 65 74 68 6f 64 28 29  d = TLS_method()
7930: 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73  ;..    SSL_CTX_s
7940: 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 72  et_min_proto_ver
7950: 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33  sion(ctx, TLS1_3
7960: 5f 56 45 52 53 49 4f 4e 29 3b 0a 09 20 20 20 20  _VERSION);..    
7970: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 78 5f  SSL_CTX_set_max_
7980: 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74  proto_version(ct
7990: 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f  x, TLS1_3_VERSIO
79a0: 4e 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a  N);..    break;.
79b0: 23 65 6e 64 69 66 0a 09 64 65 66 61 75 6c 74 3a  #endif..default:
79c0: 0a 09 20 20 20 20 6d 65 74 68 6f 64 20 3d 20 54  ..    method = T
79d0: 4c 53 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 20 20  LS_method();..  
79e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
79f0: 20 20 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 54      ctx = SSL_CT
7a00: 58 5f 6e 65 77 28 6d 65 74 68 6f 64 29 3b 0a 20  X_new(method);. 
7a10: 20 20 20 69 66 20 28 63 74 78 20 3d 3d 20 4e 55     if (ctx == NU
7a20: 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e  LL) {..Tcl_Appen
7a30: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
7a40: 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29  GET_ERR_REASON()
7a50: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
7a60: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
7a70: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
7a80: 73 73 6c 20 3d 20 53 53 4c 5f 6e 65 77 28 63 74  ssl = SSL_new(ct
7a90: 78 29 3b 0a 20 20 20 20 69 66 20 28 73 73 6c 20  x);.    if (ssl 
7aa0: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f  == NULL) {..Tcl_
7ab0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
7ac0: 65 72 70 2c 20 47 45 54 5f 45 52 52 5f 52 45 41  erp, GET_ERR_REA
7ad0: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20  SON(), (char *) 
7ae0: 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f  NULL);..SSL_CTX_
7af0: 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75  free(ctx);..retu
7b00: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
7b10: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20    }..    /* Use 
7b20: 6c 69 73 74 20 61 6e 64 20 6f 72 64 65 72 20 61  list and order a
7b30: 73 20 77 6f 75 6c 64 20 62 65 20 73 65 6e 74 20  s would be sent 
7b40: 69 6e 20 61 20 43 6c 69 65 6e 74 48 65 6c 6c 6f  in a ClientHello
7b50: 20 6f 72 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c   or all availabl
7b60: 65 20 63 69 70 68 65 72 73 20 2a 2f 0a 20 20 20  e ciphers */.   
7b70: 20 69 66 20 28 75 73 65 5f 73 75 70 70 6f 72 74   if (use_support
7b80: 65 64 29 20 7b 0a 09 73 6b 20 3d 20 53 53 4c 5f  ed) {..sk = SSL_
7b90: 67 65 74 31 5f 73 75 70 70 6f 72 74 65 64 5f 63  get1_supported_c
7ba0: 69 70 68 65 72 73 28 73 73 6c 29 3b 0a 20 20 20  iphers(ssl);.   
7bb0: 20 7d 20 65 6c 73 65 20 7b 0a 09 73 6b 20 3d 20   } else {..sk = 
7bc0: 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 73 28  SSL_get_ciphers(
7bd0: 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ssl);.    }..   
7be0: 20 69 66 20 28 73 6b 20 21 3d 20 4e 55 4c 4c 29   if (sk != NULL)
7bf0: 20 7b 0a 09 69 66 20 28 21 76 65 72 62 6f 73 65   {..if (!verbose
7c00: 29 20 7b 0a 09 20 20 20 20 63 6f 6e 73 74 20 63  ) {..    const c
7c10: 68 61 72 20 2a 63 70 3b 0a 09 20 20 20 20 6f 62  har *cp;..    ob
7c20: 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69  jPtr = Tcl_NewLi
7c30: 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a  stObj(0, NULL);.
7c40: 09 20 20 20 20 66 6f 72 20 28 69 6e 74 20 69 20  .    for (int i 
7c50: 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 53 53 4c 5f  = 0; i < sk_SSL_
7c60: 43 49 50 48 45 52 5f 6e 75 6d 28 73 6b 29 3b 20  CIPHER_num(sk); 
7c70: 69 2b 2b 29 20 7b 0a 09 09 63 6f 6e 73 74 20 53  i++) {...const S
7c80: 53 4c 5f 43 49 50 48 45 52 20 2a 63 20 3d 20 73  SL_CIPHER *c = s
7c90: 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 76 61 6c  k_SSL_CIPHER_val
7ca0: 75 65 28 73 6b 2c 20 69 29 3b 0a 09 09 69 66 20  ue(sk, i);...if 
7cb0: 28 63 20 3d 3d 20 4e 55 4c 4c 29 20 63 6f 6e 74  (c == NULL) cont
7cc0: 69 6e 75 65 3b 0a 0a 09 09 2f 2a 20 63 69 70 68  inue;..../* ciph
7cd0: 65 72 20 6e 61 6d 65 20 6f 72 20 28 4e 4f 4e 45  er name or (NONE
7ce0: 29 20 2a 2f 0a 09 09 63 70 20 3d 20 53 53 4c 5f  ) */...cp = SSL_
7cf0: 43 49 50 48 45 52 5f 67 65 74 5f 6e 61 6d 65 28  CIPHER_get_name(
7d00: 63 29 3b 0a 09 09 69 66 20 28 63 70 20 3d 3d 20  c);...if (cp == 
7d10: 4e 55 4c 4c 29 20 62 72 65 61 6b 3b 0a 09 09 54  NULL) break;...T
7d20: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
7d30: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
7d40: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  objPtr, Tcl_NewS
7d50: 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a  tringObj((char *
7d60: 29 20 63 70 2c 20 2d 31 29 29 3b 0a 09 20 20 20  ) cp, -1));..   
7d70: 20 7d 0a 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20   }...} else {.. 
7d80: 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f     objPtr = Tcl_
7d90: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 22 2c  NewStringObj("",
7da0: 30 29 3b 0a 09 20 20 20 20 66 6f 72 20 28 69 6e  0);..    for (in
7db0: 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b 5f  t i = 0; i < sk_
7dc0: 53 53 4c 5f 43 49 50 48 45 52 5f 6e 75 6d 28 73  SSL_CIPHER_num(s
7dd0: 6b 29 3b 20 69 2b 2b 29 20 7b 0a 09 09 63 6f 6e  k); i++) {...con
7de0: 73 74 20 53 53 4c 5f 43 49 50 48 45 52 20 2a 63  st SSL_CIPHER *c
7df0: 20 3d 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52   = sk_SSL_CIPHER
7e00: 5f 76 61 6c 75 65 28 73 6b 2c 20 69 29 3b 0a 09  _value(sk, i);..
7e10: 09 69 66 20 28 63 20 3d 3d 20 4e 55 4c 4c 29 20  .if (c == NULL) 
7e20: 63 6f 6e 74 69 6e 75 65 3b 0a 0a 09 09 2f 2a 20  continue;..../* 
7e30: 74 65 78 74 75 61 6c 20 64 65 73 63 72 69 70 74  textual descript
7e40: 69 6f 6e 20 6f 66 20 74 68 65 20 63 69 70 68 65  ion of the ciphe
7e50: 72 20 2a 2f 0a 09 09 69 66 20 28 53 53 4c 5f 43  r */...if (SSL_C
7e60: 49 50 48 45 52 5f 64 65 73 63 72 69 70 74 69 6f  IPHER_descriptio
7e70: 6e 28 63 2c 20 62 75 66 2c 20 73 69 7a 65 6f 66  n(c, buf, sizeof
7e80: 28 62 75 66 29 29 20 21 3d 20 4e 55 4c 4c 29 20  (buf)) != NULL) 
7e90: 7b 0a 09 09 20 20 20 20 54 63 6c 5f 41 70 70 65  {...    Tcl_Appe
7ea0: 6e 64 54 6f 4f 62 6a 28 6f 62 6a 50 74 72 2c 20  ndToObj(objPtr, 
7eb0: 62 75 66 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20  buf, (Tcl_Size) 
7ec0: 73 74 72 6c 65 6e 28 62 75 66 29 29 3b 0a 09 09  strlen(buf));...
7ed0: 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 54  } else {...    T
7ee0: 63 6c 5f 41 70 70 65 6e 64 54 6f 4f 62 6a 28 6f  cl_AppendToObj(o
7ef0: 62 6a 50 74 72 2c 20 22 55 4e 4b 4e 4f 57 4e 5c  bjPtr, "UNKNOWN\
7f00: 6e 22 2c 20 38 29 3b 0a 09 09 7d 0a 09 20 20 20  n", 8);...}..   
7f10: 20 7d 0a 09 7d 0a 09 69 66 20 28 75 73 65 5f 73   }..}..if (use_s
7f20: 75 70 70 6f 72 74 65 64 29 20 7b 0a 09 20 20 20  upported) {..   
7f30: 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 66   sk_SSL_CIPHER_f
7f40: 72 65 65 28 73 6b 29 3b 0a 09 7d 0a 20 20 20 20  ree(sk);..}.    
7f50: 7d 0a 20 20 20 20 53 53 4c 5f 66 72 65 65 28 73  }.    SSL_free(s
7f60: 73 6c 29 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58  sl);.    SSL_CTX
7f70: 5f 66 72 65 65 28 63 74 78 29 3b 0a 0a 20 20 20  _free(ctx);..   
7f80: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
7f90: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
7fa0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
7fb0: 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d  L_OK;.}.../*. *-
7fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8000: 2d 2d 0a 20 2a 0a 20 2a 20 50 72 6f 74 6f 63 6f  --. *. * Protoco
8010: 6c 73 4f 62 6a 43 6d 64 20 2d 2d 20 6c 69 73 74  lsObjCmd -- list
8020: 20 61 76 61 69 6c 61 62 6c 65 20 70 72 6f 74 6f   available proto
8030: 63 6f 6c 73 0a 20 2a 0a 20 2a 09 54 68 69 73 20  cols. *. *.This 
8040: 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76  procedure is inv
8050: 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20  oked to process 
8060: 74 68 65 20 22 74 6c 73 3a 3a 70 72 6f 74 6f 63  the "tls::protoc
8070: 6f 6c 73 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 09  ols" command. *.
8080: 74 6f 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c  to list availabl
8090: 65 20 70 72 6f 74 6f 63 6f 6c 73 2e 0a 20 2a 0a  e protocols.. *.
80a0: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41   * Results:. *.A
80b0: 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65   standard Tcl re
80c0: 73 75 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a  sult list.. *. *
80d0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
80e0: 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d  *.none. *. *----
80f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
8130: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 50   */.static int.P
8140: 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 28 43  rotocolsObjCmd(C
8150: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
8160: 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70  Data, Tcl_Interp
8170: 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62   *interp, int ob
8180: 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e  jc, Tcl_Obj *con
8190: 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20  st objv[]) {.   
81a0: 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72   Tcl_Obj *objPtr
81b0: 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69  ;.    (void) cli
81c0: 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 64 70  entData;..    dp
81d0: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
81e0: 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21  ..    if (objc !
81f0: 3d 20 31 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e  = 1) {..Tcl_Wron
8200: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
8210: 20 31 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 09   1, objv, "");..
8220: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
8230: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52  ;.    }..    ERR
8240: 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a  _clear_error();.
8250: 0a 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63  .    objPtr = Tc
8260: 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20  l_NewListObj(0, 
8270: 4e 55 4c 4c 29 3b 0a 0a 23 69 66 20 4f 50 45 4e  NULL);..#if OPEN
8280: 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42  SSL_VERSION_NUMB
8290: 45 52 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c  ER < 0x10100000L
82a0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f   && !defined(NO_
82b0: 53 53 4c 32 29 20 26 26 20 21 64 65 66 69 6e 65  SSL2) && !define
82c0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c  d(OPENSSL_NO_SSL
82d0: 32 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  2).    Tcl_ListO
82e0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
82f0: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
8300: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
8310: 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 53  (protocols[TLS_S
8320: 53 4c 32 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64  SL2], -1));.#end
8330: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  if.#if !defined(
8340: 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66  NO_SSL3) && !def
8350: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
8360: 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65  SSL3) && !define
8370: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c  d(OPENSSL_NO_SSL
8380: 33 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 54 63  3_METHOD).    Tc
8390: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
83a0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
83b0: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
83c0: 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c  ringObj(protocol
83d0: 73 5b 54 4c 53 5f 53 53 4c 33 5d 2c 20 2d 31 29  s[TLS_SSL3], -1)
83e0: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64  );.#endif.#if !d
83f0: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20  efined(NO_TLS1) 
8400: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
8410: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 26 26 20  SSL_NO_TLS1) && 
8420: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
8430: 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 29  _NO_TLS1_METHOD)
8440: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
8450: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
8460: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
8470: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70  l_NewStringObj(p
8480: 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53  rotocols[TLS_TLS
8490: 31 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66  1], -1));.#endif
84a0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f  .#if !defined(NO
84b0: 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66  _TLS1_1) && !def
84c0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
84d0: 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69  TLS1_1) && !defi
84e0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
84f0: 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 20 20  LS1_1_METHOD).  
8500: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
8510: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
8520: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
8530: 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74  ewStringObj(prot
8540: 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f 31  ocols[TLS_TLS1_1
8550: 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a  ], -1));.#endif.
8560: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f  #if !defined(NO_
8570: 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 69  TLS1_2) && !defi
8580: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
8590: 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e  LS1_2) && !defin
85a0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
85b0: 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 20 20 20  S1_2_METHOD).   
85c0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
85d0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
85e0: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
85f0: 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f  wStringObj(proto
8600: 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f 32 5d  cols[TLS_TLS1_2]
8610: 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23  , -1));.#endif.#
8620: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54  if !defined(NO_T
8630: 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e  LS1_3) && !defin
8640: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
8650: 53 31 5f 33 29 0a 20 20 20 20 54 63 6c 5f 4c 69  S1_3).    Tcl_Li
8660: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
8670: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
8680: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
8690: 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c  Obj(protocols[TL
86a0: 53 5f 54 4c 53 31 5f 33 5d 2c 20 2d 31 29 29 3b  S_TLS1_3], -1));
86b0: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 54 63 6c  .#endif..    Tcl
86c0: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
86d0: 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20  terp, objPtr);. 
86e0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b     return TCL_OK
86f0: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ;.}.../*. *-----
8700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
8740: 2a 0a 20 2a 20 48 61 6e 64 73 68 61 6b 65 4f 62  *. * HandshakeOb
8750: 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68  jCmd --. *. *.Th
8760: 69 73 20 63 6f 6d 6d 61 6e 64 20 69 73 20 75 73  is command is us
8770: 65 64 20 74 6f 20 76 65 72 69 66 79 20 77 68 65  ed to verify whe
8780: 74 68 65 72 20 74 68 65 20 68 61 6e 64 73 68 61  ther the handsha
8790: 6b 65 20 69 73 20 63 6f 6d 70 6c 65 74 65 0a 20  ke is complete. 
87a0: 2a 09 6f 72 20 6e 6f 74 2e 0a 20 2a 0a 20 2a 20  *.or not.. *. * 
87b0: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74  Results:. *.A st
87c0: 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c  andard Tcl resul
87d0: 74 2e 20 31 20 6d 65 61 6e 73 20 68 61 6e 64 73  t. 1 means hands
87e0: 68 61 6b 65 20 63 6f 6d 70 6c 65 74 65 2c 20 30  hake complete, 0
87f0: 20 6d 65 61 6e 73 20 70 65 6e 64 69 6e 67 2e 0a   means pending..
8800: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
8810: 74 73 3a 0a 20 2a 09 4d 61 79 20 66 6f 72 63 65  ts:. *.May force
8820: 20 53 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f 6e   SSL negotiation
8830: 20 74 6f 20 74 61 6b 65 20 70 6c 61 63 65 2e 0a   to take place..
8840: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
8850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8880: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61  --------. */.sta
8890: 74 69 63 20 69 6e 74 20 48 61 6e 64 73 68 61 6b  tic int Handshak
88a0: 65 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61  eObjCmd(ClientDa
88b0: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54  ta clientData, T
88c0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
88d0: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c  p, int objc, Tcl
88e0: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76  _Obj *const objv
88f0: 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68  []) {.    Tcl_Ch
8900: 61 6e 6e 65 6c 20 63 68 61 6e 3b 20 20 20 20 20  annel chan;     
8910: 20 20 20 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65     /* The channe
8920: 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 20  l to set a mode 
8930: 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53 74 61 74 65  on. */.    State
8940: 20 2a 73 74 61 74 65 50 74 72 3b 20 20 20 20 20   *statePtr;     
8950: 20 20 20 2f 2a 20 63 6c 69 65 6e 74 20 73 74 61     /* client sta
8960: 74 65 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b 65  te for ssl socke
8970: 74 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63  t */.    const c
8980: 68 61 72 20 2a 65 72 72 53 74 72 20 3d 20 4e 55  har *errStr = NU
8990: 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 72 65 74 20  LL;.    int ret 
89a0: 3d 20 31 3b 0a 20 20 20 20 69 6e 74 20 65 72 72  = 1;.    int err
89b0: 20 3d 20 30 3b 0a 20 20 20 20 28 76 6f 69 64 29   = 0;.    (void)
89c0: 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20   clientData;..  
89d0: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
89e0: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62  d");..    if (ob
89f0: 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f  jc != 2) {..Tcl_
8a00: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
8a10: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63  erp, 1, objv, "c
8a20: 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72  hannel");..retur
8a30: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
8a40: 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61   }..    ERR_clea
8a50: 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20  r_error();..    
8a60: 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68  chan = Tcl_GetCh
8a70: 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63  annel(interp, Tc
8a80: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
8a90: 5b 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20  [1]), NULL);.   
8aa0: 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63   if (chan == (Tc
8ab0: 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29  l_Channel) NULL)
8ac0: 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45   {..return TCL_E
8ad0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
8ae0: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f   /* Make sure to
8af0: 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20   operate on the 
8b00: 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20  topmost channel 
8b10: 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63  */.    chan = Tc
8b20: 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28  l_GetTopChannel(
8b30: 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 54  chan);.    if (T
8b40: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70  cl_GetChannelTyp
8b50: 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43  e(chan) != Tls_C
8b60: 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a  hannelType()) {.
8b70: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
8b80: 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63  t(interp, "bad c
8b90: 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f  hannel \"", Tcl_
8ba0: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63  GetChannelName(c
8bb0: 68 61 6e 29 2c 0a 09 20 20 20 20 22 5c 22 3a 20  han),..    "\": 
8bc0: 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65  not a TLS channe
8bd0: 6c 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  l", (char *) NUL
8be0: 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f  L);..Tcl_SetErro
8bf0: 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54  rCode(interp, "T
8c00: 4c 53 22 2c 20 22 48 41 4e 44 53 48 41 4b 45 22  LS", "HANDSHAKE"
8c10: 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e  , "CHANNEL", "IN
8c20: 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29  VALID", (char *)
8c30: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20   NULL);..return 
8c40: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
8c50: 0a 20 20 20 20 73 74 61 74 65 50 74 72 20 3d 20  .    statePtr = 
8c60: 28 53 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 74  (State *)Tcl_Get
8c70: 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44  ChannelInstanceD
8c80: 61 74 61 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20  ata(chan);..    
8c90: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 69 6e 67  dprintf("Calling
8ca0: 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e   Tls_WaitForConn
8cb0: 65 63 74 22 29 3b 0a 20 20 20 20 72 65 74 20 3d  ect");.    ret =
8cc0: 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e   Tls_WaitForConn
8cd0: 65 63 74 28 73 74 61 74 65 50 74 72 2c 20 26 65  ect(statePtr, &e
8ce0: 72 72 2c 20 31 29 3b 0a 20 20 20 20 64 70 72 69  rr, 1);.    dpri
8cf0: 6e 74 66 28 22 54 6c 73 5f 57 61 69 74 46 6f 72  ntf("Tls_WaitFor
8d00: 43 6f 6e 6e 65 63 74 20 72 65 74 75 72 6e 65 64  Connect returned
8d10: 3a 20 25 69 22 2c 20 72 65 74 29 3b 0a 0a 20 20  : %i", ret);..  
8d20: 20 20 69 66 20 28 72 65 74 20 3c 20 30 20 26 26    if (ret < 0 &&
8d30: 20 28 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61   ((statePtr->fla
8d40: 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f 41 53 59  gs & TLS_TCL_ASY
8d50: 4e 43 29 20 26 26 20 28 65 72 72 20 3d 3d 20 45  NC) && (err == E
8d60: 41 47 41 49 4e 29 29 29 20 7b 0a 09 64 70 72 69  AGAIN))) {..dpri
8d70: 6e 74 66 28 22 41 73 79 6e 63 20 73 65 74 20 61  ntf("Async set a
8d80: 6e 64 20 65 72 72 20 3d 20 45 41 47 41 49 4e 22  nd err = EAGAIN"
8d90: 29 3b 0a 09 72 65 74 20 3d 20 30 3b 0a 20 20 20  );..ret = 0;.   
8da0: 20 7d 20 65 6c 73 65 20 69 66 20 28 72 65 74 20   } else if (ret 
8db0: 3c 20 30 29 20 7b 0a 09 6c 6f 6e 67 20 72 65 73  < 0) {..long res
8dc0: 75 6c 74 3b 0a 09 65 72 72 53 74 72 20 3d 20 73  ult;..errStr = s
8dd0: 74 61 74 65 50 74 72 2d 3e 65 72 72 3b 0a 09 54  tatePtr->err;..T
8de0: 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69  cl_ResetResult(i
8df0: 6e 74 65 72 70 29 3b 0a 09 54 63 6c 5f 53 65 74  nterp);..Tcl_Set
8e00: 45 72 72 6e 6f 28 65 72 72 29 3b 0a 0a 09 69 66  Errno(err);...if
8e10: 20 28 21 65 72 72 53 74 72 20 7c 7c 20 28 2a 65   (!errStr || (*e
8e20: 72 72 53 74 72 20 3d 3d 20 30 29 29 20 7b 0a 09  rrStr == 0)) {..
8e30: 20 20 20 20 65 72 72 53 74 72 20 3d 20 54 63 6c      errStr = Tcl
8e40: 5f 50 6f 73 69 78 45 72 72 6f 72 28 69 6e 74 65  _PosixError(inte
8e50: 72 70 29 3b 0a 09 7d 0a 0a 09 54 63 6c 5f 41 70  rp);..}...Tcl_Ap
8e60: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
8e70: 70 2c 20 22 68 61 6e 64 73 68 61 6b 65 20 66 61  p, "handshake fa
8e80: 69 6c 65 64 3a 20 22 2c 20 65 72 72 53 74 72 2c  iled: ", errStr,
8e90: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
8ea0: 0a 09 69 66 20 28 28 72 65 73 75 6c 74 20 3d 20  ..if ((result = 
8eb0: 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 72  SSL_get_verify_r
8ec0: 65 73 75 6c 74 28 73 74 61 74 65 50 74 72 2d 3e  esult(statePtr->
8ed0: 73 73 6c 29 29 20 21 3d 20 58 35 30 39 5f 56 5f  ssl)) != X509_V_
8ee0: 4f 4b 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41  OK) {..    Tcl_A
8ef0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
8f00: 72 70 2c 20 22 20 64 75 65 20 74 6f 20 5c 22 22  rp, " due to \""
8f10: 2c 20 58 35 30 39 5f 76 65 72 69 66 79 5f 63 65  , X509_verify_ce
8f20: 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28  rt_error_string(
8f30: 72 65 73 75 6c 74 29 2c 20 22 5c 22 22 2c 20 28  result), "\"", (
8f40: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
8f50: 7d 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43  }..Tcl_SetErrorC
8f60: 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53  ode(interp, "TLS
8f70: 22 2c 20 22 48 41 4e 44 53 48 41 4b 45 22 2c 20  ", "HANDSHAKE", 
8f80: 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20  "FAILED", (char 
8f90: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 64 70 72 69 6e  *) NULL);..dprin
8fa0: 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20 54 43  tf("Returning TC
8fb0: 4c 5f 45 52 52 4f 52 20 77 69 74 68 20 68 61 6e  L_ERROR with han
8fc0: 64 73 68 61 6b 65 20 66 61 69 6c 65 64 3a 20 25  dshake failed: %
8fd0: 73 22 2c 20 65 72 72 53 74 72 29 3b 0a 09 72 65  s", errStr);..re
8fe0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
8ff0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66      } else {..if
9000: 20 28 65 72 72 20 21 3d 20 30 29 20 7b 0a 09 20   (err != 0) {.. 
9010: 20 20 20 64 70 72 69 6e 74 66 28 22 47 6f 74 20     dprintf("Got 
9020: 61 6e 20 65 72 72 6f 72 20 77 69 74 68 20 61 20  an error with a 
9030: 63 6f 6d 70 6c 65 74 65 64 20 68 61 6e 64 73 68  completed handsh
9040: 61 6b 65 3a 20 65 72 72 20 3d 20 25 69 22 2c 20  ake: err = %i", 
9050: 65 72 72 29 3b 0a 09 7d 0a 09 72 65 74 20 3d 20  err);..}..ret = 
9060: 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70  1;.    }..    dp
9070: 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67  rintf("Returning
9080: 20 54 43 4c 5f 4f 4b 20 77 69 74 68 20 64 61 74   TCL_OK with dat
9090: 61 20 5c 22 25 69 5c 22 22 2c 20 72 65 74 29 3b  a \"%i\"", ret);
90a0: 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  .    Tcl_SetObjR
90b0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
90c0: 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 65 74 29  l_NewIntObj(ret)
90d0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
90e0: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d  L_OK;.}../*. *--
90f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9130: 2d 0a 20 2a 0a 20 2a 20 49 6d 70 6f 72 74 4f 62  -. *. * ImportOb
9140: 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68  jCmd --. *. *.Th
9150: 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20  is procedure is 
9160: 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65  invoked to proce
9170: 73 73 20 74 68 65 20 22 73 73 6c 22 20 63 6f 6d  ss the "ssl" com
9180: 6d 61 6e 64 0a 20 2a 0a 20 2a 09 54 68 65 20 73  mand. *. *.The s
9190: 73 6c 20 63 6f 6d 6d 61 6e 64 20 70 75 73 68 65  sl command pushe
91a0: 73 20 53 53 4c 20 6f 76 65 72 20 61 20 28 6e 65  s SSL over a (ne
91b0: 77 6c 79 20 63 6f 6e 6e 65 63 74 65 64 29 20 74  wly connected) t
91c0: 63 70 20 73 6f 63 6b 65 74 0a 20 2a 0a 20 2a 20  cp socket. *. * 
91d0: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74  Results:. *.A st
91e0: 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c  andard Tcl resul
91f0: 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  t.. *. * Side ef
9200: 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f  fects:. *.May mo
9210: 64 69 66 79 20 74 68 65 20 62 65 68 61 76 69 6f  dify the behavio
9220: 72 20 6f 66 20 61 6e 20 49 4f 20 63 68 61 6e 6e  r of an IO chann
9230: 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  el.. *. *-------
9240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
9280: 0a 73 74 61 74 69 63 20 69 6e 74 0a 49 6d 70 6f  .static int.Impo
9290: 72 74 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44  rtObjCmd(ClientD
92a0: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
92b0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
92c0: 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63  rp, int objc, Tc
92d0: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a  l_Obj *const obj
92e0: 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43  v[]) {.    Tcl_C
92f0: 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a  hannel chan;../*
9300: 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20   The channel to 
9310: 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a  set a mode on. *
9320: 2f 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61  /.    State *sta
9330: 74 65 50 74 72 3b 09 09 2f 2a 20 63 6c 69 65 6e  tePtr;../* clien
9340: 74 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20  t state for ssl 
9350: 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 53 53  socket */.    SS
9360: 4c 5f 43 54 58 20 2a 63 74 78 09 09 3d 20 4e 55  L_CTX *ctx..= NU
9370: 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  LL;.    Tcl_Obj 
9380: 2a 73 63 72 69 70 74 09 09 3d 20 4e 55 4c 4c 3b  *script..= NULL;
9390: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 61  .    Tcl_Obj *pa
93a0: 73 73 77 6f 72 64 09 09 3d 20 4e 55 4c 4c 3b 0a  ssword..= NULL;.
93b0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 76 63 6d      Tcl_Obj *vcm
93c0: 64 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54  d..= NULL;.    T
93d0: 63 6c 5f 44 53 74 72 69 6e 67 20 75 70 70 65 72  cl_DString upper
93e0: 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69  ChannelTranslati
93f0: 6f 6e 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 6c  on, upperChannel
9400: 42 6c 6f 63 6b 69 6e 67 2c 20 75 70 70 65 72 43  Blocking, upperC
9410: 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 2c 20  hannelEncoding, 
9420: 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43  upperChannelEOFC
9430: 68 61 72 3b 0a 20 20 20 20 69 6e 74 20 69 64 78  har;.    int idx
9440: 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 6c  ;.    Tcl_Size l
9450: 65 6e 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67  en;.    int flag
9460: 73 09 09 09 3d 20 54 4c 53 5f 54 43 4c 5f 49 4e  s...= TLS_TCL_IN
9470: 49 54 3b 0a 20 20 20 20 69 6e 74 20 73 65 72 76  IT;.    int serv
9480: 65 72 09 09 09 3d 20 30 3b 09 2f 2a 20 69 73 20  er...= 0;./* is 
9490: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 63 6f 6d  connection incom
94a0: 69 6e 67 20 6f 72 20 6f 75 74 67 6f 69 6e 67 3f  ing or outgoing?
94b0: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 6b 65   */.    char *ke
94c0: 79 66 69 6c 65 09 09 3d 20 4e 55 4c 4c 3b 0a 20  yfile..= NULL;. 
94d0: 20 20 20 63 68 61 72 20 2a 63 65 72 74 66 69 6c     char *certfil
94e0: 65 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 75  e..= NULL;.    u
94f0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6b 65  nsigned char *ke
9500: 79 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54  y..= NULL;.    T
9510: 63 6c 5f 53 69 7a 65 20 6b 65 79 5f 6c 65 6e 09  cl_Size key_len.
9520: 09 3d 20 30 3b 0a 20 20 20 20 75 6e 73 69 67 6e  .= 0;.    unsign
9530: 65 64 20 63 68 61 72 20 2a 63 65 72 74 09 09 3d  ed char *cert..=
9540: 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 53   NULL;.    Tcl_S
9550: 69 7a 65 20 63 65 72 74 5f 6c 65 6e 09 09 3d 20  ize cert_len..= 
9560: 30 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 69 70  0;.    char *cip
9570: 68 65 72 73 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20  hers..= NULL;.  
9580: 20 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 75    char *ciphersu
9590: 69 74 65 73 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20  ites..= NULL;.  
95a0: 20 20 63 68 61 72 20 2a 43 41 66 69 6c 65 09 09    char *CAfile..
95b0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72  = NULL;.    char
95c0: 20 2a 43 41 70 61 74 68 09 09 3d 20 4e 55 4c 4c   *CApath..= NULL
95d0: 3b 0a 20 20 20 20 63 68 61 72 20 2a 44 48 70 61  ;.    char *DHpa
95e0: 72 61 6d 73 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20  rams..= NULL;.  
95f0: 20 20 63 68 61 72 20 2a 6d 6f 64 65 6c 09 09 09    char *model...
9600: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72  = NULL;.    char
9610: 20 2a 73 65 72 76 65 72 6e 61 6d 65 09 09 3d 20   *servername..= 
9620: 4e 55 4c 4c 3b 09 2f 2a 20 68 6f 73 74 6e 61 6d  NULL;./* hostnam
9630: 65 20 66 6f 72 20 53 65 72 76 65 72 20 4e 61 6d  e for Server Nam
9640: 65 20 49 6e 64 69 63 61 74 69 6f 6e 20 2a 2f 0a  e Indication */.
9650: 20 20 20 20 63 68 61 72 20 2a 73 65 73 73 69 6f      char *sessio
9660: 6e 5f 69 64 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20  n_id..= NULL;.  
9670: 20 20 54 63 6c 5f 4f 62 6a 20 2a 61 6c 70 6e 09    Tcl_Obj *alpn.
9680: 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74  .= NULL;.    int
9690: 20 73 73 6c 32 20 3d 20 30 2c 20 73 73 6c 33 20   ssl2 = 0, ssl3 
96a0: 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 6c 73  = 0;.    int tls
96b0: 31 20 3d 20 31 2c 20 74 6c 73 31 5f 31 20 3d 20  1 = 1, tls1_1 = 
96c0: 31 2c 20 74 6c 73 31 5f 32 20 3d 20 31 2c 20 74  1, tls1_2 = 1, t
96d0: 6c 73 31 5f 33 20 3d 20 31 3b 0a 20 20 20 20 69  ls1_3 = 1;.    i
96e0: 6e 74 20 70 72 6f 74 6f 20 3d 20 30 2c 20 6c 65  nt proto = 0, le
96f0: 76 65 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 69 6e  vel = -1;.    in
9700: 74 20 76 65 72 69 66 79 20 3d 20 30 2c 20 72 65  t verify = 0, re
9710: 71 75 69 72 65 20 3d 20 30 2c 20 72 65 71 75 65  quire = 0, reque
9720: 73 74 20 3d 20 31 2c 20 70 6f 73 74 5f 68 61 6e  st = 1, post_han
9730: 64 73 68 61 6b 65 20 3d 20 30 3b 0a 20 20 20 20  dshake = 0;.    
9740: 28 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 74  (void) clientDat
9750: 61 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  a;..    dprintf(
9760: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 20  "Called");..#if 
9770: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29  defined(NO_TLS1)
9780: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e   || defined(OPEN
9790: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 20 20 20  SSL_NO_TLS1).   
97a0: 20 74 6c 73 31 20 3d 20 30 3b 0a 23 65 6e 64 69   tls1 = 0;.#endi
97b0: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f  f.#if defined(NO
97c0: 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69  _TLS1_1) || defi
97d0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
97e0: 4c 53 31 5f 31 29 0a 20 20 20 20 74 6c 73 31 5f  LS1_1).    tls1_
97f0: 31 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69  1 = 0;.#endif.#i
9800: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53  f defined(NO_TLS
9810: 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  1_2) || defined(
9820: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
9830: 32 29 0a 20 20 20 20 74 6c 73 31 5f 32 20 3d 20  2).    tls1_2 = 
9840: 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65  0;.#endif.#if de
9850: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29  fined(NO_TLS1_3)
9860: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e   || defined(OPEN
9870: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20  SSL_NO_TLS1_3). 
9880: 20 20 20 74 6c 73 31 5f 33 20 3d 20 30 3b 0a 23     tls1_3 = 0;.#
9890: 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 20 28 6f  endif..    if (o
98a0: 62 6a 63 20 3c 20 32 29 20 7b 0a 09 54 63 6c 5f  bjc < 2) {..Tcl_
98b0: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
98c0: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63  erp, 1, objv, "c
98d0: 68 61 6e 6e 65 6c 20 3f 6f 70 74 69 6f 6e 73 3f  hannel ?options?
98e0: 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  ");..return TCL_
98f0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
9900: 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f    ERR_clear_erro
9910: 72 28 29 3b 0a 0a 20 20 20 20 63 68 61 6e 20 3d  r();..    chan =
9920: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28   Tcl_GetChannel(
9930: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
9940: 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
9950: 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 63  NULL);.    if (c
9960: 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e  han == (Tcl_Chan
9970: 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65  nel) NULL) {..re
9980: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
9990: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61      }..    /* Ma
99a0: 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61  ke sure to opera
99b0: 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73  te on the topmos
99c0: 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20  t channel */.   
99d0: 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54   chan = Tcl_GetT
99e0: 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b  opChannel(chan);
99f0: 0a 0a 20 20 20 20 66 6f 72 20 28 69 64 78 20 3d  ..    for (idx =
9a00: 20 32 3b 20 69 64 78 20 3c 20 6f 62 6a 63 3b 20   2; idx < objc; 
9a10: 69 64 78 2b 2b 29 20 7b 0a 09 63 68 61 72 20 2a  idx++) {..char *
9a20: 6f 70 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  opt = Tcl_GetStr
9a30: 69 6e 67 28 6f 62 6a 76 5b 69 64 78 5d 29 3b 0a  ing(objv[idx]);.
9a40: 0a 09 69 66 20 28 6f 70 74 5b 30 5d 20 21 3d 20  ..if (opt[0] != 
9a50: 27 2d 27 29 0a 09 20 20 20 20 62 72 65 61 6b 3b  '-')..    break;
9a60: 0a 0a 09 4f 50 54 4f 42 4a 28 22 2d 61 6c 70 6e  ...OPTOBJ("-alpn
9a70: 22 2c 20 61 6c 70 6e 29 3b 0a 09 4f 50 54 53 54  ", alpn);..OPTST
9a80: 52 28 22 2d 63 61 64 69 72 22 2c 20 43 41 70 61  R("-cadir", CApa
9a90: 74 68 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63  th);..OPTSTR("-c
9aa0: 61 66 69 6c 65 22 2c 20 43 41 66 69 6c 65 29 3b  afile", CAfile);
9ab0: 0a 09 4f 50 54 42 59 54 45 28 22 2d 63 65 72 74  ..OPTBYTE("-cert
9ac0: 22 2c 20 63 65 72 74 2c 20 63 65 72 74 5f 6c 65  ", cert, cert_le
9ad0: 6e 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 65  n);..OPTSTR("-ce
9ae0: 72 74 66 69 6c 65 22 2c 20 63 65 72 74 66 69 6c  rtfile", certfil
9af0: 65 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 69  e);..OPTSTR("-ci
9b00: 70 68 65 72 22 2c 20 63 69 70 68 65 72 73 29 3b  pher", ciphers);
9b10: 0a 09 4f 50 54 53 54 52 28 22 2d 63 69 70 68 65  ..OPTSTR("-ciphe
9b20: 72 73 22 2c 20 63 69 70 68 65 72 73 29 3b 0a 09  rs", ciphers);..
9b30: 4f 50 54 53 54 52 28 22 2d 63 69 70 68 65 72 73  OPTSTR("-ciphers
9b40: 75 69 74 65 73 22 2c 20 63 69 70 68 65 72 73 75  uites", ciphersu
9b50: 69 74 65 73 29 3b 0a 09 4f 50 54 4f 42 4a 28 22  ites);..OPTOBJ("
9b60: 2d 63 6f 6d 6d 61 6e 64 22 2c 20 73 63 72 69 70  -command", scrip
9b70: 74 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 64 68  t);..OPTSTR("-dh
9b80: 70 61 72 61 6d 73 22 2c 20 44 48 70 61 72 61 6d  params", DHparam
9b90: 73 29 3b 0a 09 4f 50 54 42 59 54 45 28 22 2d 6b  s);..OPTBYTE("-k
9ba0: 65 79 22 2c 20 6b 65 79 2c 20 6b 65 79 5f 6c 65  ey", key, key_le
9bb0: 6e 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 6b 65  n);..OPTSTR("-ke
9bc0: 79 66 69 6c 65 22 2c 20 6b 65 79 66 69 6c 65 29  yfile", keyfile)
9bd0: 3b 0a 09 4f 50 54 53 54 52 28 22 2d 6d 6f 64 65  ;..OPTSTR("-mode
9be0: 6c 22 2c 20 6d 6f 64 65 6c 29 3b 0a 09 4f 50 54  l", model);..OPT
9bf0: 4f 42 4a 28 22 2d 70 61 73 73 77 6f 72 64 22 2c  OBJ("-password",
9c00: 20 70 61 73 73 77 6f 72 64 29 3b 0a 09 4f 50 54   password);..OPT
9c10: 42 4f 4f 4c 28 22 2d 70 6f 73 74 5f 68 61 6e 64  BOOL("-post_hand
9c20: 73 68 61 6b 65 22 2c 20 70 6f 73 74 5f 68 61 6e  shake", post_han
9c30: 64 73 68 61 6b 65 29 3b 0a 09 4f 50 54 42 4f 4f  dshake);..OPTBOO
9c40: 4c 28 22 2d 72 65 71 75 65 73 74 22 2c 20 72 65  L("-request", re
9c50: 71 75 65 73 74 29 3b 0a 09 4f 50 54 42 4f 4f 4c  quest);..OPTBOOL
9c60: 28 22 2d 72 65 71 75 69 72 65 22 2c 20 72 65 71  ("-require", req
9c70: 75 69 72 65 29 3b 0a 09 4f 50 54 49 4e 54 28 22  uire);..OPTINT("
9c80: 2d 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 22  -security_level"
9c90: 2c 20 6c 65 76 65 6c 29 3b 0a 09 4f 50 54 42 4f  , level);..OPTBO
9ca0: 4f 4c 28 22 2d 73 65 72 76 65 72 22 2c 20 73 65  OL("-server", se
9cb0: 72 76 65 72 29 3b 0a 09 4f 50 54 53 54 52 28 22  rver);..OPTSTR("
9cc0: 2d 73 65 72 76 65 72 6e 61 6d 65 22 2c 20 73 65  -servername", se
9cd0: 72 76 65 72 6e 61 6d 65 29 3b 0a 09 4f 50 54 53  rvername);..OPTS
9ce0: 54 52 28 22 2d 73 65 73 73 69 6f 6e 5f 69 64 22  TR("-session_id"
9cf0: 2c 20 73 65 73 73 69 6f 6e 5f 69 64 29 3b 0a 09  , session_id);..
9d00: 4f 50 54 42 4f 4f 4c 28 22 2d 73 73 6c 32 22 2c  OPTBOOL("-ssl2",
9d10: 20 73 73 6c 32 29 3b 0a 09 4f 50 54 42 4f 4f 4c   ssl2);..OPTBOOL
9d20: 28 22 2d 73 73 6c 33 22 2c 20 73 73 6c 33 29 3b  ("-ssl3", ssl3);
9d30: 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31  ..OPTBOOL("-tls1
9d40: 22 2c 20 74 6c 73 31 29 3b 0a 09 4f 50 54 42 4f  ", tls1);..OPTBO
9d50: 4f 4c 28 22 2d 74 6c 73 31 2e 31 22 2c 20 74 6c  OL("-tls1.1", tl
9d60: 73 31 5f 31 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28  s1_1);..OPTBOOL(
9d70: 22 2d 74 6c 73 31 2e 32 22 2c 20 74 6c 73 31 5f  "-tls1.2", tls1_
9d80: 32 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74  2);..OPTBOOL("-t
9d90: 6c 73 31 2e 33 22 2c 20 74 6c 73 31 5f 33 29 3b  ls1.3", tls1_3);
9da0: 0a 09 4f 50 54 4f 42 4a 28 22 2d 76 61 6c 69 64  ..OPTOBJ("-valid
9db0: 61 74 65 63 6f 6d 6d 61 6e 64 22 2c 20 76 63 6d  atecommand", vcm
9dc0: 64 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 76 63  d);..OPTOBJ("-vc
9dd0: 6d 64 22 2c 20 76 63 6d 64 29 3b 0a 0a 09 4f 50  md", vcmd);...OP
9de0: 54 42 41 44 28 22 6f 70 74 69 6f 6e 22 2c 20 22  TBAD("option", "
9df0: 2d 61 6c 70 6e 2c 20 2d 63 61 64 69 72 2c 20 2d  -alpn, -cadir, -
9e00: 63 61 66 69 6c 65 2c 20 2d 63 65 72 74 2c 20 2d  cafile, -cert, -
9e10: 63 65 72 74 66 69 6c 65 2c 20 2d 63 69 70 68 65  certfile, -ciphe
9e20: 72 2c 20 2d 63 69 70 68 65 72 73 75 69 74 65 73  r, -ciphersuites
9e30: 2c 20 2d 63 6f 6d 6d 61 6e 64 2c 20 2d 64 68 70  , -command, -dhp
9e40: 61 72 61 6d 73 2c 20 2d 6b 65 79 2c 20 2d 6b 65  arams, -key, -ke
9e50: 79 66 69 6c 65 2c 20 2d 6d 6f 64 65 6c 2c 20 2d  yfile, -model, -
9e60: 70 61 73 73 77 6f 72 64 2c 20 2d 70 6f 73 74 5f  password, -post_
9e70: 68 61 6e 64 73 68 61 6b 65 2c 20 2d 72 65 71 75  handshake, -requ
9e80: 65 73 74 2c 20 2d 72 65 71 75 69 72 65 2c 20 2d  est, -require, -
9e90: 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 2c 20  security_level, 
9ea0: 2d 73 65 72 76 65 72 2c 20 2d 73 65 72 76 65 72  -server, -server
9eb0: 6e 61 6d 65 2c 20 2d 73 65 73 73 69 6f 6e 5f 69  name, -session_i
9ec0: 64 2c 20 2d 73 73 6c 32 2c 20 2d 73 73 6c 33 2c  d, -ssl2, -ssl3,
9ed0: 20 2d 74 6c 73 31 2c 20 2d 74 6c 73 31 2e 31 2c   -tls1, -tls1.1,
9ee0: 20 2d 74 6c 73 31 2e 32 2c 20 2d 74 6c 73 31 2e   -tls1.2, -tls1.
9ef0: 33 2c 20 6f 72 20 2d 76 61 6c 69 64 61 74 65 63  3, or -validatec
9f00: 6f 6d 6d 61 6e 64 22 29 3b 0a 0a 09 72 65 74 75  ommand");...retu
9f10: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
9f20: 20 20 7d 0a 20 20 20 20 69 66 20 28 72 65 71 75    }.    if (requ
9f30: 65 73 74 29 09 09 76 65 72 69 66 79 20 7c 3d 20  est)..verify |= 
9f40: 53 53 4c 5f 56 45 52 49 46 59 5f 43 4c 49 45 4e  SSL_VERIFY_CLIEN
9f50: 54 5f 4f 4e 43 45 20 7c 20 53 53 4c 5f 56 45 52  T_ONCE | SSL_VER
9f60: 49 46 59 5f 50 45 45 52 3b 0a 20 20 20 20 69 66  IFY_PEER;.    if
9f70: 20 28 72 65 71 75 65 73 74 20 26 26 20 72 65 71   (request && req
9f80: 75 69 72 65 29 09 76 65 72 69 66 79 20 7c 3d 20  uire).verify |= 
9f90: 53 53 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c 5f  SSL_VERIFY_FAIL_
9fa0: 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54 3b  IF_NO_PEER_CERT;
9fb0: 0a 20 20 20 20 69 66 20 28 72 65 71 75 65 73 74  .    if (request
9fc0: 20 26 26 20 70 6f 73 74 5f 68 61 6e 64 73 68 61   && post_handsha
9fd0: 6b 65 29 09 76 65 72 69 66 79 20 7c 3d 20 53 53  ke).verify |= SS
9fe0: 4c 5f 56 45 52 49 46 59 5f 50 4f 53 54 5f 48 41  L_VERIFY_POST_HA
9ff0: 4e 44 53 48 41 4b 45 3b 0a 20 20 20 20 69 66 20  NDSHAKE;.    if 
a000: 28 76 65 72 69 66 79 20 3d 3d 20 30 29 09 09 76  (verify == 0)..v
a010: 65 72 69 66 79 20 3d 20 53 53 4c 5f 56 45 52 49  erify = SSL_VERI
a020: 46 59 5f 4e 4f 4e 45 3b 0a 0a 20 20 20 20 70 72  FY_NONE;..    pr
a030: 6f 74 6f 20 7c 3d 20 28 73 73 6c 32 20 3f 20 54  oto |= (ssl2 ? T
a040: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 20 3a 20  LS_PROTO_SSL2 : 
a050: 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d  0);.    proto |=
a060: 20 28 73 73 6c 33 20 3f 20 54 4c 53 5f 50 52 4f   (ssl3 ? TLS_PRO
a070: 54 4f 5f 53 53 4c 33 20 3a 20 30 29 3b 0a 20 20  TO_SSL3 : 0);.  
a080: 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31    proto |= (tls1
a090: 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53   ? TLS_PROTO_TLS
a0a0: 31 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74  1 : 0);.    prot
a0b0: 6f 20 7c 3d 20 28 74 6c 73 31 5f 31 20 3f 20 54  o |= (tls1_1 ? T
a0c0: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 20  LS_PROTO_TLS1_1 
a0d0: 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20  : 0);.    proto 
a0e0: 7c 3d 20 28 74 6c 73 31 5f 32 20 3f 20 54 4c 53  |= (tls1_2 ? TLS
a0f0: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 20 3a 20  _PROTO_TLS1_2 : 
a100: 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d  0);.    proto |=
a110: 20 28 74 6c 73 31 5f 33 20 3f 20 54 4c 53 5f 50   (tls1_3 ? TLS_P
a120: 52 4f 54 4f 5f 54 4c 53 31 5f 33 20 3a 20 30 29  ROTO_TLS1_3 : 0)
a130: 3b 0a 0a 20 20 20 20 2f 2a 20 72 65 73 65 74 20  ;..    /* reset 
a140: 74 6f 20 4e 55 4c 4c 20 69 66 20 62 6c 61 6e 6b  to NULL if blank
a150: 20 73 74 72 69 6e 67 20 70 72 6f 76 69 64 65 64   string provided
a160: 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 65 72 74   */.    if (cert
a170: 20 26 26 20 21 2a 63 65 72 74 29 09 09 20 20 20   && !*cert)..   
a180: 20 20 20 20 20 63 65 72 74 09 20 20 20 20 20 20       cert.      
a190: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66    = NULL;.    if
a1a0: 20 28 6b 65 79 20 26 26 20 21 2a 6b 65 79 29 09   (key && !*key).
a1b0: 09 20 20 20 20 20 20 20 20 6b 65 79 09 20 20 20  .        key.   
a1c0: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20       = NULL;.   
a1d0: 20 69 66 20 28 63 65 72 74 66 69 6c 65 20 26 26   if (certfile &&
a1e0: 20 21 2a 63 65 72 74 66 69 6c 65 29 20 20 20 20   !*certfile)    
a1f0: 20 20 20 20 20 63 65 72 74 66 69 6c 65 09 3d 20       certfile.= 
a200: 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 6b 65  NULL;.    if (ke
a210: 79 66 69 6c 65 20 26 26 20 21 2a 6b 65 79 66 69  yfile && !*keyfi
a220: 6c 65 29 09 09 6b 65 79 66 69 6c 65 09 20 20 20  le)..keyfile.   
a230: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20       = NULL;.   
a240: 20 69 66 20 28 63 69 70 68 65 72 73 20 26 26 20   if (ciphers && 
a250: 21 2a 63 69 70 68 65 72 73 29 09 20 20 20 20 20  !*ciphers).     
a260: 20 20 20 63 69 70 68 65 72 73 09 20 20 20 20 20     ciphers.     
a270: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69     = NULL;.    i
a280: 66 20 28 63 69 70 68 65 72 73 75 69 74 65 73 20  f (ciphersuites 
a290: 26 26 20 21 2a 63 69 70 68 65 72 73 75 69 74 65  && !*ciphersuite
a2a0: 73 29 20 63 69 70 68 65 72 73 75 69 74 65 73 20  s) ciphersuites 
a2b0: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69     = NULL;.    i
a2c0: 66 20 28 43 41 66 69 6c 65 20 26 26 20 21 2a 43  f (CAfile && !*C
a2d0: 41 66 69 6c 65 29 09 20 20 20 20 20 20 20 20 43  Afile).        C
a2e0: 41 66 69 6c 65 09 20 20 20 20 20 20 20 20 3d 20  Afile.        = 
a2f0: 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 43 41  NULL;.    if (CA
a300: 70 61 74 68 20 26 26 20 21 2a 43 41 70 61 74 68  path && !*CApath
a310: 29 09 20 20 20 20 20 20 20 20 43 41 70 61 74 68  ).        CApath
a320: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b  .        = NULL;
a330: 0a 20 20 20 20 69 66 20 28 44 48 70 61 72 61 6d  .    if (DHparam
a340: 73 20 26 26 20 21 2a 44 48 70 61 72 61 6d 73 29  s && !*DHparams)
a350: 09 20 20 20 20 20 20 20 20 44 48 70 61 72 61 6d  .        DHparam
a360: 73 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b  s        = NULL;
a370: 0a 0a 20 20 20 20 2f 2a 20 6e 65 77 20 53 53 4c  ..    /* new SSL
a380: 20 73 74 61 74 65 20 2a 2f 0a 20 20 20 20 73 74   state */.    st
a390: 61 74 65 50 74 72 09 09 3d 20 28 53 74 61 74 65  atePtr..= (State
a3a0: 20 2a 29 20 63 6b 61 6c 6c 6f 63 28 28 75 6e 73   *) ckalloc((uns
a3b0: 69 67 6e 65 64 29 20 73 69 7a 65 6f 66 28 53 74  igned) sizeof(St
a3c0: 61 74 65 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65  ate));.    memse
a3d0: 74 28 73 74 61 74 65 50 74 72 2c 20 30 2c 20 73  t(statePtr, 0, s
a3e0: 69 7a 65 6f 66 28 53 74 61 74 65 29 29 3b 0a 0a  izeof(State));..
a3f0: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 66 6c      statePtr->fl
a400: 61 67 73 09 3d 20 66 6c 61 67 73 3b 0a 20 20 20  ags.= flags;.   
a410: 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72   statePtr->inter
a420: 70 09 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20  p.= interp;.    
a430: 73 74 61 74 65 50 74 72 2d 3e 76 66 6c 61 67 73  statePtr->vflags
a440: 09 3d 20 76 65 72 69 66 79 3b 0a 20 20 20 20 73  .= verify;.    s
a450: 74 61 74 65 50 74 72 2d 3e 65 72 72 09 3d 20 22  tatePtr->err.= "
a460: 22 3b 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63  ";..    /* alloc
a470: 61 74 65 20 73 63 72 69 70 74 20 2a 2f 0a 20 20  ate script */.  
a480: 20 20 69 66 20 28 73 63 72 69 70 74 29 20 7b 0a    if (script) {.
a490: 09 28 76 6f 69 64 29 20 54 63 6c 5f 47 65 74 53  .(void) Tcl_GetS
a4a0: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 73 63 72  tringFromObj(scr
a4b0: 69 70 74 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20  ipt, &len);..if 
a4c0: 28 6c 65 6e 29 20 7b 0a 09 20 20 20 20 73 74 61  (len) {..    sta
a4d0: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20  tePtr->callback 
a4e0: 3d 20 73 63 72 69 70 74 3b 0a 09 20 20 20 20 54  = script;..    T
a4f0: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
a500: 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61  statePtr->callba
a510: 63 6b 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20  ck);..}.    }.. 
a520: 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 70     /* allocate p
a530: 61 73 73 77 6f 72 64 20 2a 2f 0a 20 20 20 20 69  assword */.    i
a540: 66 20 28 70 61 73 73 77 6f 72 64 29 20 7b 0a 09  f (password) {..
a550: 28 76 6f 69 64 29 20 54 63 6c 5f 47 65 74 53 74  (void) Tcl_GetSt
a560: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 61 73 73  ringFromObj(pass
a570: 77 6f 72 64 2c 20 26 6c 65 6e 29 3b 0a 09 69 66  word, &len);..if
a580: 20 28 6c 65 6e 29 20 7b 0a 09 20 20 20 20 73 74   (len) {..    st
a590: 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64  atePtr->password
a5a0: 20 3d 20 70 61 73 73 77 6f 72 64 3b 0a 09 20 20   = password;..  
a5b0: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
a5c0: 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73  nt(statePtr->pas
a5d0: 73 77 6f 72 64 29 3b 0a 09 7d 0a 20 20 20 20 7d  sword);..}.    }
a5e0: 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74  ..    /* allocat
a5f0: 65 20 76 61 6c 69 64 61 74 65 20 63 6f 6d 6d 61  e validate comma
a600: 6e 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 76 63  nd */.    if (vc
a610: 6d 64 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 63  md) {..(void) Tc
a620: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
a630: 62 6a 28 76 63 6d 64 2c 20 26 6c 65 6e 29 3b 0a  bj(vcmd, &len);.
a640: 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20 20 20  .if (len) {..   
a650: 20 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20   statePtr->vcmd 
a660: 3d 20 76 63 6d 64 3b 0a 09 20 20 20 20 54 63 6c  = vcmd;..    Tcl
a670: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 73 74  _IncrRefCount(st
a680: 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 09  atePtr->vcmd);..
a690: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20  }.    }..    if 
a6a0: 28 6d 6f 64 65 6c 20 21 3d 20 4e 55 4c 4c 29 20  (model != NULL) 
a6b0: 7b 0a 09 69 6e 74 20 6d 6f 64 65 3b 0a 09 2f 2a  {..int mode;../*
a6c0: 20 47 65 74 20 74 68 65 20 22 6d 6f 64 65 6c 22   Get the "model"
a6d0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 63 68 61   context */..cha
a6e0: 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e  n = Tcl_GetChann
a6f0: 65 6c 28 69 6e 74 65 72 70 2c 20 6d 6f 64 65 6c  el(interp, model
a700: 2c 20 26 6d 6f 64 65 29 3b 0a 09 69 66 20 28 63  , &mode);..if (c
a710: 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e  han == (Tcl_Chan
a720: 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 20 20  nel) NULL) {..  
a730: 20 20 54 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f    Tls_Free((tls_
a740: 66 72 65 65 5f 74 79 70 65 20 2a 29 20 73 74 61  free_type *) sta
a750: 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74  tePtr);..    ret
a760: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
a770: 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 4d 61 6b 65 20  }.../*.. * Make 
a780: 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20  sure to operate 
a790: 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63  on the topmost c
a7a0: 68 61 6e 6e 65 6c 0a 09 20 2a 2f 0a 09 63 68 61  hannel.. */..cha
a7b0: 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68  n = Tcl_GetTopCh
a7c0: 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 09 69 66  annel(chan);..if
a7d0: 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c   (Tcl_GetChannel
a7e0: 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c  Type(chan) != Tl
a7f0: 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29  s_ChannelType())
a800: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65   {..    Tcl_Appe
a810: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
a820: 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22   "bad channel \"
a830: 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  ", Tcl_GetChanne
a840: 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22  lName(chan),..."
a850: 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68  \": not a TLS ch
a860: 61 6e 6e 65 6c 22 2c 20 28 63 68 61 72 20 2a 29  annel", (char *)
a870: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c   NULL);..    Tcl
a880: 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e  _SetErrorCode(in
a890: 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d  terp, "TLS", "IM
a8a0: 50 4f 52 54 22 2c 20 22 43 48 41 4e 4e 45 4c 22  PORT", "CHANNEL"
a8b0: 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68  , "INVALID", (ch
a8c0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20  ar *) NULL);..  
a8d0: 20 20 54 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f    Tls_Free((tls_
a8e0: 66 72 65 65 5f 74 79 70 65 20 2a 29 20 73 74 61  free_type *) sta
a8f0: 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74  tePtr);..    ret
a900: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
a910: 7d 0a 09 63 74 78 20 3d 20 28 28 53 74 61 74 65  }..ctx = ((State
a920: 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65   *)Tcl_GetChanne
a930: 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68  lInstanceData(ch
a940: 61 6e 29 29 2d 3e 63 74 78 3b 0a 20 20 20 20 7d  an))->ctx;.    }
a950: 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 28 63 74   else {..if ((ct
a960: 78 20 3d 20 43 54 58 5f 49 6e 69 74 28 73 74 61  x = CTX_Init(sta
a970: 74 65 50 74 72 2c 20 73 65 72 76 65 72 2c 20 70  tePtr, server, p
a980: 72 6f 74 6f 2c 20 6b 65 79 66 69 6c 65 2c 20 63  roto, keyfile, c
a990: 65 72 74 66 69 6c 65 2c 20 6b 65 79 2c 20 63 65  ertfile, key, ce
a9a0: 72 74 2c 20 6b 65 79 5f 6c 65 6e 2c 0a 09 20 20  rt, key_len,..  
a9b0: 20 20 63 65 72 74 5f 6c 65 6e 2c 20 43 41 70 61    cert_len, CApa
a9c0: 74 68 2c 20 43 41 66 69 6c 65 2c 20 63 69 70 68  th, CAfile, ciph
a9d0: 65 72 73 2c 20 63 69 70 68 65 72 73 75 69 74 65  ers, ciphersuite
a9e0: 73 2c 20 6c 65 76 65 6c 2c 20 44 48 70 61 72 61  s, level, DHpara
a9f0: 6d 73 29 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  ms)) == NULL) {.
aa00: 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 74  .    Tls_Free((t
aa10: 6c 73 5f 66 72 65 65 5f 74 79 70 65 20 2a 29 20  ls_free_type *) 
aa20: 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20  statePtr);..    
aa30: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
aa40: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ;..}.    }..    
aa50: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 20 3d 20  statePtr->ctx = 
aa60: 63 74 78 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20  ctx;..    /*.   
aa70: 20 20 2a 20 57 65 20 6e 65 65 64 20 74 6f 20 6d    * We need to m
aa80: 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
aa90: 65 20 63 68 61 6e 6e 65 6c 20 77 6f 72 6b 73 20  e channel works 
aaa0: 69 6e 20 62 69 6e 61 72 79 20 28 66 6f 72 20 74  in binary (for t
aab0: 68 65 0a 20 20 20 20 20 2a 20 65 6e 63 72 79 70  he.     * encryp
aac0: 74 69 6f 6e 20 6e 6f 74 20 74 6f 20 67 65 74 20  tion not to get 
aad0: 67 6f 6f 66 65 64 20 75 70 29 2e 0a 20 20 20 20  goofed up)..    
aae0: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53 74 72   */.    Tcl_DStr
aaf0: 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 68  ingInit(&upperCh
ab00: 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e  annelTranslation
ab10: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69  );.    Tcl_DStri
ab20: 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 68 61  ngInit(&upperCha
ab30: 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20  nnelBlocking);. 
ab40: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e     Tcl_DStringIn
ab50: 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c  it(&upperChannel
ab60: 45 4f 46 43 68 61 72 29 3b 0a 20 20 20 20 54 63  EOFChar);.    Tc
ab70: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75  l_DStringInit(&u
ab80: 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64  pperChannelEncod
ab90: 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65  ing);.    Tcl_Ge
aba0: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69  tChannelOption(i
abb0: 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 65  nterp, chan, "-e
abc0: 6f 66 63 68 61 72 22 2c 20 26 75 70 70 65 72 43  ofchar", &upperC
abd0: 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a  hannelEOFChar);.
abe0: 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e      Tcl_GetChann
abf0: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c  elOption(interp,
ac00: 20 63 68 61 6e 2c 20 22 2d 65 6e 63 6f 64 69 6e   chan, "-encodin
ac10: 67 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65  g", &upperChanne
ac20: 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20  lEncoding);.    
ac30: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70  Tcl_GetChannelOp
ac40: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61  tion(interp, cha
ac50: 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e  n, "-translation
ac60: 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c  ", &upperChannel
ac70: 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 20  Translation);.  
ac80: 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c    Tcl_GetChannel
ac90: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63  Option(interp, c
aca0: 68 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22  han, "-blocking"
acb0: 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42  , &upperChannelB
acc0: 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 20 54 63  locking);.    Tc
acd0: 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69  l_SetChannelOpti
ace0: 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c  on(interp, chan,
acf0: 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c   "-translation",
ad00: 20 22 62 69 6e 61 72 79 22 29 3b 0a 20 20 20 20   "binary");.    
ad10: 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70  Tcl_SetChannelOp
ad20: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61  tion(interp, cha
ad30: 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20  n, "-blocking", 
ad40: 22 74 72 75 65 22 29 3b 0a 20 20 20 20 64 70 72  "true");.    dpr
ad50: 69 6e 74 66 28 22 43 6f 6e 73 75 6d 69 6e 67 20  intf("Consuming 
ad60: 54 63 6c 20 63 68 61 6e 6e 65 6c 20 25 73 22 2c  Tcl channel %s",
ad70: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e   Tcl_GetChannelN
ad80: 61 6d 65 28 63 68 61 6e 29 29 3b 0a 20 20 20 20  ame(chan));.    
ad90: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d  statePtr->self =
ada0: 20 54 63 6c 5f 53 74 61 63 6b 43 68 61 6e 6e 65   Tcl_StackChanne
adb0: 6c 28 69 6e 74 65 72 70 2c 20 54 6c 73 5f 43 68  l(interp, Tls_Ch
adc0: 61 6e 6e 65 6c 54 79 70 65 28 29 2c 20 28 43 6c  annelType(), (Cl
add0: 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50  ientData) stateP
ade0: 74 72 2c 0a 09 28 54 43 4c 5f 52 45 41 44 41 42  tr,..(TCL_READAB
adf0: 4c 45 20 7c 20 54 43 4c 5f 57 52 49 54 41 42 4c  LE | TCL_WRITABL
ae00: 45 29 2c 20 63 68 61 6e 29 3b 0a 20 20 20 20 64  E), chan);.    d
ae10: 70 72 69 6e 74 66 28 22 43 72 65 61 74 65 64 20  printf("Created 
ae20: 63 68 61 6e 6e 65 6c 20 6e 61 6d 65 64 20 25 73  channel named %s
ae30: 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  ", Tcl_GetChanne
ae40: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e  lName(statePtr->
ae50: 73 65 6c 66 29 29 3b 0a 20 20 20 20 69 66 20 28  self));.    if (
ae60: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d  statePtr->self =
ae70: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20  = (Tcl_Channel) 
ae80: 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20  NULL) {../*.. * 
ae90: 4e 6f 20 75 73 65 20 6f 66 20 54 63 6c 5f 45 76  No use of Tcl_Ev
aea0: 65 6e 74 75 61 6c 6c 79 46 72 65 65 20 62 65 63  entuallyFree bec
aeb0: 61 75 73 65 20 6e 6f 20 70 6f 73 73 69 62 6c 65  ause no possible
aec0: 20 54 63 6c 5f 50 72 65 73 65 72 76 65 2e 0a 09   Tcl_Preserve...
aed0: 20 2a 2f 0a 09 54 6c 73 5f 46 72 65 65 28 28 74   */..Tls_Free((t
aee0: 6c 73 5f 66 72 65 65 5f 74 79 70 65 20 2a 29 20  ls_free_type *) 
aef0: 73 74 61 74 65 50 74 72 29 3b 0a 09 54 63 6c 5f  statePtr);..Tcl_
af00: 44 53 74 72 69 6e 67 46 72 65 65 28 26 75 70 70  DStringFree(&upp
af10: 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61  erChannelTransla
af20: 74 69 6f 6e 29 3b 0a 09 54 63 6c 5f 44 53 74 72  tion);..Tcl_DStr
af30: 69 6e 67 46 72 65 65 28 26 75 70 70 65 72 43 68  ingFree(&upperCh
af40: 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a  annelEncoding);.
af50: 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65  .Tcl_DStringFree
af60: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f  (&upperChannelEO
af70: 46 43 68 61 72 29 3b 0a 09 54 63 6c 5f 44 53 74  FChar);..Tcl_DSt
af80: 72 69 6e 67 46 72 65 65 28 26 75 70 70 65 72 43  ringFree(&upperC
af90: 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b  hannelBlocking);
afa0: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
afb0: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54  OR;.    }..    T
afc0: 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74  cl_SetChannelOpt
afd0: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74  ion(interp, stat
afe0: 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 74 72  ePtr->self, "-tr
aff0: 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 54 63 6c 5f  anslation", Tcl_
b000: 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70  DStringValue(&up
b010: 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c  perChannelTransl
b020: 61 74 69 6f 6e 29 29 3b 0a 20 20 20 20 54 63 6c  ation));.    Tcl
b030: 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f  _SetChannelOptio
b040: 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50  n(interp, stateP
b050: 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 65 6e 63 6f  tr->self, "-enco
b060: 64 69 6e 67 22 2c 20 54 63 6c 5f 44 53 74 72 69  ding", Tcl_DStri
b070: 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68  ngValue(&upperCh
b080: 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 29 3b  annelEncoding));
b090: 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e  .    Tcl_SetChan
b0a0: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70  nelOption(interp
b0b0: 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66  , statePtr->self
b0c0: 2c 20 22 2d 65 6f 66 63 68 61 72 22 2c 20 54 63  , "-eofchar", Tc
b0d0: 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26  l_DStringValue(&
b0e0: 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43  upperChannelEOFC
b0f0: 68 61 72 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53  har));.    Tcl_S
b100: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28  etChannelOption(
b110: 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72  interp, statePtr
b120: 2d 3e 73 65 6c 66 2c 20 22 2d 62 6c 6f 63 6b 69  ->self, "-blocki
b130: 6e 67 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67  ng", Tcl_DString
b140: 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e  Value(&upperChan
b150: 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 29 3b 0a 20  nelBlocking));. 
b160: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72     Tcl_DStringFr
b170: 65 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c  ee(&upperChannel
b180: 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 20  Translation);.  
b190: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65    Tcl_DStringFre
b1a0: 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45  e(&upperChannelE
b1b0: 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 54 63  ncoding);.    Tc
b1c0: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 75  l_DStringFree(&u
b1d0: 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68  pperChannelEOFCh
b1e0: 61 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74  ar);.    Tcl_DSt
b1f0: 72 69 6e 67 46 72 65 65 28 26 75 70 70 65 72 43  ringFree(&upperC
b200: 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b  hannelBlocking);
b210: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20  ..    /*.     * 
b220: 53 53 4c 20 49 6e 69 74 69 61 6c 69 7a 61 74 69  SSL Initializati
b230: 6f 6e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 73  on.     */.    s
b240: 74 61 74 65 50 74 72 2d 3e 73 73 6c 20 3d 20 53  tatePtr->ssl = S
b250: 53 4c 5f 6e 65 77 28 73 74 61 74 65 50 74 72 2d  SL_new(statePtr-
b260: 3e 63 74 78 29 3b 0a 20 20 20 20 69 66 20 28 21  >ctx);.    if (!
b270: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 20 7b  statePtr->ssl) {
b280: 0a 09 2f 2a 20 53 53 4c 20 6c 69 62 72 61 72 79  ../* SSL library
b290: 20 65 72 72 6f 72 20 2a 2f 0a 09 54 63 6c 5f 41   error */..Tcl_A
b2a0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
b2b0: 72 70 2c 20 22 63 6f 75 6c 64 6e 27 74 20 63 6f  rp, "couldn't co
b2c0: 6e 73 74 72 75 63 74 20 73 73 6c 20 73 65 73 73  nstruct ssl sess
b2d0: 69 6f 6e 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f  ion: ", GET_ERR_
b2e0: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20  REASON(), (char 
b2f0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54  *) NULL);..    T
b300: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28  cl_SetErrorCode(
b310: 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22  interp, "TLS", "
b320: 49 4d 50 4f 52 54 22 2c 20 22 49 4e 49 54 22 2c  IMPORT", "INIT",
b330: 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72   "FAILED", (char
b340: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 54 6c 73 5f   *) NULL);..Tls_
b350: 46 72 65 65 28 28 74 6c 73 5f 66 72 65 65 5f 74  Free((tls_free_t
b360: 79 70 65 20 2a 29 20 73 74 61 74 65 50 74 72 29  ype *) statePtr)
b370: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
b380: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
b390: 2f 2a 20 53 65 74 20 68 6f 73 74 20 73 65 72 76  /* Set host serv
b3a0: 65 72 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 69  er name */.    i
b3b0: 66 20 28 73 65 72 76 65 72 6e 61 6d 65 29 20 7b  f (servername) {
b3c0: 0a 09 2f 2a 20 53 65 74 73 20 74 68 65 20 73 65  ../* Sets the se
b3d0: 72 76 65 72 20 6e 61 6d 65 20 69 6e 64 69 63 61  rver name indica
b3e0: 74 69 6f 6e 20 28 53 4e 49 29 20 69 6e 20 43 6c  tion (SNI) in Cl
b3f0: 69 65 6e 74 48 65 6c 6c 6f 20 65 78 74 65 6e 73  ientHello extens
b400: 69 6f 6e 20 2a 2f 0a 09 2f 2a 20 50 65 72 20 52  ion */../* Per R
b410: 46 43 20 36 30 36 36 2c 20 68 6f 73 74 6e 61 6d  FC 6066, hostnam
b420: 65 20 69 73 20 61 20 41 53 43 49 49 20 65 6e 63  e is a ASCII enc
b430: 6f 64 65 64 20 73 74 72 69 6e 67 2c 20 74 68 6f  oded string, tho
b440: 75 67 68 20 52 46 43 20 34 33 36 36 20 73 61 79  ugh RFC 4366 say
b450: 73 20 55 54 46 2d 38 2e 20 2a 2f 0a 09 69 66 20  s UTF-8. */..if 
b460: 28 21 53 53 4c 5f 73 65 74 5f 74 6c 73 65 78 74  (!SSL_set_tlsext
b470: 5f 68 6f 73 74 5f 6e 61 6d 65 28 73 74 61 74 65  _host_name(state
b480: 50 74 72 2d 3e 73 73 6c 2c 20 73 65 72 76 65 72  Ptr->ssl, server
b490: 6e 61 6d 65 29 20 26 26 20 72 65 71 75 69 72 65  name) && require
b4a0: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70  ) {..    Tcl_App
b4b0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
b4c0: 2c 20 22 53 65 74 20 53 4e 49 20 65 78 74 65 6e  , "Set SNI exten
b4d0: 73 69 6f 6e 20 66 61 69 6c 65 64 3a 20 22 2c 20  sion failed: ", 
b4e0: 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29  GET_ERR_REASON()
b4f0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
b500: 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72  ;..    Tcl_SetEr
b510: 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  rorCode(interp, 
b520: 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c  "TLS", "IMPORT",
b530: 20 22 53 4e 49 22 2c 20 22 46 41 49 4c 45 44 22   "SNI", "FAILED"
b540: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
b550: 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28  ;..    Tls_Free(
b560: 28 74 6c 73 5f 66 72 65 65 5f 74 79 70 65 20 2a  (tls_free_type *
b570: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20  ) statePtr);..  
b580: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
b590: 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65 74 20  OR;..}.../* Set 
b5a0: 68 6f 73 74 6e 61 6d 65 20 66 6f 72 20 70 65 65  hostname for pee
b5b0: 72 20 63 65 72 74 69 66 69 63 61 74 65 20 68 6f  r certificate ho
b5c0: 73 74 6e 61 6d 65 20 76 65 72 69 66 69 63 61 74  stname verificat
b5d0: 69 6f 6e 20 69 6e 20 63 6c 69 65 6e 74 73 2e 0a  ion in clients..
b5e0: 09 20 20 20 44 6f 6e 27 74 20 75 73 65 20 53 53  .   Don't use SS
b5f0: 4c 5f 73 65 74 31 5f 68 6f 73 74 20 73 69 6e 63  L_set1_host sinc
b600: 65 20 69 74 20 68 61 73 20 6c 69 6d 69 74 61 74  e it has limitat
b610: 69 6f 6e 73 2e 20 2a 2f 0a 09 69 66 20 28 21 53  ions. */..if (!S
b620: 53 4c 5f 61 64 64 31 5f 68 6f 73 74 28 73 74 61  SL_add1_host(sta
b630: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 73 65 72 76  tePtr->ssl, serv
b640: 65 72 6e 61 6d 65 29 29 20 7b 0a 09 20 20 20 20  ername)) {..    
b650: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
b660: 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20 44 4e  (interp, "Set DN
b670: 53 20 68 6f 73 74 6e 61 6d 65 20 66 61 69 6c 65  S hostname faile
b680: 64 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45  d: ", GET_ERR_RE
b690: 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29  ASON(), (char *)
b6a0: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c   NULL);..    Tcl
b6b0: 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e  _SetErrorCode(in
b6c0: 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d  terp, "TLS", "IM
b6d0: 50 4f 52 54 22 2c 20 22 48 4f 53 54 4e 41 4d 45  PORT", "HOSTNAME
b6e0: 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68  ", "FAILED", (ch
b6f0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20  ar *) NULL);..  
b700: 20 20 54 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f    Tls_Free((tls_
b710: 66 72 65 65 5f 74 79 70 65 20 2a 29 20 73 74 61  free_type *) sta
b720: 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74  tePtr);..    ret
b730: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
b740: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
b750: 52 65 73 75 6d 65 20 73 65 73 73 69 6f 6e 20 69  Resume session i
b760: 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 65 73  d */.    if (ses
b770: 73 69 6f 6e 5f 69 64 20 26 26 20 73 74 72 6c 65  sion_id && strle
b780: 6e 28 73 65 73 73 69 6f 6e 5f 69 64 29 20 3c 3d  n(session_id) <=
b790: 20 53 53 4c 5f 4d 41 58 5f 53 49 44 5f 43 54 58   SSL_MAX_SID_CTX
b7a0: 5f 4c 45 4e 47 54 48 29 20 7b 0a 09 2f 2a 20 53  _LENGTH) {../* S
b7b0: 53 4c 5f 73 65 74 5f 73 65 73 73 69 6f 6e 28 29  SL_set_session()
b7c0: 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 53 45   */..if (!SSL_SE
b7d0: 53 53 49 4f 4e 5f 73 65 74 31 5f 69 64 5f 63 6f  SSION_set1_id_co
b7e0: 6e 74 65 78 74 28 53 53 4c 5f 67 65 74 5f 73 65  ntext(SSL_get_se
b7f0: 73 73 69 6f 6e 28 73 74 61 74 65 50 74 72 2d 3e  ssion(statePtr->
b800: 73 73 6c 29 2c 0a 09 09 28 63 6f 6e 73 74 20 75  ssl),...(const u
b810: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20  nsigned char *) 
b820: 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 75 6e 73  session_id, (uns
b830: 69 67 6e 65 64 20 69 6e 74 29 20 73 74 72 6c 65  igned int) strle
b840: 6e 28 73 65 73 73 69 6f 6e 5f 69 64 29 29 29 20  n(session_id))) 
b850: 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  {..    Tcl_Appen
b860: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
b870: 22 52 65 73 75 6d 65 20 73 65 73 73 69 6f 6e 20  "Resume session 
b880: 66 61 69 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45  failed: ", GET_E
b890: 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68  RR_REASON(), (ch
b8a0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20  ar *) NULL);..  
b8b0: 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f    Tcl_SetErrorCo
b8c0: 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22  de(interp, "TLS"
b8d0: 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 53 45 53  , "IMPORT", "SES
b8e0: 53 49 4f 4e 22 2c 20 22 46 41 49 4c 45 44 22 2c  SION", "FAILED",
b8f0: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
b900: 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28  ..    Tls_Free((
b910: 74 6c 73 5f 66 72 65 65 5f 74 79 70 65 20 2a 29  tls_free_type *)
b920: 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20   statePtr);..   
b930: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
b940: 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20  R;..}.    }..   
b950: 20 2f 2a 20 45 6e 61 62 6c 65 20 41 70 70 6c 69   /* Enable Appli
b960: 63 61 74 69 6f 6e 2d 4c 61 79 65 72 20 50 72 6f  cation-Layer Pro
b970: 74 6f 63 6f 6c 20 4e 65 67 6f 74 69 61 74 69 6f  tocol Negotiatio
b980: 6e 2e 20 45 78 61 6d 70 6c 65 73 20 61 72 65 3a  n. Examples are:
b990: 20 68 74 74 70 2f 31 2e 30 2c 0a 09 68 74 74 70   http/1.0,..http
b9a0: 2f 31 2e 31 2c 20 68 32 2c 20 68 33 2c 20 66 74  /1.1, h2, h3, ft
b9b0: 70 2c 20 69 6d 61 70 2c 20 70 6f 70 33 2c 20 78  p, imap, pop3, x
b9c0: 6d 70 70 2d 63 6c 69 65 6e 74 2c 20 78 6d 70 70  mpp-client, xmpp
b9d0: 2d 73 65 72 76 65 72 2c 20 6d 71 74 74 2c 20 69  -server, mqtt, i
b9e0: 72 63 2c 20 65 74 63 2e 20 2a 2f 0a 20 20 20 20  rc, etc. */.    
b9f0: 69 66 20 28 61 6c 70 6e 29 20 7b 0a 09 2f 2a 20  if (alpn) {../* 
ba00: 43 6f 6e 76 65 72 74 20 61 20 54 43 4c 20 6c 69  Convert a TCL li
ba10: 73 74 20 69 6e 74 6f 20 61 20 70 72 6f 74 6f 63  st into a protoc
ba20: 6f 6c 2d 6c 69 73 74 20 69 6e 20 77 69 72 65 2d  ol-list in wire-
ba30: 66 6f 72 6d 61 74 20 2a 2f 0a 09 75 6e 73 69 67  format */..unsig
ba40: 6e 65 64 20 63 68 61 72 20 2a 70 72 6f 74 6f 73  ned char *protos
ba50: 2c 20 2a 70 3b 0a 09 75 6e 73 69 67 6e 65 64 20  , *p;..unsigned 
ba60: 69 6e 74 20 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d  int protos_len =
ba70: 20 30 3b 0a 09 54 63 6c 5f 53 69 7a 65 20 63 6e   0;..Tcl_Size cn
ba80: 74 2c 20 69 3b 0a 09 69 6e 74 20 6a 3b 0a 09 54  t, i;..int j;..T
ba90: 63 6c 5f 4f 62 6a 20 2a 2a 6c 69 73 74 3b 0a 0a  cl_Obj **list;..
baa0: 09 69 66 20 28 54 63 6c 5f 4c 69 73 74 4f 62 6a  .if (Tcl_ListObj
bab0: 47 65 74 45 6c 65 6d 65 6e 74 73 28 69 6e 74 65  GetElements(inte
bac0: 72 70 2c 20 61 6c 70 6e 2c 20 26 63 6e 74 2c 20  rp, alpn, &cnt, 
bad0: 26 6c 69 73 74 29 20 21 3d 20 54 43 4c 5f 4f 4b  &list) != TCL_OK
bae0: 29 20 7b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65  ) {..    Tls_Fre
baf0: 65 28 28 74 6c 73 5f 66 72 65 65 5f 74 79 70 65  e((tls_free_type
bb00: 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09   *) statePtr);..
bb10: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
bb20: 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65  RROR;..}.../* De
bb30: 74 65 72 6d 69 6e 65 20 74 68 65 20 6d 65 6d 6f  termine the memo
bb40: 72 79 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  ry required for 
bb50: 74 68 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73  the protocol-lis
bb60: 74 20 2a 2f 0a 09 66 6f 72 20 28 69 20 3d 20 30  t */..for (i = 0
bb70: 3b 20 69 20 3c 20 63 6e 74 3b 20 69 2b 2b 29 20  ; i < cnt; i++) 
bb80: 7b 0a 09 20 20 20 20 54 63 6c 5f 47 65 74 53 74  {..    Tcl_GetSt
bb90: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6c 69 73 74  ringFromObj(list
bba0: 5b 69 5d 2c 20 26 6c 65 6e 29 3b 0a 09 20 20 20  [i], &len);..   
bbb0: 20 69 66 20 28 6c 65 6e 20 3e 20 32 35 35 29 20   if (len > 255) 
bbc0: 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65  {...Tcl_AppendRe
bbd0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 41 4c  sult(interp, "AL
bbe0: 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e 61 6d 65  PN protocol name
bbf0: 73 20 74 6f 6f 20 6c 6f 6e 67 22 2c 20 28 63 68  s too long", (ch
bc00: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 54  ar *) NULL);...T
bc10: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28  cl_SetErrorCode(
bc20: 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22  interp, "TLS", "
bc30: 49 4d 50 4f 52 54 22 2c 20 22 41 4c 50 4e 22 2c  IMPORT", "ALPN",
bc40: 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72   "FAILED", (char
bc50: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 54 6c 73   *) NULL);...Tls
bc60: 5f 46 72 65 65 28 28 74 6c 73 5f 66 72 65 65 5f  _Free((tls_free_
bc70: 74 79 70 65 20 2a 29 20 73 74 61 74 65 50 74 72  type *) statePtr
bc80: 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f  );...return TCL_
bc90: 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 20  ERROR;..    }.. 
bca0: 20 20 20 70 72 6f 74 6f 73 5f 6c 65 6e 20 2b 3d     protos_len +=
bcb0: 20 31 20 2b 20 28 69 6e 74 29 20 6c 65 6e 3b 0a   1 + (int) len;.
bcc0: 09 7d 0a 0a 09 2f 2a 20 42 75 69 6c 64 20 74 68  .}.../* Build th
bcd0: 65 20 63 6f 6d 70 6c 65 74 65 20 70 72 6f 74 6f  e complete proto
bce0: 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 70 72 6f  col-list */..pro
bcf0: 74 6f 73 20 3d 20 63 6b 61 6c 6c 6f 63 28 70 72  tos = ckalloc(pr
bd00: 6f 74 6f 73 5f 6c 65 6e 29 3b 0a 09 2f 2a 20 70  otos_len);../* p
bd10: 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 73 20 63 6f  rotocol-lists co
bd20: 6e 73 69 73 74 20 6f 66 20 38 2d 62 69 74 20 6c  nsist of 8-bit l
bd30: 65 6e 67 74 68 2d 70 72 65 66 69 78 65 64 2c 20  ength-prefixed, 
bd40: 62 79 74 65 20 73 74 72 69 6e 67 73 20 2a 2f 0a  byte strings */.
bd50: 09 66 6f 72 20 28 6a 20 3d 20 30 2c 20 70 20 3d  .for (j = 0, p =
bd60: 20 70 72 6f 74 6f 73 3b 20 6a 20 3c 20 63 6e 74   protos; j < cnt
bd70: 3b 20 6a 2b 2b 29 20 7b 0a 09 20 20 20 20 63 68  ; j++) {..    ch
bd80: 61 72 20 2a 73 74 72 20 3d 20 54 63 6c 5f 47 65  ar *str = Tcl_Ge
bd90: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6c  tStringFromObj(l
bda0: 69 73 74 5b 6a 5d 2c 20 26 6c 65 6e 29 3b 0a 09  ist[j], &len);..
bdb0: 20 20 20 20 2a 70 2b 2b 20 3d 20 28 75 6e 73 69      *p++ = (unsi
bdc0: 67 6e 65 64 20 63 68 61 72 29 20 6c 65 6e 3b 0a  gned char) len;.
bdd0: 09 20 20 20 20 6d 65 6d 63 70 79 28 70 2c 20 73  .    memcpy(p, s
bde0: 74 72 2c 20 28 73 69 7a 65 5f 74 29 20 6c 65 6e  tr, (size_t) len
bdf0: 29 3b 0a 09 20 20 20 20 70 20 2b 3d 20 6c 65 6e  );..    p += len
be00: 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 53 4c 5f 73 65  ;..}.../* SSL_se
be10: 74 5f 61 6c 70 6e 5f 70 72 6f 74 6f 73 20 6d 61  t_alpn_protos ma
be20: 6b 65 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68  kes a copy of th
be30: 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20  e protocol-list 
be40: 2a 2f 0a 09 2f 2a 20 4e 6f 74 65 3a 20 54 68 69  */../* Note: Thi
be50: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 76 65 72  s function rever
be60: 73 65 73 20 74 68 65 20 72 65 74 75 72 6e 20 76  ses the return v
be70: 61 6c 75 65 20 63 6f 6e 76 65 6e 74 69 6f 6e 20  alue convention 
be80: 2a 2f 0a 09 69 66 20 28 53 53 4c 5f 73 65 74 5f  */..if (SSL_set_
be90: 61 6c 70 6e 5f 70 72 6f 74 6f 73 28 73 74 61 74  alpn_protos(stat
bea0: 65 50 74 72 2d 3e 73 73 6c 2c 20 70 72 6f 74 6f  ePtr->ssl, proto
beb0: 73 2c 20 70 72 6f 74 6f 73 5f 6c 65 6e 29 29 20  s, protos_len)) 
bec0: 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  {..    Tcl_Appen
bed0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
bee0: 22 53 65 74 20 41 4c 50 4e 20 70 72 6f 74 6f 63  "Set ALPN protoc
bef0: 6f 6c 73 20 66 61 69 6c 65 64 3a 20 22 2c 20 47  ols failed: ", G
bf00: 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c  ET_ERR_REASON(),
bf10: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
bf20: 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72  ..    Tcl_SetErr
bf30: 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22  orCode(interp, "
bf40: 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20  TLS", "IMPORT", 
bf50: 22 41 4c 50 4e 22 2c 20 22 46 41 49 4c 45 44 22  "ALPN", "FAILED"
bf60: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
bf70: 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28  ;..    Tls_Free(
bf80: 28 74 6c 73 5f 66 72 65 65 5f 74 79 70 65 20 2a  (tls_free_type *
bf90: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20  ) statePtr);..  
bfa0: 20 20 63 6b 66 72 65 65 28 70 72 6f 74 6f 73 29    ckfree(protos)
bfb0: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  ;..    return TC
bfc0: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a  L_ERROR;..}.../*
bfd0: 20 53 74 6f 72 65 20 70 72 6f 74 6f 63 6f 6c 73   Store protocols
bfe0: 20 6c 69 73 74 20 2a 2f 0a 09 73 74 61 74 65 50   list */..stateP
bff0: 74 72 2d 3e 70 72 6f 74 6f 73 20 3d 20 70 72 6f  tr->protos = pro
c000: 74 6f 73 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e  tos;..statePtr->
c010: 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 70 72 6f  protos_len = pro
c020: 74 6f 73 5f 6c 65 6e 3b 0a 20 20 20 20 7d 20 65  tos_len;.    } e
c030: 6c 73 65 20 7b 0a 09 73 74 61 74 65 50 74 72 2d  lse {..statePtr-
c040: 3e 70 72 6f 74 6f 73 20 3d 20 4e 55 4c 4c 3b 0a  >protos = NULL;.
c050: 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f  .statePtr->proto
c060: 73 5f 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 7d  s_len = 0;.    }
c070: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20  ..    /*.     * 
c080: 53 53 4c 20 43 61 6c 6c 62 61 63 6b 73 0a 20 20  SSL Callbacks.  
c090: 20 20 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65     */.    SSL_se
c0a0: 74 5f 61 70 70 5f 64 61 74 61 28 73 74 61 74 65  t_app_data(state
c0b0: 50 74 72 2d 3e 73 73 6c 2c 20 28 76 6f 69 64 20  Ptr->ssl, (void 
c0c0: 2a 29 73 74 61 74 65 50 74 72 29 3b 09 2f 2a 20  *)statePtr);./* 
c0d0: 70 6f 69 6e 74 20 62 61 63 6b 20 74 6f 20 75 73  point back to us
c0e0: 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f   */.    SSL_set_
c0f0: 76 65 72 69 66 79 28 73 74 61 74 65 50 74 72 2d  verify(statePtr-
c100: 3e 73 73 6c 2c 20 76 65 72 69 66 79 2c 20 56 65  >ssl, verify, Ve
c110: 72 69 66 79 43 61 6c 6c 62 61 63 6b 29 3b 0a 20  rifyCallback);. 
c120: 20 20 20 53 53 4c 5f 73 65 74 5f 69 6e 66 6f 5f     SSL_set_info_
c130: 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 50 74  callback(statePt
c140: 72 2d 3e 73 73 6c 2c 20 49 6e 66 6f 43 61 6c 6c  r->ssl, InfoCall
c150: 62 61 63 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  back);..    /* C
c160: 61 6c 6c 62 61 63 6b 20 66 6f 72 20 6f 62 73 65  allback for obse
c170: 72 76 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 6d  rving protocol m
c180: 65 73 73 61 67 65 73 20 2a 2f 0a 23 69 66 6e 64  essages */.#ifnd
c190: 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53  ef OPENSSL_NO_SS
c1a0: 4c 5f 54 52 41 43 45 0a 20 20 20 20 2f 2a 20 76  L_TRACE.    /* v
c1b0: 6f 69 64 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f  oid SSL_CTX_set_
c1c0: 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 5f 61 72 67  msg_callback_arg
c1d0: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20  (statePtr->ctx, 
c1e0: 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72  (void *)statePtr
c1f0: 29 3b 0a 20 20 20 20 76 6f 69 64 20 53 53 4c 5f  );.    void SSL_
c200: 43 54 58 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c  CTX_set_msg_call
c210: 62 61 63 6b 28 73 74 61 74 65 50 74 72 2d 3e 63  back(statePtr->c
c220: 74 78 2c 20 4d 65 73 73 61 67 65 43 61 6c 6c 62  tx, MessageCallb
c230: 61 63 6b 29 3b 20 2a 2f 0a 20 20 20 20 53 53 4c  ack); */.    SSL
c240: 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63  _set_msg_callbac
c250: 6b 5f 61 72 67 28 73 74 61 74 65 50 74 72 2d 3e  k_arg(statePtr->
c260: 73 73 6c 2c 20 28 76 6f 69 64 20 2a 29 73 74 61  ssl, (void *)sta
c270: 74 65 50 74 72 29 3b 0a 20 20 20 20 53 53 4c 5f  tePtr);.    SSL_
c280: 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b  set_msg_callback
c290: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20  (statePtr->ssl, 
c2a0: 4d 65 73 73 61 67 65 43 61 6c 6c 62 61 63 6b 29  MessageCallback)
c2b0: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  ;.#endif..    /*
c2c0: 20 43 72 65 61 74 65 20 54 63 6c 5f 43 68 61 6e   Create Tcl_Chan
c2d0: 6e 65 6c 20 42 49 4f 20 48 61 6e 64 6c 65 72 20  nel BIO Handler 
c2e0: 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d  */.    statePtr-
c2f0: 3e 70 5f 62 69 6f 09 3d 20 42 49 4f 5f 6e 65 77  >p_bio.= BIO_new
c300: 5f 74 63 6c 28 73 74 61 74 65 50 74 72 2c 20 42  _tcl(statePtr, B
c310: 49 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a 20 20 20  IO_NOCLOSE);.   
c320: 20 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 09 3d   statePtr->bio.=
c330: 20 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 66 5f 73   BIO_new(BIO_f_s
c340: 73 6c 28 29 29 3b 0a 0a 20 20 20 20 69 66 20 28  sl());..    if (
c350: 73 65 72 76 65 72 29 20 7b 0a 09 2f 2a 20 53 65  server) {../* Se
c360: 72 76 65 72 20 63 61 6c 6c 62 61 63 6b 73 20 2a  rver callbacks *
c370: 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74  /..SSL_CTX_set_t
c380: 6c 73 65 78 74 5f 73 65 72 76 65 72 6e 61 6d 65  lsext_servername
c390: 5f 61 72 67 28 73 74 61 74 65 50 74 72 2d 3e 63  _arg(statePtr->c
c3a0: 74 78 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74  tx, (void *)stat
c3b0: 65 50 74 72 29 3b 0a 09 53 53 4c 5f 43 54 58 5f  ePtr);..SSL_CTX_
c3c0: 73 65 74 5f 74 6c 73 65 78 74 5f 73 65 72 76 65  set_tlsext_serve
c3d0: 72 6e 61 6d 65 5f 63 61 6c 6c 62 61 63 6b 28 73  rname_callback(s
c3e0: 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 4e  tatePtr->ctx, SN
c3f0: 49 43 61 6c 6c 62 61 63 6b 29 3b 0a 09 53 53 4c  ICallback);..SSL
c400: 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f  _CTX_set_client_
c410: 68 65 6c 6c 6f 5f 63 62 28 73 74 61 74 65 50 74  hello_cb(statePt
c420: 72 2d 3e 63 74 78 2c 20 48 65 6c 6c 6f 43 61 6c  r->ctx, HelloCal
c430: 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73  lback, (void *)s
c440: 74 61 74 65 50 74 72 29 3b 0a 09 69 66 20 28 73  tatePtr);..if (s
c450: 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20  tatePtr->protos 
c460: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20  != NULL) {..    
c470: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 61 6c 70 6e  SSL_CTX_set_alpn
c480: 5f 73 65 6c 65 63 74 5f 63 62 28 73 74 61 74 65  _select_cb(state
c490: 50 74 72 2d 3e 63 74 78 2c 20 41 4c 50 4e 43 61  Ptr->ctx, ALPNCa
c4a0: 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29  llback, (void *)
c4b0: 73 74 61 74 65 50 74 72 29 3b 0a 23 69 66 64 65  statePtr);.#ifde
c4c0: 66 20 55 53 45 5f 4e 50 4e 0a 09 20 20 20 20 69  f USE_NPN..    i
c4d0: 66 20 28 74 6c 73 31 5f 32 20 3d 3d 20 30 20 26  f (tls1_2 == 0 &
c4e0: 26 20 74 6c 73 31 5f 33 20 3d 3d 20 30 29 20 7b  & tls1_3 == 0) {
c4f0: 0a 09 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6e  ...SSL_CTX_set_n
c500: 65 78 74 5f 70 72 6f 74 6f 73 5f 61 64 76 65 72  ext_protos_adver
c510: 74 69 73 65 64 5f 63 62 28 73 74 61 74 65 50 74  tised_cb(statePt
c520: 72 2d 3e 63 74 78 2c 20 4e 50 4e 43 61 6c 6c 62  r->ctx, NPNCallb
c530: 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61  ack, (void *)sta
c540: 74 65 50 74 72 29 3b 0a 09 20 20 20 20 7d 0a 23  tePtr);..    }.#
c550: 65 6e 64 69 66 0a 09 7d 0a 0a 09 2f 2a 20 45 6e  endif..}.../* En
c560: 61 62 6c 65 20 73 65 72 76 65 72 20 74 6f 20 73  able server to s
c570: 65 6e 64 20 63 65 72 74 20 72 65 71 75 65 73 74  end cert request
c580: 20 61 66 74 65 72 20 68 61 6e 64 73 68 61 6b 65   after handshake
c590: 20 28 54 4c 53 20 31 2e 33 20 6f 6e 6c 79 29 20   (TLS 1.3 only) 
c5a0: 2a 2f 0a 09 2f 2a 20 41 20 77 72 69 74 65 20 6f  */../* A write o
c5b0: 70 65 72 61 74 69 6f 6e 20 6d 75 73 74 20 74 61  peration must ta
c5c0: 6b 65 20 70 6c 61 63 65 20 66 6f 72 20 74 68 65  ke place for the
c5d0: 20 43 65 72 74 69 66 69 63 61 74 65 20 52 65 71   Certificate Req
c5e0: 75 65 73 74 20 74 6f 20 62 65 0a 09 20 20 20 73  uest to be..   s
c5f0: 65 6e 74 20 74 6f 20 74 68 65 20 63 6c 69 65 6e  ent to the clien
c600: 74 2c 20 74 68 69 73 20 63 61 6e 20 62 65 20 64  t, this can be d
c610: 6f 6e 65 20 77 69 74 68 20 53 53 4c 5f 64 6f 5f  one with SSL_do_
c620: 68 61 6e 64 73 68 61 6b 65 28 29 2e 20 2a 2f 0a  handshake(). */.
c630: 09 69 66 20 28 72 65 71 75 65 73 74 20 26 26 20  .if (request && 
c640: 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 20 26  post_handshake &
c650: 26 20 74 6c 73 31 5f 33 29 20 7b 0a 09 20 20 20  & tls1_3) {..   
c660: 20 53 53 4c 5f 76 65 72 69 66 79 5f 63 6c 69 65   SSL_verify_clie
c670: 6e 74 5f 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b  nt_post_handshak
c680: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29  e(statePtr->ssl)
c690: 3b 0a 09 7d 0a 0a 09 2f 2a 20 73 65 74 20 61 75  ;..}.../* set au
c6a0: 74 6f 6d 61 74 69 63 20 63 75 72 76 65 20 73 65  tomatic curve se
c6b0: 6c 65 63 74 69 6f 6e 20 2a 2f 0a 09 53 53 4c 5f  lection */..SSL_
c6c0: 73 65 74 5f 65 63 64 68 5f 61 75 74 6f 28 73 74  set_ecdh_auto(st
c6d0: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 31 29 3b  atePtr->ssl, 1);
c6e0: 0a 0a 09 2f 2a 20 53 65 74 20 73 65 72 76 65 72  .../* Set server
c6f0: 20 6d 6f 64 65 20 2a 2f 0a 09 73 74 61 74 65 50   mode */..stateP
c700: 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53  tr->flags |= TLS
c710: 5f 54 43 4c 5f 53 45 52 56 45 52 3b 0a 09 53 53  _TCL_SERVER;..SS
c720: 4c 5f 73 65 74 5f 61 63 63 65 70 74 5f 73 74 61  L_set_accept_sta
c730: 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  te(statePtr->ssl
c740: 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  );.    } else {.
c750: 09 2f 2a 20 43 6c 69 65 6e 74 20 63 61 6c 6c 62  ./* Client callb
c760: 61 63 6b 73 20 2a 2f 0a 23 69 66 64 65 66 20 55  acks */.#ifdef U
c770: 53 45 5f 4e 50 4e 0a 09 69 66 20 28 73 74 61 74  SE_NPN..if (stat
c780: 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21 3d 20  ePtr->protos != 
c790: 4e 55 4c 4c 20 26 26 20 74 6c 73 31 5f 32 20 3d  NULL && tls1_2 =
c7a0: 3d 20 30 20 26 26 20 74 6c 73 31 5f 33 20 3d 3d  = 0 && tls1_3 ==
c7b0: 20 30 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 43   0) {..    SSL_C
c7c0: 54 58 5f 73 65 74 5f 6e 65 78 74 5f 70 72 6f 74  TX_set_next_prot
c7d0: 6f 5f 73 65 6c 65 63 74 5f 63 62 28 73 74 61 74  o_select_cb(stat
c7e0: 65 50 74 72 2d 3e 63 74 78 2c 20 41 4c 50 4e 43  ePtr->ctx, ALPNC
c7f0: 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a  allback, (void *
c800: 29 73 74 61 74 65 50 74 72 29 3b 0a 09 7d 0a 23  )statePtr);..}.#
c810: 65 6e 64 69 66 0a 0a 09 2f 2a 20 53 65 73 73 69  endif.../* Sessi
c820: 6f 6e 20 63 61 63 68 69 6e 67 20 2a 2f 0a 09 53  on caching */..S
c830: 53 4c 5f 43 54 58 5f 73 65 74 5f 73 65 73 73 69  SL_CTX_set_sessi
c840: 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 28 73 74  on_cache_mode(st
c850: 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 53 4c  atePtr->ctx, SSL
c860: 5f 53 45 53 53 5f 43 41 43 48 45 5f 43 4c 49 45  _SESS_CACHE_CLIE
c870: 4e 54 20 7c 20 53 53 4c 5f 53 45 53 53 5f 43 41  NT | SSL_SESS_CA
c880: 43 48 45 5f 4e 4f 5f 49 4e 54 45 52 4e 41 4c 5f  CHE_NO_INTERNAL_
c890: 53 54 4f 52 45 29 3b 0a 09 53 53 4c 5f 43 54 58  STORE);..SSL_CTX
c8a0: 5f 73 65 73 73 5f 73 65 74 5f 6e 65 77 5f 63 62  _sess_set_new_cb
c8b0: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20  (statePtr->ctx, 
c8c0: 53 65 73 73 69 6f 6e 43 61 6c 6c 62 61 63 6b 29  SessionCallback)
c8d0: 3b 0a 0a 09 2f 2a 20 45 6e 61 62 6c 65 20 70 6f  ;.../* Enable po
c8e0: 73 74 20 68 61 6e 64 73 68 61 6b 65 20 41 75 74  st handshake Aut
c8f0: 68 65 6e 74 69 63 61 74 69 6f 6e 20 65 78 74 65  hentication exte
c900: 6e 73 69 6f 6e 2e 20 54 4c 53 20 31 2e 33 20 6f  nsion. TLS 1.3 o
c910: 6e 6c 79 2c 20 6e 6f 74 20 68 74 74 70 2f 32 2e  nly, not http/2.
c920: 20 2a 2f 0a 09 69 66 20 28 72 65 71 75 65 73 74   */..if (request
c930: 20 26 26 20 70 6f 73 74 5f 68 61 6e 64 73 68 61   && post_handsha
c940: 6b 65 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 73  ke) {..    SSL_s
c950: 65 74 5f 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b  et_post_handshak
c960: 65 5f 61 75 74 68 28 73 74 61 74 65 50 74 72 2d  e_auth(statePtr-
c970: 3e 73 73 6c 2c 20 31 29 3b 0a 09 7d 0a 0a 09 2f  >ssl, 1);..}.../
c980: 2a 20 53 65 74 20 63 6c 69 65 6e 74 20 6d 6f 64  * Set client mod
c990: 65 20 2a 2f 0a 09 53 53 4c 5f 73 65 74 5f 63 6f  e */..SSL_set_co
c9a0: 6e 6e 65 63 74 5f 73 74 61 74 65 28 73 74 61 74  nnect_state(stat
c9b0: 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20  ePtr->ssl);.    
c9c0: 7d 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 62 69  }.    SSL_set_bi
c9d0: 6f 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c  o(statePtr->ssl,
c9e0: 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f   statePtr->p_bio
c9f0: 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69  , statePtr->p_bi
ca00: 6f 29 3b 0a 20 20 20 20 42 49 4f 5f 73 65 74 5f  o);.    BIO_set_
ca10: 73 73 6c 28 73 74 61 74 65 50 74 72 2d 3e 62 69  ssl(statePtr->bi
ca20: 6f 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  o, statePtr->ssl
ca30: 2c 20 42 49 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a  , BIO_NOCLOSE);.
ca40: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 45  .    /*.     * E
ca50: 6e 64 20 6f 66 20 53 53 4c 20 49 6e 69 74 0a 20  nd of SSL Init. 
ca60: 20 20 20 20 2a 2f 0a 20 20 20 20 64 70 72 69 6e      */.    dprin
ca70: 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20 25 73  tf("Returning %s
ca80: 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  ", Tcl_GetChanne
ca90: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e  lName(statePtr->
caa0: 73 65 6c 66 29 29 3b 0a 20 20 20 20 54 63 6c 5f  self));.    Tcl_
cab0: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
cac0: 2c 20 28 63 68 61 72 20 2a 29 20 54 63 6c 5f 47  , (char *) Tcl_G
cad0: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74  etChannelName(st
cae0: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 54  atePtr->self), T
caf0: 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 0a 20  CL_VOLATILE);.. 
cb00: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b     return TCL_OK
cb10: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ;.}.../*. *-----
cb20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cb30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cb40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cb50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
cb60: 2a 0a 20 2a 20 55 6e 69 6d 70 6f 72 74 4f 62 6a  *. * UnimportObj
cb70: 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69  Cmd --. *. *.Thi
cb80: 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 69  s procedure is i
cb90: 6e 76 6f 6b 65 64 20 74 6f 20 72 65 6d 6f 76 65  nvoked to remove
cba0: 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61   the topmost cha
cbb0: 6e 6e 65 6c 20 66 69 6c 74 65 72 2e 0a 20 2a 0a  nnel filter.. *.
cbc0: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41   * Results:. *.A
cbd0: 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65   standard Tcl re
cbe0: 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65  sult.. *. * Side
cbf0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79   effects:. *.May
cc00: 20 6d 6f 64 69 66 79 20 74 68 65 20 62 65 68 61   modify the beha
cc10: 76 69 6f 72 20 6f 66 20 61 6e 20 49 4f 20 63 68  vior of an IO ch
cc20: 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d  annel.. *. *----
cc30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cc40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cc50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cc60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
cc70: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 55   */.static int.U
cc80: 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 28 43 6c  nimportObjCmd(Cl
cc90: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
cca0: 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20  ata, Tcl_Interp 
ccb0: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a  *interp, int obj
ccc0: 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73  c, Tcl_Obj *cons
ccd0: 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20  t objv[]) {.    
cce0: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e  Tcl_Channel chan
ccf0: 2c 20 63 68 69 6c 64 3b 09 2f 2a 20 54 68 65 20  , child;./* The 
cd00: 73 74 61 63 6b 65 64 20 61 6e 64 20 75 6e 64 65  stacked and unde
cd10: 72 6c 79 69 6e 67 20 63 68 61 6e 6e 65 6c 73 20  rlying channels 
cd20: 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69  */.    Tcl_DStri
cd30: 6e 67 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 54  ng upperChannelT
cd40: 72 61 6e 73 6c 61 74 69 6f 6e 2c 20 75 70 70 65  ranslation, uppe
cd50: 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67  rChannelBlocking
cd60: 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e  , upperChannelEn
cd70: 63 6f 64 69 6e 67 2c 20 75 70 70 65 72 43 68 61  coding, upperCha
cd80: 6e 6e 65 6c 45 4f 46 43 68 61 72 3b 0a 20 20 20  nnelEOFChar;.   
cd90: 20 69 6e 74 20 72 65 73 20 3d 20 54 43 4c 5f 4f   int res = TCL_O
cda0: 4b 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c  K;.    (void) cl
cdb0: 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 64  ientData;..    d
cdc0: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
cdd0: 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20  ;..    if (objc 
cde0: 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f  != 2) {..Tcl_Wro
cdf0: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
ce00: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e  , 1, objv, "chan
ce10: 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20 54  nel");..return T
ce20: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
ce30: 0a 20 20 20 20 2f 2a 20 56 61 6c 69 64 61 74 65  .    /* Validate
ce40: 20 63 68 61 6e 6e 65 6c 20 6e 61 6d 65 20 2a 2f   channel name */
ce50: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f  .    chan = Tcl_
ce60: 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72  GetChannel(inter
ce70: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
ce80: 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29  (objv[1]), NULL)
ce90: 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d  ;.    if (chan =
cea0: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20  = (Tcl_Channel) 
ceb0: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20  NULL) {..return 
cec0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
ced0: 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75  ..    /* Make su
cee0: 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e  re to operate on
cef0: 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61   the topmost cha
cf00: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e  nnel */.    chan
cf10: 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61   = Tcl_GetTopCha
cf20: 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20  nnel(chan);.    
cf30: 63 68 69 6c 64 20 3d 20 54 63 6c 5f 47 65 74 53  child = Tcl_GetS
cf40: 74 61 63 6b 65 64 43 68 61 6e 6e 65 6c 28 63 68  tackedChannel(ch
cf50: 61 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72  an);..    /* Ver
cf60: 69 66 79 20 69 73 20 61 20 73 74 61 63 6b 65 64  ify is a stacked
cf70: 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20   channel */.    
cf80: 69 66 20 28 63 68 69 6c 64 20 3d 3d 20 4e 55 4c  if (child == NUL
cf90: 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  L) {..Tcl_Append
cfa0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
cfb0: 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c  bad channel \"",
cfc0: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e   Tcl_GetChannelN
cfd0: 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22  ame(chan),..."\"
cfe0: 3a 20 6e 6f 74 20 61 20 73 74 61 63 6b 65 64 20  : not a stacked 
cff0: 63 68 61 6e 6e 65 6c 22 2c 20 28 63 68 61 72 20  channel", (char 
d000: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54  *) NULL);..    T
d010: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28  cl_SetErrorCode(
d020: 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22  interp, "TLS", "
d030: 55 4e 49 4d 50 4f 52 54 22 2c 20 22 43 48 41 4e  UNIMPORT", "CHAN
d040: 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c  NEL", "INVALID",
d050: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
d060: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
d070: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  OR;.    }..    /
d080: 2a 20 46 6c 75 73 68 20 61 6e 79 20 70 65 6e 64  * Flush any pend
d090: 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 20 20  ing data */.    
d0a0: 69 66 20 28 54 63 6c 5f 46 6c 75 73 68 28 63 68  if (Tcl_Flush(ch
d0b0: 61 6e 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b  an) != TCL_OK) {
d0c0: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
d0d0: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54  OR;.    }..    T
d0e0: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26  cl_DStringInit(&
d0f0: 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e  upperChannelTran
d100: 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63  slation);.    Tc
d110: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75  l_DStringInit(&u
d120: 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b  pperChannelBlock
d130: 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53  ing);.    Tcl_DS
d140: 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72  tringInit(&upper
d150: 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b  ChannelEOFChar);
d160: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
d170: 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e  Init(&upperChann
d180: 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 0a 20 20  elEncoding);..  
d190: 20 20 2f 2a 20 47 65 74 20 63 75 72 72 65 6e 74    /* Get current
d1a0: 20 63 6f 6e 66 69 67 20 2d 20 45 4f 4c 20 74 72   config - EOL tr
d1b0: 61 6e 73 6c 61 74 69 6f 6e 2c 20 65 6e 63 6f 64  anslation, encod
d1c0: 69 6e 67 20 61 6e 64 20 62 75 66 66 65 72 69 6e  ing and bufferin
d1d0: 67 20 6f 70 74 69 6f 6e 73 20 61 72 65 20 73 68  g options are sh
d1e0: 61 72 65 64 20 62 65 74 77 65 65 6e 20 61 6c 6c  ared between all
d1f0: 20 63 68 61 6e 6e 65 6c 73 20 69 6e 20 74 68 65   channels in the
d200: 20 73 74 61 63 6b 20 2a 2f 0a 20 20 20 20 54 63   stack */.    Tc
d210: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69  l_GetChannelOpti
d220: 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c  on(interp, chan,
d230: 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 26 75   "-blocking", &u
d240: 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b  pperChannelBlock
d250: 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65  ing);.    Tcl_Ge
d260: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69  tChannelOption(i
d270: 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 65  nterp, chan, "-e
d280: 6e 63 6f 64 69 6e 67 22 2c 20 26 75 70 70 65 72  ncoding", &upper
d290: 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29  ChannelEncoding)
d2a0: 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61  ;.    Tcl_GetCha
d2b0: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72  nnelOption(inter
d2c0: 70 2c 20 63 68 61 6e 2c 20 22 2d 65 6f 66 63 68  p, chan, "-eofch
d2d0: 61 72 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e  ar", &upperChann
d2e0: 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20 20 20  elEOFChar);.    
d2f0: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70  Tcl_GetChannelOp
d300: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61  tion(interp, cha
d310: 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e  n, "-translation
d320: 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c  ", &upperChannel
d330: 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 0a 20  Translation);.. 
d340: 20 20 20 2f 2a 20 55 6e 73 74 61 63 6b 20 74 68     /* Unstack th
d350: 65 20 63 68 61 6e 6e 65 6c 20 61 6e 64 20 72 65  e channel and re
d360: 73 74 6f 72 65 20 75 6e 64 65 72 6c 79 69 6e 67  store underlying
d370: 20 63 68 61 6e 6e 65 6c 20 63 6f 6e 66 69 67 20   channel config 
d380: 2a 2f 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 55  */.    if (Tcl_U
d390: 6e 73 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e  nstackChannel(in
d3a0: 74 65 72 70 2c 20 63 68 61 6e 29 20 3d 3d 20 54  terp, chan) == T
d3b0: 43 4c 5f 4f 4b 29 20 7b 0a 09 54 63 6c 5f 53 65  CL_OK) {..Tcl_Se
d3c0: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69  tChannelOption(i
d3d0: 6e 74 65 72 70 2c 20 63 68 69 6c 64 2c 20 22 2d  nterp, child, "-
d3e0: 65 6e 63 6f 64 69 6e 67 22 2c 20 54 63 6c 5f 44  encoding", Tcl_D
d3f0: 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70  StringValue(&upp
d400: 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e  erChannelEncodin
d410: 67 29 29 3b 0a 09 54 63 6c 5f 53 65 74 43 68 61  g));..Tcl_SetCha
d420: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72  nnelOption(inter
d430: 70 2c 20 63 68 69 6c 64 2c 20 22 2d 65 6f 66 63  p, child, "-eofc
d440: 68 61 72 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e  har", Tcl_DStrin
d450: 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 61  gValue(&upperCha
d460: 6e 6e 65 6c 45 4f 46 43 68 61 72 29 29 3b 0a 09  nnelEOFChar));..
d470: 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70  Tcl_SetChannelOp
d480: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 69  tion(interp, chi
d490: 6c 64 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f  ld, "-translatio
d4a0: 6e 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56  n", Tcl_DStringV
d4b0: 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e  alue(&upperChann
d4c0: 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 29 3b  elTranslation));
d4d0: 0a 09 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c  ..Tcl_SetChannel
d4e0: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63  Option(interp, c
d4f0: 68 69 6c 64 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67  hild, "-blocking
d500: 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61  ", Tcl_DStringVa
d510: 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65  lue(&upperChanne
d520: 6c 42 6c 6f 63 6b 69 6e 67 29 29 3b 0a 20 20 20  lBlocking));.   
d530: 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d   } else {..res =
d540: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
d550: 7d 0a 0a 20 20 20 20 2f 2a 20 43 6c 65 61 6e 2d  }..    /* Clean-
d560: 75 70 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53  up */.    Tcl_DS
d570: 74 72 69 6e 67 46 72 65 65 28 26 75 70 70 65 72  tringFree(&upper
d580: 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69  ChannelTranslati
d590: 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74  on);.    Tcl_DSt
d5a0: 72 69 6e 67 46 72 65 65 28 26 75 70 70 65 72 43  ringFree(&upperC
d5b0: 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b  hannelEncoding);
d5c0: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
d5d0: 46 72 65 65 28 26 75 70 70 65 72 43 68 61 6e 6e  Free(&upperChann
d5e0: 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20 20 20  elEOFChar);.    
d5f0: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
d600: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f  &upperChannelBlo
d610: 63 6b 69 6e 67 29 3b 0a 20 20 20 20 72 65 74 75  cking);.    retu
d620: 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  rn res;.}.../*. 
d630: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
d640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d670: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 54 58 5f 49  ----. *. * CTX_I
d680: 6e 69 74 20 2d 2d 20 63 6f 6e 73 74 72 75 63 74  nit -- construct
d690: 20 61 20 53 53 4c 5f 43 54 58 20 69 6e 73 74 61   a SSL_CTX insta
d6a0: 6e 63 65 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  nce. *. * Result
d6b0: 73 3a 0a 20 2a 09 41 20 76 61 6c 69 64 20 53 53  s:. *.A valid SS
d6c0: 4c 5f 43 54 58 20 69 6e 73 74 61 6e 63 65 20 6f  L_CTX instance o
d6d0: 72 20 4e 55 4c 4c 2e 0a 20 2a 0a 20 2a 20 53 69  r NULL.. *. * Si
d6e0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 63  de effects:. *.c
d6f0: 6f 6e 73 74 72 75 63 74 73 20 53 53 4c 20 63 6f  onstructs SSL co
d700: 6e 74 65 78 74 20 28 43 54 58 29 0a 20 2a 0a 20  ntext (CTX). *. 
d710: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
d720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d750: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ----. */.static 
d760: 53 53 4c 5f 43 54 58 20 2a 0a 43 54 58 5f 49 6e  SSL_CTX *.CTX_In
d770: 69 74 28 53 74 61 74 65 20 2a 73 74 61 74 65 50  it(State *stateP
d780: 74 72 2c 20 69 6e 74 20 69 73 53 65 72 76 65 72  tr, int isServer
d790: 2c 20 69 6e 74 20 70 72 6f 74 6f 2c 20 63 68 61  , int proto, cha
d7a0: 72 20 2a 6b 65 79 66 69 6c 65 2c 20 63 68 61 72  r *keyfile, char
d7b0: 20 2a 63 65 72 74 66 69 6c 65 2c 0a 20 20 20 20   *certfile,.    
d7c0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6b  unsigned char *k
d7d0: 65 79 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ey, unsigned cha
d7e0: 72 20 2a 63 65 72 74 2c 20 54 63 6c 5f 53 69 7a  r *cert, Tcl_Siz
d7f0: 65 20 6b 65 79 5f 6c 65 6e 2c 20 54 63 6c 5f 53  e key_len, Tcl_S
d800: 69 7a 65 20 63 65 72 74 5f 6c 65 6e 2c 20 63 68  ize cert_len, ch
d810: 61 72 20 2a 43 41 70 61 74 68 2c 0a 20 20 20 20  ar *CApath,.    
d820: 63 68 61 72 20 2a 43 41 66 69 6c 65 2c 20 63 68  char *CAfile, ch
d830: 61 72 20 2a 63 69 70 68 65 72 73 2c 20 63 68 61  ar *ciphers, cha
d840: 72 20 2a 63 69 70 68 65 72 73 75 69 74 65 73 2c  r *ciphersuites,
d850: 20 69 6e 74 20 6c 65 76 65 6c 2c 20 63 68 61 72   int level, char
d860: 20 2a 44 48 70 61 72 61 6d 73 29 20 7b 0a 20 20   *DHparams) {.  
d870: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
d880: 74 65 72 70 20 3d 20 73 74 61 74 65 50 74 72 2d  terp = statePtr-
d890: 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 53 53 4c  >interp;.    SSL
d8a0: 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c  _CTX *ctx = NULL
d8b0: 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ;.    Tcl_DStrin
d8c0: 67 20 64 73 3b 0a 20 20 20 20 69 6e 74 20 6f 66  g ds;.    int of
d8d0: 66 20 3d 20 30 2c 20 61 62 6f 72 74 20 3d 20 30  f = 0, abort = 0
d8e0: 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 61 64 5f 70  ;.    int load_p
d8f0: 72 69 76 61 74 65 5f 6b 65 79 3b 0a 20 20 20 20  rivate_key;.    
d900: 63 6f 6e 73 74 20 53 53 4c 5f 4d 45 54 48 4f 44  const SSL_METHOD
d910: 20 2a 6d 65 74 68 6f 64 3b 0a 0a 20 20 20 20 64   *method;..    d
d920: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
d930: 3b 0a 0a 20 20 20 20 69 66 20 28 21 70 72 6f 74  ;..    if (!prot
d940: 6f 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  o) {..Tcl_Append
d950: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
d960: 6e 6f 20 76 61 6c 69 64 20 70 72 6f 74 6f 63 6f  no valid protoco
d970: 6c 20 73 65 6c 65 63 74 65 64 22 2c 20 28 63 68  l selected", (ch
d980: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65  ar *) NULL);..re
d990: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  turn NULL;.    }
d9a0: 0a 0a 20 20 20 20 2f 2a 20 63 72 65 61 74 65 20  ..    /* create 
d9b0: 53 53 4c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 23  SSL context */.#
d9c0: 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49  if OPENSSL_VERSI
d9d0: 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 78 31  ON_NUMBER >= 0x1
d9e0: 30 31 30 30 30 30 30 4c 20 7c 7c 20 64 65 66 69  0100000L || defi
d9f0: 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 7c 7c 20  ned(NO_SSL2) || 
da00: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
da10: 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20 69 66 20  NO_SSL2).    if 
da20: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20  (ENABLED(proto, 
da30: 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 29 29  TLS_PROTO_SSL2))
da40: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65   {..Tcl_AppendRe
da50: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 53  sult(interp, "SS
da60: 4c 32 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20  L2 protocol not 
da70: 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61  supported", (cha
da80: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74  r *) NULL);..ret
da90: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a  urn NULL;.    }.
daa0: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
dab0: 65 64 28 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 64  ed(NO_SSL3) || d
dac0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
dad0: 4f 5f 53 53 4c 33 29 0a 20 20 20 20 69 66 20 28  O_SSL3).    if (
dae0: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54  ENABLED(proto, T
daf0: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 29 29 20  LS_PROTO_SSL3)) 
db00: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
db10: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 53 4c  ult(interp, "SSL
db20: 33 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73  3 protocol not s
db30: 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72  upported", (char
db40: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75   *) NULL);..retu
db50: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23  rn NULL;.    }.#
db60: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65  endif.#if define
db70: 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65  d(NO_TLS1) || de
db80: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
db90: 5f 54 4c 53 31 29 0a 20 20 20 20 69 66 20 28 45  _TLS1).    if (E
dba0: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c  NABLED(proto, TL
dbb0: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 29 29 20 7b  S_PROTO_TLS1)) {
dbc0: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
dbd0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20  lt(interp, "TLS 
dbe0: 31 2e 30 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74  1.0 protocol not
dbf0: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68   supported", (ch
dc00: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65  ar *) NULL);..re
dc10: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  turn NULL;.    }
dc20: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
dc30: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c  ned(NO_TLS1_1) |
dc40: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  | defined(OPENSS
dc50: 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 20 20 20  L_NO_TLS1_1).   
dc60: 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f   if (ENABLED(pro
dc70: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c  to, TLS_PROTO_TL
dc80: 53 31 5f 31 29 29 20 7b 0a 09 54 63 6c 5f 41 70  S1_1)) {..Tcl_Ap
dc90: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
dca0: 70 2c 20 22 54 4c 53 20 31 2e 31 20 70 72 6f 74  p, "TLS 1.1 prot
dcb0: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74  ocol not support
dcc0: 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  ed", (char *) NU
dcd0: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c  LL);..return NUL
dce0: 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  L;.    }.#endif.
dcf0: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54  #if defined(NO_T
dd00: 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65  LS1_2) || define
dd10: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
dd20: 31 5f 32 29 0a 20 20 20 20 69 66 20 28 45 4e 41  1_2).    if (ENA
dd30: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f  BLED(proto, TLS_
dd40: 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 29 29 20 7b  PROTO_TLS1_2)) {
dd50: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
dd60: 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20  lt(interp, "TLS 
dd70: 31 2e 32 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74  1.2 protocol not
dd80: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68   supported", (ch
dd90: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65  ar *) NULL);..re
dda0: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  turn NULL;.    }
ddb0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
ddc0: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c  ned(NO_TLS1_3) |
ddd0: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  | defined(OPENSS
dde0: 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20  L_NO_TLS1_3).   
ddf0: 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f   if (ENABLED(pro
de00: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c  to, TLS_PROTO_TL
de10: 53 31 5f 33 29 29 20 7b 0a 09 54 63 6c 5f 41 70  S1_3)) {..Tcl_Ap
de20: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
de30: 70 2c 20 22 54 4c 53 20 31 2e 33 20 70 72 6f 74  p, "TLS 1.3 prot
de40: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74  ocol not support
de50: 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  ed", (char *) NU
de60: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c  LL);..return NUL
de70: 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  L;.    }.#endif.
de80: 20 20 20 20 69 66 20 28 70 72 6f 74 6f 20 3d 3d      if (proto ==
de90: 20 30 29 20 7b 0a 09 2f 2a 20 55 73 65 20 66 75   0) {../* Use fu
dea0: 6c 6c 20 72 61 6e 67 65 20 2a 2f 0a 09 53 53 4c  ll range */..SSL
deb0: 5f 43 54 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f  _CTX_set_min_pro
dec0: 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20  to_version(ctx, 
ded0: 30 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74  0);..SSL_CTX_set
dee0: 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 72 73 69  _max_proto_versi
def0: 6f 6e 28 63 74 78 2c 20 30 29 3b 0a 20 20 20 20  on(ctx, 0);.    
df00: 7d 0a 0a 20 20 20 20 73 77 69 74 63 68 20 28 70  }..    switch (p
df10: 72 6f 74 6f 29 20 7b 0a 23 69 66 20 4f 50 45 4e  roto) {.#if OPEN
df20: 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42  SSL_VERSION_NUMB
df30: 45 52 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c  ER < 0x10100000L
df40: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f   && !defined(NO_
df50: 53 53 4c 32 29 20 26 26 20 21 64 65 66 69 6e 65  SSL2) && !define
df60: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c  d(OPENSSL_NO_SSL
df70: 32 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f  2).    case TLS_
df80: 50 52 4f 54 4f 5f 53 53 4c 32 3a 0a 09 6d 65 74  PROTO_SSL2:..met
df90: 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f  hod = isServer ?
dfa0: 20 53 53 4c 76 32 5f 73 65 72 76 65 72 5f 6d 65   SSLv2_server_me
dfb0: 74 68 6f 64 28 29 20 3a 20 53 53 4c 76 32 5f 63  thod() : SSLv2_c
dfc0: 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a  lient_method();.
dfd0: 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23  .break;.#endif.#
dfe0: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53  if !defined(NO_S
dff0: 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 64  SL3) && !defined
e000: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33  (OPENSSL_NO_SSL3
e010: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
e020: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45  ENSSL_NO_SSL3_ME
e030: 54 48 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54  THOD).    case T
e040: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 3a 0a 09  LS_PROTO_SSL3:..
e050: 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65  method = isServe
e060: 72 20 3f 20 53 53 4c 76 33 5f 73 65 72 76 65 72  r ? SSLv3_server
e070: 5f 6d 65 74 68 6f 64 28 29 20 3a 20 53 53 4c 76  _method() : SSLv
e080: 33 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28  3_client_method(
e090: 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69  );..break;.#endi
e0a0: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  f.#if !defined(N
e0b0: 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66 69  O_TLS1) && !defi
e0c0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
e0d0: 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 64  LS1) && !defined
e0e0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
e0f0: 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 61 73  _METHOD).    cas
e100: 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31  e TLS_PROTO_TLS1
e110: 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65  :..method = isSe
e120: 72 76 65 72 20 3f 20 54 4c 53 76 31 5f 73 65 72  rver ? TLSv1_ser
e130: 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54  ver_method() : T
e140: 4c 53 76 31 5f 63 6c 69 65 6e 74 5f 6d 65 74 68  LSv1_client_meth
e150: 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65  od();..break;.#e
e160: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65  ndif.#if !define
e170: 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20  d(NO_TLS1_1) && 
e180: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
e190: 5f 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21  _NO_TLS1_1) && !
e1a0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
e1b0: 4e 4f 5f 54 4c 53 31 5f 31 5f 4d 45 54 48 4f 44  NO_TLS1_1_METHOD
e1c0: 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50  ).    case TLS_P
e1d0: 52 4f 54 4f 5f 54 4c 53 31 5f 31 3a 0a 09 6d 65  ROTO_TLS1_1:..me
e1e0: 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20  thod = isServer 
e1f0: 3f 20 54 4c 53 76 31 5f 31 5f 73 65 72 76 65 72  ? TLSv1_1_server
e200: 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 76  _method() : TLSv
e210: 31 5f 31 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f  1_1_client_metho
e220: 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e  d();..break;.#en
e230: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64  dif.#if !defined
e240: 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21  (NO_TLS1_2) && !
e250: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
e260: 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64  NO_TLS1_2) && !d
e270: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
e280: 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29  O_TLS1_2_METHOD)
e290: 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52  .    case TLS_PR
e2a0: 4f 54 4f 5f 54 4c 53 31 5f 32 3a 0a 09 6d 65 74  OTO_TLS1_2:..met
e2b0: 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f  hod = isServer ?
e2c0: 20 54 4c 53 76 31 5f 32 5f 73 65 72 76 65 72 5f   TLSv1_2_server_
e2d0: 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 76 31  method() : TLSv1
e2e0: 5f 32 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64  _2_client_method
e2f0: 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64  ();..break;.#end
e300: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  if.#if !defined(
e310: 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64  NO_TLS1_3) && !d
e320: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
e330: 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 63 61  O_TLS1_3).    ca
e340: 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53  se TLS_PROTO_TLS
e350: 31 5f 33 3a 0a 09 2f 2a 20 55 73 65 20 74 68 65  1_3:../* Use the
e360: 20 67 65 6e 65 72 69 63 20 6d 65 74 68 6f 64 20   generic method 
e370: 61 6e 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 72  and constraint r
e380: 61 6e 67 65 20 61 66 74 65 72 20 63 6f 6e 74 65  ange after conte
e390: 78 74 20 69 73 20 63 72 65 61 74 65 64 20 2a 2f  xt is created */
e3a0: 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72  ..method = isSer
e3b0: 76 65 72 20 3f 20 54 4c 53 5f 73 65 72 76 65 72  ver ? TLS_server
e3c0: 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 5f  _method() : TLS_
e3d0: 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b  client_method();
e3e0: 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a  ..break;.#endif.
e3f0: 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 2f 2a      default:../*
e400: 20 4e 65 67 6f 74 69 61 74 65 20 68 69 67 68 65   Negotiate highe
e410: 73 74 20 61 76 61 69 6c 61 62 6c 65 20 53 53 4c  st available SSL
e420: 2f 54 4c 53 20 76 65 72 73 69 6f 6e 20 2a 2f 0a  /TLS version */.
e430: 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76  .method = isServ
e440: 65 72 20 3f 20 54 4c 53 5f 73 65 72 76 65 72 5f  er ? TLS_server_
e450: 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 5f 63  method() : TLS_c
e460: 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a  lient_method();.
e470: 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53  #if OPENSSL_VERS
e480: 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31  ION_NUMBER < 0x1
e490: 30 31 30 30 30 30 30 4c 20 26 26 20 21 64 65 66  0100000L && !def
e4a0: 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26  ined(NO_SSL2) &&
e4b0: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
e4c0: 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 09 6f 66 66 20  L_NO_SSL2)..off 
e4d0: 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74  |= (ENABLED(prot
e4e0: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c  o, TLS_PROTO_SSL
e4f0: 32 29 20 20 20 3f 20 30 20 3a 20 53 53 4c 5f 4f  2)   ? 0 : SSL_O
e500: 50 5f 4e 4f 5f 53 53 4c 76 32 29 3b 0a 23 65 6e  P_NO_SSLv2);.#en
e510: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64  dif.#if !defined
e520: 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65  (NO_SSL3) && !de
e530: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
e540: 5f 53 53 4c 33 29 0a 09 6f 66 66 20 7c 3d 20 28  _SSL3)..off |= (
e550: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54  ENABLED(proto, T
e560: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 29 20 20  LS_PROTO_SSL3)  
e570: 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f   ? 0 : SSL_OP_NO
e580: 5f 53 53 4c 76 33 29 3b 0a 23 65 6e 64 69 66 0a  _SSLv3);.#endif.
e590: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f  #if !defined(NO_
e5a0: 54 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e 65  TLS1) && !define
e5b0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
e5c0: 31 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42  1)..off |= (ENAB
e5d0: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50  LED(proto, TLS_P
e5e0: 52 4f 54 4f 5f 54 4c 53 31 29 20 20 20 3f 20 30  ROTO_TLS1)   ? 0
e5f0: 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53   : SSL_OP_NO_TLS
e600: 76 31 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  v1);.#endif.#if 
e610: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31  !defined(NO_TLS1
e620: 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  _1) && !defined(
e630: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
e640: 31 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42  1)..off |= (ENAB
e650: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50  LED(proto, TLS_P
e660: 52 4f 54 4f 5f 54 4c 53 31 5f 31 29 20 3f 20 30  ROTO_TLS1_1) ? 0
e670: 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53   : SSL_OP_NO_TLS
e680: 76 31 5f 31 29 3b 0a 23 65 6e 64 69 66 0a 23 69  v1_1);.#endif.#i
e690: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  f !defined(NO_TL
e6a0: 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65  S1_2) && !define
e6b0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
e6c0: 31 5f 32 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e  1_2)..off |= (EN
e6d0: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53  ABLED(proto, TLS
e6e0: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 29 20 3f  _PROTO_TLS1_2) ?
e6f0: 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54   0 : SSL_OP_NO_T
e700: 4c 53 76 31 5f 32 29 3b 0a 23 65 6e 64 69 66 0a  LSv1_2);.#endif.
e710: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f  #if !defined(NO_
e720: 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66 69  TLS1_3) && !defi
e730: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
e740: 4c 53 31 5f 33 29 0a 09 6f 66 66 20 7c 3d 20 28  LS1_3)..off |= (
e750: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54  ENABLED(proto, T
e760: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29  LS_PROTO_TLS1_3)
e770: 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f   ? 0 : SSL_OP_NO
e780: 5f 54 4c 53 76 31 5f 33 29 3b 0a 23 65 6e 64 69  _TLSv1_3);.#endi
e790: 66 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a  f..break;.    }.
e7a0: 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65  .    ERR_clear_e
e7b0: 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 63 74 78  rror();..    ctx
e7c0: 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 6d   = SSL_CTX_new(m
e7d0: 65 74 68 6f 64 29 3b 0a 20 20 20 20 69 66 20 28  ethod);.    if (
e7e0: 21 63 74 78 29 20 7b 0a 09 72 65 74 75 72 6e 20  !ctx) {..return 
e7f0: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  NULL;.    }..   
e800: 20 69 66 20 28 67 65 74 65 6e 76 28 53 53 4c 4b   if (getenv(SSLK
e810: 45 59 4c 4f 47 46 49 4c 45 29 29 20 7b 0a 09 53  EYLOGFILE)) {..S
e820: 53 4c 5f 43 54 58 5f 73 65 74 5f 6b 65 79 6c 6f  SL_CTX_set_keylo
e830: 67 5f 63 61 6c 6c 62 61 63 6b 28 63 74 78 2c 20  g_callback(ctx, 
e840: 4b 65 79 4c 6f 67 43 61 6c 6c 62 61 63 6b 29 3b  KeyLogCallback);
e850: 0a 20 20 20 20 7d 0a 0a 23 69 66 20 21 64 65 66  .    }..#if !def
e860: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20  ined(NO_TLS1_3) 
e870: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
e880: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20  SSL_NO_TLS1_3). 
e890: 20 20 20 69 66 20 28 70 72 6f 74 6f 20 3d 3d 20     if (proto == 
e8a0: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33  TLS_PROTO_TLS1_3
e8b0: 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74  ) {..SSL_CTX_set
e8c0: 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 69  _min_proto_versi
e8d0: 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56  on(ctx, TLS1_3_V
e8e0: 45 52 53 49 4f 4e 29 3b 0a 09 53 53 4c 5f 43 54  ERSION);..SSL_CT
e8f0: 58 5f 73 65 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f  X_set_max_proto_
e900: 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53  version(ctx, TLS
e910: 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 20 20  1_3_VERSION);.  
e920: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
e930: 2f 2a 20 46 6f 72 63 65 20 63 69 70 68 65 72 20  /* Force cipher 
e940: 73 65 6c 65 63 74 69 6f 6e 20 6f 72 64 65 72 20  selection order 
e950: 62 79 20 73 65 72 76 65 72 20 2a 2f 0a 20 20 20  by server */.   
e960: 20 69 66 20 28 21 69 73 53 65 72 76 65 72 29 20   if (!isServer) 
e970: 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f  {..SSL_CTX_set_o
e980: 70 74 69 6f 6e 73 28 63 74 78 2c 20 53 53 4c 5f  ptions(ctx, SSL_
e990: 4f 50 5f 43 49 50 48 45 52 5f 53 45 52 56 45 52  OP_CIPHER_SERVER
e9a0: 5f 50 52 45 46 45 52 45 4e 43 45 29 3b 0a 20 20  _PREFERENCE);.  
e9b0: 20 20 7d 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c    }..#if OPENSSL
e9c0: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20  _VERSION_NUMBER 
e9d0: 3c 20 30 78 31 30 31 30 30 30 30 30 4c 0a 20 20  < 0x10100000L.  
e9e0: 20 20 4f 70 65 6e 53 53 4c 5f 61 64 64 5f 61 6c    OpenSSL_add_al
e9f0: 6c 5f 61 6c 67 6f 72 69 74 68 6d 73 28 29 3b 20  l_algorithms(); 
ea00: 2f 2a 20 4c 6f 61 64 20 63 69 70 68 65 72 73 20  /* Load ciphers 
ea10: 61 6e 64 20 64 69 67 65 73 74 73 20 2a 2f 0a 23  and digests */.#
ea20: 65 6e 64 69 66 0a 0a 20 20 20 20 53 53 4c 5f 43  endif..    SSL_C
ea30: 54 58 5f 73 65 74 5f 61 70 70 5f 64 61 74 61 28  TX_set_app_data(
ea40: 63 74 78 2c 20 28 76 6f 69 64 2a 29 69 6e 74 65  ctx, (void*)inte
ea50: 72 70 29 3b 09 2f 2a 20 72 65 6d 65 6d 62 65 72  rp);./* remember
ea60: 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72   the interpreter
ea70: 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f   */.    SSL_CTX_
ea80: 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c  set_options(ctx,
ea90: 20 53 53 4c 5f 4f 50 5f 41 4c 4c 29 3b 09 2f 2a   SSL_OP_ALL);./*
eaa0: 20 61 6c 6c 20 53 53 4c 20 62 75 67 20 77 6f 72   all SSL bug wor
eab0: 6b 61 72 6f 75 6e 64 73 20 2a 2f 0a 20 20 20 20  karounds */.    
eac0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69  SSL_CTX_set_opti
ead0: 6f 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f 50 5f  ons(ctx, SSL_OP_
eae0: 4e 4f 5f 43 4f 4d 50 52 45 53 53 49 4f 4e 29 3b  NO_COMPRESSION);
eaf0: 09 2f 2a 20 64 69 73 61 62 6c 65 20 63 6f 6d 70  ./* disable comp
eb00: 72 65 73 73 69 6f 6e 20 65 76 65 6e 20 69 66 20  ression even if 
eb10: 73 75 70 70 6f 72 74 65 64 20 2a 2f 0a 20 20 20  supported */.   
eb20: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74   SSL_CTX_set_opt
eb30: 69 6f 6e 73 28 63 74 78 2c 20 6f 66 66 29 3b 09  ions(ctx, off);.
eb40: 09 2f 2a 20 64 69 73 61 62 6c 65 20 70 72 6f 74  ./* disable prot
eb50: 6f 63 6f 6c 20 76 65 72 73 69 6f 6e 73 20 2a 2f  ocol versions */
eb60: 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52  .#if OPENSSL_VER
eb70: 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78  SION_NUMBER < 0x
eb80: 31 30 31 30 31 30 30 30 4c 0a 20 20 20 20 53 53  10101000L.    SS
eb90: 4c 5f 43 54 58 5f 73 65 74 5f 6d 6f 64 65 28 63  L_CTX_set_mode(c
eba0: 74 78 2c 20 53 53 4c 5f 4d 4f 44 45 5f 41 55 54  tx, SSL_MODE_AUT
ebb0: 4f 5f 52 45 54 52 59 29 3b 09 2f 2a 20 68 61 6e  O_RETRY);./* han
ebc0: 64 6c 65 20 6e 65 77 20 68 61 6e 64 73 68 61 6b  dle new handshak
ebd0: 65 73 20 69 6e 20 62 61 63 6b 67 72 6f 75 6e 64  es in background
ebe0: 2e 20 4f 6e 20 62 79 20 64 65 66 61 75 6c 74 20  . On by default 
ebf0: 69 6e 20 4f 70 65 6e 53 53 4c 20 31 2e 31 2e 31  in OpenSSL 1.1.1
ec00: 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20  . */.#endif.    
ec10: 53 53 4c 5f 43 54 58 5f 73 65 73 73 5f 73 65 74  SSL_CTX_sess_set
ec20: 5f 63 61 63 68 65 5f 73 69 7a 65 28 63 74 78 2c  _cache_size(ctx,
ec30: 20 31 32 38 29 3b 0a 0a 20 20 20 20 2f 2a 20 53   128);..    /* S
ec40: 65 74 20 75 73 65 72 20 64 65 66 69 6e 65 64 20  et user defined 
ec50: 63 69 70 68 65 72 73 2c 20 63 69 70 68 65 72 20  ciphers, cipher 
ec60: 73 75 69 74 65 73 2c 20 61 6e 64 20 73 65 63 75  suites, and secu
ec70: 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 20 20  rity level */.  
ec80: 20 20 69 66 20 28 28 63 69 70 68 65 72 73 20 21    if ((ciphers !
ec90: 3d 20 4e 55 4c 4c 29 20 26 26 20 21 53 53 4c 5f  = NULL) && !SSL_
eca0: 43 54 58 5f 73 65 74 5f 63 69 70 68 65 72 5f 6c  CTX_set_cipher_l
ecb0: 69 73 74 28 63 74 78 2c 20 63 69 70 68 65 72 73  ist(ctx, ciphers
ecc0: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  )) {..Tcl_Append
ecd0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
ece0: 53 65 74 20 63 69 70 68 65 72 73 20 66 61 69 6c  Set ciphers fail
ecf0: 65 64 3a 20 4e 6f 20 76 61 6c 69 64 20 63 69 70  ed: No valid cip
ed00: 68 65 72 73 22 2c 20 28 63 68 61 72 20 2a 29 20  hers", (char *) 
ed10: 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f  NULL);..SSL_CTX_
ed20: 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75  free(ctx);..retu
ed30: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20  rn NULL;.    }. 
ed40: 20 20 20 69 66 20 28 28 63 69 70 68 65 72 73 75     if ((ciphersu
ed50: 69 74 65 73 20 21 3d 20 4e 55 4c 4c 29 20 26 26  ites != NULL) &&
ed60: 20 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 69   !SSL_CTX_set_ci
ed70: 70 68 65 72 73 75 69 74 65 73 28 63 74 78 2c 20  phersuites(ctx, 
ed80: 63 69 70 68 65 72 73 75 69 74 65 73 29 29 20 7b  ciphersuites)) {
ed90: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
eda0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20  lt(interp, "Set 
edb0: 63 69 70 68 65 72 20 73 75 69 74 65 73 20 66 61  cipher suites fa
edc0: 69 6c 65 64 3a 20 4e 6f 20 76 61 6c 69 64 20 63  iled: No valid c
edd0: 69 70 68 65 72 73 22 2c 20 28 63 68 61 72 20 2a  iphers", (char *
ede0: 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54  ) NULL);..SSL_CT
edf0: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65  X_free(ctx);..re
ee00: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  turn NULL;.    }
ee10: 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 73 65 63  ..    /* Set sec
ee20: 75 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 20  urity level */. 
ee30: 20 20 20 69 66 20 28 6c 65 76 65 6c 20 3e 20 2d     if (level > -
ee40: 31 20 26 26 20 6c 65 76 65 6c 20 3c 20 36 29 20  1 && level < 6) 
ee50: 7b 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 73 65  {../* SSL_set_se
ee60: 63 75 72 69 74 79 5f 6c 65 76 65 6c 20 2a 2f 0a  curity_level */.
ee70: 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 73 65 63  .SSL_CTX_set_sec
ee80: 75 72 69 74 79 5f 6c 65 76 65 6c 28 63 74 78 2c  urity_level(ctx,
ee90: 20 6c 65 76 65 6c 29 3b 0a 20 20 20 20 7d 0a 0a   level);.    }..
eea0: 20 20 20 20 2f 2a 20 73 65 74 20 73 6f 6d 65 20      /* set some 
eeb0: 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 20 20 20  callbacks */.   
eec0: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66   SSL_CTX_set_def
eed0: 61 75 6c 74 5f 70 61 73 73 77 64 5f 63 62 28 63  ault_passwd_cb(c
eee0: 74 78 2c 20 50 61 73 73 77 6f 72 64 43 61 6c 6c  tx, PasswordCall
eef0: 62 61 63 6b 29 3b 0a 20 20 20 20 53 53 4c 5f 43  back);.    SSL_C
ef00: 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 70  TX_set_default_p
ef10: 61 73 73 77 64 5f 63 62 5f 75 73 65 72 64 61 74  asswd_cb_userdat
ef20: 61 28 63 74 78 2c 20 28 76 6f 69 64 20 2a 29 73  a(ctx, (void *)s
ef30: 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f  tatePtr);..    /
ef40: 2a 20 72 65 61 64 20 61 20 44 69 66 66 69 65 2d  * read a Diffie-
ef50: 48 65 6c 6c 6d 61 6e 20 70 61 72 61 6d 65 74 65  Hellman paramete
ef60: 72 73 20 66 69 6c 65 2c 20 6f 72 20 75 73 65 20  rs file, or use 
ef70: 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 6f 6e 65  the built-in one
ef80: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53 74 72   */.    Tcl_DStr
ef90: 69 6e 67 49 6e 69 74 28 26 64 73 29 3b 0a 23 69  ingInit(&ds);.#i
efa0: 66 64 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  fdef OPENSSL_NO_
efb0: 44 48 0a 20 20 20 20 69 66 20 28 44 48 70 61 72  DH.    if (DHpar
efc0: 61 6d 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ams != NULL) {..
efd0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
efe0: 28 69 6e 74 65 72 70 2c 20 22 44 48 20 70 61 72  (interp, "DH par
eff0: 61 6d 65 74 65 72 20 73 75 70 70 6f 72 74 20 6e  ameter support n
f000: 6f 74 20 61 76 61 69 6c 61 62 6c 65 22 2c 20 28  ot available", (
f010: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
f020: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78  SSL_CTX_free(ctx
f030: 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b  );..return NULL;
f040: 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20  .    }.#else.   
f050: 20 7b 0a 09 44 48 2a 20 64 68 3b 0a 09 69 66 20   {..DH* dh;..if 
f060: 28 44 48 70 61 72 61 6d 73 20 21 3d 20 4e 55 4c  (DHparams != NUL
f070: 4c 29 20 7b 0a 09 20 20 20 20 42 49 4f 20 2a 62  L) {..    BIO *b
f080: 69 6f 3b 0a 0a 09 20 20 20 20 62 69 6f 20 3d 20  io;...    bio = 
f090: 42 49 4f 5f 6e 65 77 5f 66 69 6c 65 28 46 32 4e  BIO_new_file(F2N
f0a0: 28 44 48 70 61 72 61 6d 73 2c 20 26 64 73 29 2c  (DHparams, &ds),
f0b0: 20 22 72 22 29 3b 0a 09 20 20 20 20 69 66 20 28   "r");..    if (
f0c0: 21 62 69 6f 29 20 7b 0a 09 09 54 63 6c 5f 44 53  !bio) {...Tcl_DS
f0d0: 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a  tringFree(&ds);.
f0e0: 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
f0f0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 43 6f 75 6c  lt(interp, "Coul
f100: 64 20 6e 6f 74 20 66 69 6e 64 20 44 48 20 70 61  d not find DH pa
f110: 72 61 6d 65 74 65 72 73 20 66 69 6c 65 22 2c 20  rameters file", 
f120: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
f130: 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63  ..SSL_CTX_free(c
f140: 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55  tx);...return NU
f150: 4c 4c 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20  LL;..    }...   
f160: 20 64 68 20 3d 20 50 45 4d 5f 72 65 61 64 5f 62   dh = PEM_read_b
f170: 69 6f 5f 44 48 70 61 72 61 6d 73 28 62 69 6f 2c  io_DHparams(bio,
f180: 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c   NULL, NULL, NUL
f190: 4c 29 3b 0a 09 20 20 20 20 42 49 4f 5f 66 72 65  L);..    BIO_fre
f1a0: 65 28 62 69 6f 29 3b 0a 09 20 20 20 20 54 63 6c  e(bio);..    Tcl
f1b0: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73  _DStringFree(&ds
f1c0: 29 3b 0a 09 20 20 20 20 69 66 20 28 21 64 68 29  );..    if (!dh)
f1d0: 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52   {...Tcl_AppendR
f1e0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 43  esult(interp, "C
f1f0: 6f 75 6c 64 20 6e 6f 74 20 72 65 61 64 20 44 48  ould not read DH
f200: 20 70 61 72 61 6d 65 74 65 72 73 20 66 72 6f 6d   parameters from
f210: 20 66 69 6c 65 22 2c 20 28 63 68 61 72 20 2a 29   file", (char *)
f220: 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54   NULL);...SSL_CT
f230: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72  X_free(ctx);...r
f240: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20  eturn NULL;..   
f250: 20 7d 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f   }..    SSL_CTX_
f260: 73 65 74 5f 74 6d 70 5f 64 68 28 63 74 78 2c 20  set_tmp_dh(ctx, 
f270: 64 68 29 3b 0a 09 20 20 20 20 44 48 5f 66 72 65  dh);..    DH_fre
f280: 65 28 64 68 29 3b 0a 0a 09 7d 20 65 6c 73 65 20  e(dh);...} else 
f290: 7b 0a 09 20 20 20 20 2f 2a 20 55 73 65 20 77 65  {..    /* Use we
f2a0: 6c 6c 20 6b 6e 6f 77 6e 20 44 48 20 70 61 72 61  ll known DH para
f2b0: 6d 65 74 65 72 73 20 74 68 61 74 20 68 61 76 65  meters that have
f2c0: 20 62 75 69 6c 74 2d 69 6e 20 73 75 70 70 6f 72   built-in suppor
f2d0: 74 20 69 6e 20 4f 70 65 6e 53 53 4c 20 2a 2f 0a  t in OpenSSL */.
f2e0: 09 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43 54  .    if (!SSL_CT
f2f0: 58 5f 73 65 74 5f 64 68 5f 61 75 74 6f 28 63 74  X_set_dh_auto(ct
f300: 78 2c 20 31 29 29 20 7b 0a 09 09 54 63 6c 5f 41  x, 1)) {...Tcl_A
f310: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
f320: 72 70 2c 20 22 43 6f 75 6c 64 20 6e 6f 74 20 65  rp, "Could not e
f330: 6e 61 62 6c 65 20 73 65 74 20 44 48 20 61 75 74  nable set DH aut
f340: 6f 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45  o: ", GET_ERR_RE
f350: 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29  ASON(), (char *)
f360: 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54   NULL);...SSL_CT
f370: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72  X_free(ctx);...r
f380: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20  eturn NULL;..   
f390: 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a 23 65 6e 64   }..}.    }.#end
f3a0: 69 66 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 6f  if..    /* set o
f3b0: 75 72 20 63 65 72 74 69 66 69 63 61 74 65 20 2a  ur certificate *
f3c0: 2f 0a 20 20 20 20 6c 6f 61 64 5f 70 72 69 76 61  /.    load_priva
f3d0: 74 65 5f 6b 65 79 20 3d 20 30 3b 0a 20 20 20 20  te_key = 0;.    
f3e0: 69 66 20 28 63 65 72 74 66 69 6c 65 20 21 3d 20  if (certfile != 
f3f0: 4e 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 72  NULL) {..load_pr
f400: 69 76 61 74 65 5f 6b 65 79 20 3d 20 31 3b 0a 0a  ivate_key = 1;..
f410: 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65  .if (SSL_CTX_use
f420: 5f 63 65 72 74 69 66 69 63 61 74 65 5f 66 69 6c  _certificate_fil
f430: 65 28 63 74 78 2c 20 46 32 4e 28 63 65 72 74 66  e(ctx, F2N(certf
f440: 69 6c 65 2c 20 26 64 73 29 2c 20 53 53 4c 5f 46  ile, &ds), SSL_F
f450: 49 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20  ILETYPE_PEM) <= 
f460: 30 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 44 53  0) {..    Tcl_DS
f470: 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a  tringFree(&ds);.
f480: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
f490: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75  esult(interp, "u
f4a0: 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 63 65 72  nable to set cer
f4b0: 74 69 66 69 63 61 74 65 20 66 69 6c 65 20 22 2c  tificate file ",
f4c0: 20 63 65 72 74 66 69 6c 65 2c 20 22 3a 20 22 2c   certfile, ": ",
f4d0: 0a 09 09 47 45 54 5f 45 52 52 5f 52 45 41 53 4f  ...GET_ERR_REASO
f4e0: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  N(), (char *) NU
f4f0: 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54  LL);..    SSL_CT
f500: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20  X_free(ctx);..  
f510: 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09    return NULL;..
f520: 7d 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72  }..Tcl_DStringFr
f530: 65 65 28 26 64 73 29 3b 0a 0a 20 20 20 20 7d 20  ee(&ds);..    } 
f540: 65 6c 73 65 20 69 66 20 28 63 65 72 74 20 21 3d  else if (cert !=
f550: 20 4e 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70   NULL) {..load_p
f560: 72 69 76 61 74 65 5f 6b 65 79 20 3d 20 31 3b 0a  rivate_key = 1;.
f570: 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65  .if (SSL_CTX_use
f580: 5f 63 65 72 74 69 66 69 63 61 74 65 5f 41 53 4e  _certificate_ASN
f590: 31 28 63 74 78 2c 20 28 69 6e 74 29 20 63 65 72  1(ctx, (int) cer
f5a0: 74 5f 6c 65 6e 2c 20 63 65 72 74 29 20 3c 3d 20  t_len, cert) <= 
f5b0: 30 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70  0) {..    Tcl_Ap
f5c0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
f5d0: 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65  p, "unable to se
f5e0: 74 20 63 65 72 74 69 66 69 63 61 74 65 3a 20 22  t certificate: "
f5f0: 2c 0a 09 09 47 45 54 5f 45 52 52 5f 52 45 41 53  ,...GET_ERR_REAS
f600: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e  ON(), (char *) N
f610: 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43  ULL);..    SSL_C
f620: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20  TX_free(ctx);.. 
f630: 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a     return NULL;.
f640: 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  .}.    } else {.
f650: 09 63 65 72 74 66 69 6c 65 20 3d 20 28 63 68 61  .certfile = (cha
f660: 72 2a 29 58 35 30 39 5f 67 65 74 5f 64 65 66 61  r*)X509_get_defa
f670: 75 6c 74 5f 63 65 72 74 5f 66 69 6c 65 28 29 3b  ult_cert_file();
f680: 0a 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75  ...if (SSL_CTX_u
f690: 73 65 5f 63 65 72 74 69 66 69 63 61 74 65 5f 66  se_certificate_f
f6a0: 69 6c 65 28 63 74 78 2c 20 63 65 72 74 66 69 6c  ile(ctx, certfil
f6b0: 65 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f  e, SSL_FILETYPE_
f6c0: 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 23 69 66  PEM) <= 0) {.#if
f6d0: 20 30 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65   0..    Tcl_Appe
f6e0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
f6f0: 20 22 75 6e 61 62 6c 65 20 74 6f 20 75 73 65 20   "unable to use 
f700: 64 65 66 61 75 6c 74 20 63 65 72 74 69 66 69 63  default certific
f710: 61 74 65 20 66 69 6c 65 20 22 2c 20 63 65 72 74  ate file ", cert
f720: 66 69 6c 65 2c 20 22 3a 20 22 2c 0a 09 09 47 45  file, ": ",...GE
f730: 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20  T_ERR_REASON(), 
f740: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
f750: 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65  .    SSL_CTX_fre
f760: 65 28 63 74 78 29 3b 0a 09 20 20 20 20 72 65 74  e(ctx);..    ret
f770: 75 72 6e 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66  urn NULL;.#endif
f780: 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ..}.    }..    /
f790: 2a 20 73 65 74 20 6f 75 72 20 70 72 69 76 61 74  * set our privat
f7a0: 65 20 6b 65 79 20 2a 2f 0a 20 20 20 20 69 66 20  e key */.    if 
f7b0: 28 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65  (load_private_ke
f7c0: 79 29 20 7b 0a 09 69 66 20 28 6b 65 79 66 69 6c  y) {..if (keyfil
f7d0: 65 20 3d 3d 20 4e 55 4c 4c 20 26 26 20 6b 65 79  e == NULL && key
f7e0: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20   == NULL) {..   
f7f0: 20 6b 65 79 66 69 6c 65 20 3d 20 63 65 72 74 66   keyfile = certf
f800: 69 6c 65 3b 0a 09 7d 0a 0a 09 69 66 20 28 6b 65  ile;..}...if (ke
f810: 79 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b  yfile != NULL) {
f820: 0a 09 20 20 20 20 2f 2a 20 67 65 74 20 74 68 65  ..    /* get the
f830: 20 70 72 69 76 61 74 65 20 6b 65 79 20 61 73 73   private key ass
f840: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69  ociated with thi
f850: 73 20 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f  s certificate */
f860: 0a 09 20 20 20 20 69 66 20 28 6b 65 79 66 69 6c  ..    if (keyfil
f870: 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 6b  e == NULL) {...k
f880: 65 79 66 69 6c 65 20 3d 20 63 65 72 74 66 69 6c  eyfile = certfil
f890: 65 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20  e;..    }...    
f8a0: 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f  if (SSL_CTX_use_
f8b0: 50 72 69 76 61 74 65 4b 65 79 5f 66 69 6c 65 28  PrivateKey_file(
f8c0: 63 74 78 2c 20 46 32 4e 28 6b 65 79 66 69 6c 65  ctx, F2N(keyfile
f8d0: 2c 20 26 64 73 29 2c 20 53 53 4c 5f 46 49 4c 45  , &ds), SSL_FILE
f8e0: 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20  TYPE_PEM) <= 0) 
f8f0: 7b 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 46  {...Tcl_DStringF
f900: 72 65 65 28 26 64 73 29 3b 0a 09 09 2f 2a 20 66  ree(&ds);.../* f
f910: 6c 75 73 68 20 74 68 65 20 70 61 73 73 70 68 72  lush the passphr
f920: 61 73 65 20 77 68 69 63 68 20 6d 69 67 68 74 20  ase which might 
f930: 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 72  be left in the r
f940: 65 73 75 6c 74 20 2a 2f 0a 09 09 54 63 6c 5f 53  esult */...Tcl_S
f950: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
f960: 20 4e 55 4c 4c 2c 20 54 43 4c 5f 53 54 41 54 49   NULL, TCL_STATI
f970: 43 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64  C);...Tcl_Append
f980: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
f990: 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 70 75  unable to set pu
f9a0: 62 6c 69 63 20 6b 65 79 20 66 69 6c 65 20 22 2c  blic key file ",
f9b0: 20 6b 65 79 66 69 6c 65 2c 20 22 20 22 2c 0a 09   keyfile, " ",..
f9c0: 09 20 20 20 20 47 45 54 5f 45 52 52 5f 52 45 41  .    GET_ERR_REA
f9d0: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20  SON(), (char *) 
f9e0: 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58  NULL);...SSL_CTX
f9f0: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65  _free(ctx);...re
fa00: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20  turn NULL;..    
fa10: 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69  }..    Tcl_DStri
fa20: 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 0a 09 7d  ngFree(&ds);...}
fa30: 20 65 6c 73 65 20 69 66 20 28 6b 65 79 20 21 3d   else if (key !=
fa40: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 69 66   NULL) {..    if
fa50: 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 50 72   (SSL_CTX_use_Pr
fa60: 69 76 61 74 65 4b 65 79 5f 41 53 4e 31 28 45 56  ivateKey_ASN1(EV
fa70: 50 5f 50 4b 45 59 5f 52 53 41 2c 20 63 74 78 2c  P_PKEY_RSA, ctx,
fa80: 20 6b 65 79 2c 20 28 69 6e 74 29 20 6b 65 79 5f   key, (int) key_
fa90: 6c 65 6e 29 20 3c 3d 20 30 29 20 7b 0a 09 09 2f  len) <= 0) {.../
faa0: 2a 20 66 6c 75 73 68 20 74 68 65 20 70 61 73 73  * flush the pass
fab0: 70 68 72 61 73 65 20 77 68 69 63 68 20 6d 69 67  phrase which mig
fac0: 68 74 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68  ht be left in th
fad0: 65 20 72 65 73 75 6c 74 20 2a 2f 0a 09 09 54 63  e result */...Tc
fae0: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
faf0: 72 70 2c 20 4e 55 4c 4c 2c 20 54 43 4c 5f 53 54  rp, NULL, TCL_ST
fb00: 41 54 49 43 29 3b 0a 09 09 54 63 6c 5f 41 70 70  ATIC);...Tcl_App
fb10: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
fb20: 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74  , "unable to set
fb30: 20 70 75 62 6c 69 63 20 6b 65 79 3a 20 22 2c 20   public key: ", 
fb40: 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29  GET_ERR_REASON()
fb50: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
fb60: 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65  ;...SSL_CTX_free
fb70: 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20  (ctx);...return 
fb80: 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a  NULL;..    }..}.
fb90: 09 2f 2a 20 4e 6f 77 20 77 65 20 6b 6e 6f 77 20  ./* Now we know 
fba0: 74 68 61 74 20 61 20 6b 65 79 20 61 6e 64 20 63  that a key and c
fbb0: 65 72 74 20 68 61 76 65 20 62 65 65 6e 20 73 65  ert have been se
fbc0: 74 20 61 67 61 69 6e 73 74 0a 09 20 2a 20 74 68  t against.. * th
fbd0: 65 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 2a 2f  e SSL context */
fbe0: 0a 09 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 63  ..if (!SSL_CTX_c
fbf0: 68 65 63 6b 5f 70 72 69 76 61 74 65 5f 6b 65 79  heck_private_key
fc00: 28 63 74 78 29 29 20 7b 0a 09 20 20 20 20 54 63  (ctx)) {..    Tc
fc10: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
fc20: 6e 74 65 72 70 2c 20 22 70 72 69 76 61 74 65 20  nterp, "private 
fc30: 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74  key does not mat
fc40: 63 68 20 74 68 65 20 63 65 72 74 69 66 69 63 61  ch the certifica
fc50: 74 65 20 70 75 62 6c 69 63 20 6b 65 79 22 2c 0a  te public key",.
fc60: 09 09 09 20 20 20 20 20 28 63 68 61 72 20 2a 29  ...     (char *)
fc70: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c   NULL);..    SSL
fc80: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a  _CTX_free(ctx);.
fc90: 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c  .    return NULL
fca0: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ;..}.    }..    
fcb0: 2f 2a 20 53 65 74 20 74 6f 20 75 73 65 20 64 65  /* Set to use de
fcc0: 66 61 75 6c 74 20 6c 6f 63 61 74 69 6f 6e 20 61  fault location a
fcd0: 6e 64 20 66 69 6c 65 20 66 6f 72 20 43 65 72 74  nd file for Cert
fce0: 69 66 69 63 61 74 65 20 41 75 74 68 6f 72 69 74  ificate Authorit
fcf0: 79 20 28 43 41 29 20 63 65 72 74 69 66 69 63 61  y (CA) certifica
fd00: 74 65 73 2e 20 54 68 65 0a 20 20 20 20 20 2a 20  tes. The.     * 
fd10: 76 65 72 69 66 79 20 70 61 74 68 20 61 6e 64 20  verify path and 
fd20: 73 74 6f 72 65 20 63 61 6e 20 62 65 20 6f 76 65  store can be ove
fd30: 72 72 69 64 64 65 6e 20 62 79 20 74 68 65 20 53  rridden by the S
fd40: 53 4c 5f 43 45 52 54 5f 44 49 52 20 65 6e 76 20  SL_CERT_DIR env 
fd50: 76 61 72 2e 20 54 68 65 20 76 65 72 69 66 79 20  var. The verify 
fd60: 66 69 6c 65 20 63 61 6e 0a 20 20 20 20 20 2a 20  file can.     * 
fd70: 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79  be overridden by
fd80: 20 74 68 65 20 53 53 4c 5f 43 45 52 54 5f 46 49   the SSL_CERT_FI
fd90: 4c 45 20 65 6e 76 20 76 61 72 2e 20 2a 2f 0a 20  LE env var. */. 
fda0: 20 20 20 69 66 20 28 21 53 53 4c 5f 43 54 58 5f     if (!SSL_CTX_
fdb0: 73 65 74 5f 64 65 66 61 75 6c 74 5f 76 65 72 69  set_default_veri
fdc0: 66 79 5f 70 61 74 68 73 28 63 74 78 29 29 20 7b  fy_paths(ctx)) {
fdd0: 0a 09 61 62 6f 72 74 2b 2b 3b 0a 20 20 20 20 7d  ..abort++;.    }
fde0: 0a 0a 20 20 20 20 2f 2a 20 4f 76 65 72 72 69 64  ..    /* Overrid
fdf0: 65 73 20 66 6f 72 20 74 68 65 20 43 41 20 76 65  es for the CA ve
fe00: 72 69 66 79 20 70 61 74 68 20 61 6e 64 20 66 69  rify path and fi
fe10: 6c 65 20 2a 2f 0a 20 20 20 20 7b 0a 23 69 66 20  le */.    {.#if 
fe20: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f  OPENSSL_VERSION_
fe30: 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30  NUMBER < 0x30000
fe40: 30 30 30 4c 0a 09 69 66 20 28 43 41 70 61 74 68  000L..if (CApath
fe50: 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20 43 41 66 69   != NULL || CAfi
fe60: 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20  le != NULL) {.. 
fe70: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 64     Tcl_DString d
fe80: 73 31 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74  s1;..    Tcl_DSt
fe90: 72 69 6e 67 49 6e 69 74 28 26 64 73 31 29 3b 0a  ringInit(&ds1);.
fea0: 0a 09 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43  ..    if (!SSL_C
feb0: 54 58 5f 6c 6f 61 64 5f 76 65 72 69 66 79 5f 6c  TX_load_verify_l
fec0: 6f 63 61 74 69 6f 6e 73 28 63 74 78 2c 20 46 32  ocations(ctx, F2
fed0: 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29 2c 20  N(CAfile, &ds), 
fee0: 46 32 4e 28 43 41 70 61 74 68 2c 20 26 64 73 31  F2N(CApath, &ds1
fef0: 29 29 29 20 7b 0a 09 09 61 62 6f 72 74 2b 2b 3b  ))) {...abort++;
ff00: 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54 63 6c  ..    }..    Tcl
ff10: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73  _DStringFree(&ds
ff20: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72  );..    Tcl_DStr
ff30: 69 6e 67 46 72 65 65 28 26 64 73 31 29 3b 0a 0a  ingFree(&ds1);..
ff40: 09 20 20 20 20 2f 2a 20 53 65 74 20 6c 69 73 74  .    /* Set list
ff50: 20 6f 66 20 43 41 73 20 74 6f 20 73 65 6e 64 20   of CAs to send 
ff60: 74 6f 20 63 6c 69 65 6e 74 20 77 68 65 6e 20 72  to client when r
ff70: 65 71 75 65 73 74 69 6e 67 20 61 20 63 6c 69 65  equesting a clie
ff80: 6e 74 20 63 65 72 74 69 66 69 63 61 74 65 20 2a  nt certificate *
ff90: 2f 0a 09 20 20 20 20 2f 2a 20 68 74 74 70 73 3a  /..    /* https:
ffa0: 2f 2f 73 6f 75 72 63 65 66 6f 72 67 65 2e 6e 65  //sourceforge.ne
ffb0: 74 2f 70 2f 74 6c 73 2f 62 75 67 73 2f 35 37 2f  t/p/tls/bugs/57/
ffc0: 20 2a 2f 0a 09 20 20 20 20 2f 2a 20 58 58 58 3a   */..    /* XXX:
ffd0: 54 4f 44 4f 3a 20 4c 65 74 20 74 68 65 20 75 73  TODO: Let the us
ffe0: 65 72 20 73 75 70 70 6c 79 20 76 61 6c 75 65 73  er supply values
fff0: 20 68 65 72 65 20 69 6e 73 74 65 61 64 20 6f 66   here instead of
10000 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20   something that 
10010 65 78 69 73 74 73 20 6f 6e 20 74 68 65 20 66 69  exists on the fi
10020 6c 65 73 79 73 74 65 6d 20 2a 2f 0a 09 20 20 20  lesystem */..   
10030 20 53 54 41 43 4b 5f 4f 46 28 58 35 30 39 5f 4e   STACK_OF(X509_N
10040 41 4d 45 29 20 2a 63 65 72 74 4e 61 6d 65 73 20  AME) *certNames 
10050 3d 20 53 53 4c 5f 6c 6f 61 64 5f 63 6c 69 65 6e  = SSL_load_clien
10060 74 5f 43 41 5f 66 69 6c 65 28 46 32 4e 28 43 41  t_CA_file(F2N(CA
10070 66 69 6c 65 2c 20 26 64 73 29 29 3b 0a 09 20 20  file, &ds));..  
10080 20 20 69 66 20 28 63 65 72 74 4e 61 6d 65 73 20    if (certNames 
10090 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 53 53 4c  != NULL) {...SSL
100a0 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f  _CTX_set_client_
100b0 43 41 5f 6c 69 73 74 28 63 74 78 2c 20 63 65 72  CA_list(ctx, cer
100c0 74 4e 61 6d 65 73 29 3b 0a 09 20 20 20 20 7d 0a  tNames);..    }.
100d0 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
100e0 46 72 65 65 28 26 64 73 29 3b 0a 09 7d 0a 0a 23  Free(&ds);..}..#
100f0 65 6c 73 65 0a 09 69 66 20 28 43 41 70 61 74 68  else..if (CApath
10100 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20   != NULL) {..   
10110 20 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 6c 6f   if (!SSL_CTX_lo
10120 61 64 5f 76 65 72 69 66 79 5f 64 69 72 28 63 74  ad_verify_dir(ct
10130 78 2c 20 46 32 4e 28 43 41 70 61 74 68 2c 20 26  x, F2N(CApath, &
10140 64 73 29 29 29 20 7b 0a 09 09 61 62 6f 72 74 2b  ds))) {...abort+
10150 2b 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54  +;..    }..    T
10160 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26  cl_DStringFree(&
10170 64 73 29 3b 0a 09 7d 0a 09 69 66 20 28 43 41 66  ds);..}..if (CAf
10180 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ile != NULL) {..
10190 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43 54 58      if (!SSL_CTX
101a0 5f 6c 6f 61 64 5f 76 65 72 69 66 79 5f 66 69 6c  _load_verify_fil
101b0 65 28 63 74 78 2c 20 46 32 4e 28 43 41 66 69 6c  e(ctx, F2N(CAfil
101c0 65 2c 20 26 64 73 29 29 29 20 7b 0a 09 09 61 62  e, &ds))) {...ab
101d0 6f 72 74 2b 2b 3b 0a 09 20 20 20 20 7d 0a 09 20  ort++;..    }.. 
101e0 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72     Tcl_DStringFr
101f0 65 65 28 26 64 73 29 3b 0a 0a 09 20 20 20 20 2f  ee(&ds);...    /
10200 2a 20 53 65 74 20 6c 69 73 74 20 6f 66 20 43 41  * Set list of CA
10210 73 20 74 6f 20 73 65 6e 64 20 74 6f 20 63 6c 69  s to send to cli
10220 65 6e 74 20 77 68 65 6e 20 72 65 71 75 65 73 74  ent when request
10230 69 6e 67 20 61 20 63 6c 69 65 6e 74 20 63 65 72  ing a client cer
10240 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 20 20 20  tificate */..   
10250 20 53 54 41 43 4b 5f 4f 46 28 58 35 30 39 5f 4e   STACK_OF(X509_N
10260 41 4d 45 29 20 2a 63 65 72 74 4e 61 6d 65 73 20  AME) *certNames 
10270 3d 20 53 53 4c 5f 6c 6f 61 64 5f 63 6c 69 65 6e  = SSL_load_clien
10280 74 5f 43 41 5f 66 69 6c 65 28 46 32 4e 28 43 41  t_CA_file(F2N(CA
10290 66 69 6c 65 2c 20 26 64 73 29 29 3b 0a 09 20 20  file, &ds));..  
102a0 20 20 69 66 20 28 63 65 72 74 4e 61 6d 65 73 20    if (certNames 
102b0 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 53 53 4c  != NULL) {...SSL
102c0 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f  _CTX_set_client_
102d0 43 41 5f 6c 69 73 74 28 63 74 78 2c 20 63 65 72  CA_list(ctx, cer
102e0 74 4e 61 6d 65 73 29 3b 0a 09 20 20 20 20 7d 0a  tNames);..    }.
102f0 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
10300 46 72 65 65 28 26 64 73 29 3b 0a 09 7d 0a 23 65  Free(&ds);..}.#e
10310 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ndif.    }..    
10320 72 65 74 75 72 6e 20 63 74 78 3b 0a 7d 0a 0c 0a  return ctx;.}...
10330 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
10340 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10350 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10360 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10370 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53  --------. *. * S
10380 74 61 74 75 73 4f 62 6a 43 6d 64 20 2d 2d 20 72  tatusObjCmd -- r
10390 65 74 75 72 6e 20 63 65 72 74 69 66 69 63 61 74  eturn certificat
103a0 65 20 66 6f 72 20 63 6f 6e 6e 65 63 74 65 64 20  e for connected 
103b0 70 65 65 72 20 69 6e 66 6f 2e 0a 20 2a 0a 20 2a  peer info.. *. *
103c0 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73   Results:. *.A s
103d0 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75  tandard Tcl resu
103e0 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  lt.. *. * Side e
103f0 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e  ffects:. *.None.
10400 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
10410 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10420 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10430 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10440 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74  ---------. */.st
10450 61 74 69 63 20 69 6e 74 0a 53 74 61 74 75 73 4f  atic int.StatusO
10460 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61  bjCmd(ClientData
10470 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c   clientData, Tcl
10480 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
10490 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f   int objc, Tcl_O
104a0 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d  bj *const objv[]
104b0 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73  ) {.    State *s
104c0 74 61 74 65 50 74 72 3b 0a 20 20 20 20 58 35 30  tatePtr;.    X50
104d0 39 20 2a 70 65 65 72 3b 0a 20 20 20 20 54 63 6c  9 *peer;.    Tcl
104e0 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 20 20  _Obj *objPtr;.  
104f0 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68    Tcl_Channel ch
10500 61 6e 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 68  an;.    char *ch
10510 61 6e 6e 65 6c 4e 61 6d 65 2c 20 2a 63 69 70 68  annelName, *ciph
10520 65 72 73 3b 0a 20 20 20 20 69 6e 74 20 6d 6f 64  ers;.    int mod
10530 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73  e;.    const uns
10540 69 67 6e 65 64 20 63 68 61 72 20 2a 70 72 6f 74  igned char *prot
10550 6f 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  o;.    unsigned 
10560 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 69 6e 74  int len;.    int
10570 20 6e 69 64 2c 20 72 65 73 3b 0a 20 20 20 20 28   nid, res;.    (
10580 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 74 61  void) clientData
10590 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
105a0 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69  Called");..    i
105b0 66 20 28 6f 62 6a 63 20 3c 20 32 20 7c 7c 20 6f  f (objc < 2 || o
105c0 62 6a 63 20 3e 20 33 20 7c 7c 20 28 6f 62 6a 63  bjc > 3 || (objc
105d0 20 3d 3d 20 33 20 26 26 20 21 73 74 72 63 6d 70   == 3 && !strcmp
105e0 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f  (Tcl_GetString(o
105f0 62 6a 76 5b 31 5d 29 2c 20 22 2d 6c 6f 63 61 6c  bjv[1]), "-local
10600 22 29 29 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e  "))) {..Tcl_Wron
10610 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
10620 20 31 2c 20 6f 62 6a 76 2c 20 22 3f 2d 6c 6f 63   1, objv, "?-loc
10630 61 6c 3f 20 63 68 61 6e 6e 65 6c 22 29 3b 0a 09  al? channel");..
10640 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
10650 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
10660 47 65 74 20 63 68 61 6e 6e 65 6c 20 49 64 20 2a  Get channel Id *
10670 2f 0a 20 20 20 20 63 68 61 6e 6e 65 6c 4e 61 6d  /.    channelNam
10680 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
10690 67 28 6f 62 6a 76 5b 28 6f 62 6a 63 20 3d 3d 20  g(objv[(objc == 
106a0 32 20 3f 20 31 20 3a 20 32 29 5d 29 3b 0a 20 20  2 ? 1 : 2)]);.  
106b0 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74    chan = Tcl_Get
106c0 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20  Channel(interp, 
106d0 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c 20 26 6d 6f  channelName, &mo
106e0 64 65 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61  de);.    if (cha
106f0 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65  n == (Tcl_Channe
10700 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75  l) NULL) {..retu
10710 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
10720 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65    }..    /* Make
10730 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65   sure to operate
10740 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20   on the topmost 
10750 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63  channel */.    c
10760 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70  han = Tcl_GetTop
10770 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20  Channel(chan);. 
10780 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68     if (Tcl_GetCh
10790 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20  annelType(chan) 
107a0 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79  != Tls_ChannelTy
107b0 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70  pe()) {..Tcl_App
107c0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
107d0 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c  , "bad channel \
107e0 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e  "", Tcl_GetChann
107f0 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09  elName(chan),...
10800 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63  "\": not a TLS c
10810 68 61 6e 6e 65 6c 22 2c 20 28 63 68 61 72 20 2a  hannel", (char *
10820 29 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65  ) NULL);..Tcl_Se
10830 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72  tErrorCode(inter
10840 70 2c 20 22 54 4c 53 22 2c 20 22 53 54 41 54 55  p, "TLS", "STATU
10850 53 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22  S", "CHANNEL", "
10860 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20  INVALID", (char 
10870 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72  *) NULL);..retur
10880 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
10890 20 7d 0a 20 20 20 20 73 74 61 74 65 50 74 72 20   }.    statePtr 
108a0 3d 20 28 53 74 61 74 65 20 2a 29 20 54 63 6c 5f  = (State *) Tcl_
108b0 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e  GetChannelInstan
108c0 63 65 44 61 74 61 28 63 68 61 6e 29 3b 0a 0a 20  ceData(chan);.. 
108d0 20 20 20 2f 2a 20 47 65 74 20 63 65 72 74 69 66     /* Get certif
108e0 69 63 61 74 65 20 66 6f 72 20 70 65 65 72 20 6f  icate for peer o
108f0 72 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20 69 66  r self */.    if
10900 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09   (objc == 2) {..
10910 70 65 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f 70  peer = SSL_get_p
10920 65 65 72 5f 63 65 72 74 69 66 69 63 61 74 65 28  eer_certificate(
10930 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a  statePtr->ssl);.
10940 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 70 65      } else {..pe
10950 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f 63 65 72  er = SSL_get_cer
10960 74 69 66 69 63 61 74 65 28 73 74 61 74 65 50 74  tificate(statePt
10970 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 20  r->ssl);.    }. 
10980 20 20 20 2f 2a 20 47 65 74 20 58 35 30 39 20 63     /* Get X509 c
10990 65 72 74 69 66 69 63 61 74 65 20 69 6e 66 6f 20  ertificate info 
109a0 2a 2f 0a 20 20 20 20 69 66 20 28 70 65 65 72 29  */.    if (peer)
109b0 20 7b 0a 09 6f 62 6a 50 74 72 20 3d 20 54 6c 73   {..objPtr = Tls
109c0 5f 4e 65 77 58 35 30 39 4f 62 6a 28 69 6e 74 65  _NewX509Obj(inte
109d0 72 70 2c 20 70 65 65 72 29 3b 0a 09 69 66 20 28  rp, peer);..if (
109e0 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 20 20  objc == 2) {..  
109f0 20 20 58 35 30 39 5f 66 72 65 65 28 70 65 65 72    X509_free(peer
10a00 29 3b 0a 09 20 20 20 20 70 65 65 72 20 3d 20 4e  );..    peer = N
10a10 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c  ULL;..}.    } el
10a20 73 65 20 7b 0a 09 6f 62 6a 50 74 72 20 3d 20 54  se {..objPtr = T
10a30 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c  cl_NewListObj(0,
10a40 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 0a 20   NULL);.    }.. 
10a50 20 20 20 2f 2a 20 50 65 65 72 20 6e 61 6d 65 20     /* Peer name 
10a60 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53  */.    LAPPEND_S
10a70 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  TR(interp, objPt
10a80 72 2c 20 22 70 65 65 72 6e 61 6d 65 22 2c 20 53  r, "peername", S
10a90 53 4c 5f 67 65 74 30 5f 70 65 65 72 6e 61 6d 65  SL_get0_peername
10aa0 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c  (statePtr->ssl),
10ab0 20 2d 31 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e   -1);.    LAPPEN
10ac0 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62  D_INT(interp, ob
10ad0 6a 50 74 72 2c 20 22 73 62 69 74 73 22 2c 20 53  jPtr, "sbits", S
10ae0 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 5f 62 69  SL_get_cipher_bi
10af0 74 73 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  ts(statePtr->ssl
10b00 2c 20 4e 55 4c 4c 29 29 3b 0a 0a 20 20 20 20 63  , NULL));..    c
10b10 69 70 68 65 72 73 20 3d 20 28 63 68 61 72 2a 29  iphers = (char*)
10b20 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 28 73  SSL_get_cipher(s
10b30 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20  tatePtr->ssl);. 
10b40 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69     LAPPEND_STR(i
10b50 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
10b60 63 69 70 68 65 72 22 2c 20 63 69 70 68 65 72 73  cipher", ciphers
10b70 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 56  , -1);..    /* V
10b80 65 72 69 66 79 20 74 68 65 20 58 35 30 39 20 63  erify the X509 c
10b90 65 72 74 69 66 69 63 61 74 65 20 70 72 65 73 65  ertificate prese
10ba0 6e 74 65 64 20 62 79 20 74 68 65 20 70 65 65 72  nted by the peer
10bb0 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f   */.    LAPPEND_
10bc0 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
10bd0 74 72 2c 20 22 76 65 72 69 66 79 52 65 73 75 6c  tr, "verifyResul
10be0 74 22 2c 0a 09 58 35 30 39 5f 76 65 72 69 66 79  t",..X509_verify
10bf0 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 69  _cert_error_stri
10c00 6e 67 28 53 53 4c 5f 67 65 74 5f 76 65 72 69 66  ng(SSL_get_verif
10c10 79 5f 72 65 73 75 6c 74 28 73 74 61 74 65 50 74  y_result(statePt
10c20 72 2d 3e 73 73 6c 29 29 2c 20 2d 31 29 3b 0a 0a  r->ssl)), -1);..
10c30 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 6d 6f      /* Verify mo
10c40 64 65 20 2a 2f 0a 20 20 20 20 6d 6f 64 65 20 3d  de */.    mode =
10c50 20 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f   SSL_get_verify_
10c60 6d 6f 64 65 28 73 74 61 74 65 50 74 72 2d 3e 73  mode(statePtr->s
10c70 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 6d 6f 64  sl);.    if (mod
10c80 65 20 26 26 20 53 53 4c 5f 56 45 52 49 46 59 5f  e && SSL_VERIFY_
10c90 4e 4f 4e 45 29 20 7b 0a 09 4c 41 50 50 45 4e 44  NONE) {..LAPPEND
10ca0 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _STR(interp, obj
10cb0 50 74 72 2c 20 22 76 65 72 69 66 79 4d 6f 64 65  Ptr, "verifyMode
10cc0 22 2c 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a  ", "none", -1);.
10cd0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63      } else {..Tc
10ce0 6c 5f 4f 62 6a 20 2a 6c 69 73 74 4f 62 6a 50 74  l_Obj *listObjPt
10cf0 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f  r = Tcl_NewListO
10d00 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66  bj(0, NULL);..if
10d10 20 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 45   (mode && SSL_VE
10d20 52 49 46 59 5f 50 45 45 52 29 20 7b 0a 09 20 20  RIFY_PEER) {..  
10d30 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
10d40 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
10d50 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54  p, listObjPtr, T
10d60 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
10d70 22 70 65 65 72 22 2c 20 2d 31 29 29 3b 0a 09 7d  "peer", -1));..}
10d80 0a 09 69 66 20 28 6d 6f 64 65 20 26 26 20 53 53  ..if (mode && SS
10d90 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c 5f 49 46  L_VERIFY_FAIL_IF
10da0 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54 29 20 7b  _NO_PEER_CERT) {
10db0 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ..    Tcl_ListOb
10dc0 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
10dd0 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74  nterp, listObjPt
10de0 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
10df0 4f 62 6a 28 22 66 61 69 6c 20 69 66 20 6e 6f 20  Obj("fail if no 
10e00 70 65 65 72 20 63 65 72 74 22 2c 20 2d 31 29 29  peer cert", -1))
10e10 3b 0a 09 7d 0a 09 69 66 20 28 6d 6f 64 65 20 26  ;..}..if (mode &
10e20 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 43 4c 49  & SSL_VERIFY_CLI
10e30 45 4e 54 5f 4f 4e 43 45 29 20 7b 0a 09 20 20 20  ENT_ONCE) {..   
10e40 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
10e50 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
10e60 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 63  , listObjPtr, Tc
10e70 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
10e80 63 6c 69 65 6e 74 20 6f 6e 63 65 22 2c 20 2d 31  client once", -1
10e90 29 29 3b 0a 09 7d 0a 09 69 66 20 28 6d 6f 64 65  ));..}..if (mode
10ea0 20 26 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 50   && SSL_VERIFY_P
10eb0 4f 53 54 5f 48 41 4e 44 53 48 41 4b 45 29 20 7b  OST_HANDSHAKE) {
10ec0 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ..    Tcl_ListOb
10ed0 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
10ee0 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74  nterp, listObjPt
10ef0 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
10f00 4f 62 6a 28 22 70 6f 73 74 20 68 61 6e 64 73 68  Obj("post handsh
10f10 61 6b 65 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09  ake", -1));..}..
10f20 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65  LAPPEND_OBJ(inte
10f30 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 76 65 72  rp, objPtr, "ver
10f40 69 66 79 4d 6f 64 65 22 2c 20 6c 69 73 74 4f 62  ifyMode", listOb
10f50 6a 50 74 72 29 0a 20 20 20 20 7d 0a 0a 20 20 20  jPtr).    }..   
10f60 20 2f 2a 20 56 65 72 69 66 79 20 6d 6f 64 65 20   /* Verify mode 
10f70 64 65 70 74 68 20 2a 2f 0a 20 20 20 20 4c 41 50  depth */.    LAP
10f80 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c  PEND_INT(interp,
10f90 20 6f 62 6a 50 74 72 2c 20 22 76 65 72 69 66 79   objPtr, "verify
10fa0 44 65 70 74 68 22 2c 20 53 53 4c 5f 67 65 74 5f  Depth", SSL_get_
10fb0 76 65 72 69 66 79 5f 64 65 70 74 68 28 73 74 61  verify_depth(sta
10fc0 74 65 50 74 72 2d 3e 73 73 6c 29 29 3b 0a 0a 20  tePtr->ssl));.. 
10fd0 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 74 68 65     /* Report the
10fe0 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f 63   selected protoc
10ff0 6f 6c 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f  ol as a result o
11000 66 20 74 68 65 20 6e 65 67 6f 74 69 61 74 69 6f  f the negotiatio
11010 6e 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 67 65 74  n */.    SSL_get
11020 30 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 65 64 28  0_alpn_selected(
11030 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26  statePtr->ssl, &
11040 70 72 6f 74 6f 2c 20 26 6c 65 6e 29 3b 0a 20 20  proto, &len);.  
11050 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e    LAPPEND_STR(in
11060 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61  terp, objPtr, "a
11070 6c 70 6e 22 2c 20 28 63 68 61 72 20 2a 29 70 72  lpn", (char *)pr
11080 6f 74 6f 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20  oto, (Tcl_Size) 
11090 6c 65 6e 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e  len);.    LAPPEN
110a0 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62  D_STR(interp, ob
110b0 6a 50 74 72 2c 20 22 70 72 6f 74 6f 63 6f 6c 22  jPtr, "protocol"
110c0 2c 20 53 53 4c 5f 67 65 74 5f 76 65 72 73 69 6f  , SSL_get_versio
110d0 6e 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29  n(statePtr->ssl)
110e0 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 56  , -1);..    /* V
110f0 61 6c 69 64 20 66 6f 72 20 6e 6f 6e 2d 52 53 41  alid for non-RSA
11100 20 73 69 67 6e 61 74 75 72 65 20 61 6e 64 20 54   signature and T
11110 4c 53 20 31 2e 33 20 2a 2f 0a 20 20 20 20 69 66  LS 1.3 */.    if
11120 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09   (objc == 2) {..
11130 72 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f 70 65  res = SSL_get_pe
11140 65 72 5f 73 69 67 6e 61 74 75 72 65 5f 6e 69 64  er_signature_nid
11150 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20  (statePtr->ssl, 
11160 26 6e 69 64 29 3b 0a 20 20 20 20 7d 20 65 6c 73  &nid);.    } els
11170 65 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67  e {..res = SSL_g
11180 65 74 5f 73 69 67 6e 61 74 75 72 65 5f 6e 69 64  et_signature_nid
11190 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20  (statePtr->ssl, 
111a0 26 6e 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20  &nid);.    }.   
111b0 20 69 66 20 28 21 72 65 73 29 20 7b 6e 69 64 20   if (!res) {nid 
111c0 3d 20 30 3b 7d 0a 20 20 20 20 4c 41 50 50 45 4e  = 0;}.    LAPPEN
111d0 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62  D_STR(interp, ob
111e0 6a 50 74 72 2c 20 22 73 69 67 6e 61 74 75 72 65  jPtr, "signature
111f0 48 61 73 68 41 6c 67 6f 72 69 74 68 6d 22 2c 20  HashAlgorithm", 
11200 4f 42 4a 5f 6e 69 64 32 6c 6e 28 6e 69 64 29 2c  OBJ_nid2ln(nid),
11210 20 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 64   -1);..    /* Ad
11220 64 65 64 20 69 6e 20 4f 70 65 6e 53 53 4c 20 31  ded in OpenSSL 1
11230 2e 31 2e 31 61 20 2a 2f 0a 23 69 66 20 4f 50 45  .1.1a */.#if OPE
11240 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d  NSSL_VERSION_NUM
11250 42 45 52 20 3e 20 30 78 31 30 31 30 31 30 30 30  BER > 0x10101000
11260 4c 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3d  L.    if (objc =
11270 3d 20 32 29 20 7b 0a 09 72 65 73 20 3d 20 53 53  = 2) {..res = SS
11280 4c 5f 67 65 74 5f 70 65 65 72 5f 73 69 67 6e 61  L_get_peer_signa
11290 74 75 72 65 5f 74 79 70 65 5f 6e 69 64 28 73 74  ture_type_nid(st
112a0 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69  atePtr->ssl, &ni
112b0 64 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  d);.    } else {
112c0 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f  ..res = SSL_get_
112d0 73 69 67 6e 61 74 75 72 65 5f 74 79 70 65 5f 6e  signature_type_n
112e0 69 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  id(statePtr->ssl
112f0 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20 7d 0a 20  , &nid);.    }. 
11300 20 20 20 69 66 20 28 21 72 65 73 29 20 7b 6e 69     if (!res) {ni
11310 64 20 3d 20 30 3b 7d 0a 20 20 20 20 4c 41 50 50  d = 0;}.    LAPP
11320 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
11330 6f 62 6a 50 74 72 2c 20 22 73 69 67 6e 61 74 75  objPtr, "signatu
11340 72 65 54 79 70 65 22 2c 20 4f 42 4a 5f 6e 69 64  reType", OBJ_nid
11350 32 6c 6e 28 6e 69 64 29 2c 20 2d 31 29 3b 0a 23  2ln(nid), -1);.#
11360 65 6e 64 69 66 0a 0a 20 20 20 20 54 63 6c 5f 53  endif..    Tcl_S
11370 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
11380 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20  rp, objPtr);.   
11390 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
113a0 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  }.../*. *-------
113b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
113c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
113d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
113e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
113f0 20 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66   * ConnectionInf
11400 6f 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72  oObjCmd -- retur
11410 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66  n connection inf
11420 6f 20 66 72 6f 6d 20 4f 70 65 6e 53 53 4c 2e 0a  o from OpenSSL..
11430 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
11440 2a 09 41 20 6c 69 73 74 20 6f 66 20 63 6f 6e 6e  *.A list of conn
11450 65 63 74 69 6f 6e 20 69 6e 66 6f 0a 20 20 2a 0a  ection info.  *.
11460 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
11470 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11480 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11490 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
114a0 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69  -----. */..stati
114b0 63 20 69 6e 74 20 43 6f 6e 6e 65 63 74 69 6f 6e  c int Connection
114c0 49 6e 66 6f 4f 62 6a 43 6d 64 28 43 6c 69 65 6e  InfoObjCmd(Clien
114d0 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
114e0 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  , Tcl_Interp *in
114f0 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20  terp, int objc, 
11500 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f  Tcl_Obj *const o
11510 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c  bjv[]) {.    Tcl
11520 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09  _Channel chan;..
11530 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74  /* The channel t
11540 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 20  o set a mode on 
11550 2a 2f 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74  */.    State *st
11560 61 74 65 50 74 72 3b 09 09 2f 2a 20 63 6c 69 65  atePtr;../* clie
11570 6e 74 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c  nt state for ssl
11580 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 54   socket */.    T
11590 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 2c 20  cl_Obj *objPtr, 
115a0 2a 6c 69 73 74 50 74 72 3b 0a 20 20 20 20 63 6f  *listPtr;.    co
115b0 6e 73 74 20 53 53 4c 20 2a 73 73 6c 3b 0a 20 20  nst SSL *ssl;.  
115c0 20 20 63 6f 6e 73 74 20 53 53 4c 5f 43 49 50 48    const SSL_CIPH
115d0 45 52 20 2a 63 69 70 68 65 72 3b 0a 20 20 20 20  ER *cipher;.    
115e0 63 6f 6e 73 74 20 53 53 4c 5f 53 45 53 53 49 4f  const SSL_SESSIO
115f0 4e 20 2a 73 65 73 73 69 6f 6e 3b 0a 20 20 20 20  N *session;.    
11600 63 6f 6e 73 74 20 45 56 50 5f 4d 44 20 2a 6d 64  const EVP_MD *md
11610 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69  ;.    (void) cli
11620 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 69 66  entData;..    if
11630 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09   (objc != 2) {..
11640 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
11650 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
11660 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72  , "channel");..r
11670 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
11680 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e  .    }..    chan
11690 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65   = Tcl_GetChanne
116a0 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  l(interp, Tcl_Ge
116b0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
116c0 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20  , NULL);.    if 
116d0 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68  (chan == (Tcl_Ch
116e0 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09  annel) NULL) {..
116f0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
11700 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
11710 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65  Make sure to ope
11720 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d  rate on the topm
11730 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20  ost channel */. 
11740 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65     chan = Tcl_Ge
11750 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e  tTopChannel(chan
11760 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47  );.    if (Tcl_G
11770 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68  etChannelType(ch
11780 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e  an) != Tls_Chann
11790 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c  elType()) {..Tcl
117a0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
117b0 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e  terp, "bad chann
117c0 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43  el \"", Tcl_GetC
117d0 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29  hannelName(chan)
117e0 2c 0a 09 20 20 20 20 22 5c 22 3a 20 6e 6f 74 20  ,..    "\": not 
117f0 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20  a TLS channel", 
11800 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
11810 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64  .Tcl_SetErrorCod
11820 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c  e(interp, "TLS",
11830 20 22 43 4f 4e 4e 45 43 54 49 4f 4e 22 2c 20 22   "CONNECTION", "
11840 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c  CHANNEL", "INVAL
11850 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  ID", (char *) NU
11860 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  LL);..return TCL
11870 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
11880 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f     objPtr = Tcl_
11890 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55  NewListObj(0, NU
118a0 4c 4c 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e  LL);..    /* Con
118b0 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a  nection info */.
118c0 20 20 20 20 73 74 61 74 65 50 74 72 20 3d 20 28      statePtr = (
118d0 53 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43  State *)Tcl_GetC
118e0 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61  hannelInstanceDa
118f0 74 61 28 63 68 61 6e 29 3b 0a 20 20 20 20 73 73  ta(chan);.    ss
11900 6c 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 73 73  l = statePtr->ss
11910 6c 3b 0a 20 20 20 20 69 66 20 28 73 73 6c 20 21  l;.    if (ssl !
11920 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 6f 6e 73 74  = NULL) {..const
11930 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
11940 70 72 6f 74 6f 3b 0a 09 75 6e 73 69 67 6e 65 64  proto;..unsigned
11950 20 69 6e 74 20 75 6c 65 6e 3b 0a 0a 09 2f 2a 20   int ulen;.../* 
11960 49 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 66  Initialization f
11970 69 6e 69 73 68 65 64 20 2a 2f 0a 09 4c 41 50 50  inished */..LAPP
11980 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c  END_BOOL(interp,
11990 20 6f 62 6a 50 74 72 2c 20 22 69 6e 69 74 5f 66   objPtr, "init_f
119a0 69 6e 69 73 68 65 64 22 2c 20 53 53 4c 5f 69 73  inished", SSL_is
119b0 5f 69 6e 69 74 5f 66 69 6e 69 73 68 65 64 28 73  _init_finished(s
119c0 73 6c 29 29 3b 0a 09 0a 09 2f 2a 20 63 6f 6e 6e  sl));..../* conn
119d0 65 63 74 69 6f 6e 20 73 74 61 74 65 20 2a 2f 0a  ection state */.
119e0 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74  .LAPPEND_STR(int
119f0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 74  erp, objPtr, "st
11a00 61 74 65 22 2c 20 53 53 4c 5f 73 74 61 74 65 5f  ate", SSL_state_
11a10 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 73 73 6c 29  string_long(ssl)
11a20 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 47 65 74 20  , -1);.../* Get 
11a30 53 4e 49 20 72 65 71 75 65 73 74 65 64 20 73 65  SNI requested se
11a40 72 76 65 72 20 6e 61 6d 65 20 2a 2f 0a 09 4c 41  rver name */..LA
11a50 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
11a60 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 72 76 65  , objPtr, "serve
11a70 72 6e 61 6d 65 22 2c 20 53 53 4c 5f 67 65 74 5f  rname", SSL_get_
11a80 73 65 72 76 65 72 6e 61 6d 65 28 73 73 6c 2c 20  servername(ssl, 
11a90 54 4c 53 45 58 54 5f 4e 41 4d 45 54 59 50 45 5f  TLSEXT_NAMETYPE_
11aa0 68 6f 73 74 5f 6e 61 6d 65 29 2c 20 2d 31 29 3b  host_name), -1);
11ab0 0a 0a 09 2f 2a 20 52 65 70 6f 72 74 20 74 68 65  .../* Report the
11ac0 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f 63   selected protoc
11ad0 6f 6c 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f  ol as a result o
11ae0 66 20 74 68 65 20 6e 65 67 6f 74 69 61 74 69 6f  f the negotiatio
11af0 6e 20 2a 2f 0a 09 53 53 4c 5f 67 65 74 30 5f 61  n */..SSL_get0_a
11b00 6c 70 6e 5f 73 65 6c 65 63 74 65 64 28 73 74 61  lpn_selected(sta
11b10 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 70 72 6f  tePtr->ssl, &pro
11b20 74 6f 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c 41 50  to, &ulen);..LAP
11b30 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
11b40 20 6f 62 6a 50 74 72 2c 20 22 61 6c 70 6e 22 2c   objPtr, "alpn",
11b50 20 28 63 68 61 72 20 2a 29 70 72 6f 74 6f 2c 20   (char *)proto, 
11b60 28 54 63 6c 5f 53 69 7a 65 29 20 75 6c 65 6e 29  (Tcl_Size) ulen)
11b70 3b 0a 0a 09 2f 2a 20 47 65 74 20 70 72 6f 74 6f  ;.../* Get proto
11b80 63 6f 6c 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f  col */..LAPPEND_
11b90 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
11ba0 74 72 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20  tr, "protocol", 
11bb0 53 53 4c 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28  SSL_get_version(
11bc0 73 73 6c 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20  ssl), -1);.../* 
11bd0 52 65 6e 65 67 6f 74 69 61 74 69 6f 6e 20 61 6c  Renegotiation al
11be0 6c 6f 77 65 64 20 2a 2f 0a 09 4c 41 50 50 45 4e  lowed */..LAPPEN
11bf0 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f  D_BOOL(interp, o
11c00 62 6a 50 74 72 2c 20 22 72 65 6e 65 67 6f 74 69  bjPtr, "renegoti
11c10 61 74 69 6f 6e 5f 61 6c 6c 6f 77 65 64 22 2c 20  ation_allowed", 
11c20 53 53 4c 5f 67 65 74 5f 73 65 63 75 72 65 5f 72  SSL_get_secure_r
11c30 65 6e 65 67 6f 74 69 61 74 69 6f 6e 5f 73 75 70  enegotiation_sup
11c40 70 6f 72 74 28 28 53 53 4c 20 2a 29 20 73 73 6c  port((SSL *) ssl
11c50 29 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 73 65 63  ));.../* Get sec
11c60 75 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 09  urity level */..
11c70 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65  LAPPEND_INT(inte
11c80 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 63  rp, objPtr, "sec
11c90 75 72 69 74 79 5f 6c 65 76 65 6c 22 2c 20 53 53  urity_level", SS
11ca0 4c 5f 67 65 74 5f 73 65 63 75 72 69 74 79 5f 6c  L_get_security_l
11cb0 65 76 65 6c 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a  evel(ssl));.../*
11cc0 20 53 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f   Session info */
11cd0 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69  ..LAPPEND_BOOL(i
11ce0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
11cf0 73 65 73 73 69 6f 6e 5f 72 65 75 73 65 64 22 2c  session_reused",
11d00 20 53 53 4c 5f 73 65 73 73 69 6f 6e 5f 72 65 75   SSL_session_reu
11d10 73 65 64 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20  sed(ssl));.../* 
11d20 49 73 20 73 65 72 76 65 72 20 69 6e 66 6f 20 2a  Is server info *
11d30 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28  /..LAPPEND_BOOL(
11d40 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
11d50 22 69 73 5f 73 65 72 76 65 72 22 2c 20 53 53 4c  "is_server", SSL
11d60 5f 69 73 5f 73 65 72 76 65 72 28 73 73 6c 29 29  _is_server(ssl))
11d70 3b 0a 0a 09 2f 2a 20 49 73 20 44 54 4c 53 20 2a  ;.../* Is DTLS *
11d80 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28  /..LAPPEND_BOOL(
11d90 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
11da0 22 69 73 5f 64 74 6c 73 22 2c 20 53 53 4c 5f 69  "is_dtls", SSL_i
11db0 73 5f 64 74 6c 73 28 73 73 6c 29 29 3b 0a 0a 23  s_dtls(ssl));..#
11dc0 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49  if OPENSSL_VERSI
11dd0 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 78 33  ON_NUMBER >= 0x3
11de0 30 32 30 30 30 30 30 4c 0a 09 2f 2a 20 49 73 20  0200000L../* Is 
11df0 51 55 49 43 20 2a 2f 0a 09 4c 41 50 50 45 4e 44  QUIC */..LAPPEND
11e00 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62  _BOOL(interp, ob
11e10 6a 50 74 72 2c 20 22 69 73 5f 71 75 69 63 22 2c  jPtr, "is_quic",
11e20 20 53 53 4c 5f 69 73 5f 71 75 69 63 28 73 73 6c   SSL_is_quic(ssl
11e30 29 29 3b 0a 0a 09 2f 2a 20 49 73 20 54 4c 53 20  ));.../* Is TLS 
11e40 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c  */..LAPPEND_BOOL
11e50 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
11e60 20 22 69 73 5f 74 6c 73 22 2c 20 53 53 4c 5f 69   "is_tls", SSL_i
11e70 73 5f 74 6c 73 28 73 73 6c 29 29 3b 0a 23 65 6e  s_tls(ssl));.#en
11e80 64 69 66 0a 0a 09 2f 2a 20 44 41 4e 45 20 54 4c  dif.../* DANE TL
11e90 53 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e  S authentication
11ea0 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f   */..LAPPEND_BOO
11eb0 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  L(interp, objPtr
11ec0 2c 20 22 64 61 6e 65 5f 61 75 74 68 22 2c 20 53  , "dane_auth", S
11ed0 53 4c 5f 67 65 74 30 5f 64 61 6e 65 28 73 73 6c  SL_get0_dane(ssl
11ee0 29 20 21 3d 20 4e 55 4c 4c 29 3b 0a 0a 09 2f 2a  ) != NULL);.../*
11ef0 20 57 61 69 74 69 6e 67 20 66 6f 72 20 61 73 79   Waiting for asy
11f00 6e 63 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42  nc */..LAPPEND_B
11f10 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  OOL(interp, objP
11f20 74 72 2c 20 22 77 61 69 74 69 6e 67 5f 66 6f 72  tr, "waiting_for
11f30 5f 61 73 79 6e 63 22 2c 20 53 53 4c 5f 77 61 69  _async", SSL_wai
11f40 74 69 6e 67 5f 66 6f 72 5f 61 73 79 6e 63 28 73  ting_for_async(s
11f50 73 6c 29 29 3b 0a 0a 09 2f 2a 20 54 69 6d 65 2d  sl));.../* Time-
11f60 6f 75 74 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f  out */..LAPPEND_
11f70 4c 4f 4e 47 28 69 6e 74 65 72 70 2c 20 6f 62 6a  LONG(interp, obj
11f80 50 74 72 2c 20 22 74 69 6d 65 2d 6f 75 74 22 2c  Ptr, "time-out",
11f90 20 53 53 4c 5f 67 65 74 5f 64 65 66 61 75 6c 74   SSL_get_default
11fa0 5f 74 69 6d 65 6f 75 74 28 73 73 6c 29 29 3b 0a  _timeout(ssl));.
11fb0 0a 09 2f 2a 20 49 73 20 43 65 72 74 69 66 69 63  ../* Is Certific
11fc0 61 74 65 20 54 72 61 6e 73 70 61 72 65 6e 63 79  ate Transparency
11fd0 20 76 61 6c 69 64 61 74 69 6f 6e 20 65 6e 61 62   validation enab
11fe0 6c 65 64 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f  led */..LAPPEND_
11ff0 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a  BOOL(interp, obj
12000 50 74 72 2c 20 22 63 74 5f 65 6e 61 62 6c 65 64  Ptr, "ct_enabled
12010 22 2c 20 53 53 4c 5f 63 74 5f 69 73 5f 65 6e 61  ", SSL_ct_is_ena
12020 62 6c 65 64 28 73 73 6c 29 29 3b 0a 20 20 20 20  bled(ssl));.    
12030 7d 0a 0a 20 20 20 20 2f 2a 20 43 69 70 68 65 72  }..    /* Cipher
12040 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 63 69 70   info */.    cip
12050 68 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75  her = SSL_get_cu
12060 72 72 65 6e 74 5f 63 69 70 68 65 72 28 73 73 6c  rrent_cipher(ssl
12070 29 3b 0a 20 20 20 20 69 66 20 28 63 69 70 68 65  );.    if (ciphe
12080 72 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 68  r != NULL) {..ch
12090 61 72 20 62 75 66 5b 42 55 46 53 49 5a 5d 20 3d  ar buf[BUFSIZ] =
120a0 20 7b 30 7d 3b 0a 09 69 6e 74 20 62 69 74 73 2c   {0};..int bits,
120b0 20 61 6c 67 5f 62 69 74 73 3b 0a 0a 09 2f 2a 20   alg_bits;.../* 
120c0 43 69 70 68 65 72 20 6e 61 6d 65 20 2a 2f 0a 09  Cipher name */..
120d0 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65  LAPPEND_STR(inte
120e0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70  rp, objPtr, "cip
120f0 68 65 72 22 2c 20 53 53 4c 5f 43 49 50 48 45 52  her", SSL_CIPHER
12100 5f 67 65 74 5f 6e 61 6d 65 28 63 69 70 68 65 72  _get_name(cipher
12110 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 52 46 43  ), -1);.../* RFC
12120 20 6e 61 6d 65 20 6f 66 20 63 69 70 68 65 72 20   name of cipher 
12130 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28  */..LAPPEND_STR(
12140 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
12150 22 73 74 61 6e 64 61 72 64 5f 6e 61 6d 65 22 2c  "standard_name",
12160 20 53 53 4c 5f 43 49 50 48 45 52 5f 73 74 61 6e   SSL_CIPHER_stan
12170 64 61 72 64 5f 6e 61 6d 65 28 63 69 70 68 65 72  dard_name(cipher
12180 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 4f 70 65  ), -1);.../* Ope
12190 6e 53 53 4c 20 6e 61 6d 65 20 6f 66 20 63 69 70  nSSL name of cip
121a0 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f  her */..LAPPEND_
121b0 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
121c0 74 72 2c 20 22 6f 70 65 6e 73 73 6c 5f 6e 61 6d  tr, "openssl_nam
121d0 65 22 2c 20 4f 50 45 4e 53 53 4c 5f 63 69 70 68  e", OPENSSL_ciph
121e0 65 72 5f 6e 61 6d 65 28 53 53 4c 5f 43 49 50 48  er_name(SSL_CIPH
121f0 45 52 5f 73 74 61 6e 64 61 72 64 5f 6e 61 6d 65  ER_standard_name
12200 28 63 69 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a  (cipher)), -1);.
12210 0a 09 2f 2a 20 6e 75 6d 62 65 72 20 6f 66 20 73  ../* number of s
12220 65 63 72 65 74 20 62 69 74 73 20 75 73 65 64 20  ecret bits used 
12230 66 6f 72 20 63 69 70 68 65 72 20 2a 2f 0a 09 62  for cipher */..b
12240 69 74 73 20 3d 20 53 53 4c 5f 43 49 50 48 45 52  its = SSL_CIPHER
12250 5f 67 65 74 5f 62 69 74 73 28 63 69 70 68 65 72  _get_bits(cipher
12260 2c 20 26 61 6c 67 5f 62 69 74 73 29 3b 0a 09 4c  , &alg_bits);..L
12270 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72  APPEND_INT(inter
12280 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 63 72  p, objPtr, "secr
12290 65 74 5f 62 69 74 73 22 2c 20 62 69 74 73 29 3b  et_bits", bits);
122a0 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e  ..LAPPEND_INT(in
122b0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61  terp, objPtr, "a
122c0 6c 67 6f 72 69 74 68 6d 5f 62 69 74 73 22 2c 20  lgorithm_bits", 
122d0 61 6c 67 5f 62 69 74 73 29 3b 0a 09 2f 2a 20 61  alg_bits);../* a
122e0 6c 67 5f 62 69 74 73 20 69 73 20 61 63 74 75 61  lg_bits is actua
122f0 6c 20 6b 65 79 20 73 65 63 72 65 74 20 62 69 74  l key secret bit
12300 73 2e 20 49 66 20 75 73 65 20 62 69 74 73 20 61  s. If use bits a
12310 6e 64 20 73 65 63 72 65 74 20 28 61 6c 67 6f 72  nd secret (algor
12320 69 74 68 6d 29 20 62 69 74 73 20 64 69 66 66 65  ithm) bits diffe
12330 72 2c 0a 09 20 20 20 74 68 65 20 72 65 73 74 20  r,..   the rest 
12340 6f 66 20 74 68 65 20 62 69 74 73 20 61 72 65 20  of the bits are 
12350 66 69 78 65 64 2c 20 69 2e 65 2e 20 66 6f 72 20  fixed, i.e. for 
12360 6c 69 6d 69 74 65 64 20 65 78 70 6f 72 74 20 63  limited export c
12370 69 70 68 65 72 73 20 28 62 69 74 73 20 3c 20 35  iphers (bits < 5
12380 36 29 20 2a 2f 0a 0a 09 2f 2a 20 49 6e 64 69 63  6) */.../* Indic
12390 61 74 65 73 20 77 68 69 63 68 20 53 53 4c 2f 54  ates which SSL/T
123a0 4c 53 20 70 72 6f 74 6f 63 6f 6c 20 76 65 72 73  LS protocol vers
123b0 69 6f 6e 20 66 69 72 73 74 20 64 65 66 69 6e 65  ion first define
123c0 64 20 74 68 65 20 63 69 70 68 65 72 20 2a 2f 0a  d the cipher */.
123d0 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74  .LAPPEND_STR(int
123e0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6d 69  erp, objPtr, "mi
123f0 6e 5f 76 65 72 73 69 6f 6e 22 2c 20 53 53 4c 5f  n_version", SSL_
12400 43 49 50 48 45 52 5f 67 65 74 5f 76 65 72 73 69  CIPHER_get_versi
12410 6f 6e 28 63 69 70 68 65 72 29 2c 20 2d 31 29 3b  on(cipher), -1);
12420 0a 0a 09 2f 2a 20 43 69 70 68 65 72 20 4e 49 44  .../* Cipher NID
12430 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52   */..LAPPEND_STR
12440 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
12450 20 22 63 69 70 68 65 72 4e 49 44 22 2c 20 28 63   "cipherNID", (c
12460 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e  har *)OBJ_nid2ln
12470 28 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f  (SSL_CIPHER_get_
12480 63 69 70 68 65 72 5f 6e 69 64 28 63 69 70 68 65  cipher_nid(ciphe
12490 72 29 29 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45  r)), -1);..LAPPE
124a0 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f  ND_STR(interp, o
124b0 62 6a 50 74 72 2c 20 22 64 69 67 65 73 74 4e 49  bjPtr, "digestNI
124c0 44 22 2c 20 28 63 68 61 72 20 2a 29 4f 42 4a 5f  D", (char *)OBJ_
124d0 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49 50 48 45  nid2ln(SSL_CIPHE
124e0 52 5f 67 65 74 5f 64 69 67 65 73 74 5f 6e 69 64  R_get_digest_nid
124f0 28 63 69 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a  (cipher)), -1);.
12500 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74  .LAPPEND_STR(int
12510 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6b 65  erp, objPtr, "ke
12520 79 45 78 63 68 61 6e 67 65 4e 49 44 22 2c 20 28  yExchangeNID", (
12530 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c  char *)OBJ_nid2l
12540 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74  n(SSL_CIPHER_get
12550 5f 6b 78 5f 6e 69 64 28 63 69 70 68 65 72 29 29  _kx_nid(cipher))
12560 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f  , -1);..LAPPEND_
12570 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
12580 74 72 2c 20 22 61 75 74 68 65 6e 74 69 63 61 74  tr, "authenticat
12590 69 6f 6e 4e 49 44 22 2c 20 28 63 68 61 72 20 2a  ionNID", (char *
125a0 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f  )OBJ_nid2ln(SSL_
125b0 43 49 50 48 45 52 5f 67 65 74 5f 61 75 74 68 5f  CIPHER_get_auth_
125c0 6e 69 64 28 63 69 70 68 65 72 29 29 2c 20 2d 31  nid(cipher)), -1
125d0 29 3b 0a 0a 09 2f 2a 20 6d 65 73 73 61 67 65 20  );.../* message 
125e0 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 63  authentication c
125f0 6f 64 65 20 2d 20 43 69 70 68 65 72 20 69 73 20  ode - Cipher is 
12600 41 45 41 44 20 28 65 2e 67 2e 20 47 43 4d 20 6f  AEAD (e.g. GCM o
12610 72 20 43 68 61 43 68 61 32 30 2f 50 6f 6c 79 31  r ChaCha20/Poly1
12620 33 30 35 29 20 6f 72 20 6e 6f 74 20 2a 2f 0a 09  305) or not */..
12630 2f 2a 20 41 75 74 68 65 6e 74 69 63 61 74 65 64  /* Authenticated
12640 20 45 6e 63 72 79 70 74 69 6f 6e 20 77 69 74 68   Encryption with
12650 20 61 73 73 6f 63 69 61 74 65 64 20 64 61 74 61   associated data
12660 20 28 41 45 41 44 29 20 63 68 65 63 6b 20 2a 2f   (AEAD) check */
12670 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69  ..LAPPEND_BOOL(i
12680 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
12690 63 69 70 68 65 72 5f 69 73 5f 61 65 61 64 22 2c  cipher_is_aead",
126a0 20 53 53 4c 5f 43 49 50 48 45 52 5f 69 73 5f 61   SSL_CIPHER_is_a
126b0 65 61 64 28 63 69 70 68 65 72 29 29 3b 0a 0a 09  ead(cipher));...
126c0 2f 2a 20 44 69 67 65 73 74 20 75 73 65 64 20 64  /* Digest used d
126d0 75 72 69 6e 67 20 74 68 65 20 53 53 4c 2f 54 4c  uring the SSL/TL
126e0 53 20 68 61 6e 64 73 68 61 6b 65 20 77 68 65 6e  S handshake when
126f0 20 75 73 69 6e 67 20 74 68 65 20 63 69 70 68 65   using the ciphe
12700 72 2e 20 2a 2f 0a 09 6d 64 20 3d 20 53 53 4c 5f  r. */..md = SSL_
12710 43 49 50 48 45 52 5f 67 65 74 5f 68 61 6e 64 73  CIPHER_get_hands
12720 68 61 6b 65 5f 64 69 67 65 73 74 28 63 69 70 68  hake_digest(ciph
12730 65 72 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54  er);..LAPPEND_ST
12740 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  R(interp, objPtr
12750 2c 20 22 68 61 6e 64 73 68 61 6b 65 5f 64 69 67  , "handshake_dig
12760 65 73 74 22 2c 20 28 63 68 61 72 20 2a 29 45 56  est", (char *)EV
12770 50 5f 4d 44 5f 6e 61 6d 65 28 6d 64 29 2c 20 2d  P_MD_name(md), -
12780 31 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 4f 70 65  1);.../* Get Ope
12790 6e 53 53 4c 2d 73 70 65 63 69 66 69 63 20 49 44  nSSL-specific ID
127a0 2c 20 6e 6f 74 20 49 41 4e 41 20 49 44 20 2a 2f  , not IANA ID */
127b0 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e  ..LAPPEND_INT(in
127c0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63  terp, objPtr, "c
127d0 69 70 68 65 72 5f 69 64 22 2c 20 28 69 6e 74 29  ipher_id", (int)
127e0 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f   SSL_CIPHER_get_
127f0 69 64 28 63 69 70 68 65 72 29 29 3b 0a 0a 09 2f  id(cipher));.../
12800 2a 20 54 77 6f 2d 62 79 74 65 20 49 44 20 75 73  * Two-byte ID us
12810 65 64 20 69 6e 20 74 68 65 20 54 4c 53 20 70 72  ed in the TLS pr
12820 6f 74 6f 63 6f 6c 20 6f 66 20 74 68 65 20 67 69  otocol of the gi
12830 76 65 6e 20 63 69 70 68 65 72 20 2a 2f 0a 09 4c  ven cipher */..L
12840 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72  APPEND_INT(inter
12850 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70 72 6f 74  p, objPtr, "prot
12860 6f 63 6f 6c 5f 69 64 22 2c 20 28 69 6e 74 29 20  ocol_id", (int) 
12870 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 70  SSL_CIPHER_get_p
12880 72 6f 74 6f 63 6f 6c 5f 69 64 28 63 69 70 68 65  rotocol_id(ciphe
12890 72 29 29 3b 0a 0a 09 2f 2a 20 54 65 78 74 75 61  r));.../* Textua
128a0 6c 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  l description of
128b0 20 74 68 65 20 63 69 70 68 65 72 20 2a 2f 0a 09   the cipher */..
128c0 69 66 20 28 53 53 4c 5f 43 49 50 48 45 52 5f 64  if (SSL_CIPHER_d
128d0 65 73 63 72 69 70 74 69 6f 6e 28 63 69 70 68 65  escription(ciphe
128e0 72 2c 20 62 75 66 2c 20 73 69 7a 65 6f 66 28 62  r, buf, sizeof(b
128f0 75 66 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  uf)) != NULL) {.
12900 09 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52  .    LAPPEND_STR
12910 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
12920 20 22 64 65 73 63 72 69 70 74 69 6f 6e 22 2c 20   "description", 
12930 62 75 66 2c 20 2d 31 29 3b 0a 09 7d 0a 20 20 20  buf, -1);..}.   
12940 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 73 73 69   }..    /* Sessi
12950 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 73  on info */.    s
12960 65 73 73 69 6f 6e 20 3d 20 53 53 4c 5f 67 65 74  ession = SSL_get
12970 5f 73 65 73 73 69 6f 6e 28 73 73 6c 29 3b 0a 20  _session(ssl);. 
12980 20 20 20 69 66 20 28 73 65 73 73 69 6f 6e 20 21     if (session !
12990 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 6f 6e 73 74  = NULL) {..const
129a0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
129b0 74 69 63 6b 65 74 3b 0a 09 73 69 7a 65 5f 74 20  ticket;..size_t 
129c0 6c 65 6e 32 3b 0a 09 75 6e 73 69 67 6e 65 64 20  len2;..unsigned 
129d0 69 6e 74 20 75 6c 65 6e 3b 0a 09 63 6f 6e 73 74  int ulen;..const
129e0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
129f0 73 65 73 73 69 6f 6e 5f 69 64 2c 20 2a 70 72 6f  session_id, *pro
12a00 74 6f 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68  to;..unsigned ch
12a10 61 72 20 62 75 66 66 65 72 5b 53 53 4c 5f 4d 41  ar buffer[SSL_MA
12a20 58 5f 4d 41 53 54 45 52 5f 4b 45 59 5f 4c 45 4e  X_MASTER_KEY_LEN
12a30 47 54 48 5d 3b 0a 0a 09 2f 2a 20 52 65 70 6f 72  GTH];.../* Repor
12a40 74 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 70  t the selected p
12a50 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20 72 65 73  rotocol as a res
12a60 75 6c 74 20 6f 66 20 74 68 65 20 41 4c 50 4e 20  ult of the ALPN 
12a70 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a 09  negotiation */..
12a80 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30  SSL_SESSION_get0
12a90 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 65 64 28 73  _alpn_selected(s
12aa0 65 73 73 69 6f 6e 2c 20 26 70 72 6f 74 6f 2c 20  ession, &proto, 
12ab0 26 6c 65 6e 32 29 3b 0a 09 4c 41 50 50 45 4e 44  &len2);..LAPPEND
12ac0 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _STR(interp, obj
12ad0 50 74 72 2c 20 22 61 6c 70 6e 22 2c 20 28 63 68  Ptr, "alpn", (ch
12ae0 61 72 20 2a 29 20 70 72 6f 74 6f 2c 20 28 54 63  ar *) proto, (Tc
12af0 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 29 3b 0a 0a  l_Size) len2);..
12b00 09 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 20 73  ./* Report the s
12b10 65 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c  elected protocol
12b20 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20   as a result of 
12b30 74 68 65 20 4e 50 4e 20 6e 65 67 6f 74 69 61 74  the NPN negotiat
12b40 69 6f 6e 20 2a 2f 0a 23 69 66 64 65 66 20 55 53  ion */.#ifdef US
12b50 45 5f 4e 50 4e 0a 09 53 53 4c 5f 67 65 74 30 5f  E_NPN..SSL_get0_
12b60 6e 65 78 74 5f 70 72 6f 74 6f 5f 6e 65 67 6f 74  next_proto_negot
12b70 69 61 74 65 64 28 73 73 6c 2c 20 26 70 72 6f 74  iated(ssl, &prot
12b80 6f 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c 41 50 50  o, &ulen);..LAPP
12b90 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
12ba0 6f 62 6a 50 74 72 2c 20 22 6e 70 6e 22 2c 20 28  objPtr, "npn", (
12bb0 63 68 61 72 20 2a 29 20 70 72 6f 74 6f 2c 20 28  char *) proto, (
12bc0 54 63 6c 5f 53 69 7a 65 29 20 75 6c 65 6e 29 3b  Tcl_Size) ulen);
12bd0 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a 20 52 65 73  .#endif.../* Res
12be0 75 6d 61 62 6c 65 20 73 65 73 73 69 6f 6e 20 2a  umable session *
12bf0 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28  /..LAPPEND_BOOL(
12c00 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
12c10 22 72 65 73 75 6d 61 62 6c 65 22 2c 20 53 53 4c  "resumable", SSL
12c20 5f 53 45 53 53 49 4f 4e 5f 69 73 5f 72 65 73 75  _SESSION_is_resu
12c30 6d 61 62 6c 65 28 73 65 73 73 69 6f 6e 29 29 3b  mable(session));
12c40 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 73 74  .../* Session st
12c50 61 72 74 20 74 69 6d 65 20 28 73 65 63 6f 6e 64  art time (second
12c60 73 20 73 69 6e 63 65 20 65 70 6f 63 68 29 20 2a  s since epoch) *
12c70 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47 28  /..LAPPEND_LONG(
12c80 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
12c90 22 73 74 61 72 74 5f 74 69 6d 65 22 2c 20 53 53  "start_time", SS
12ca0 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69  L_SESSION_get_ti
12cb0 6d 65 28 73 65 73 73 69 6f 6e 29 29 3b 0a 0a 09  me(session));...
12cc0 2f 2a 20 54 69 6d 65 6f 75 74 20 76 61 6c 75 65  /* Timeout value
12cd0 20 2d 20 53 53 4c 5f 43 54 58 5f 67 65 74 5f 74   - SSL_CTX_get_t
12ce0 69 6d 65 6f 75 74 20 28 69 6e 20 73 65 63 6f 6e  imeout (in secon
12cf0 64 73 29 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f  ds) */..LAPPEND_
12d00 4c 4f 4e 47 28 69 6e 74 65 72 70 2c 20 6f 62 6a  LONG(interp, obj
12d10 50 74 72 2c 20 22 74 69 6d 65 6f 75 74 22 2c 20  Ptr, "timeout", 
12d20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f  SSL_SESSION_get_
12d30 74 69 6d 65 6f 75 74 28 73 65 73 73 69 6f 6e 29  timeout(session)
12d40 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20  );.../* Session 
12d50 69 64 20 2d 20 54 4c 53 76 31 2e 32 20 61 6e 64  id - TLSv1.2 and
12d60 20 62 65 6c 6f 77 20 6f 6e 6c 79 20 2a 2f 0a 09   below only */..
12d70 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20 53 53 4c  session_id = SSL
12d80 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 69 64 28  _SESSION_get_id(
12d90 73 65 73 73 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b  session, &ulen);
12da0 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59  ..LAPPEND_BARRAY
12db0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
12dc0 20 22 73 65 73 73 69 6f 6e 5f 69 64 22 2c 20 73   "session_id", s
12dd0 65 73 73 69 6f 6e 5f 69 64 2c 20 28 54 63 6c 5f  ession_id, (Tcl_
12de0 53 69 7a 65 29 20 75 6c 65 6e 29 3b 0a 0a 09 2f  Size) ulen);.../
12df0 2a 20 53 65 73 73 69 6f 6e 20 63 6f 6e 74 65 78  * Session contex
12e00 74 20 2a 2f 0a 09 73 65 73 73 69 6f 6e 5f 69 64  t */..session_id
12e10 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67   = SSL_SESSION_g
12e20 65 74 30 5f 69 64 5f 63 6f 6e 74 65 78 74 28 73  et0_id_context(s
12e30 65 73 73 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a  ession, &ulen);.
12e40 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59 28  .LAPPEND_BARRAY(
12e50 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
12e60 22 73 65 73 73 69 6f 6e 5f 63 6f 6e 74 65 78 74  "session_context
12e70 22 2c 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28  ", session_id, (
12e80 54 63 6c 5f 53 69 7a 65 29 20 75 6c 65 6e 29 3b  Tcl_Size) ulen);
12e90 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69  .../* Session ti
12ea0 63 6b 65 74 20 2d 20 63 6c 69 65 6e 74 20 6f 6e  cket - client on
12eb0 6c 79 20 2a 2f 0a 09 53 53 4c 5f 53 45 53 53 49  ly */..SSL_SESSI
12ec0 4f 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74 28 73  ON_get0_ticket(s
12ed0 65 73 73 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c  ession, &ticket,
12ee0 20 26 6c 65 6e 32 29 3b 0a 09 4c 41 50 50 45 4e   &len2);..LAPPEN
12ef0 44 5f 42 41 52 52 41 59 28 69 6e 74 65 72 70 2c  D_BARRAY(interp,
12f00 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69 6f   objPtr, "sessio
12f10 6e 5f 74 69 63 6b 65 74 22 2c 20 74 69 63 6b 65  n_ticket", ticke
12f20 74 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65  t, (Tcl_Size) le
12f30 6e 32 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f  n2);.../* Sessio
12f40 6e 20 74 69 63 6b 65 74 20 6c 69 66 65 74 69 6d  n ticket lifetim
12f50 65 20 68 69 6e 74 20 28 69 6e 20 73 65 63 6f 6e  e hint (in secon
12f60 64 73 29 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f  ds) */..LAPPEND_
12f70 4c 4f 4e 47 28 69 6e 74 65 72 70 2c 20 6f 62 6a  LONG(interp, obj
12f80 50 74 72 2c 20 22 6c 69 66 65 74 69 6d 65 22 2c  Ptr, "lifetime",
12f90 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74   SSL_SESSION_get
12fa0 5f 74 69 63 6b 65 74 5f 6c 69 66 65 74 69 6d 65  _ticket_lifetime
12fb0 5f 68 69 6e 74 28 73 65 73 73 69 6f 6e 29 29 3b  _hint(session));
12fc0 0a 0a 09 2f 2a 20 54 69 63 6b 65 74 20 61 70 70  .../* Ticket app
12fd0 20 64 61 74 61 20 2a 2f 0a 23 69 66 20 4f 50 45   data */.#if OPE
12fe0 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d  NSSL_VERSION_NUM
12ff0 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30  BER < 0x30000000
13000 4c 0a 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67  L..SSL_SESSION_g
13010 65 74 30 5f 74 69 63 6b 65 74 5f 61 70 70 64 61  et0_ticket_appda
13020 74 61 28 28 53 53 4c 5f 53 45 53 53 49 4f 4e 20  ta((SSL_SESSION 
13030 2a 29 20 73 65 73 73 69 6f 6e 2c 20 26 74 69 63  *) session, &tic
13040 6b 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 09 4c 41  ket, &len2);..LA
13050 50 50 45 4e 44 5f 42 41 52 52 41 59 28 69 6e 74  PPEND_BARRAY(int
13060 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 74 69  erp, objPtr, "ti
13070 63 6b 65 74 5f 61 70 70 5f 64 61 74 61 22 2c 20  cket_app_data", 
13080 74 69 63 6b 65 74 2c 20 28 54 63 6c 5f 53 69 7a  ticket, (Tcl_Siz
13090 65 29 20 6c 65 6e 32 29 3b 0a 23 65 6e 64 69 66  e) len2);.#endif
130a0 0a 0a 09 2f 2a 20 47 65 74 20 6d 61 73 74 65 72  .../* Get master
130b0 20 6b 65 79 20 2a 2f 0a 09 6c 65 6e 32 20 3d 20   key */..len2 = 
130c0 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f  SSL_SESSION_get_
130d0 6d 61 73 74 65 72 5f 6b 65 79 28 73 65 73 73 69  master_key(sessi
130e0 6f 6e 2c 20 62 75 66 66 65 72 2c 20 53 53 4c 5f  on, buffer, SSL_
130f0 4d 41 58 5f 4d 41 53 54 45 52 5f 4b 45 59 5f 4c  MAX_MASTER_KEY_L
13100 45 4e 47 54 48 29 3b 0a 09 4c 41 50 50 45 4e 44  ENGTH);..LAPPEND
13110 5f 42 41 52 52 41 59 28 69 6e 74 65 72 70 2c 20  _BARRAY(interp, 
13120 6f 62 6a 50 74 72 2c 20 22 6d 61 73 74 65 72 5f  objPtr, "master_
13130 6b 65 79 22 2c 20 62 75 66 66 65 72 2c 20 28 54  key", buffer, (T
13140 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 29 3b 0a  cl_Size) len2);.
13150 0a 09 2f 2a 20 43 6f 6d 70 72 65 73 73 69 6f 6e  ../* Compression
13160 20 69 64 20 2a 2f 0a 09 75 6e 73 69 67 6e 65 64   id */..unsigned
13170 20 69 6e 74 20 69 64 20 3d 20 53 53 4c 5f 53 45   int id = SSL_SE
13180 53 53 49 4f 4e 5f 67 65 74 5f 63 6f 6d 70 72 65  SSION_get_compre
13190 73 73 5f 69 64 28 73 65 73 73 69 6f 6e 29 3b 0a  ss_id(session);.
131a0 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74  .LAPPEND_STR(int
131b0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 6f  erp, objPtr, "co
131c0 6d 70 72 65 73 73 69 6f 6e 5f 69 64 22 2c 20 69  mpression_id", i
131d0 64 20 3d 3d 20 31 20 3f 20 22 7a 6c 69 62 22 20  d == 1 ? "zlib" 
131e0 3a 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 20  : "none", -1);. 
131f0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d     }..    /* Com
13200 70 72 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f  pression info */
13210 0a 20 20 20 20 69 66 20 28 73 73 6c 20 21 3d 20  .    if (ssl != 
13220 4e 55 4c 4c 29 20 7b 0a 23 69 66 64 65 66 20 48  NULL) {.#ifdef H
13230 41 56 45 5f 53 53 4c 5f 43 4f 4d 50 52 45 53 53  AVE_SSL_COMPRESS
13240 49 4f 4e 0a 09 63 6f 6e 73 74 20 43 4f 4d 50 5f  ION..const COMP_
13250 4d 45 54 48 4f 44 20 2a 63 6f 6d 70 2c 20 2a 65  METHOD *comp, *e
13260 78 70 6e 3b 0a 09 63 6f 6d 70 20 3d 20 53 53 4c  xpn;..comp = SSL
13270 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 63 6f 6d  _get_current_com
13280 70 72 65 73 73 69 6f 6e 28 73 73 6c 29 3b 0a 09  pression(ssl);..
13290 65 78 70 6e 20 3d 20 53 53 4c 5f 67 65 74 5f 63  expn = SSL_get_c
132a0 75 72 72 65 6e 74 5f 65 78 70 61 6e 73 69 6f 6e  urrent_expansion
132b0 28 73 73 6c 29 3b 0a 0a 09 4c 41 50 50 45 4e 44  (ssl);...LAPPEND
132c0 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _STR(interp, obj
132d0 50 74 72 2c 20 22 63 6f 6d 70 72 65 73 73 69 6f  Ptr, "compressio
132e0 6e 22 2c 20 63 6f 6d 70 20 3f 20 53 53 4c 5f 43  n", comp ? SSL_C
132f0 4f 4d 50 5f 67 65 74 5f 6e 61 6d 65 28 63 6f 6d  OMP_get_name(com
13300 70 29 20 3a 20 22 6e 6f 6e 65 22 2c 20 2d 31 29  p) : "none", -1)
13310 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69  ;..LAPPEND_STR(i
13320 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
13330 65 78 70 61 6e 73 69 6f 6e 22 2c 20 65 78 70 6e  expansion", expn
13340 20 3f 20 53 53 4c 5f 43 4f 4d 50 5f 67 65 74 5f   ? SSL_COMP_get_
13350 6e 61 6d 65 28 65 78 70 6e 29 20 3a 20 22 6e 6f  name(expn) : "no
13360 6e 65 22 2c 20 2d 31 29 3b 0a 23 65 6c 73 65 0a  ne", -1);.#else.
13370 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74  .LAPPEND_STR(int
13380 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 6f  erp, objPtr, "co
13390 6d 70 72 65 73 73 69 6f 6e 22 2c 20 22 6e 6f 6e  mpression", "non
133a0 65 22 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e  e", -1);..LAPPEN
133b0 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62  D_STR(interp, ob
133c0 6a 50 74 72 2c 20 22 65 78 70 61 6e 73 69 6f 6e  jPtr, "expansion
133d0 22 2c 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a  ", "none", -1);.
133e0 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20  #endif.    }..  
133f0 20 20 2f 2a 20 53 65 72 76 65 72 20 69 6e 66 6f    /* Server info
13400 20 2a 2f 0a 20 20 20 20 7b 0a 09 6c 6f 6e 67 20   */.    {..long 
13410 6d 6f 64 65 20 3d 20 53 53 4c 5f 43 54 58 5f 67  mode = SSL_CTX_g
13420 65 74 5f 73 65 73 73 69 6f 6e 5f 63 61 63 68 65  et_session_cache
13430 5f 6d 6f 64 65 28 73 74 61 74 65 50 74 72 2d 3e  _mode(statePtr->
13440 63 74 78 29 3b 0a 09 63 68 61 72 20 2a 6d 73 67  ctx);..char *msg
13450 3b 0a 0a 09 69 66 20 28 6d 6f 64 65 20 26 20 53  ;...if (mode & S
13460 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 4f 46  SL_SESS_CACHE_OF
13470 46 29 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20  F) {..    msg = 
13480 22 6f 66 66 22 3b 0a 09 7d 20 65 6c 73 65 20 69  "off";..} else i
13490 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45  f (mode & SSL_SE
134a0 53 53 5f 43 41 43 48 45 5f 43 4c 49 45 4e 54 29  SS_CACHE_CLIENT)
134b0 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 63   {..    msg = "c
134c0 6c 69 65 6e 74 22 3b 0a 09 7d 20 65 6c 73 65 20  lient";..} else 
134d0 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53  if (mode & SSL_S
134e0 45 53 53 5f 43 41 43 48 45 5f 53 45 52 56 45 52  ESS_CACHE_SERVER
134f0 29 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 22  ) {..    msg = "
13500 73 65 72 76 65 72 22 3b 0a 09 7d 20 65 6c 73 65  server";..} else
13510 20 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f   if (mode & SSL_
13520 53 45 53 53 5f 43 41 43 48 45 5f 42 4f 54 48 29  SESS_CACHE_BOTH)
13530 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 62   {..    msg = "b
13540 6f 74 68 22 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a  oth";..} else {.
13550 09 20 20 20 20 6d 73 67 20 3d 20 22 75 6e 6b 6e  .    msg = "unkn
13560 6f 77 6e 22 3b 0a 09 7d 0a 09 4c 41 50 50 45 4e  own";..}..LAPPEN
13570 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62  D_STR(interp, ob
13580 6a 50 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f 63  jPtr, "session_c
13590 61 63 68 65 5f 6d 6f 64 65 22 2c 20 6d 73 67 2c  ache_mode", msg,
135a0 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   -1);.    }..   
135b0 20 2f 2a 20 43 41 20 4c 69 73 74 20 2a 2f 0a 20   /* CA List */. 
135c0 20 20 20 2f 2a 20 49 46 20 6e 6f 74 20 61 20 73     /* IF not a s
135d0 65 72 76 65 72 2c 20 73 61 6d 65 20 61 73 20 53  erver, same as S
135e0 53 4c 5f 67 65 74 30 5f 70 65 65 72 5f 43 41 5f  SL_get0_peer_CA_
135f0 6c 69 73 74 2e 20 49 66 20 73 65 72 76 65 72 20  list. If server 
13600 73 61 6d 65 20 61 73 20 53 53 4c 5f 43 54 58 5f  same as SSL_CTX_
13610 67 65 74 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c 69  get_client_CA_li
13620 73 74 20 2a 2f 0a 20 20 20 20 6c 69 73 74 50 74  st */.    listPt
13630 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f  r = Tcl_NewListO
13640 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20  bj(0, NULL);.   
13650 20 53 54 41 43 4b 5f 4f 46 28 58 35 30 39 5f 4e   STACK_OF(X509_N
13660 41 4d 45 29 20 2a 63 61 5f 6c 69 73 74 3b 0a 20  AME) *ca_list;. 
13670 20 20 20 69 66 20 28 28 63 61 5f 6c 69 73 74 20     if ((ca_list 
13680 3d 20 53 53 4c 5f 67 65 74 5f 63 6c 69 65 6e 74  = SSL_get_client
13690 5f 43 41 5f 6c 69 73 74 28 73 73 6c 29 29 20 21  _CA_list(ssl)) !
136a0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 68 61 72 20  = NULL) {..char 
136b0 62 75 66 66 65 72 5b 42 55 46 53 49 5a 5d 3b 0a  buffer[BUFSIZ];.
136c0 09 66 6f 72 20 28 69 6e 74 20 69 20 3d 20 30 3b  .for (int i = 0;
136d0 20 69 20 3c 20 73 6b 5f 58 35 30 39 5f 4e 41 4d   i < sk_X509_NAM
136e0 45 5f 6e 75 6d 28 63 61 5f 6c 69 73 74 29 3b 20  E_num(ca_list); 
136f0 69 2b 2b 29 20 7b 0a 09 20 20 20 20 58 35 30 39  i++) {..    X509
13700 5f 4e 41 4d 45 20 2a 6e 61 6d 65 20 3d 20 73 6b  _NAME *name = sk
13710 5f 58 35 30 39 5f 4e 41 4d 45 5f 76 61 6c 75 65  _X509_NAME_value
13720 28 63 61 5f 6c 69 73 74 2c 20 69 29 3b 0a 09 20  (ca_list, i);.. 
13730 20 20 20 69 66 20 28 6e 61 6d 65 29 20 7b 0a 09     if (name) {..
13740 09 58 35 30 39 5f 4e 41 4d 45 5f 6f 6e 65 6c 69  .X509_NAME_oneli
13750 6e 65 28 6e 61 6d 65 2c 20 62 75 66 66 65 72 2c  ne(name, buffer,
13760 20 42 55 46 53 49 5a 29 3b 0a 09 09 54 63 6c 5f   BUFSIZ);...Tcl_
13770 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
13780 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73  ment(interp, lis
13790 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  tPtr, Tcl_NewStr
137a0 69 6e 67 4f 62 6a 28 62 75 66 66 65 72 2c 20 2d  ingObj(buffer, -
137b0 31 29 29 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 20  1));..    }..}. 
137c0 20 20 20 7d 0a 20 20 20 20 4c 41 50 50 45 4e 44     }.    LAPPEND
137d0 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _OBJ(interp, obj
137e0 50 74 72 2c 20 22 63 61 4c 69 73 74 22 2c 20 6c  Ptr, "caList", l
137f0 69 73 74 50 74 72 29 3b 0a 20 20 20 20 4c 41 50  istPtr);.    LAP
13800 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c  PEND_INT(interp,
13810 20 6f 62 6a 50 74 72 2c 20 22 63 61 4c 69 73 74   objPtr, "caList
13820 43 6f 75 6e 74 22 2c 20 73 6b 5f 58 35 30 39 5f  Count", sk_X509_
13830 4e 41 4d 45 5f 6e 75 6d 28 63 61 5f 6c 69 73 74  NAME_num(ca_list
13840 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74  ));..    Tcl_Set
13850 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
13860 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72  , objPtr);.    r
13870 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
13880 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
13890 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
138a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
138b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
138c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
138d0 20 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 20 2d   VersionObjCmd -
138e0 2d 20 72 65 74 75 72 6e 20 76 65 72 73 69 6f 6e  - return version
138f0 20 73 74 72 69 6e 67 20 66 72 6f 6d 20 4f 70 65   string from Ope
13900 6e 53 53 4c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  nSSL.. *. * Resu
13910 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61  lts:. *.A standa
13920 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20  rd Tcl result.. 
13930 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
13940 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20  s:. *.None.. *. 
13950 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
13960 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13970 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13980 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13990 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ----. */.static 
139a0 69 6e 74 0a 56 65 72 73 69 6f 6e 4f 62 6a 43 6d  int.VersionObjCm
139b0 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69  d(ClientData cli
139c0 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74  entData, Tcl_Int
139d0 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74  erp *interp, int
139e0 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a   objc, Tcl_Obj *
139f0 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a  const objv[]) {.
13a00 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a      Tcl_Obj *obj
13a10 50 74 72 3b 0a 20 20 20 20 28 76 6f 69 64 29 20  Ptr;.    (void) 
13a20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 20 20  clientData;.    
13a30 28 76 6f 69 64 29 20 6f 62 6a 63 3b 0a 20 20 20  (void) objc;.   
13a40 20 28 76 6f 69 64 29 20 6f 62 6a 76 3b 0a 0a 20   (void) objv;.. 
13a50 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
13a60 65 64 22 29 3b 0a 0a 20 20 20 20 6f 62 6a 50 74  ed");..    objPt
13a70 72 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  r = Tcl_NewStrin
13a80 67 4f 62 6a 28 4f 50 45 4e 53 53 4c 5f 56 45 52  gObj(OPENSSL_VER
13a90 53 49 4f 4e 5f 54 45 58 54 2c 20 2d 31 29 3b 0a  SION_TEXT, -1);.
13aa0 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
13ab0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  sult(interp, obj
13ac0 50 74 72 29 3b 0a 0a 20 20 20 20 72 65 74 75 72  Ptr);..    retur
13ad0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a  n TCL_OK;.}.../*
13ae0 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
13af0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13b00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13b10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13b20 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d 69 73  ------. *. * Mis
13b30 63 4f 62 6a 43 6d 64 20 2d 2d 20 6d 69 73 63 20  cObjCmd -- misc 
13b40 63 6f 6d 6d 61 6e 64 73 0a 20 2a 0a 20 2a 20 52  commands. *. * R
13b50 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61  esults:. *.A sta
13b60 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74  ndard Tcl result
13b70 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  .. *. * Side eff
13b80 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20  ects:. *.None.. 
13b90 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
13ba0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13bb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13bc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13bd0 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74  -------. */.stat
13be0 69 63 20 69 6e 74 0a 4d 69 73 63 4f 62 6a 43 6d  ic int.MiscObjCm
13bf0 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69  d(ClientData cli
13c00 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74  entData, Tcl_Int
13c10 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74  erp *interp, int
13c20 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a   objc, Tcl_Obj *
13c30 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a  const objv[]) {.
13c40 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
13c50 20 63 68 61 72 20 2a 63 6f 6d 6d 61 6e 64 73 20   char *commands 
13c60 5b 5d 20 3d 20 7b 20 22 72 65 71 22 2c 20 22 73  [] = { "req", "s
13c70 74 72 72 65 71 22 2c 20 4e 55 4c 4c 20 7d 3b 0a  trreq", NULL };.
13c80 20 20 20 20 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64      enum command
13c90 20 7b 20 43 5f 52 45 51 2c 20 43 5f 53 54 52 52   { C_REQ, C_STRR
13ca0 45 51 2c 20 43 5f 44 55 4d 4d 59 20 7d 3b 0a 20  EQ, C_DUMMY };. 
13cb0 20 20 20 54 63 6c 5f 53 69 7a 65 20 63 6d 64 3b     Tcl_Size cmd;
13cc0 0a 20 20 20 20 69 6e 74 20 69 73 53 74 72 3b 0a  .    int isStr;.
13cd0 20 20 20 20 63 68 61 72 20 62 75 66 66 65 72 5b      char buffer[
13ce0 31 36 33 38 34 5d 3b 0a 20 20 20 20 28 76 6f 69  16384];.    (voi
13cf0 64 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a  d) clientData;..
13d00 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
13d10 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28  led");..    if (
13d20 6f 62 6a 63 20 3c 20 32 29 20 7b 0a 09 54 63 6c  objc < 2) {..Tcl
13d30 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
13d40 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
13d50 73 75 62 63 6f 6d 6d 61 6e 64 20 3f 61 72 67 73  subcommand ?args
13d60 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  ?");..return TCL
13d70 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
13d80 20 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 64    if (Tcl_GetInd
13d90 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  exFromObj(interp
13da0 2c 20 6f 62 6a 76 5b 31 5d 2c 20 63 6f 6d 6d 61  , objv[1], comma
13db0 6e 64 73 2c 20 22 63 6f 6d 6d 61 6e 64 22 2c 20  nds, "command", 
13dc0 30 2c 20 26 63 6d 64 29 20 21 3d 20 54 43 4c 5f  0, &cmd) != TCL_
13dd0 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43  OK) {..return TC
13de0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
13df0 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72      ERR_clear_er
13e00 72 6f 72 28 29 3b 0a 0a 20 20 20 20 69 73 53 74  ror();..    isSt
13e10 72 20 3d 20 28 63 6d 64 20 3d 3d 20 43 5f 53 54  r = (cmd == C_ST
13e20 52 52 45 51 29 3b 0a 20 20 20 20 73 77 69 74 63  RREQ);.    switc
13e30 68 20 28 28 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64  h ((enum command
13e40 29 20 63 6d 64 29 20 7b 0a 09 63 61 73 65 20 43  ) cmd) {..case C
13e50 5f 52 45 51 3a 0a 09 63 61 73 65 20 43 5f 53 54  _REQ:..case C_ST
13e60 52 52 45 51 3a 20 7b 0a 09 20 20 20 20 45 56 50  RREQ: {..    EVP
13e70 5f 50 4b 45 59 20 2a 70 6b 65 79 3d 4e 55 4c 4c  _PKEY *pkey=NULL
13e80 3b 0a 09 20 20 20 20 58 35 30 39 20 2a 63 65 72  ;..    X509 *cer
13e90 74 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 58 35 30  t=NULL;..    X50
13ea0 39 5f 4e 41 4d 45 20 2a 6e 61 6d 65 3d 4e 55 4c  9_NAME *name=NUL
13eb0 4c 3b 0a 09 20 20 20 20 54 63 6c 5f 4f 62 6a 20  L;..    Tcl_Obj 
13ec0 2a 2a 6c 69 73 74 76 3b 0a 09 20 20 20 20 54 63  **listv;..    Tc
13ed0 6c 5f 53 69 7a 65 20 6c 69 73 74 63 3b 0a 09 20  l_Size listc;.. 
13ee0 20 20 20 69 6e 74 20 69 3b 0a 0a 09 20 20 20 20     int i;...    
13ef0 42 49 4f 20 2a 6f 75 74 3d 4e 55 4c 4c 3b 0a 0a  BIO *out=NULL;..
13f00 09 20 20 20 20 63 68 61 72 20 2a 6b 5f 43 3d 22  .    char *k_C="
13f10 22 2c 2a 6b 5f 53 54 3d 22 22 2c 2a 6b 5f 4c 3d  ",*k_ST="",*k_L=
13f20 22 22 2c 2a 6b 5f 4f 3d 22 22 2c 2a 6b 5f 4f 55  "",*k_O="",*k_OU
13f30 3d 22 22 2c 2a 6b 5f 43 4e 3d 22 22 2c 2a 6b 5f  ="",*k_CN="",*k_
13f40 45 6d 61 69 6c 3d 22 22 3b 0a 09 20 20 20 20 63  Email="";..    c
13f50 68 61 72 20 2a 6b 65 79 6f 75 74 2c 2a 70 65 6d  har *keyout,*pem
13f60 6f 75 74 2c 2a 73 74 72 3b 0a 09 20 20 20 20 69  out,*str;..    i
13f70 6e 74 20 6b 65 79 73 69 7a 65 2c 73 65 72 69 61  nt keysize,seria
13f80 6c 3d 30 2c 64 61 79 73 3d 33 36 35 3b 0a 0a 23  l=0,days=365;..#
13f90 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49  if OPENSSL_VERSI
13fa0 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30  ON_NUMBER < 0x30
13fb0 30 30 30 30 30 30 4c 0a 09 20 20 20 20 42 49 47  000000L..    BIG
13fc0 4e 55 4d 20 2a 62 6e 65 20 3d 20 4e 55 4c 4c 3b  NUM *bne = NULL;
13fd0 0a 09 20 20 20 20 52 53 41 20 2a 72 73 61 20 3d  ..    RSA *rsa =
13fe0 20 4e 55 4c 4c 3b 0a 23 65 6c 73 65 0a 09 20 20   NULL;.#else..  
13ff0 20 20 45 56 50 5f 50 4b 45 59 5f 43 54 58 20 2a    EVP_PKEY_CTX *
14000 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6e 64  ctx = NULL;.#end
14010 69 66 0a 0a 09 20 20 20 20 69 66 20 28 28 6f 62  if...    if ((ob
14020 6a 63 3c 35 29 20 7c 7c 20 28 6f 62 6a 63 3e 36  jc<5) || (objc>6
14030 29 29 20 7b 0a 09 09 54 63 6c 5f 57 72 6f 6e 67  )) {...Tcl_Wrong
14040 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
14050 32 2c 20 6f 62 6a 76 2c 20 22 6b 65 79 73 69 7a  2, objv, "keysiz
14060 65 20 6b 65 79 66 69 6c 65 20 63 65 72 74 66 69  e keyfile certfi
14070 6c 65 20 3f 69 6e 66 6f 3f 22 29 3b 0a 09 09 72  le ?info?");...r
14080 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
14090 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 66  ..    }...    if
140a0 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d   (Tcl_GetIntFrom
140b0 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
140c0 5b 32 5d 2c 20 26 6b 65 79 73 69 7a 65 29 20 21  [2], &keysize) !
140d0 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 72 65  = TCL_OK) {...re
140e0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
140f0 09 20 20 20 20 7d 0a 09 20 20 20 20 6b 65 79 6f  .    }..    keyo
14100 75 74 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  ut=Tcl_GetString
14110 28 6f 62 6a 76 5b 33 5d 29 3b 0a 09 20 20 20 20  (objv[3]);..    
14120 70 65 6d 6f 75 74 3d 54 63 6c 5f 47 65 74 53 74  pemout=Tcl_GetSt
14130 72 69 6e 67 28 6f 62 6a 76 5b 34 5d 29 3b 0a 09  ring(objv[4]);..
14140 20 20 20 20 69 66 20 28 69 73 53 74 72 29 20 7b      if (isStr) {
14150 0a 09 09 54 63 6c 5f 53 65 74 56 61 72 28 69 6e  ...Tcl_SetVar(in
14160 74 65 72 70 2c 6b 65 79 6f 75 74 2c 22 22 2c 30  terp,keyout,"",0
14170 29 3b 0a 09 09 54 63 6c 5f 53 65 74 56 61 72 28  );...Tcl_SetVar(
14180 69 6e 74 65 72 70 2c 70 65 6d 6f 75 74 2c 22 22  interp,pemout,""
14190 2c 30 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20  ,0);..    }...  
141a0 20 20 69 66 20 28 6f 62 6a 63 3e 3d 36 29 20 7b    if (objc>=6) {
141b0 0a 09 09 69 66 20 28 54 63 6c 5f 4c 69 73 74 4f  ...if (Tcl_ListO
141c0 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 69 6e  bjGetElements(in
141d0 74 65 72 70 2c 20 6f 62 6a 76 5b 35 5d 2c 20 26  terp, objv[5], &
141e0 6c 69 73 74 63 2c 20 26 6c 69 73 74 76 29 20 21  listc, &listv) !
141f0 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 20 20  = TCL_OK) {...  
14200 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
14210 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 28  OR;...}....if ((
14220 6c 69 73 74 63 25 32 29 20 21 3d 20 30 29 20 7b  listc%2) != 0) {
14230 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 52 65  ...    Tcl_SetRe
14240 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 49 6e 66  sult(interp,"Inf
14250 6f 72 6d 61 74 69 6f 6e 20 6c 69 73 74 20 6d 75  ormation list mu
14260 73 74 20 68 61 76 65 20 65 76 65 6e 20 6e 75 6d  st have even num
14270 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
14280 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 72  ",NULL);...    r
14290 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
142a0 0a 09 09 7d 0a 09 09 66 6f 72 20 28 69 3d 30 3b  ...}...for (i=0;
142b0 20 69 3c 6c 69 73 74 63 3b 20 69 2b 3d 32 29 20   i<listc; i+=2) 
142c0 7b 0a 09 09 20 20 20 20 73 74 72 3d 54 63 6c 5f  {...    str=Tcl_
142d0 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b  GetString(listv[
142e0 69 5d 29 3b 0a 09 09 20 20 20 20 69 66 20 28 73  i]);...    if (s
142f0 74 72 63 6d 70 28 73 74 72 2c 22 64 61 79 73 22  trcmp(str,"days"
14300 29 3d 3d 30 29 20 7b 0a 09 09 09 69 66 20 28 54  )==0) {....if (T
14310 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
14320 28 69 6e 74 65 72 70 2c 6c 69 73 74 76 5b 69 2b  (interp,listv[i+
14330 31 5d 2c 26 64 61 79 73 29 21 3d 54 43 4c 5f 4f  1],&days)!=TCL_O
14340 4b 29 0a 09 09 09 20 20 20 20 72 65 74 75 72 6e  K)....    return
14350 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20   TCL_ERROR;...  
14360 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72    } else if (str
14370 63 6d 70 28 73 74 72 2c 22 73 65 72 69 61 6c 22  cmp(str,"serial"
14380 29 3d 3d 30 29 20 7b 0a 09 09 09 69 66 20 28 54  )==0) {....if (T
14390 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
143a0 28 69 6e 74 65 72 70 2c 6c 69 73 74 76 5b 69 2b  (interp,listv[i+
143b0 31 5d 2c 26 73 65 72 69 61 6c 29 21 3d 54 43 4c  1],&serial)!=TCL
143c0 5f 4f 4b 29 0a 09 09 09 20 20 20 20 72 65 74 75  _OK)....    retu
143d0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09  rn TCL_ERROR;...
143e0 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73      } else if (s
143f0 74 72 63 6d 70 28 73 74 72 2c 22 43 22 29 3d 3d  trcmp(str,"C")==
14400 30 29 20 7b 0a 09 09 09 6b 5f 43 3d 54 63 6c 5f  0) {....k_C=Tcl_
14410 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b  GetString(listv[
14420 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65  i+1]);...    } e
14430 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73  lse if (strcmp(s
14440 74 72 2c 22 53 54 22 29 3d 3d 30 29 20 7b 0a 09  tr,"ST")==0) {..
14450 09 09 6b 5f 53 54 3d 54 63 6c 5f 47 65 74 53 74  ..k_ST=Tcl_GetSt
14460 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29  ring(listv[i+1])
14470 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69  ;...    } else i
14480 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 4c  f (strcmp(str,"L
14490 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4c 3d  ")==0) {....k_L=
144a0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69  Tcl_GetString(li
144b0 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20  stv[i+1]);...   
144c0 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63   } else if (strc
144d0 6d 70 28 73 74 72 2c 22 4f 22 29 3d 3d 30 29 20  mp(str,"O")==0) 
144e0 7b 0a 09 09 09 6b 5f 4f 3d 54 63 6c 5f 47 65 74  {....k_O=Tcl_Get
144f0 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31  String(listv[i+1
14500 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65  ]);...    } else
14510 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c   if (strcmp(str,
14520 22 4f 55 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b  "OU")==0) {....k
14530 5f 4f 55 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e  _OU=Tcl_GetStrin
14540 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09  g(listv[i+1]);..
14550 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
14560 73 74 72 63 6d 70 28 73 74 72 2c 22 43 4e 22 29  strcmp(str,"CN")
14570 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 43 4e 3d 54  ==0) {....k_CN=T
14580 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73  cl_GetString(lis
14590 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20  tv[i+1]);...    
145a0 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d  } else if (strcm
145b0 70 28 73 74 72 2c 22 45 6d 61 69 6c 22 29 3d 3d  p(str,"Email")==
145c0 30 29 20 7b 0a 09 09 09 6b 5f 45 6d 61 69 6c 3d  0) {....k_Email=
145d0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69  Tcl_GetString(li
145e0 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20  stv[i+1]);...   
145f0 20 7d 20 65 6c 73 65 20 7b 0a 09 09 09 54 63 6c   } else {....Tcl
14600 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
14610 70 2c 22 55 6e 6b 6e 6f 77 6e 20 70 61 72 61 6d  p,"Unknown param
14620 65 74 65 72 22 2c 4e 55 4c 4c 29 3b 0a 09 09 09  eter",NULL);....
14630 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
14640 3b 0a 09 09 20 20 20 20 7d 0a 09 09 7d 0a 09 20  ;...    }...}.. 
14650 20 20 20 7d 0a 0a 23 69 66 20 4f 50 45 4e 53 53     }..#if OPENSS
14660 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52  L_VERSION_NUMBER
14670 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09   < 0x30000000L..
14680 20 20 20 20 62 6e 65 20 3d 20 42 4e 5f 6e 65 77      bne = BN_new
14690 28 29 3b 0a 09 20 20 20 20 72 73 61 20 3d 20 52  ();..    rsa = R
146a0 53 41 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20 70  SA_new();..    p
146b0 6b 65 79 20 3d 20 45 56 50 5f 50 4b 45 59 5f 6e  key = EVP_PKEY_n
146c0 65 77 28 29 3b 0a 09 20 20 20 20 69 66 20 28 62  ew();..    if (b
146d0 6e 65 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 72 73  ne == NULL || rs
146e0 61 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 70 6b 65  a == NULL || pke
146f0 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21 42 4e  y == NULL || !BN
14700 5f 73 65 74 5f 77 6f 72 64 28 62 6e 65 2c 52 53  _set_word(bne,RS
14710 41 5f 46 34 29 20 7c 7c 0a 09 09 21 52 53 41 5f  A_F4) ||...!RSA_
14720 67 65 6e 65 72 61 74 65 5f 6b 65 79 5f 65 78 28  generate_key_ex(
14730 72 73 61 2c 20 6b 65 79 73 69 7a 65 2c 20 62 6e  rsa, keysize, bn
14740 65 2c 20 4e 55 4c 4c 29 20 7c 7c 20 21 45 56 50  e, NULL) || !EVP
14750 5f 50 4b 45 59 5f 61 73 73 69 67 6e 5f 52 53 41  _PKEY_assign_RSA
14760 28 70 6b 65 79 2c 20 72 73 61 29 29 20 7b 0a 09  (pkey, rsa)) {..
14770 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70  .EVP_PKEY_free(p
14780 6b 65 79 29 3b 0a 09 09 2f 2a 20 52 53 41 5f 66  key);.../* RSA_f
14790 72 65 65 28 72 73 61 29 3b 20 66 72 65 65 64 20  ree(rsa); freed 
147a0 62 79 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65  by EVP_PKEY_free
147b0 20 2a 2f 0a 09 09 42 4e 5f 66 72 65 65 28 62 6e   */...BN_free(bn
147c0 65 29 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 70  e);.#else..    p
147d0 6b 65 79 20 3d 20 45 56 50 5f 52 53 41 5f 67 65  key = EVP_RSA_ge
147e0 6e 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29  n((unsigned int)
147f0 20 6b 65 79 73 69 7a 65 29 3b 0a 09 20 20 20 20   keysize);..    
14800 63 74 78 20 3d 20 45 56 50 5f 50 4b 45 59 5f 43  ctx = EVP_PKEY_C
14810 54 58 5f 6e 65 77 28 70 6b 65 79 2c 4e 55 4c 4c  TX_new(pkey,NULL
14820 29 3b 0a 09 20 20 20 20 69 66 20 28 70 6b 65 79  );..    if (pkey
14830 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 63 74 78 20   == NULL || ctx 
14840 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21 45 56 50 5f  == NULL || !EVP_
14850 50 4b 45 59 5f 6b 65 79 67 65 6e 5f 69 6e 69 74  PKEY_keygen_init
14860 28 63 74 78 29 20 7c 7c 0a 09 09 21 45 56 50 5f  (ctx) ||...!EVP_
14870 50 4b 45 59 5f 43 54 58 5f 73 65 74 5f 72 73 61  PKEY_CTX_set_rsa
14880 5f 6b 65 79 67 65 6e 5f 62 69 74 73 28 63 74 78  _keygen_bits(ctx
14890 2c 20 6b 65 79 73 69 7a 65 29 20 7c 7c 20 21 45  , keysize) || !E
148a0 56 50 5f 50 4b 45 59 5f 6b 65 79 67 65 6e 28 63  VP_PKEY_keygen(c
148b0 74 78 2c 20 26 70 6b 65 79 29 29 20 7b 0a 09 09  tx, &pkey)) {...
148c0 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b  EVP_PKEY_free(pk
148d0 65 79 29 3b 0a 09 09 45 56 50 5f 50 4b 45 59 5f  ey);...EVP_PKEY_
148e0 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 23  CTX_free(ctx);.#
148f0 65 6e 64 69 66 0a 09 09 54 63 6c 5f 53 65 74 52  endif...Tcl_SetR
14900 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72  esult(interp,"Er
14910 72 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 70  ror generating p
14920 72 69 76 61 74 65 20 6b 65 79 22 2c 4e 55 4c 4c  rivate key",NULL
14930 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f  );...return TCL_
14940 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 20 65 6c  ERROR;..    } el
14950 73 65 20 7b 0a 09 09 69 66 20 28 69 73 53 74 72  se {...if (isStr
14960 29 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49  ) {...    out=BI
14970 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28  O_new(BIO_s_mem(
14980 29 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72  ));...    PEM_wr
14990 69 74 65 5f 62 69 6f 5f 50 72 69 76 61 74 65 4b  ite_bio_PrivateK
149a0 65 79 28 6f 75 74 2c 70 6b 65 79 2c 4e 55 4c 4c  ey(out,pkey,NULL
149b0 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c  ,NULL,0,NULL,NUL
149c0 4c 29 3b 0a 09 09 20 20 20 20 69 3d 42 49 4f 5f  L);...    i=BIO_
149d0 72 65 61 64 28 6f 75 74 2c 62 75 66 66 65 72 2c  read(out,buffer,
149e0 73 69 7a 65 6f 66 28 62 75 66 66 65 72 29 2d 31  sizeof(buffer)-1
149f0 29 3b 0a 09 09 20 20 20 20 69 3d 28 69 3c 30 29  );...    i=(i<0)
14a00 20 3f 20 30 20 3a 20 69 3b 0a 09 09 20 20 20 20   ? 0 : i;...    
14a10 62 75 66 66 65 72 5b 69 5d 3d 27 5c 30 27 3b 0a  buffer[i]='\0';.
14a20 09 09 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72  ..    Tcl_SetVar
14a30 28 69 6e 74 65 72 70 2c 6b 65 79 6f 75 74 2c 62  (interp,keyout,b
14a40 75 66 66 65 72 2c 30 29 3b 0a 09 09 20 20 20 20  uffer,0);...    
14a50 42 49 4f 5f 66 6c 75 73 68 28 6f 75 74 29 3b 0a  BIO_flush(out);.
14a60 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65 28 6f  ..    BIO_free(o
14a70 75 74 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a  ut);...} else {.
14a80 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65  ..    out=BIO_ne
14a90 77 28 42 49 4f 5f 73 5f 66 69 6c 65 28 29 29 3b  w(BIO_s_file());
14aa0 0a 09 09 20 20 20 20 42 49 4f 5f 77 72 69 74 65  ...    BIO_write
14ab0 5f 66 69 6c 65 6e 61 6d 65 28 6f 75 74 2c 6b 65  _filename(out,ke
14ac0 79 6f 75 74 29 3b 0a 09 09 20 20 20 20 50 45 4d  yout);...    PEM
14ad0 5f 77 72 69 74 65 5f 62 69 6f 5f 50 72 69 76 61  _write_bio_Priva
14ae0 74 65 4b 65 79 28 6f 75 74 2c 70 6b 65 79 2c 4e  teKey(out,pkey,N
14af0 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c  ULL,NULL,0,NULL,
14b00 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 2f 2a 20  NULL);...    /* 
14b10 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 52 53  PEM_write_bio_RS
14b20 41 50 72 69 76 61 74 65 4b 65 79 28 6f 75 74 2c  APrivateKey(out,
14b30 20 72 73 61 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c   rsa, NULL, NULL
14b40 2c 20 30 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29  , 0, NULL, NULL)
14b50 3b 20 2a 2f 0a 09 09 20 20 20 20 42 49 4f 5f 66  ; */...    BIO_f
14b60 72 65 65 5f 61 6c 6c 28 6f 75 74 29 3b 0a 09 20  ree_all(out);.. 
14b70 09 7d 0a 0a 09 09 69 66 20 28 28 63 65 72 74 3d  .}....if ((cert=
14b80 58 35 30 39 5f 6e 65 77 28 29 29 3d 3d 4e 55 4c  X509_new())==NUL
14b90 4c 29 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 53  L) {...    Tcl_S
14ba0 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
14bb0 22 45 72 72 6f 72 20 67 65 6e 65 72 61 74 69 6e  "Error generatin
14bc0 67 20 63 65 72 74 69 66 69 63 61 74 65 20 72 65  g certificate re
14bd0 71 75 65 73 74 22 2c 4e 55 4c 4c 29 3b 0a 09 09  quest",NULL);...
14be0 20 20 20 20 45 56 50 5f 50 4b 45 59 5f 66 72 65      EVP_PKEY_fre
14bf0 65 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45  e(pkey);.#if OPE
14c00 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d  NSSL_VERSION_NUM
14c10 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30  BER < 0x30000000
14c20 4c 0a 09 09 20 20 20 20 42 4e 5f 66 72 65 65 28  L...    BN_free(
14c30 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 09 09 20  bne);.#endif... 
14c40 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
14c50 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 58 35 30 39  ROR;...}....X509
14c60 5f 73 65 74 5f 76 65 72 73 69 6f 6e 28 63 65 72  _set_version(cer
14c70 74 2c 32 29 3b 0a 09 09 41 53 4e 31 5f 49 4e 54  t,2);...ASN1_INT
14c80 45 47 45 52 5f 73 65 74 28 58 35 30 39 5f 67 65  EGER_set(X509_ge
14c90 74 5f 73 65 72 69 61 6c 4e 75 6d 62 65 72 28 63  t_serialNumber(c
14ca0 65 72 74 29 2c 73 65 72 69 61 6c 29 3b 0a 09 09  ert),serial);...
14cb0 58 35 30 39 5f 67 6d 74 69 6d 65 5f 61 64 6a 28  X509_gmtime_adj(
14cc0 58 35 30 39 5f 67 65 74 6d 5f 6e 6f 74 42 65 66  X509_getm_notBef
14cd0 6f 72 65 28 63 65 72 74 29 2c 30 29 3b 0a 09 09  ore(cert),0);...
14ce0 58 35 30 39 5f 67 6d 74 69 6d 65 5f 61 64 6a 28  X509_gmtime_adj(
14cf0 58 35 30 39 5f 67 65 74 6d 5f 6e 6f 74 41 66 74  X509_getm_notAft
14d00 65 72 28 63 65 72 74 29 2c 28 6c 6f 6e 67 29 36  er(cert),(long)6
14d10 30 2a 36 30 2a 32 34 2a 64 61 79 73 29 3b 0a 09  0*60*24*days);..
14d20 09 58 35 30 39 5f 73 65 74 5f 70 75 62 6b 65 79  .X509_set_pubkey
14d30 28 63 65 72 74 2c 70 6b 65 79 29 3b 0a 0a 09 09  (cert,pkey);....
14d40 6e 61 6d 65 3d 58 35 30 39 5f 67 65 74 5f 73 75  name=X509_get_su
14d50 62 6a 65 63 74 5f 6e 61 6d 65 28 63 65 72 74 29  bject_name(cert)
14d60 3b 0a 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61  ;....X509_NAME_a
14d70 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28  dd_entry_by_txt(
14d80 6e 61 6d 65 2c 22 43 22 2c 20 4d 42 53 54 52 49  name,"C", MBSTRI
14d90 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75  NG_ASC, (const u
14da0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20  nsigned char *) 
14db0 6b 5f 43 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b  k_C, -1, -1, 0);
14dc0 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64  ...X509_NAME_add
14dd0 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61  _entry_by_txt(na
14de0 6d 65 2c 22 53 54 22 2c 20 4d 42 53 54 52 49 4e  me,"ST", MBSTRIN
14df0 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e  G_ASC, (const un
14e00 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b  signed char *) k
14e10 5f 53 54 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b  _ST, -1, -1, 0);
14e20 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64  ...X509_NAME_add
14e30 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61  _entry_by_txt(na
14e40 6d 65 2c 22 4c 22 2c 20 4d 42 53 54 52 49 4e 47  me,"L", MBSTRING
14e50 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73  _ASC, (const uns
14e60 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f  igned char *) k_
14e70 4c 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09  L, -1, -1, 0);..
14e80 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65  .X509_NAME_add_e
14e90 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65  ntry_by_txt(name
14ea0 2c 22 4f 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41  ,"O", MBSTRING_A
14eb0 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67  SC, (const unsig
14ec0 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 4f 2c  ned char *) k_O,
14ed0 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58   -1, -1, 0);...X
14ee0 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74  509_NAME_add_ent
14ef0 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22  ry_by_txt(name,"
14f00 4f 55 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53  OU", MBSTRING_AS
14f10 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e  C, (const unsign
14f20 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 4f 55 2c  ed char *) k_OU,
14f30 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58   -1, -1, 0);...X
14f40 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74  509_NAME_add_ent
14f50 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22  ry_by_txt(name,"
14f60 43 4e 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53  CN", MBSTRING_AS
14f70 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e  C, (const unsign
14f80 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 43 4e 2c  ed char *) k_CN,
14f90 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58   -1, -1, 0);...X
14fa0 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74  509_NAME_add_ent
14fb0 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22  ry_by_txt(name,"
14fc0 45 6d 61 69 6c 22 2c 20 4d 42 53 54 52 49 4e 47  Email", MBSTRING
14fd0 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73  _ASC, (const uns
14fe0 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f  igned char *) k_
14ff0 45 6d 61 69 6c 2c 20 2d 31 2c 20 2d 31 2c 20 30  Email, -1, -1, 0
15000 29 3b 0a 0a 09 09 58 35 30 39 5f 73 65 74 5f 73  );....X509_set_s
15010 75 62 6a 65 63 74 5f 6e 61 6d 65 28 63 65 72 74  ubject_name(cert
15020 2c 6e 61 6d 65 29 3b 0a 0a 09 09 69 66 20 28 21  ,name);....if (!
15030 58 35 30 39 5f 73 69 67 6e 28 63 65 72 74 2c 70  X509_sign(cert,p
15040 6b 65 79 2c 45 56 50 5f 73 68 61 32 35 36 28 29  key,EVP_sha256()
15050 29 29 20 7b 0a 09 09 20 20 20 20 58 35 30 39 5f  )) {...    X509_
15060 66 72 65 65 28 63 65 72 74 29 3b 0a 09 09 20 20  free(cert);...  
15070 20 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28    EVP_PKEY_free(
15080 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53  pkey);.#if OPENS
15090 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45  SL_VERSION_NUMBE
150a0 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a  R < 0x30000000L.
150b0 09 09 20 20 20 20 42 4e 5f 66 72 65 65 28 62 6e  ..    BN_free(bn
150c0 65 29 3b 0a 23 65 6e 64 69 66 0a 09 09 20 20 20  e);.#endif...   
150d0 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
150e0 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 73 69 67  nterp,"Error sig
150f0 6e 69 6e 67 20 63 65 72 74 69 66 69 63 61 74 65  ning certificate
15100 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 72  ",NULL);...    r
15110 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
15120 0a 09 09 7d 0a 0a 09 09 69 66 20 28 69 73 53 74  ...}....if (isSt
15130 72 29 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42  r) {...    out=B
15140 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d  IO_new(BIO_s_mem
15150 28 29 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77  ());...    PEM_w
15160 72 69 74 65 5f 62 69 6f 5f 58 35 30 39 28 6f 75  rite_bio_X509(ou
15170 74 2c 63 65 72 74 29 3b 0a 09 09 20 20 20 20 69  t,cert);...    i
15180 3d 42 49 4f 5f 72 65 61 64 28 6f 75 74 2c 62 75  =BIO_read(out,bu
15190 66 66 65 72 2c 73 69 7a 65 6f 66 28 62 75 66 66  ffer,sizeof(buff
151a0 65 72 29 2d 31 29 3b 0a 09 09 20 20 20 20 69 3d  er)-1);...    i=
151b0 28 69 3c 30 29 20 3f 20 30 20 3a 20 69 3b 0a 09  (i<0) ? 0 : i;..
151c0 09 20 20 20 20 62 75 66 66 65 72 5b 69 5d 3d 27  .    buffer[i]='
151d0 5c 30 27 3b 0a 09 09 20 20 20 20 54 63 6c 5f 53  \0';...    Tcl_S
151e0 65 74 56 61 72 28 69 6e 74 65 72 70 2c 70 65 6d  etVar(interp,pem
151f0 6f 75 74 2c 62 75 66 66 65 72 2c 30 29 3b 0a 09  out,buffer,0);..
15200 09 20 20 20 20 42 49 4f 5f 66 6c 75 73 68 28 6f  .    BIO_flush(o
15210 75 74 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66  ut);...    BIO_f
15220 72 65 65 28 6f 75 74 29 3b 0a 09 09 7d 20 65 6c  ree(out);...} el
15230 73 65 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42  se {...    out=B
15240 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 66 69 6c  IO_new(BIO_s_fil
15250 65 28 29 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f  e());...    BIO_
15260 77 72 69 74 65 5f 66 69 6c 65 6e 61 6d 65 28 6f  write_filename(o
15270 75 74 2c 70 65 6d 6f 75 74 29 3b 0a 09 09 20 20  ut,pemout);...  
15280 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f    PEM_write_bio_
15290 58 35 30 39 28 6f 75 74 2c 63 65 72 74 29 3b 0a  X509(out,cert);.
152a0 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65 5f 61  ..    BIO_free_a
152b0 6c 6c 28 6f 75 74 29 3b 0a 09 09 7d 0a 0a 09 09  ll(out);...}....
152c0 58 35 30 39 5f 66 72 65 65 28 63 65 72 74 29 3b  X509_free(cert);
152d0 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 65  ...EVP_PKEY_free
152e0 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e  (pkey);.#if OPEN
152f0 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42  SSL_VERSION_NUMB
15300 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c  ER < 0x30000000L
15310 0a 09 09 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b  ...BN_free(bne);
15320 0a 23 65 6e 64 69 66 0a 09 20 20 20 20 7d 0a 09  .#endif..    }..
15330 7d 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 64 65  }..break;.    de
15340 66 61 75 6c 74 3a 0a 09 62 72 65 61 6b 3b 0a 20  fault:..break;. 
15350 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
15360 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a  TCL_OK;.}.../***
15370 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15380 2a 2f 0a 2f 2a 20 49 6e 69 74 20 20 20 20 20 20  */./* Init      
15390 20 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a         */./*****
153a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
153b0 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
153c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
153d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
153e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
153f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
15400 20 54 6c 73 5f 46 72 65 65 20 2d 2d 0a 20 2a 0a   Tls_Free --. *.
15410 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72   *.This procedur
15420 65 20 63 6c 65 61 6e 73 20 75 70 20 77 68 65 6e  e cleans up when
15430 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61   a SSL socket ba
15440 73 65 64 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 69  sed channel. *.i
15450 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 69 74 73  s closed and its
15460 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
15470 20 66 61 6c 6c 73 20 62 65 6c 6f 77 20 31 0a 20   falls below 1. 
15480 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
15490 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65  .none. *. * Side
154a0 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 46 72 65   effects:. *.Fre
154b0 65 73 20 61 6c 6c 20 74 68 65 20 73 74 61 74 65  es all the state
154c0 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
154d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
154e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
154f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15500 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f  ---------. */.vo
15510 69 64 0a 54 6c 73 5f 46 72 65 65 28 74 6c 73 5f  id.Tls_Free(tls_
15520 66 72 65 65 5f 74 79 70 65 20 2a 62 6c 6f 63 6b  free_type *block
15530 50 74 72 29 20 7b 0a 20 20 20 20 53 74 61 74 65  Ptr) {.    State
15540 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74   *statePtr = (St
15550 61 74 65 20 2a 29 62 6c 6f 63 6b 50 74 72 3b 0a  ate *)blockPtr;.
15560 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
15570 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 54 6c 73  lled");..    Tls
15580 5f 43 6c 65 61 6e 28 73 74 61 74 65 50 74 72 29  _Clean(statePtr)
15590 3b 0a 20 20 20 20 63 6b 66 72 65 65 28 62 6c 6f  ;.    ckfree(blo
155a0 63 6b 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  ckPtr);.}.../*. 
155b0 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
155c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
155d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
155e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
155f0 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 43  ----. *. * Tls_C
15600 6c 65 61 6e 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68  lean --. *. *.Th
15610 69 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65  is procedure cle
15620 61 6e 73 20 75 70 20 77 68 65 6e 20 61 20 53 53  ans up when a SS
15630 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 64 20 63  L socket based c
15640 68 61 6e 6e 65 6c 0a 20 2a 09 69 73 20 63 6c 6f  hannel. *.is clo
15650 73 65 64 20 61 6e 64 20 69 74 73 20 72 65 66 65  sed and its refe
15660 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 61 6c 6c  rence count fall
15670 73 20 62 65 6c 6f 77 20 31 2e 20 20 54 68 69 73  s below 1.  This
15680 20 73 68 6f 75 6c 64 0a 20 2a 09 62 65 20 63 61   should. *.be ca
15690 6c 6c 65 64 20 73 79 6e 63 68 72 6f 6e 6f 75 73  lled synchronous
156a0 6c 79 20 62 79 20 74 68 65 20 43 6c 6f 73 65 50  ly by the CloseP
156b0 72 6f 63 2c 20 6e 6f 74 20 69 6e 20 74 68 65 0a  roc, not in the.
156c0 20 2a 09 45 76 65 6e 74 75 61 6c 6c 79 46 72 65   *.EventuallyFre
156d0 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 20 2a 0a 20  e callback.. *. 
156e0 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 6e 6f  * Results:. *.no
156f0 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  ne. *. * Side ef
15700 66 65 63 74 73 3a 0a 20 2a 09 46 72 65 65 73 20  fects:. *.Frees 
15710 61 6c 6c 20 74 68 65 20 73 74 61 74 65 0a 20 2a  all the state. *
15720 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
15730 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15740 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15750 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15760 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 20  ------. */.void 
15770 54 6c 73 5f 43 6c 65 61 6e 28 53 74 61 74 65 20  Tls_Clean(State 
15780 2a 73 74 61 74 65 50 74 72 29 20 7b 0a 20 20 20  *statePtr) {.   
15790 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
157a0 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61  ");..    if (sta
157b0 74 65 50 74 72 2d 3e 73 73 6c 29 20 7b 0a 09 2f  tePtr->ssl) {../
157c0 2a 20 53 65 6e 64 20 63 6c 6f 73 65 5f 6e 6f 74  * Send close_not
157d0 69 66 79 20 6d 65 73 73 61 67 65 20 2a 2f 0a 09  ify message */..
157e0 64 70 72 69 6e 74 66 28 22 53 53 4c 5f 73 68 75  dprintf("SSL_shu
157f0 74 64 6f 77 6e 28 25 70 29 22 2c 20 73 74 61 74  tdown(%p)", stat
15800 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 53 53 4c  ePtr->ssl);..SSL
15810 5f 73 68 75 74 64 6f 77 6e 28 73 74 61 74 65 50  _shutdown(stateP
15820 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 0a  tr->ssl);.    }.
15830 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 77  .    /*.     * w
15840 65 27 72 65 20 61 73 73 75 6d 69 6e 67 20 68 65  e're assuming he
15850 72 65 20 74 68 61 74 20 77 65 27 72 65 20 73 69  re that we're si
15860 6e 67 6c 65 2d 74 68 72 65 61 64 65 64 0a 20 20  ngle-threaded.  
15870 20 20 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74     */.    if (st
15880 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 21 3d  atePtr->timer !=
15890 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e   (Tcl_TimerToken
158a0 29 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44  ) NULL) {..Tcl_D
158b0 65 6c 65 74 65 54 69 6d 65 72 48 61 6e 64 6c 65  eleteTimerHandle
158c0 72 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65  r(statePtr->time
158d0 72 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 74  r);..statePtr->t
158e0 69 6d 65 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  imer = NULL;.   
158f0 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76   }..    /* Remov
15900 65 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 20  e callbacks */. 
15910 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
15920 3e 63 61 6c 6c 62 61 63 6b 29 20 7b 0a 09 54 63  >callback) {..Tc
15930 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 73  l_DecrRefCount(s
15940 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63  tatePtr->callbac
15950 6b 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 63  k);..statePtr->c
15960 61 6c 6c 62 61 63 6b 20 3d 20 4e 55 4c 4c 3b 0a  allback = NULL;.
15970 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74      }.    if (st
15980 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64  atePtr->password
15990 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66  ) {..Tcl_DecrRef
159a0 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e  Count(statePtr->
159b0 70 61 73 73 77 6f 72 64 29 3b 0a 09 73 74 61 74  password);..stat
159c0 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d  ePtr->password =
159d0 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20   NULL;.    }.   
159e0 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76   if (statePtr->v
159f0 63 6d 64 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72  cmd) {..Tcl_Decr
15a00 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74  RefCount(statePt
15a10 72 2d 3e 76 63 6d 64 29 3b 0a 09 73 74 61 74 65  r->vcmd);..state
15a20 50 74 72 2d 3e 76 63 6d 64 20 3d 20 4e 55 4c 4c  Ptr->vcmd = NULL
15a30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20  ;.    }..    if 
15a40 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f  (statePtr->proto
15a50 73 29 20 7b 0a 09 63 6b 66 72 65 65 28 73 74 61  s) {..ckfree(sta
15a60 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 29 3b 0a  tePtr->protos);.
15a70 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f  .statePtr->proto
15a80 73 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a  s = NULL;.    }.
15a90 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
15aa0 72 2d 3e 62 69 6f 29 20 7b 0a 09 2f 2a 20 54 68  r->bio) {../* Th
15ab0 69 73 20 77 69 6c 6c 20 63 61 6c 6c 20 53 53 4c  is will call SSL
15ac0 5f 73 68 75 74 64 6f 77 6e 2e 20 42 75 67 20 31  _shutdown. Bug 1
15ad0 34 31 34 30 34 35 20 2a 2f 0a 09 64 70 72 69 6e  414045 */..dprin
15ae0 74 66 28 22 42 49 4f 5f 66 72 65 65 5f 61 6c 6c  tf("BIO_free_all
15af0 28 25 70 29 22 2c 20 73 74 61 74 65 50 74 72 2d  (%p)", statePtr-
15b00 3e 62 69 6f 29 3b 0a 09 42 49 4f 5f 66 72 65 65  >bio);..BIO_free
15b10 5f 61 6c 6c 28 73 74 61 74 65 50 74 72 2d 3e 62  _all(statePtr->b
15b20 69 6f 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e  io);..statePtr->
15b30 62 69 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  bio = NULL;.    
15b40 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65  }..    if (state
15b50 50 74 72 2d 3e 73 73 6c 29 20 7b 0a 09 64 70 72  Ptr->ssl) {..dpr
15b60 69 6e 74 66 28 22 53 53 4c 5f 66 72 65 65 28 25  intf("SSL_free(%
15b70 70 29 22 2c 20 73 74 61 74 65 50 74 72 2d 3e 73  p)", statePtr->s
15b80 73 6c 29 3b 0a 09 53 53 4c 5f 66 72 65 65 28 73  sl);..SSL_free(s
15b90 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09  tatePtr->ssl);..
15ba0 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 20 3d 20  statePtr->ssl = 
15bb0 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  NULL;.    }..   
15bc0 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63   if (statePtr->c
15bd0 74 78 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 66  tx) {..SSL_CTX_f
15be0 72 65 65 28 73 74 61 74 65 50 74 72 2d 3e 63 74  ree(statePtr->ct
15bf0 78 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 63  x);..statePtr->c
15c00 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  tx = NULL;.    }
15c10 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 52  ..    dprintf("R
15c20 65 74 75 72 6e 69 6e 67 22 29 3b 0a 7d 0a 0c 0a  eturning");.}...
15c30 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
15c40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15c50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15c60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15c70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
15c80 2a 20 42 75 69 6c 64 20 49 6e 66 6f 20 43 6f 6d  * Build Info Com
15c90 6d 61 6e 64 20 2d 2d 0a 20 2a 0a 20 2a 09 43 72  mand --. *. *.Cr
15ca0 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20  eate command to 
15cb0 72 65 74 75 72 6e 20 62 75 69 6c 64 20 69 6e 66  return build inf
15cc0 6f 20 66 6f 72 20 70 61 63 6b 61 67 65 2e 0a 20  o for package.. 
15cd0 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
15ce0 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20  .A standard Tcl 
15cf0 72 65 73 75 6c 74 0a 20 2a 0a 20 2a 20 53 69 64  result. *. * Sid
15d00 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 72  e effects:. *.Cr
15d10 65 61 74 65 64 20 62 75 69 6c 64 2d 69 6e 66 6f  eated build-info
15d20 20 63 6f 6d 6d 61 6e 64 2e 0a 20 2a 0a 20 2a 2d   command.. *. *-
15d30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15d40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15d50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15d60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15d70 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 23 69 66 6e 64  -----. */..#ifnd
15d80 65 66 20 53 54 52 49 4e 47 49 46 59 0a 23 20 20  ef STRINGIFY.#  
15d90 64 65 66 69 6e 65 20 53 54 52 49 4e 47 49 46 59  define STRINGIFY
15da0 28 78 29 20 53 54 52 49 4e 47 49 46 59 31 28 78  (x) STRINGIFY1(x
15db0 29 0a 23 20 20 64 65 66 69 6e 65 20 53 54 52 49  ).#  define STRI
15dc0 4e 47 49 46 59 31 28 78 29 20 23 78 0a 23 65 6e  NGIFY1(x) #x.#en
15dd0 64 69 66 0a 0a 69 6e 74 0a 42 75 69 6c 64 49 6e  dif..int.BuildIn
15de0 66 6f 43 6f 6d 6d 61 6e 64 28 54 63 6c 5f 49 6e  foCommand(Tcl_In
15df0 74 65 72 70 2a 20 69 6e 74 65 72 70 29 20 7b 0a  terp* interp) {.
15e00 20 20 20 20 54 63 6c 5f 43 6d 64 49 6e 66 6f 20      Tcl_CmdInfo 
15e10 69 6e 66 6f 3b 0a 0a 20 20 20 20 69 66 20 28 54  info;..    if (T
15e20 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64 49 6e 66  cl_GetCommandInf
15e30 6f 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 63 6c  o(interp, "::tcl
15e40 3a 3a 62 75 69 6c 64 2d 69 6e 66 6f 22 2c 20 26  ::build-info", &
15e50 69 6e 66 6f 29 29 20 7b 0a 09 54 63 6c 5f 43 72  info)) {..Tcl_Cr
15e60 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
15e70 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 62  nterp, "::tls::b
15e80 75 69 6c 64 2d 69 6e 66 6f 22 2c 20 69 6e 66 6f  uild-info", info
15e90 2e 6f 62 6a 50 72 6f 63 2c 20 28 76 6f 69 64 20  .objProc, (void 
15ea0 2a 29 28 0a 09 09 50 41 43 4b 41 47 45 5f 56 45  *)(...PACKAGE_VE
15eb0 52 53 49 4f 4e 20 22 2b 22 20 53 54 52 49 4e 47  RSION "+" STRING
15ec0 49 46 59 28 54 4c 53 5f 56 45 52 53 49 4f 4e 5f  IFY(TLS_VERSION_
15ed0 55 55 49 44 29 0a 23 69 66 20 64 65 66 69 6e 65  UUID).#if define
15ee0 64 28 5f 5f 63 6c 61 6e 67 5f 5f 29 20 26 26 20  d(__clang__) && 
15ef0 64 65 66 69 6e 65 64 28 5f 5f 63 6c 61 6e 67 5f  defined(__clang_
15f00 6d 61 6a 6f 72 5f 5f 29 0a 09 09 09 20 20 20 20  major__)....    
15f10 22 2e 63 6c 61 6e 67 2d 22 20 53 54 52 49 4e 47  ".clang-" STRING
15f20 49 46 59 28 5f 5f 63 6c 61 6e 67 5f 6d 61 6a 6f  IFY(__clang_majo
15f30 72 5f 5f 29 0a 23 69 66 20 5f 5f 63 6c 61 6e 67  r__).#if __clang
15f40 5f 6d 69 6e 6f 72 5f 5f 20 3c 20 31 30 0a 09 09  _minor__ < 10...
15f50 09 20 20 20 20 22 30 22 0a 23 65 6e 64 69 66 0a  .    "0".#endif.
15f60 09 09 09 20 20 20 20 53 54 52 49 4e 47 49 46 59  ...    STRINGIFY
15f70 28 5f 5f 63 6c 61 6e 67 5f 6d 69 6e 6f 72 5f 5f  (__clang_minor__
15f80 29 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  ).#endif.#if def
15f90 69 6e 65 64 28 5f 5f 63 70 6c 75 73 70 6c 75 73  ined(__cplusplus
15fa0 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f  ) && !defined(__
15fb0 4f 42 4a 43 5f 5f 29 0a 09 09 09 20 20 20 20 22  OBJC__)....    "
15fc0 2e 63 70 6c 75 73 70 6c 75 73 22 0a 23 65 6e 64  .cplusplus".#end
15fd0 69 66 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  if.#ifndef NDEBU
15fe0 47 0a 09 09 09 20 20 20 20 22 2e 64 65 62 75 67  G....    ".debug
15ff0 22 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65  ".#endif.#if !de
16000 66 69 6e 65 64 28 5f 5f 63 6c 61 6e 67 5f 5f 29  fined(__clang__)
16010 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 49   && !defined(__I
16020 4e 54 45 4c 5f 43 4f 4d 50 49 4c 45 52 29 20 26  NTEL_COMPILER) &
16030 26 20 64 65 66 69 6e 65 64 28 5f 5f 47 4e 55 43  & defined(__GNUC
16040 5f 5f 29 0a 09 09 09 20 20 20 20 22 2e 67 63 63  __)....    ".gcc
16050 2d 22 20 53 54 52 49 4e 47 49 46 59 28 5f 5f 47  -" STRINGIFY(__G
16060 4e 55 43 5f 5f 29 0a 23 69 66 20 5f 5f 47 4e 55  NUC__).#if __GNU
16070 43 5f 4d 49 4e 4f 52 5f 5f 20 3c 20 31 30 0a 09  C_MINOR__ < 10..
16080 09 09 20 20 20 20 22 30 22 0a 23 65 6e 64 69 66  ..    "0".#endif
16090 0a 09 09 09 20 20 20 20 53 54 52 49 4e 47 49 46  ....    STRINGIF
160a0 59 28 5f 5f 47 4e 55 43 5f 4d 49 4e 4f 52 5f 5f  Y(__GNUC_MINOR__
160b0 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ).#endif.#ifdef 
160c0 5f 5f 49 4e 54 45 4c 5f 43 4f 4d 50 49 4c 45 52  __INTEL_COMPILER
160d0 0a 09 09 09 20 20 20 20 22 2e 69 63 63 2d 22 20  ....    ".icc-" 
160e0 53 54 52 49 4e 47 49 46 59 28 5f 5f 49 4e 54 45  STRINGIFY(__INTE
160f0 4c 5f 43 4f 4d 50 49 4c 45 52 29 0a 23 65 6e 64  L_COMPILER).#end
16100 69 66 0a 23 69 66 64 65 66 20 54 43 4c 5f 4d 45  if.#ifdef TCL_ME
16110 4d 5f 44 45 42 55 47 0a 09 09 09 20 20 20 20 22  M_DEBUG....    "
16120 2e 6d 65 6d 64 65 62 75 67 22 0a 23 65 6e 64 69  .memdebug".#endi
16130 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 4d  f.#if defined(_M
16140 53 43 5f 56 45 52 29 0a 09 09 09 20 20 20 20 22  SC_VER)....    "
16150 2e 6d 73 76 63 2d 22 20 53 54 52 49 4e 47 49 46  .msvc-" STRINGIF
16160 59 28 5f 4d 53 43 5f 56 45 52 29 0a 23 65 6e 64  Y(_MSC_VER).#end
16170 69 66 0a 23 69 66 64 65 66 20 55 53 45 5f 4e 4d  if.#ifdef USE_NM
16180 41 4b 45 0a 09 09 09 20 20 20 20 22 2e 6e 6d 61  AKE....    ".nma
16190 6b 65 22 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64  ke".#endif.#ifnd
161a0 65 66 20 54 43 4c 5f 43 46 47 5f 4f 50 54 49 4d  ef TCL_CFG_OPTIM
161b0 49 5a 45 44 0a 09 09 09 20 20 20 20 22 2e 6e 6f  IZED....    ".no
161c0 2d 6f 70 74 69 6d 69 7a 65 22 0a 23 65 6e 64 69  -optimize".#endi
161d0 66 0a 23 69 66 64 65 66 20 5f 5f 4f 42 4a 43 5f  f.#ifdef __OBJC_
161e0 5f 0a 09 09 09 20 20 20 20 22 2e 6f 62 6a 65 63  _....    ".objec
161f0 74 69 76 65 2d 63 22 0a 23 69 66 20 64 65 66 69  tive-c".#if defi
16200 6e 65 64 28 5f 5f 63 70 6c 75 73 70 6c 75 73 29  ned(__cplusplus)
16210 0a 09 09 09 20 20 20 20 22 70 6c 75 73 70 6c 75  ....    "plusplu
16220 73 22 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66  s".#endif.#endif
16230 0a 23 69 66 64 65 66 20 54 43 4c 5f 43 46 47 5f  .#ifdef TCL_CFG_
16240 50 52 4f 46 49 4c 45 44 0a 09 09 09 20 20 20 20  PROFILED....    
16250 22 2e 70 72 6f 66 69 6c 65 22 0a 23 65 6e 64 69  ".profile".#endi
16260 66 0a 23 69 66 64 65 66 20 50 55 52 49 46 59 0a  f.#ifdef PURIFY.
16270 09 09 09 20 20 20 20 22 2e 70 75 72 69 66 79 22  ...    ".purify"
16280 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
16290 54 41 54 49 43 5f 42 55 49 4c 44 0a 09 09 09 20  TATIC_BUILD.... 
162a0 20 20 20 22 2e 73 74 61 74 69 63 22 0a 23 65 6e     ".static".#en
162b0 64 69 66 0a 09 09 29 2c 20 4e 55 4c 4c 29 3b 0a  dif...), NULL);.
162c0 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
162d0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a   TCL_OK;.}.../*.
162e0 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
162f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16300 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16310 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 20  --------*. *. * 
16320 54 6c 73 4c 69 62 53 68 75 74 64 6f 77 6e 20 2d  TlsLibShutdown -
16330 2d 0a 20 2a 0a 20 2a 09 53 68 75 74 64 6f 77 6e  -. *. *.Shutdown
16340 20 53 53 4c 20 6c 69 62 72 61 72 79 20 6f 6e 63   SSL library onc
16350 65 20 70 65 72 20 61 70 70 6c 69 63 61 74 69 6f  e per applicatio
16360 6e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  n. *. * Results:
16370 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54  . *.A standard T
16380 43 4c 20 72 65 73 75 6c 74 0a 20 2a 0a 20 2a 20  CL result. *. * 
16390 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
163a0 09 53 68 75 74 64 6f 77 6e 20 53 53 4c 20 6c 69  .Shutdown SSL li
163b0 62 72 61 72 79 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  brary. *. *-----
163c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
163d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
163e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
163f0 2d 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  -*. */.static in
16400 74 20 54 6c 73 4c 69 62 53 68 75 74 64 6f 77 6e  t TlsLibShutdown
16410 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65  (ClientData clie
16420 6e 74 44 61 74 61 29 20 7b 0a 20 20 20 20 42 49  ntData) {.    BI
16430 4f 5f 63 6c 65 61 6e 75 70 28 29 3b 0a 20 20 20  O_cleanup();.   
16440 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
16450 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  }../*. *--------
16460 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16470 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16480 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a  --------------*.
16490 20 2a 0a 20 2a 09 54 6c 73 4c 69 62 49 6e 69 74   *. *.TlsLibInit
164a0 20 2d 2d 0a 20 2a 0a 20 2a 09 49 6e 69 74 69 61   --. *. *.Initia
164b0 6c 69 7a 65 73 20 53 53 4c 20 6c 69 62 72 61 72  lizes SSL librar
164c0 79 20 6f 6e 63 65 20 70 65 72 20 61 70 70 6c 69  y once per appli
164d0 63 61 74 69 6f 6e 0a 20 2a 0a 20 2a 20 52 65 73  cation. *. * Res
164e0 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64  ults:. *.A stand
164f0 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 0a 20  ard Tcl result. 
16500 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
16510 73 3a 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a 65  s:. *.Initialize
16520 73 20 53 53 4c 20 6c 69 62 72 61 72 79 0a 20 2a  s SSL library. *
16530 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
16540 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16550 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16560 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 73  ---------*. */.s
16570 74 61 74 69 63 20 69 6e 74 20 54 6c 73 4c 69 62  tatic int TlsLib
16580 49 6e 69 74 28 29 20 7b 0a 20 20 20 20 73 74 61  Init() {.    sta
16590 74 69 63 20 69 6e 74 20 69 6e 69 74 69 61 6c 69  tic int initiali
165a0 7a 65 64 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70  zed = 0;..    dp
165b0 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
165c0 0a 0a 20 20 20 20 69 66 20 28 21 69 6e 69 74 69  ..    if (!initi
165d0 61 6c 69 7a 65 64 29 20 7b 0a 09 2f 2a 20 49 6e  alized) {../* In
165e0 69 74 69 61 6c 69 7a 65 20 42 4f 54 48 20 6c 69  itialize BOTH li
165f0 62 63 72 79 70 74 6f 20 61 6e 64 20 6c 69 62 73  bcrypto and libs
16600 73 6c 2e 20 2a 2f 0a 09 69 66 20 28 21 4f 50 45  sl. */..if (!OPE
16610 4e 53 53 4c 5f 69 6e 69 74 5f 73 73 6c 28 4f 50  NSSL_init_ssl(OP
16620 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f  ENSSL_INIT_LOAD_
16630 53 53 4c 5f 53 54 52 49 4e 47 53 20 7c 20 4f 50  SSL_STRINGS | OP
16640 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f  ENSSL_INIT_LOAD_
16650 43 52 59 50 54 4f 5f 53 54 52 49 4e 47 53 0a 09  CRYPTO_STRINGS..
16660 20 20 20 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e      | OPENSSL_IN
16670 49 54 5f 41 44 44 5f 41 4c 4c 5f 43 49 50 48 45  IT_ADD_ALL_CIPHE
16680 52 53 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49  RS | OPENSSL_INI
16690 54 5f 41 44 44 5f 41 4c 4c 5f 44 49 47 45 53 54  T_ADD_ALL_DIGEST
166a0 53 0a 09 20 20 20 20 7c 20 4f 50 45 4e 53 53 4c  S..    | OPENSSL
166b0 5f 49 4e 49 54 5f 4c 4f 41 44 5f 43 4f 4e 46 49  _INIT_LOAD_CONFI
166c0 47 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54  G | OPENSSL_INIT
166d0 5f 41 53 59 4e 43 2c 20 4e 55 4c 4c 29 29 20 7b  _ASYNC, NULL)) {
166e0 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
166f0 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20  _ERROR;..}.../* 
16700 43 72 65 61 74 65 20 42 49 4f 20 68 61 6e 64 6c  Create BIO handl
16710 65 72 73 20 2a 2f 0a 09 42 49 4f 5f 6e 65 77 5f  ers */..BIO_new_
16720 74 63 6c 28 4e 55 4c 4c 2c 20 30 29 3b 0a 09 0a  tcl(NULL, 0);...
16730 09 2f 2a 20 43 72 65 61 74 65 20 65 78 69 74 20  ./* Create exit 
16740 68 61 6e 64 6c 65 72 20 2a 2f 0a 09 54 63 6c 5f  handler */..Tcl_
16750 43 72 65 61 74 65 45 78 69 74 48 61 6e 64 6c 65  CreateExitHandle
16760 72 28 54 6c 73 4c 69 62 53 68 75 74 64 6f 77 6e  r(TlsLibShutdown
16770 2c 20 4e 55 4c 4c 29 3b 0a 09 69 6e 69 74 69 61  , NULL);..initia
16780 6c 69 7a 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d  lized = 1;.    }
16790 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
167a0 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 20 49 6e 69 74 20  OK;.}.../* Init 
167b0 73 63 72 69 70 74 20 2a 2f 0a 73 74 61 74 69 63  script */.static
167c0 20 63 6f 6e 73 74 20 63 68 61 72 20 74 6c 73 54   const char tlsT
167d0 63 6c 49 6e 69 74 53 63 72 69 70 74 5b 5d 20 3d  clInitScript[] =
167e0 20 7b 0a 23 69 6e 63 6c 75 64 65 20 22 74 6c 73   {.#include "tls
167f0 2e 74 63 6c 2e 68 22 0a 7d 3b 0a 0a 2f 2a 0a 20  .tcl.h".};../*. 
16800 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
16810 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16820 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16830 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16840 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 49  ----. *. * Tls_I
16850 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69  nit --. *. *.Thi
16860 73 20 69 73 20 61 20 70 61 63 6b 61 67 65 20 69  s is a package i
16870 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 70 72  nitialization pr
16880 6f 63 65 64 75 72 65 2c 20 77 68 69 63 68 20 69  ocedure, which i
16890 73 20 63 61 6c 6c 65 64 0a 20 2a 09 62 79 20 54  s called. *.by T
168a0 43 4c 20 77 68 65 6e 20 74 68 69 73 20 70 61 63  CL when this pac
168b0 6b 61 67 65 20 69 73 20 74 6f 20 62 65 20 61 64  kage is to be ad
168c0 64 65 64 20 74 6f 20 61 6e 20 69 6e 74 65 72 70  ded to an interp
168d0 72 65 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73  reter.. *. * Res
168e0 75 6c 74 73 3a 0a 20 2a 09 49 6e 69 74 69 61 6c  ults:. *.Initial
168f0 69 7a 65 73 20 73 74 72 75 63 74 75 72 65 73 20  izes structures 
16900 61 6e 64 20 63 72 65 61 74 65 73 20 63 6f 6d 6d  and creates comm
16910 61 6e 64 73 2e 0a 20 2a 0a 20 2a 20 53 69 64 65  ands.. *. * Side
16920 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 20 43 72   effects:. *. Cr
16930 65 61 74 65 20 74 68 65 20 63 6f 6d 6d 61 6e 64  eate the command
16940 73 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  s. *. *---------
16950 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16960 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16970 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16980 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a  ----------. */..
16990 23 69 66 20 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45  #if TCL_MAJOR_VE
169a0 52 53 49 4f 4e 20 3e 20 38 0a 23 64 65 66 69 6e  RSION > 8.#defin
169b0 65 20 4d 49 4e 5f 56 45 52 53 49 4f 4e 20 22 39  e MIN_VERSION "9
169c0 2e 30 22 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  .0".#else.#defin
169d0 65 20 4d 49 4e 5f 56 45 52 53 49 4f 4e 20 22 38  e MIN_VERSION "8
169e0 2e 35 22 0a 23 65 6e 64 69 66 0a 0a 44 4c 4c 45  .5".#endif..DLLE
169f0 58 50 4f 52 54 20 69 6e 74 20 54 6c 73 5f 49 6e  XPORT int Tls_In
16a00 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  it(Tcl_Interp *i
16a10 6e 74 65 72 70 29 20 7b 0a 0a 20 20 20 20 64 70  nterp) {..    dp
16a20 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
16a30 0a 0a 23 69 66 64 65 66 20 55 53 45 5f 54 43 4c  ..#ifdef USE_TCL
16a40 5f 53 54 55 42 53 0a 20 20 20 20 69 66 20 28 54  _STUBS.    if (T
16a50 63 6c 5f 49 6e 69 74 53 74 75 62 73 28 69 6e 74  cl_InitStubs(int
16a60 65 72 70 2c 20 4d 49 4e 5f 56 45 52 53 49 4f 4e  erp, MIN_VERSION
16a70 2c 20 30 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  , 0) == NULL) {.
16a80 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
16a90 52 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  R;.    }.#endif.
16aa0 20 20 20 20 69 66 20 28 54 63 6c 5f 50 6b 67 52      if (Tcl_PkgR
16ab0 65 71 75 69 72 65 28 69 6e 74 65 72 70 2c 20 22  equire(interp, "
16ac0 54 63 6c 22 2c 20 4d 49 4e 5f 56 45 52 53 49 4f  Tcl", MIN_VERSIO
16ad0 4e 2c 20 30 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b  N, 0) == NULL) {
16ae0 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
16af0 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  OR;.    }..    i
16b00 66 20 28 54 6c 73 4c 69 62 49 6e 69 74 28 29 20  f (TlsLibInit() 
16b10 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 54 63  != TCL_OK) {..Tc
16b20 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
16b30 6e 74 65 72 70 2c 20 22 63 6f 75 6c 64 20 6e 6f  nterp, "could no
16b40 74 20 69 6e 69 74 69 61 6c 69 7a 65 20 53 53 4c  t initialize SSL
16b50 20 6c 69 62 72 61 72 79 22 2c 20 28 63 68 61 72   library", (char
16b60 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75   *) NULL);..retu
16b70 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
16b80 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 43 72 65    }..    Tcl_Cre
16b90 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e  ateObjCommand(in
16ba0 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 63 69  terp, "::tls::ci
16bb0 70 68 65 72 73 22 2c 20 43 69 70 68 65 72 73 4f  phers", CiphersO
16bc0 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61  bjCmd, (ClientDa
16bd0 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43  ta) NULL, (Tcl_C
16be0 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20  mdDeleteProc *) 
16bf0 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43  NULL);.    Tcl_C
16c00 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28  reateObjCommand(
16c10 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a  interp, "::tls::
16c20 63 6f 6e 6e 65 63 74 69 6f 6e 22 2c 20 43 6f 6e  connection", Con
16c30 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d  nectionInfoObjCm
16c40 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20  d, (ClientData) 
16c50 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65  NULL, (Tcl_CmdDe
16c60 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c  leteProc *) NULL
16c70 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74  );.    Tcl_Creat
16c80 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eObjCommand(inte
16c90 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 68 61 6e 64  rp, "::tls::hand
16ca0 73 68 61 6b 65 22 2c 20 48 61 6e 64 73 68 61 6b  shake", Handshak
16cb0 65 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74  eObjCmd, (Client
16cc0 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c  Data) NULL, (Tcl
16cd0 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a  _CmdDeleteProc *
16ce0 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c  ) NULL);.    Tcl
16cf0 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e  _CreateObjComman
16d00 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73  d(interp, "::tls
16d10 3a 3a 69 6d 70 6f 72 74 22 2c 20 49 6d 70 6f 72  ::import", Impor
16d20 74 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74  tObjCmd, (Client
16d30 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c  Data) NULL, (Tcl
16d40 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a  _CmdDeleteProc *
16d50 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c  ) NULL);.    Tcl
16d60 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e  _CreateObjComman
16d70 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73  d(interp, "::tls
16d80 3a 3a 75 6e 69 6d 70 6f 72 74 22 2c 20 55 6e 69  ::unimport", Uni
16d90 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 28 43 6c  mportObjCmd, (Cl
16da0 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20  ientData) NULL, 
16db0 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72  (Tcl_CmdDeletePr
16dc0 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20  oc *) NULL);.   
16dd0 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
16de0 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a  mmand(interp, ":
16df0 3a 74 6c 73 3a 3a 75 6e 73 74 61 63 6b 22 2c 20  :tls::unstack", 
16e00 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c 20  UnimportObjCmd, 
16e10 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c  (ClientData) NUL
16e20 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74  L, (Tcl_CmdDelet
16e30 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a  eProc *) NULL);.
16e40 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62      Tcl_CreateOb
16e50 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  jCommand(interp,
16e60 20 22 3a 3a 74 6c 73 3a 3a 73 74 61 74 75 73 22   "::tls::status"
16e70 2c 20 53 74 61 74 75 73 4f 62 6a 43 6d 64 2c 20  , StatusObjCmd, 
16e80 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c  (ClientData) NUL
16e90 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74  L, (Tcl_CmdDelet
16ea0 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a  eProc *) NULL);.
16eb0 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62      Tcl_CreateOb
16ec0 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  jCommand(interp,
16ed0 20 22 3a 3a 74 6c 73 3a 3a 76 65 72 73 69 6f 6e   "::tls::version
16ee0 22 2c 20 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64  ", VersionObjCmd
16ef0 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e  , (ClientData) N
16f00 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c  ULL, (Tcl_CmdDel
16f10 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29  eteProc *) NULL)
16f20 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65  ;.    Tcl_Create
16f30 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
16f40 70 2c 20 22 3a 3a 74 6c 73 3a 3a 6d 69 73 63 22  p, "::tls::misc"
16f50 2c 20 4d 69 73 63 4f 62 6a 43 6d 64 2c 20 28 43  , MiscObjCmd, (C
16f60 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c  lientData) NULL,
16f70 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50   (Tcl_CmdDeleteP
16f80 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20  roc *) NULL);.  
16f90 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43    Tcl_CreateObjC
16fa0 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22  ommand(interp, "
16fb0 3a 3a 74 6c 73 3a 3a 70 72 6f 74 6f 63 6f 6c 73  ::tls::protocols
16fc0 22 2c 20 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43  ", ProtocolsObjC
16fd0 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29  md, (ClientData)
16fe0 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44   NULL, (Tcl_CmdD
16ff0 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c  eleteProc *) NUL
17000 4c 29 3b 0a 0a 20 20 20 20 42 75 69 6c 64 49 6e  L);..    BuildIn
17010 66 6f 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  foCommand(interp
17020 29 3b 0a 0a 20 20 20 20 69 66 20 28 69 6e 74 65  );..    if (inte
17030 72 70 20 26 26 20 54 63 6c 5f 45 76 61 6c 28 69  rp && Tcl_Eval(i
17040 6e 74 65 72 70 2c 20 74 6c 73 54 63 6c 49 6e 69  nterp, tlsTclIni
17050 74 53 63 72 69 70 74 29 20 21 3d 20 54 43 4c 5f  tScript) != TCL_
17060 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43  OK) {..return TC
17070 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
17080 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 50      return Tcl_P
17090 6b 67 50 72 6f 76 69 64 65 28 69 6e 74 65 72 70  kgProvide(interp
170a0 2c 20 50 41 43 4b 41 47 45 5f 4e 41 4d 45 2c 20  , PACKAGE_NAME, 
170b0 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 29  PACKAGE_VERSION)
170c0 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  ;.}../*. *------
170d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
170e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
170f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17100 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
17110 0a 20 2a 09 54 6c 73 5f 53 61 66 65 49 6e 69 74  . *.Tls_SafeInit
17120 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 69   --. *. *.This i
17130 73 20 61 20 70 61 63 6b 61 67 65 20 69 6e 69 74  s a package init
17140 69 61 6c 69 7a 61 74 69 6f 6e 20 70 72 6f 63 65  ialization proce
17150 64 75 72 65 20 66 6f 72 20 73 61 66 65 20 69 6e  dure for safe in
17160 74 65 72 70 73 2e 0a 20 2a 0a 20 2a 20 52 65 73  terps.. *. * Res
17170 75 6c 74 73 3a 0a 20 2a 09 53 61 6d 65 20 61 73  ults:. *.Same as
17180 20 6f 66 20 27 54 6c 73 5f 49 6e 69 74 27 0a 20   of 'Tls_Init'. 
17190 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
171a0 73 3a 0a 20 2a 09 53 61 6d 65 20 61 73 20 6f 66  s:. *.Same as of
171b0 20 27 54 6c 73 5f 49 6e 69 74 27 0a 20 2a 0a 20   'Tls_Init'. *. 
171c0 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
171d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
171e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
171f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17200 2d 2d 2d 2d 0a 20 2a 2f 0a 44 4c 4c 45 58 50 4f  ----. */.DLLEXPO
17210 52 54 20 69 6e 74 20 54 6c 73 5f 53 61 66 65 49  RT int Tls_SafeI
17220 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  nit(Tcl_Interp *
17230 69 6e 74 65 72 70 29 20 7b 0a 20 20 20 20 64 70  interp) {.    dp
17240 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
17250 0a 20 20 20 20 72 65 74 75 72 6e 20 54 6c 73 5f  .    return Tls_
17260 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 7d 0a  Init(interp);.}.