Hex Artifact Content

Artifact c568200b91505f57b3c4c15f9fdf2af506bbd0a1ab9fe09d9e57c1e0a1331d21:


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 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  peer.. *. * Resu
103c0 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61  lts:. *.A standa
103d0 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20  rd Tcl result.. 
103e0 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
103f0 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20  s:. *.None.. *. 
10400 2a 2d 2d 2d 2d 2d 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 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ----. */.static 
10450 69 6e 74 0a 53 74 61 74 75 73 4f 62 6a 43 6d 64  int.StatusObjCmd
10460 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65  (ClientData clie
10470 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65  ntData, Tcl_Inte
10480 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20  rp *interp, int 
10490 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63  objc, Tcl_Obj *c
104a0 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20  onst objv[]) {. 
104b0 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50     State *stateP
104c0 74 72 3b 0a 20 20 20 20 58 35 30 39 20 2a 70 65  tr;.    X509 *pe
104d0 65 72 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  er;.    Tcl_Obj 
104e0 2a 6f 62 6a 50 74 72 3b 0a 20 20 20 20 54 63 6c  *objPtr;.    Tcl
104f0 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a 20  _Channel chan;. 
10500 20 20 20 63 68 61 72 20 2a 63 68 61 6e 6e 65 6c     char *channel
10510 4e 61 6d 65 2c 20 2a 63 69 70 68 65 72 73 3b 0a  Name, *ciphers;.
10520 20 20 20 20 69 6e 74 20 6d 6f 64 65 3b 0a 20 20      int mode;.  
10530 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
10540 20 63 68 61 72 20 2a 70 72 6f 74 6f 3b 0a 20 20   char *proto;.  
10550 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6c    unsigned int l
10560 65 6e 3b 0a 20 20 20 20 69 6e 74 20 6e 69 64 2c  en;.    int nid,
10570 20 72 65 73 3b 0a 20 20 20 20 28 76 6f 69 64 29   res;.    (void)
10580 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20   clientData;..  
10590 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
105a0 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62  d");..    if (ob
105b0 6a 63 20 3c 20 32 20 7c 7c 20 6f 62 6a 63 20 3e  jc < 2 || objc >
105c0 20 33 20 7c 7c 20 28 6f 62 6a 63 20 3d 3d 20 33   3 || (objc == 3
105d0 20 26 26 20 21 73 74 72 63 6d 70 28 54 63 6c 5f   && !strcmp(Tcl_
105e0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
105f0 5d 29 2c 20 22 2d 6c 6f 63 61 6c 22 29 29 29 20  ]), "-local"))) 
10600 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41  {..Tcl_WrongNumA
10610 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
10620 62 6a 76 2c 20 22 3f 2d 6c 6f 63 61 6c 3f 20 63  bjv, "?-local? c
10630 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72  hannel");..retur
10640 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
10650 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 63   }..    /* Get c
10660 68 61 6e 6e 65 6c 20 49 64 20 2a 2f 0a 20 20 20  hannel Id */.   
10670 20 63 68 61 6e 6e 65 6c 4e 61 6d 65 20 3d 20 54   channelName = T
10680 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
10690 76 5b 28 6f 62 6a 63 20 3d 3d 20 32 20 3f 20 31  v[(objc == 2 ? 1
106a0 20 3a 20 32 29 5d 29 3b 0a 20 20 20 20 63 68 61   : 2)]);.    cha
106b0 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e  n = Tcl_GetChann
106c0 65 6c 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 6e  el(interp, chann
106d0 65 6c 4e 61 6d 65 2c 20 26 6d 6f 64 65 29 3b 0a  elName, &mode);.
106e0 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20      if (chan == 
106f0 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55  (Tcl_Channel) NU
10700 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43  LL) {..return TC
10710 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
10720 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
10730 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74   to operate on t
10740 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e  he topmost chann
10750 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d  el */.    chan =
10760 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e   Tcl_GetTopChann
10770 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 69 66  el(chan);.    if
10780 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c   (Tcl_GetChannel
10790 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c  Type(chan) != Tl
107a0 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29  s_ChannelType())
107b0 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65   {..Tcl_AppendRe
107c0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61  sult(interp, "ba
107d0 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54  d channel \"", T
107e0 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d  cl_GetChannelNam
107f0 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20  e(chan),..."\": 
10800 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65  not a TLS channe
10810 6c 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  l", (char *) NUL
10820 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f  L);..Tcl_SetErro
10830 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54  rCode(interp, "T
10840 4c 53 22 2c 20 22 53 54 41 54 55 53 22 2c 20 22  LS", "STATUS", "
10850 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c  CHANNEL", "INVAL
10860 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  ID", (char *) NU
10870 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  LL);..return TCL
10880 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
10890 20 20 73 74 61 74 65 50 74 72 20 3d 20 28 53 74    statePtr = (St
108a0 61 74 65 20 2a 29 20 54 63 6c 5f 47 65 74 43 68  ate *) Tcl_GetCh
108b0 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74  annelInstanceDat
108c0 61 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 2f 2a  a(chan);..    /*
108d0 20 47 65 74 20 63 65 72 74 69 66 69 63 61 74 65   Get certificate
108e0 20 66 6f 72 20 70 65 65 72 20 6f 72 20 73 65 6c   for peer or sel
108f0 66 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f 62 6a  f */.    if (obj
10900 63 20 3d 3d 20 32 29 20 7b 0a 09 70 65 65 72 20  c == 2) {..peer 
10910 3d 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f 63  = SSL_get_peer_c
10920 65 72 74 69 66 69 63 61 74 65 28 73 74 61 74 65  ertificate(state
10930 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d  Ptr->ssl);.    }
10940 20 65 6c 73 65 20 7b 0a 09 70 65 65 72 20 3d 20   else {..peer = 
10950 53 53 4c 5f 67 65 74 5f 63 65 72 74 69 66 69 63  SSL_get_certific
10960 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73  ate(statePtr->ss
10970 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  l);.    }.    /*
10980 20 47 65 74 20 58 35 30 39 20 63 65 72 74 69 66   Get X509 certif
10990 69 63 61 74 65 20 69 6e 66 6f 20 2a 2f 0a 20 20  icate info */.  
109a0 20 20 69 66 20 28 70 65 65 72 29 20 7b 0a 09 6f    if (peer) {..o
109b0 62 6a 50 74 72 20 3d 20 54 6c 73 5f 4e 65 77 58  bjPtr = Tls_NewX
109c0 35 30 39 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70  509Obj(interp, p
109d0 65 65 72 29 3b 0a 09 69 66 20 28 6f 62 6a 63 20  eer);..if (objc 
109e0 3d 3d 20 32 29 20 7b 0a 09 20 20 20 20 58 35 30  == 2) {..    X50
109f0 39 5f 66 72 65 65 28 70 65 65 72 29 3b 0a 09 20  9_free(peer);.. 
10a00 20 20 20 70 65 65 72 20 3d 20 4e 55 4c 4c 3b 0a     peer = NULL;.
10a10 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  .}.    } else {.
10a20 09 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65  .objPtr = Tcl_Ne
10a30 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c  wListObj(0, NULL
10a40 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
10a50 20 50 65 65 72 20 6e 61 6d 65 20 2a 2f 0a 20 20   Peer name */.  
10a60 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e    LAPPEND_STR(in
10a70 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70  terp, objPtr, "p
10a80 65 65 72 6e 61 6d 65 22 2c 20 53 53 4c 5f 67 65  eername", SSL_ge
10a90 74 30 5f 70 65 65 72 6e 61 6d 65 28 73 74 61 74  t0_peername(stat
10aa0 65 50 74 72 2d 3e 73 73 6c 29 2c 20 2d 31 29 3b  ePtr->ssl), -1);
10ab0 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 49 4e 54  .    LAPPEND_INT
10ac0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
10ad0 20 22 73 62 69 74 73 22 2c 20 53 53 4c 5f 67 65   "sbits", SSL_ge
10ae0 74 5f 63 69 70 68 65 72 5f 62 69 74 73 28 73 74  t_cipher_bits(st
10af0 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 4e 55 4c  atePtr->ssl, NUL
10b00 4c 29 29 3b 0a 0a 20 20 20 20 63 69 70 68 65 72  L));..    cipher
10b10 73 20 3d 20 28 63 68 61 72 2a 29 53 53 4c 5f 67  s = (char*)SSL_g
10b20 65 74 5f 63 69 70 68 65 72 28 73 74 61 74 65 50  et_cipher(stateP
10b30 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 4c 41  tr->ssl);.    LA
10b40 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
10b50 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65  , objPtr, "ciphe
10b60 72 22 2c 20 63 69 70 68 65 72 73 2c 20 2d 31 29  r", ciphers, -1)
10b70 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79  ;..    /* Verify
10b80 20 74 68 65 20 58 35 30 39 20 63 65 72 74 69 66   the X509 certif
10b90 69 63 61 74 65 20 70 72 65 73 65 6e 74 65 64 20  icate presented 
10ba0 62 79 20 74 68 65 20 70 65 65 72 20 2a 2f 0a 20  by the peer */. 
10bb0 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69     LAPPEND_STR(i
10bc0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
10bd0 76 65 72 69 66 79 52 65 73 75 6c 74 22 2c 0a 09  verifyResult",..
10be0 58 35 30 39 5f 76 65 72 69 66 79 5f 63 65 72 74  X509_verify_cert
10bf0 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 53 53  _error_string(SS
10c00 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 72 65 73  L_get_verify_res
10c10 75 6c 74 28 73 74 61 74 65 50 74 72 2d 3e 73 73  ult(statePtr->ss
10c20 6c 29 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f  l)), -1);..    /
10c30 2a 20 56 65 72 69 66 79 20 6d 6f 64 65 20 2a 2f  * Verify mode */
10c40 0a 20 20 20 20 6d 6f 64 65 20 3d 20 53 53 4c 5f  .    mode = SSL_
10c50 67 65 74 5f 76 65 72 69 66 79 5f 6d 6f 64 65 28  get_verify_mode(
10c60 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a  statePtr->ssl);.
10c70 20 20 20 20 69 66 20 28 6d 6f 64 65 20 26 26 20      if (mode && 
10c80 53 53 4c 5f 56 45 52 49 46 59 5f 4e 4f 4e 45 29  SSL_VERIFY_NONE)
10c90 20 7b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28   {..LAPPEND_STR(
10ca0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
10cb0 22 76 65 72 69 66 79 4d 6f 64 65 22 2c 20 22 6e  "verifyMode", "n
10cc0 6f 6e 65 22 2c 20 2d 31 29 3b 0a 20 20 20 20 7d  one", -1);.    }
10cd0 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 4f 62 6a   else {..Tcl_Obj
10ce0 20 2a 6c 69 73 74 4f 62 6a 50 74 72 20 3d 20 54   *listObjPtr = T
10cf0 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c  cl_NewListObj(0,
10d00 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 6d 6f 64   NULL);..if (mod
10d10 65 20 26 26 20 53 53 4c 5f 56 45 52 49 46 59 5f  e && SSL_VERIFY_
10d20 50 45 45 52 29 20 7b 0a 09 20 20 20 20 54 63 6c  PEER) {..    Tcl
10d30 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
10d40 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69  ement(interp, li
10d50 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  stObjPtr, Tcl_Ne
10d60 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 65 65 72  wStringObj("peer
10d70 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20  ", -1));..}..if 
10d80 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 52  (mode && SSL_VER
10d90 49 46 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50  IFY_FAIL_IF_NO_P
10da0 45 45 52 5f 43 45 52 54 29 20 7b 0a 09 20 20 20  EER_CERT) {..   
10db0 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
10dc0 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
10dd0 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 63  , listObjPtr, Tc
10de0 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
10df0 66 61 69 6c 20 69 66 20 6e 6f 20 70 65 65 72 20  fail if no peer 
10e00 63 65 72 74 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a  cert", -1));..}.
10e10 09 69 66 20 28 6d 6f 64 65 20 26 26 20 53 53 4c  .if (mode && SSL
10e20 5f 56 45 52 49 46 59 5f 43 4c 49 45 4e 54 5f 4f  _VERIFY_CLIENT_O
10e30 4e 43 45 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f  NCE) {..    Tcl_
10e40 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
10e50 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73  ment(interp, lis
10e60 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77  tObjPtr, Tcl_New
10e70 53 74 72 69 6e 67 4f 62 6a 28 22 63 6c 69 65 6e  StringObj("clien
10e80 74 20 6f 6e 63 65 22 2c 20 2d 31 29 29 3b 0a 09  t once", -1));..
10e90 7d 0a 09 69 66 20 28 6d 6f 64 65 20 26 26 20 53  }..if (mode && S
10ea0 53 4c 5f 56 45 52 49 46 59 5f 50 4f 53 54 5f 48  SL_VERIFY_POST_H
10eb0 41 4e 44 53 48 41 4b 45 29 20 7b 0a 09 20 20 20  ANDSHAKE) {..   
10ec0 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
10ed0 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
10ee0 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 63  , listObjPtr, Tc
10ef0 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
10f00 70 6f 73 74 20 68 61 6e 64 73 68 61 6b 65 22 2c  post handshake",
10f10 20 2d 31 29 29 3b 0a 09 7d 0a 09 4c 41 50 50 45   -1));..}..LAPPE
10f20 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 6f  ND_OBJ(interp, o
10f30 62 6a 50 74 72 2c 20 22 76 65 72 69 66 79 4d 6f  bjPtr, "verifyMo
10f40 64 65 22 2c 20 6c 69 73 74 4f 62 6a 50 74 72 29  de", listObjPtr)
10f50 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 56  .    }..    /* V
10f60 65 72 69 66 79 20 6d 6f 64 65 20 64 65 70 74 68  erify mode depth
10f70 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f   */.    LAPPEND_
10f80 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  INT(interp, objP
10f90 74 72 2c 20 22 76 65 72 69 66 79 44 65 70 74 68  tr, "verifyDepth
10fa0 22 2c 20 53 53 4c 5f 67 65 74 5f 76 65 72 69 66  ", SSL_get_verif
10fb0 79 5f 64 65 70 74 68 28 73 74 61 74 65 50 74 72  y_depth(statePtr
10fc0 2d 3e 73 73 6c 29 29 3b 0a 0a 20 20 20 20 2f 2a  ->ssl));..    /*
10fd0 20 52 65 70 6f 72 74 20 74 68 65 20 73 65 6c 65   Report the sele
10fe0 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73  cted protocol as
10ff0 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65   a result of the
11000 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a   negotiation */.
11010 20 20 20 20 53 53 4c 5f 67 65 74 30 5f 61 6c 70      SSL_get0_alp
11020 6e 5f 73 65 6c 65 63 74 65 64 28 73 74 61 74 65  n_selected(state
11030 50 74 72 2d 3e 73 73 6c 2c 20 26 70 72 6f 74 6f  Ptr->ssl, &proto
11040 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 4c 41 50  , &len);.    LAP
11050 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
11060 20 6f 62 6a 50 74 72 2c 20 22 61 6c 70 6e 22 2c   objPtr, "alpn",
11070 20 28 63 68 61 72 20 2a 29 70 72 6f 74 6f 2c 20   (char *)proto, 
11080 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 29 3b  (Tcl_Size) len);
11090 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52  .    LAPPEND_STR
110a0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
110b0 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 53 53 4c   "protocol", SSL
110c0 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 73 74 61  _get_version(sta
110d0 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20 2d 31 29  tePtr->ssl), -1)
110e0 3b 0a 0a 20 20 20 20 2f 2a 20 56 61 6c 69 64 20  ;..    /* Valid 
110f0 66 6f 72 20 6e 6f 6e 2d 52 53 41 20 73 69 67 6e  for non-RSA sign
11100 61 74 75 72 65 20 61 6e 64 20 54 4c 53 20 31 2e  ature and TLS 1.
11110 33 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f 62 6a  3 */.    if (obj
11120 63 20 3d 3d 20 32 29 20 7b 0a 09 72 65 73 20 3d  c == 2) {..res =
11130 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f 73 69   SSL_get_peer_si
11140 67 6e 61 74 75 72 65 5f 6e 69 64 28 73 74 61 74  gnature_nid(stat
11150 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29  ePtr->ssl, &nid)
11160 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
11170 72 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f 73 69  res = SSL_get_si
11180 67 6e 61 74 75 72 65 5f 6e 69 64 28 73 74 61 74  gnature_nid(stat
11190 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29  ePtr->ssl, &nid)
111a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
111b0 21 72 65 73 29 20 7b 6e 69 64 20 3d 20 30 3b 7d  !res) {nid = 0;}
111c0 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52  .    LAPPEND_STR
111d0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
111e0 20 22 73 69 67 6e 61 74 75 72 65 48 61 73 68 41   "signatureHashA
111f0 6c 67 6f 72 69 74 68 6d 22 2c 20 4f 42 4a 5f 6e  lgorithm", OBJ_n
11200 69 64 32 6c 6e 28 6e 69 64 29 2c 20 2d 31 29 3b  id2ln(nid), -1);
11210 0a 0a 20 20 20 20 2f 2a 20 41 64 64 65 64 20 69  ..    /* Added i
11220 6e 20 4f 70 65 6e 53 53 4c 20 31 2e 31 2e 31 61  n OpenSSL 1.1.1a
11230 20 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f   */.#if OPENSSL_
11240 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e  VERSION_NUMBER >
11250 20 30 78 31 30 31 30 31 30 30 30 4c 0a 20 20 20   0x10101000L.   
11260 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20   if (objc == 2) 
11270 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67 65 74  {..res = SSL_get
11280 5f 70 65 65 72 5f 73 69 67 6e 61 74 75 72 65 5f  _peer_signature_
11290 74 79 70 65 5f 6e 69 64 28 73 74 61 74 65 50 74  type_nid(statePt
112a0 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 3b 0a 20  r->ssl, &nid);. 
112b0 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73     } else {..res
112c0 20 3d 20 53 53 4c 5f 67 65 74 5f 73 69 67 6e 61   = SSL_get_signa
112d0 74 75 72 65 5f 74 79 70 65 5f 6e 69 64 28 73 74  ture_type_nid(st
112e0 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69  atePtr->ssl, &ni
112f0 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  d);.    }.    if
11300 20 28 21 72 65 73 29 20 7b 6e 69 64 20 3d 20 30   (!res) {nid = 0
11310 3b 7d 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53  ;}.    LAPPEND_S
11320 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  TR(interp, objPt
11330 72 2c 20 22 73 69 67 6e 61 74 75 72 65 54 79 70  r, "signatureTyp
11340 65 22 2c 20 4f 42 4a 5f 6e 69 64 32 6c 6e 28 6e  e", OBJ_nid2ln(n
11350 69 64 29 2c 20 2d 31 29 3b 0a 23 65 6e 64 69 66  id), -1);.#endif
11360 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a  ..    Tcl_SetObj
11370 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f  Result(interp, o
11380 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75  bjPtr);.    retu
11390 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f  rn TCL_OK;.}.../
113a0 2a 0a 20 2a 2d 2d 2d 2d 2d 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 0a 20 2a 0a 20 2a 20 43 6f  -------. *. * Co
113f0 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43  nnectionInfoObjC
11400 6d 64 20 2d 2d 20 72 65 74 75 72 6e 20 63 6f 6e  md -- return con
11410 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 20 66 72 6f  nection info fro
11420 6d 20 4f 70 65 6e 53 53 4c 2e 0a 20 2a 0a 20 2a  m OpenSSL.. *. *
11430 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 6c   Results:. *.A l
11440 69 73 74 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f  ist of connectio
11450 6e 20 69 6e 66 6f 0a 20 20 2a 0a 20 2a 2d 2d 2d  n info.  *. *---
11460 2d 2d 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 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74  . */..static int
114b0 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f   ConnectionInfoO
114c0 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61  bjCmd(ClientData
114d0 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c   clientData, Tcl
114e0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
114f0 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f   int objc, Tcl_O
11500 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d  bj *const objv[]
11510 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e  ) {.    Tcl_Chan
11520 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68  nel chan;../* Th
11530 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74  e channel to set
11540 20 61 20 6d 6f 64 65 20 6f 6e 20 2a 2f 0a 20 20   a mode on */.  
11550 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74    State *statePt
11560 72 3b 09 09 2f 2a 20 63 6c 69 65 6e 74 20 73 74  r;../* client st
11570 61 74 65 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b  ate for ssl sock
11580 65 74 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62  et */.    Tcl_Ob
11590 6a 20 2a 6f 62 6a 50 74 72 2c 20 2a 6c 69 73 74  j *objPtr, *list
115a0 50 74 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53  Ptr;.    const S
115b0 53 4c 20 2a 73 73 6c 3b 0a 20 20 20 20 63 6f 6e  SL *ssl;.    con
115c0 73 74 20 53 53 4c 5f 43 49 50 48 45 52 20 2a 63  st SSL_CIPHER *c
115d0 69 70 68 65 72 3b 0a 20 20 20 20 63 6f 6e 73 74  ipher;.    const
115e0 20 53 53 4c 5f 53 45 53 53 49 4f 4e 20 2a 73 65   SSL_SESSION *se
115f0 73 73 69 6f 6e 3b 0a 20 20 20 20 63 6f 6e 73 74  ssion;.    const
11600 20 45 56 50 5f 4d 44 20 2a 6d 64 3b 0a 20 20 20   EVP_MD *md;.   
11610 20 28 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 61   (void) clientDa
11620 74 61 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a  ta;..    if (obj
11630 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57  c != 2) {..Tcl_W
11640 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
11650 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68  rp, 1, objv, "ch
11660 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e  annel");..return
11670 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
11680 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63  }..    chan = Tc
11690 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74  l_GetChannel(int
116a0 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
116b0 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c  ng(objv[1]), NUL
116c0 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e  L);.    if (chan
116d0 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c   == (Tcl_Channel
116e0 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  ) NULL) {..retur
116f0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
11700 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20   }..    /* Make 
11710 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20  sure to operate 
11720 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63  on the topmost c
11730 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68  hannel */.    ch
11740 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43  an = Tcl_GetTopC
11750 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20  hannel(chan);.  
11760 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61    if (Tcl_GetCha
11770 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21  nnelType(chan) !
11780 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70  = Tls_ChannelTyp
11790 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65  e()) {..Tcl_Appe
117a0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
117b0 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22   "bad channel \"
117c0 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  ", Tcl_GetChanne
117d0 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 20 20  lName(chan),..  
117e0 20 20 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53    "\": not a TLS
117f0 20 63 68 61 6e 6e 65 6c 22 2c 20 28 63 68 61 72   channel", (char
11800 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f   *) NULL);..Tcl_
11810 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74  SetErrorCode(int
11820 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 43 4f 4e  erp, "TLS", "CON
11830 4e 45 43 54 49 4f 4e 22 2c 20 22 43 48 41 4e 4e  NECTION", "CHANN
11840 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20  EL", "INVALID", 
11850 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
11860 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
11870 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6f 62  R;.    }..    ob
11880 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69  jPtr = Tcl_NewLi
11890 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a  stObj(0, NULL);.
118a0 0a 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69  .    /* Connecti
118b0 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 73  on info */.    s
118c0 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65  tatePtr = (State
118d0 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65   *)Tcl_GetChanne
118e0 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68  lInstanceData(ch
118f0 61 6e 29 3b 0a 20 20 20 20 73 73 6c 20 3d 20 73  an);.    ssl = s
11900 74 61 74 65 50 74 72 2d 3e 73 73 6c 3b 0a 20 20  tatePtr->ssl;.  
11910 20 20 69 66 20 28 73 73 6c 20 21 3d 20 4e 55 4c    if (ssl != NUL
11920 4c 29 20 7b 0a 09 2f 2a 20 63 6f 6e 6e 65 63 74  L) {../* connect
11930 69 6f 6e 20 73 74 61 74 65 20 2a 2f 0a 09 4c 41  ion state */..LA
11940 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
11950 2c 20 6f 62 6a 50 74 72 2c 20 22 73 74 61 74 65  , objPtr, "state
11960 22 2c 20 53 53 4c 5f 73 74 61 74 65 5f 73 74 72  ", SSL_state_str
11970 69 6e 67 5f 6c 6f 6e 67 28 73 73 6c 29 2c 20 2d  ing_long(ssl), -
11980 31 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 53 4e 49  1);.../* Get SNI
11990 20 72 65 71 75 65 73 74 65 64 20 73 65 72 76 65   requested serve
119a0 72 20 6e 61 6d 65 20 2a 2f 0a 09 4c 41 50 50 45  r name */..LAPPE
119b0 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f  ND_STR(interp, o
119c0 62 6a 50 74 72 2c 20 22 73 65 72 76 65 72 6e 61  bjPtr, "serverna
119d0 6d 65 22 2c 20 53 53 4c 5f 67 65 74 5f 73 65 72  me", SSL_get_ser
119e0 76 65 72 6e 61 6d 65 28 73 73 6c 2c 20 54 4c 53  vername(ssl, TLS
119f0 45 58 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73  EXT_NAMETYPE_hos
11a00 74 5f 6e 61 6d 65 29 2c 20 2d 31 29 3b 0a 0a 09  t_name), -1);...
11a10 2f 2a 20 47 65 74 20 70 72 6f 74 6f 63 6f 6c 20  /* Get protocol 
11a20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28  */..LAPPEND_STR(
11a30 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
11a40 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 53 53 4c 5f  "protocol", SSL_
11a50 67 65 74 5f 76 65 72 73 69 6f 6e 28 73 73 6c 29  get_version(ssl)
11a60 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 52 65 6e 65  , -1);.../* Rene
11a70 67 6f 74 69 61 74 69 6f 6e 20 61 6c 6c 6f 77 65  gotiation allowe
11a80 64 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f  d */..LAPPEND_BO
11a90 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  OL(interp, objPt
11aa0 72 2c 20 22 72 65 6e 65 67 6f 74 69 61 74 69 6f  r, "renegotiatio
11ab0 6e 5f 61 6c 6c 6f 77 65 64 22 2c 20 53 53 4c 5f  n_allowed", SSL_
11ac0 67 65 74 5f 73 65 63 75 72 65 5f 72 65 6e 65 67  get_secure_reneg
11ad0 6f 74 69 61 74 69 6f 6e 5f 73 75 70 70 6f 72 74  otiation_support
11ae0 28 28 53 53 4c 20 2a 29 20 73 73 6c 29 29 3b 0a  ((SSL *) ssl));.
11af0 0a 09 2f 2a 20 47 65 74 20 73 65 63 75 72 69 74  ../* Get securit
11b00 79 20 6c 65 76 65 6c 20 2a 2f 0a 09 4c 41 50 50  y level */..LAPP
11b10 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20  END_INT(interp, 
11b20 6f 62 6a 50 74 72 2c 20 22 73 65 63 75 72 69 74  objPtr, "securit
11b30 79 5f 6c 65 76 65 6c 22 2c 20 53 53 4c 5f 67 65  y_level", SSL_ge
11b40 74 5f 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c  t_security_level
11b50 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 53 65 73  (ssl));.../* Ses
11b60 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 09 4c 41  sion info */..LA
11b70 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72  PPEND_BOOL(inter
11b80 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 73  p, objPtr, "sess
11b90 69 6f 6e 5f 72 65 75 73 65 64 22 2c 20 53 53 4c  ion_reused", SSL
11ba0 5f 73 65 73 73 69 6f 6e 5f 72 65 75 73 65 64 28  _session_reused(
11bb0 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 49 73 20 73  ssl));.../* Is s
11bc0 65 72 76 65 72 20 69 6e 66 6f 20 2a 2f 0a 09 4c  erver info */..L
11bd0 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65  APPEND_BOOL(inte
11be0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 69 73 5f  rp, objPtr, "is_
11bf0 73 65 72 76 65 72 22 2c 20 53 53 4c 5f 69 73 5f  server", SSL_is_
11c00 73 65 72 76 65 72 28 73 73 6c 29 29 3b 0a 0a 09  server(ssl));...
11c10 2f 2a 20 49 73 20 44 54 4c 53 20 2a 2f 0a 09 4c  /* Is DTLS */..L
11c20 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65  APPEND_BOOL(inte
11c30 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 69 73 5f  rp, objPtr, "is_
11c40 64 74 6c 73 22 2c 20 53 53 4c 5f 69 73 5f 64 74  dtls", SSL_is_dt
11c50 6c 73 28 73 73 6c 29 29 3b 0a 20 20 20 20 7d 0a  ls(ssl));.    }.
11c60 0a 20 20 20 20 2f 2a 20 43 69 70 68 65 72 20 69  .    /* Cipher i
11c70 6e 66 6f 20 2a 2f 0a 20 20 20 20 63 69 70 68 65  nfo */.    ciphe
11c80 72 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75 72 72  r = SSL_get_curr
11c90 65 6e 74 5f 63 69 70 68 65 72 28 73 73 6c 29 3b  ent_cipher(ssl);
11ca0 0a 20 20 20 20 69 66 20 28 63 69 70 68 65 72 20  .    if (cipher 
11cb0 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 68 61 72  != NULL) {..char
11cc0 20 62 75 66 5b 42 55 46 53 49 5a 5d 20 3d 20 7b   buf[BUFSIZ] = {
11cd0 30 7d 3b 0a 09 69 6e 74 20 62 69 74 73 2c 20 61  0};..int bits, a
11ce0 6c 67 5f 62 69 74 73 3b 0a 0a 09 2f 2a 20 43 69  lg_bits;.../* Ci
11cf0 70 68 65 72 20 6e 61 6d 65 20 2a 2f 0a 09 4c 41  pher name */..LA
11d00 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
11d10 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65  , objPtr, "ciphe
11d20 72 22 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f 67  r", SSL_CIPHER_g
11d30 65 74 5f 6e 61 6d 65 28 63 69 70 68 65 72 29 2c  et_name(cipher),
11d40 20 2d 31 29 3b 0a 0a 09 2f 2a 20 52 46 43 20 6e   -1);.../* RFC n
11d50 61 6d 65 20 6f 66 20 63 69 70 68 65 72 20 2a 2f  ame of cipher */
11d60 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e  ..LAPPEND_STR(in
11d70 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73  terp, objPtr, "s
11d80 74 61 6e 64 61 72 64 5f 6e 61 6d 65 22 2c 20 53  tandard_name", S
11d90 53 4c 5f 43 49 50 48 45 52 5f 73 74 61 6e 64 61  SL_CIPHER_standa
11da0 72 64 5f 6e 61 6d 65 28 63 69 70 68 65 72 29 2c  rd_name(cipher),
11db0 20 2d 31 29 3b 0a 0a 09 2f 2a 20 4f 70 65 6e 53   -1);.../* OpenS
11dc0 53 4c 20 6e 61 6d 65 20 6f 66 20 63 69 70 68 65  SL name of ciphe
11dd0 72 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54  r */..LAPPEND_ST
11de0 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  R(interp, objPtr
11df0 2c 20 22 6f 70 65 6e 73 73 6c 5f 6e 61 6d 65 22  , "openssl_name"
11e00 2c 20 4f 50 45 4e 53 53 4c 5f 63 69 70 68 65 72  , OPENSSL_cipher
11e10 5f 6e 61 6d 65 28 53 53 4c 5f 43 49 50 48 45 52  _name(SSL_CIPHER
11e20 5f 73 74 61 6e 64 61 72 64 5f 6e 61 6d 65 28 63  _standard_name(c
11e30 69 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a 0a 09  ipher)), -1);...
11e40 2f 2a 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 63  /* number of sec
11e50 72 65 74 20 62 69 74 73 20 75 73 65 64 20 66 6f  ret bits used fo
11e60 72 20 63 69 70 68 65 72 20 2a 2f 0a 09 62 69 74  r cipher */..bit
11e70 73 20 3d 20 53 53 4c 5f 43 49 50 48 45 52 5f 67  s = SSL_CIPHER_g
11e80 65 74 5f 62 69 74 73 28 63 69 70 68 65 72 2c 20  et_bits(cipher, 
11e90 26 61 6c 67 5f 62 69 74 73 29 3b 0a 09 4c 41 50  &alg_bits);..LAP
11ea0 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c  PEND_INT(interp,
11eb0 20 6f 62 6a 50 74 72 2c 20 22 73 65 63 72 65 74   objPtr, "secret
11ec0 5f 62 69 74 73 22 2c 20 62 69 74 73 29 3b 0a 09  _bits", bits);..
11ed0 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65  LAPPEND_INT(inte
11ee0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61 6c 67  rp, objPtr, "alg
11ef0 6f 72 69 74 68 6d 5f 62 69 74 73 22 2c 20 61 6c  orithm_bits", al
11f00 67 5f 62 69 74 73 29 3b 0a 09 2f 2a 20 61 6c 67  g_bits);../* alg
11f10 5f 62 69 74 73 20 69 73 20 61 63 74 75 61 6c 20  _bits is actual 
11f20 6b 65 79 20 73 65 63 72 65 74 20 62 69 74 73 2e  key secret bits.
11f30 20 49 66 20 75 73 65 20 62 69 74 73 20 61 6e 64   If use bits and
11f40 20 73 65 63 72 65 74 20 28 61 6c 67 6f 72 69 74   secret (algorit
11f50 68 6d 29 20 62 69 74 73 20 64 69 66 66 65 72 2c  hm) bits differ,
11f60 0a 09 20 20 20 74 68 65 20 72 65 73 74 20 6f 66  ..   the rest of
11f70 20 74 68 65 20 62 69 74 73 20 61 72 65 20 66 69   the bits are fi
11f80 78 65 64 2c 20 69 2e 65 2e 20 66 6f 72 20 6c 69  xed, i.e. for li
11f90 6d 69 74 65 64 20 65 78 70 6f 72 74 20 63 69 70  mited export cip
11fa0 68 65 72 73 20 28 62 69 74 73 20 3c 20 35 36 29  hers (bits < 56)
11fb0 20 2a 2f 0a 0a 09 2f 2a 20 49 6e 64 69 63 61 74   */.../* Indicat
11fc0 65 73 20 77 68 69 63 68 20 53 53 4c 2f 54 4c 53  es which SSL/TLS
11fd0 20 70 72 6f 74 6f 63 6f 6c 20 76 65 72 73 69 6f   protocol versio
11fe0 6e 20 66 69 72 73 74 20 64 65 66 69 6e 65 64 20  n first defined 
11ff0 74 68 65 20 63 69 70 68 65 72 20 2a 2f 0a 09 4c  the cipher */..L
12000 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
12010 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6d 69 6e 5f  p, objPtr, "min_
12020 76 65 72 73 69 6f 6e 22 2c 20 53 53 4c 5f 43 49  version", SSL_CI
12030 50 48 45 52 5f 67 65 74 5f 76 65 72 73 69 6f 6e  PHER_get_version
12040 28 63 69 70 68 65 72 29 2c 20 2d 31 29 3b 0a 0a  (cipher), -1);..
12050 09 2f 2a 20 43 69 70 68 65 72 20 4e 49 44 20 2a  ./* Cipher NID *
12060 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69  /..LAPPEND_STR(i
12070 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
12080 63 69 70 68 65 72 4e 49 44 22 2c 20 28 63 68 61  cipherNID", (cha
12090 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53  r *)OBJ_nid2ln(S
120a0 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 63 69  SL_CIPHER_get_ci
120b0 70 68 65 72 5f 6e 69 64 28 63 69 70 68 65 72 29  pher_nid(cipher)
120c0 29 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44  ), -1);..LAPPEND
120d0 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _STR(interp, obj
120e0 50 74 72 2c 20 22 64 69 67 65 73 74 4e 49 44 22  Ptr, "digestNID"
120f0 2c 20 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69  , (char *)OBJ_ni
12100 64 32 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f  d2ln(SSL_CIPHER_
12110 67 65 74 5f 64 69 67 65 73 74 5f 6e 69 64 28 63  get_digest_nid(c
12120 69 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a 09 4c  ipher)), -1);..L
12130 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
12140 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6b 65 79 45  p, objPtr, "keyE
12150 78 63 68 61 6e 67 65 4e 49 44 22 2c 20 28 63 68  xchangeNID", (ch
12160 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28  ar *)OBJ_nid2ln(
12170 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 6b  SSL_CIPHER_get_k
12180 78 5f 6e 69 64 28 63 69 70 68 65 72 29 29 2c 20  x_nid(cipher)), 
12190 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54  -1);..LAPPEND_ST
121a0 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  R(interp, objPtr
121b0 2c 20 22 61 75 74 68 65 6e 74 69 63 61 74 69 6f  , "authenticatio
121c0 6e 4e 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4f  nNID", (char *)O
121d0 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49  BJ_nid2ln(SSL_CI
121e0 50 48 45 52 5f 67 65 74 5f 61 75 74 68 5f 6e 69  PHER_get_auth_ni
121f0 64 28 63 69 70 68 65 72 29 29 2c 20 2d 31 29 3b  d(cipher)), -1);
12200 0a 0a 09 2f 2a 20 6d 65 73 73 61 67 65 20 61 75  .../* message au
12210 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 63 6f 64  thentication cod
12220 65 20 2d 20 43 69 70 68 65 72 20 69 73 20 41 45  e - Cipher is AE
12230 41 44 20 28 65 2e 67 2e 20 47 43 4d 20 6f 72 20  AD (e.g. GCM or 
12240 43 68 61 43 68 61 32 30 2f 50 6f 6c 79 31 33 30  ChaCha20/Poly130
12250 35 29 20 6f 72 20 6e 6f 74 20 2a 2f 0a 09 2f 2a  5) or not */../*
12260 20 41 75 74 68 65 6e 74 69 63 61 74 65 64 20 45   Authenticated E
12270 6e 63 72 79 70 74 69 6f 6e 20 77 69 74 68 20 61  ncryption with a
12280 73 73 6f 63 69 61 74 65 64 20 64 61 74 61 20 28  ssociated data (
12290 41 45 41 44 29 20 63 68 65 63 6b 20 2a 2f 0a 09  AEAD) check */..
122a0 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74  LAPPEND_BOOL(int
122b0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69  erp, objPtr, "ci
122c0 70 68 65 72 5f 69 73 5f 61 65 61 64 22 2c 20 53  pher_is_aead", S
122d0 53 4c 5f 43 49 50 48 45 52 5f 69 73 5f 61 65 61  SL_CIPHER_is_aea
122e0 64 28 63 69 70 68 65 72 29 29 3b 0a 0a 09 2f 2a  d(cipher));.../*
122f0 20 44 69 67 65 73 74 20 75 73 65 64 20 64 75 72   Digest used dur
12300 69 6e 67 20 74 68 65 20 53 53 4c 2f 54 4c 53 20  ing the SSL/TLS 
12310 68 61 6e 64 73 68 61 6b 65 20 77 68 65 6e 20 75  handshake when u
12320 73 69 6e 67 20 74 68 65 20 63 69 70 68 65 72 2e  sing the cipher.
12330 20 2a 2f 0a 09 6d 64 20 3d 20 53 53 4c 5f 43 49   */..md = SSL_CI
12340 50 48 45 52 5f 67 65 74 5f 68 61 6e 64 73 68 61  PHER_get_handsha
12350 6b 65 5f 64 69 67 65 73 74 28 63 69 70 68 65 72  ke_digest(cipher
12360 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28  );..LAPPEND_STR(
12370 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
12380 22 68 61 6e 64 73 68 61 6b 65 5f 64 69 67 65 73  "handshake_diges
12390 74 22 2c 20 28 63 68 61 72 20 2a 29 45 56 50 5f  t", (char *)EVP_
123a0 4d 44 5f 6e 61 6d 65 28 6d 64 29 2c 20 2d 31 29  MD_name(md), -1)
123b0 3b 0a 0a 09 2f 2a 20 47 65 74 20 4f 70 65 6e 53  ;.../* Get OpenS
123c0 53 4c 2d 73 70 65 63 69 66 69 63 20 49 44 2c 20  SL-specific ID, 
123d0 6e 6f 74 20 49 41 4e 41 20 49 44 20 2a 2f 0a 09  not IANA ID */..
123e0 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65  LAPPEND_INT(inte
123f0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70  rp, objPtr, "cip
12400 68 65 72 5f 69 64 22 2c 20 28 69 6e 74 29 20 53  her_id", (int) S
12410 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 69 64  SL_CIPHER_get_id
12420 28 63 69 70 68 65 72 29 29 3b 0a 0a 09 2f 2a 20  (cipher));.../* 
12430 54 77 6f 2d 62 79 74 65 20 49 44 20 75 73 65 64  Two-byte ID used
12440 20 69 6e 20 74 68 65 20 54 4c 53 20 70 72 6f 74   in the TLS prot
12450 6f 63 6f 6c 20 6f 66 20 74 68 65 20 67 69 76 65  ocol of the give
12460 6e 20 63 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50  n cipher */..LAP
12470 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c  PEND_INT(interp,
12480 20 6f 62 6a 50 74 72 2c 20 22 70 72 6f 74 6f 63   objPtr, "protoc
12490 6f 6c 5f 69 64 22 2c 20 28 69 6e 74 29 20 53 53  ol_id", (int) SS
124a0 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 70 72 6f  L_CIPHER_get_pro
124b0 74 6f 63 6f 6c 5f 69 64 28 63 69 70 68 65 72 29  tocol_id(cipher)
124c0 29 3b 0a 0a 09 2f 2a 20 54 65 78 74 75 61 6c 20  );.../* Textual 
124d0 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74  description of t
124e0 68 65 20 63 69 70 68 65 72 20 2a 2f 0a 09 69 66  he cipher */..if
124f0 20 28 53 53 4c 5f 43 49 50 48 45 52 5f 64 65 73   (SSL_CIPHER_des
12500 63 72 69 70 74 69 6f 6e 28 63 69 70 68 65 72 2c  cription(cipher,
12510 20 62 75 66 2c 20 73 69 7a 65 6f 66 28 62 75 66   buf, sizeof(buf
12520 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20  )) != NULL) {.. 
12530 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69     LAPPEND_STR(i
12540 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
12550 64 65 73 63 72 69 70 74 69 6f 6e 22 2c 20 62 75  description", bu
12560 66 2c 20 2d 31 29 3b 0a 09 7d 0a 20 20 20 20 7d  f, -1);..}.    }
12570 0a 0a 20 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e  ..    /* Session
12580 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 73 65 73   info */.    ses
12590 73 69 6f 6e 20 3d 20 53 53 4c 5f 67 65 74 5f 73  sion = SSL_get_s
125a0 65 73 73 69 6f 6e 28 73 73 6c 29 3b 0a 20 20 20  ession(ssl);.   
125b0 20 69 66 20 28 73 65 73 73 69 6f 6e 20 21 3d 20   if (session != 
125c0 4e 55 4c 4c 29 20 7b 0a 09 63 6f 6e 73 74 20 75  NULL) {..const u
125d0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 69  nsigned char *ti
125e0 63 6b 65 74 3b 0a 09 73 69 7a 65 5f 74 20 6c 65  cket;..size_t le
125f0 6e 32 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e  n2;..unsigned in
12600 74 20 75 6c 65 6e 3b 0a 09 63 6f 6e 73 74 20 75  t ulen;..const u
12610 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73 65  nsigned char *se
12620 73 73 69 6f 6e 5f 69 64 2c 20 2a 70 72 6f 74 6f  ssion_id, *proto
12630 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ;..unsigned char
12640 20 62 75 66 66 65 72 5b 53 53 4c 5f 4d 41 58 5f   buffer[SSL_MAX_
12650 4d 41 53 54 45 52 5f 4b 45 59 5f 4c 45 4e 47 54  MASTER_KEY_LENGT
12660 48 5d 3b 0a 0a 09 2f 2a 20 52 65 70 6f 72 74 20  H];.../* Report 
12670 74 68 65 20 73 65 6c 65 63 74 65 64 20 70 72 6f  the selected pro
12680 74 6f 63 6f 6c 20 61 73 20 61 20 72 65 73 75 6c  tocol as a resul
12690 74 20 6f 66 20 74 68 65 20 41 4c 50 4e 20 6e 65  t of the ALPN ne
126a0 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a 09 53 53  gotiation */..SS
126b0 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 61  L_SESSION_get0_a
126c0 6c 70 6e 5f 73 65 6c 65 63 74 65 64 28 73 65 73  lpn_selected(ses
126d0 73 69 6f 6e 2c 20 26 70 72 6f 74 6f 2c 20 26 6c  sion, &proto, &l
126e0 65 6e 32 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53  en2);..LAPPEND_S
126f0 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  TR(interp, objPt
12700 72 2c 20 22 61 6c 70 6e 22 2c 20 28 63 68 61 72  r, "alpn", (char
12710 20 2a 29 20 70 72 6f 74 6f 2c 20 28 54 63 6c 5f   *) proto, (Tcl_
12720 53 69 7a 65 29 20 6c 65 6e 32 29 3b 0a 0a 09 2f  Size) len2);.../
12730 2a 20 52 65 70 6f 72 74 20 74 68 65 20 73 65 6c  * Report the sel
12740 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61  ected protocol a
12750 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68  s a result of th
12760 65 20 4e 50 4e 20 6e 65 67 6f 74 69 61 74 69 6f  e NPN negotiatio
12770 6e 20 2a 2f 0a 23 69 66 64 65 66 20 55 53 45 5f  n */.#ifdef USE_
12780 4e 50 4e 0a 09 53 53 4c 5f 67 65 74 30 5f 6e 65  NPN..SSL_get0_ne
12790 78 74 5f 70 72 6f 74 6f 5f 6e 65 67 6f 74 69 61  xt_proto_negotia
127a0 74 65 64 28 73 73 6c 2c 20 26 70 72 6f 74 6f 2c  ted(ssl, &proto,
127b0 20 26 75 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e   &ulen);..LAPPEN
127c0 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62  D_STR(interp, ob
127d0 6a 50 74 72 2c 20 22 6e 70 6e 22 2c 20 28 63 68  jPtr, "npn", (ch
127e0 61 72 20 2a 29 20 70 72 6f 74 6f 2c 20 28 54 63  ar *) proto, (Tc
127f0 6c 5f 53 69 7a 65 29 20 75 6c 65 6e 29 3b 0a 23  l_Size) ulen);.#
12800 65 6e 64 69 66 0a 0a 09 2f 2a 20 52 65 73 75 6d  endif.../* Resum
12810 61 62 6c 65 20 73 65 73 73 69 6f 6e 20 2a 2f 0a  able session */.
12820 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e  .LAPPEND_BOOL(in
12830 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 72  terp, objPtr, "r
12840 65 73 75 6d 61 62 6c 65 22 2c 20 53 53 4c 5f 53  esumable", SSL_S
12850 45 53 53 49 4f 4e 5f 69 73 5f 72 65 73 75 6d 61  ESSION_is_resuma
12860 62 6c 65 28 73 65 73 73 69 6f 6e 29 29 3b 0a 0a  ble(session));..
12870 09 2f 2a 20 53 65 73 73 69 6f 6e 20 73 74 61 72  ./* Session star
12880 74 20 74 69 6d 65 20 28 73 65 63 6f 6e 64 73 20  t time (seconds 
12890 73 69 6e 63 65 20 65 70 6f 63 68 29 20 2a 2f 0a  since epoch) */.
128a0 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e  .LAPPEND_LONG(in
128b0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73  terp, objPtr, "s
128c0 74 61 72 74 5f 74 69 6d 65 22 2c 20 53 53 4c 5f  tart_time", SSL_
128d0 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 6d 65  SESSION_get_time
128e0 28 73 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a  (session));.../*
128f0 20 54 69 6d 65 6f 75 74 20 76 61 6c 75 65 20 2d   Timeout value -
12900 20 53 53 4c 5f 43 54 58 5f 67 65 74 5f 74 69 6d   SSL_CTX_get_tim
12910 65 6f 75 74 20 28 69 6e 20 73 65 63 6f 6e 64 73  eout (in seconds
12920 29 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f  ) */..LAPPEND_LO
12930 4e 47 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  NG(interp, objPt
12940 72 2c 20 22 74 69 6d 65 6f 75 74 22 2c 20 53 53  r, "timeout", SS
12950 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69  L_SESSION_get_ti
12960 6d 65 6f 75 74 28 73 65 73 73 69 6f 6e 29 29 3b  meout(session));
12970 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 69 64  .../* Session id
12980 20 2d 20 54 4c 53 76 31 2e 32 20 61 6e 64 20 62   - TLSv1.2 and b
12990 65 6c 6f 77 20 6f 6e 6c 79 20 2a 2f 0a 09 73 65  elow only */..se
129a0 73 73 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f 53  ssion_id = SSL_S
129b0 45 53 53 49 4f 4e 5f 67 65 74 5f 69 64 28 73 65  ESSION_get_id(se
129c0 73 73 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a 09  ssion, &ulen);..
129d0 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59 28 69  LAPPEND_BARRAY(i
129e0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
129f0 73 65 73 73 69 6f 6e 5f 69 64 22 2c 20 73 65 73  session_id", ses
12a00 73 69 6f 6e 5f 69 64 2c 20 28 54 63 6c 5f 53 69  sion_id, (Tcl_Si
12a10 7a 65 29 20 75 6c 65 6e 29 3b 0a 0a 09 2f 2a 20  ze) ulen);.../* 
12a20 53 65 73 73 69 6f 6e 20 63 6f 6e 74 65 78 74 20  Session context 
12a30 2a 2f 0a 09 73 65 73 73 69 6f 6e 5f 69 64 20 3d  */..session_id =
12a40 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74   SSL_SESSION_get
12a50 30 5f 69 64 5f 63 6f 6e 74 65 78 74 28 73 65 73  0_id_context(ses
12a60 73 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c  sion, &ulen);..L
12a70 41 50 50 45 4e 44 5f 42 41 52 52 41 59 28 69 6e  APPEND_BARRAY(in
12a80 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73  terp, objPtr, "s
12a90 65 73 73 69 6f 6e 5f 63 6f 6e 74 65 78 74 22 2c  ession_context",
12aa0 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 54 63   session_id, (Tc
12ab0 6c 5f 53 69 7a 65 29 20 75 6c 65 6e 29 3b 0a 0a  l_Size) ulen);..
12ac0 09 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69 63 6b  ./* Session tick
12ad0 65 74 20 2d 20 63 6c 69 65 6e 74 20 6f 6e 6c 79  et - client only
12ae0 20 2a 2f 0a 09 53 53 4c 5f 53 45 53 53 49 4f 4e   */..SSL_SESSION
12af0 5f 67 65 74 30 5f 74 69 63 6b 65 74 28 73 65 73  _get0_ticket(ses
12b00 73 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 26  sion, &ticket, &
12b10 6c 65 6e 32 29 3b 0a 09 4c 41 50 50 45 4e 44 5f  len2);..LAPPEND_
12b20 42 41 52 52 41 59 28 69 6e 74 65 72 70 2c 20 6f  BARRAY(interp, o
12b30 62 6a 50 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f  bjPtr, "session_
12b40 74 69 63 6b 65 74 22 2c 20 74 69 63 6b 65 74 2c  ticket", ticket,
12b50 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32   (Tcl_Size) len2
12b60 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20  );.../* Session 
12b70 74 69 63 6b 65 74 20 6c 69 66 65 74 69 6d 65 20  ticket lifetime 
12b80 68 69 6e 74 20 28 69 6e 20 73 65 63 6f 6e 64 73  hint (in seconds
12b90 29 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f  ) */..LAPPEND_LO
12ba0 4e 47 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  NG(interp, objPt
12bb0 72 2c 20 22 6c 69 66 65 74 69 6d 65 22 2c 20 53  r, "lifetime", S
12bc0 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74  SL_SESSION_get_t
12bd0 69 63 6b 65 74 5f 6c 69 66 65 74 69 6d 65 5f 68  icket_lifetime_h
12be0 69 6e 74 28 73 65 73 73 69 6f 6e 29 29 3b 0a 0a  int(session));..
12bf0 09 2f 2a 20 54 69 63 6b 65 74 20 61 70 70 20 64  ./* Ticket app d
12c00 61 74 61 20 2a 2f 0a 23 69 66 20 4f 50 45 4e 53  ata */.#if OPENS
12c10 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45  SL_VERSION_NUMBE
12c20 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a  R < 0x30000000L.
12c30 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74  .SSL_SESSION_get
12c40 30 5f 74 69 63 6b 65 74 5f 61 70 70 64 61 74 61  0_ticket_appdata
12c50 28 28 53 53 4c 5f 53 45 53 53 49 4f 4e 20 2a 29  ((SSL_SESSION *)
12c60 20 73 65 73 73 69 6f 6e 2c 20 26 74 69 63 6b 65   session, &ticke
12c70 74 2c 20 26 6c 65 6e 32 29 3b 0a 09 4c 41 50 50  t, &len2);..LAPP
12c80 45 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 65 72  END_BARRAY(inter
12c90 70 2c 20 6f 62 6a 50 74 72 2c 20 22 74 69 63 6b  p, objPtr, "tick
12ca0 65 74 5f 61 70 70 5f 64 61 74 61 22 2c 20 74 69  et_app_data", ti
12cb0 63 6b 65 74 2c 20 28 54 63 6c 5f 53 69 7a 65 29  cket, (Tcl_Size)
12cc0 20 6c 65 6e 32 29 3b 0a 23 65 6e 64 69 66 0a 0a   len2);.#endif..
12cd0 09 2f 2a 20 47 65 74 20 6d 61 73 74 65 72 20 6b  ./* Get master k
12ce0 65 79 20 2a 2f 0a 09 6c 65 6e 32 20 3d 20 53 53  ey */..len2 = SS
12cf0 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 6d 61  L_SESSION_get_ma
12d00 73 74 65 72 5f 6b 65 79 28 73 65 73 73 69 6f 6e  ster_key(session
12d10 2c 20 62 75 66 66 65 72 2c 20 53 53 4c 5f 4d 41  , buffer, SSL_MA
12d20 58 5f 4d 41 53 54 45 52 5f 4b 45 59 5f 4c 45 4e  X_MASTER_KEY_LEN
12d30 47 54 48 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42  GTH);..LAPPEND_B
12d40 41 52 52 41 59 28 69 6e 74 65 72 70 2c 20 6f 62  ARRAY(interp, ob
12d50 6a 50 74 72 2c 20 22 6d 61 73 74 65 72 5f 6b 65  jPtr, "master_ke
12d60 79 22 2c 20 62 75 66 66 65 72 2c 20 28 54 63 6c  y", buffer, (Tcl
12d70 5f 53 69 7a 65 29 20 6c 65 6e 32 29 3b 0a 0a 09  _Size) len2);...
12d80 2f 2a 20 43 6f 6d 70 72 65 73 73 69 6f 6e 20 69  /* Compression i
12d90 64 20 2a 2f 0a 09 75 6e 73 69 67 6e 65 64 20 69  d */..unsigned i
12da0 6e 74 20 69 64 20 3d 20 53 53 4c 5f 53 45 53 53  nt id = SSL_SESS
12db0 49 4f 4e 5f 67 65 74 5f 63 6f 6d 70 72 65 73 73  ION_get_compress
12dc0 5f 69 64 28 73 65 73 73 69 6f 6e 29 3b 0a 09 4c  _id(session);..L
12dd0 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
12de0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 6f 6d 70  p, objPtr, "comp
12df0 72 65 73 73 69 6f 6e 5f 69 64 22 2c 20 69 64 20  ression_id", id 
12e00 3d 3d 20 31 20 3f 20 22 7a 6c 69 62 22 20 3a 20  == 1 ? "zlib" : 
12e10 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 20 20 20  "none", -1);.   
12e20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 72   }..    /* Compr
12e30 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20  ession info */. 
12e40 20 20 20 69 66 20 28 73 73 6c 20 21 3d 20 4e 55     if (ssl != NU
12e50 4c 4c 29 20 7b 0a 23 69 66 64 65 66 20 48 41 56  LL) {.#ifdef HAV
12e60 45 5f 53 53 4c 5f 43 4f 4d 50 52 45 53 53 49 4f  E_SSL_COMPRESSIO
12e70 4e 0a 09 63 6f 6e 73 74 20 43 4f 4d 50 5f 4d 45  N..const COMP_ME
12e80 54 48 4f 44 20 2a 63 6f 6d 70 2c 20 2a 65 78 70  THOD *comp, *exp
12e90 6e 3b 0a 09 63 6f 6d 70 20 3d 20 53 53 4c 5f 67  n;..comp = SSL_g
12ea0 65 74 5f 63 75 72 72 65 6e 74 5f 63 6f 6d 70 72  et_current_compr
12eb0 65 73 73 69 6f 6e 28 73 73 6c 29 3b 0a 09 65 78  ession(ssl);..ex
12ec0 70 6e 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75 72  pn = SSL_get_cur
12ed0 72 65 6e 74 5f 65 78 70 61 6e 73 69 6f 6e 28 73  rent_expansion(s
12ee0 73 6c 29 3b 0a 0a 09 4c 41 50 50 45 4e 44 5f 53  sl);...LAPPEND_S
12ef0 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  TR(interp, objPt
12f00 72 2c 20 22 63 6f 6d 70 72 65 73 73 69 6f 6e 22  r, "compression"
12f10 2c 20 63 6f 6d 70 20 3f 20 53 53 4c 5f 43 4f 4d  , comp ? SSL_COM
12f20 50 5f 67 65 74 5f 6e 61 6d 65 28 63 6f 6d 70 29  P_get_name(comp)
12f30 20 3a 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a   : "none", -1);.
12f40 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74  .LAPPEND_STR(int
12f50 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 65 78  erp, objPtr, "ex
12f60 70 61 6e 73 69 6f 6e 22 2c 20 65 78 70 6e 20 3f  pansion", expn ?
12f70 20 53 53 4c 5f 43 4f 4d 50 5f 67 65 74 5f 6e 61   SSL_COMP_get_na
12f80 6d 65 28 65 78 70 6e 29 20 3a 20 22 6e 6f 6e 65  me(expn) : "none
12f90 22 2c 20 2d 31 29 3b 0a 23 65 6c 73 65 0a 09 4c  ", -1);.#else..L
12fa0 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
12fb0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 6f 6d 70  p, objPtr, "comp
12fc0 72 65 73 73 69 6f 6e 22 2c 20 22 6e 6f 6e 65 22  ression", "none"
12fd0 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f  , -1);..LAPPEND_
12fe0 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
12ff0 74 72 2c 20 22 65 78 70 61 6e 73 69 6f 6e 22 2c  tr, "expansion",
13000 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 23 65   "none", -1);.#e
13010 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ndif.    }..    
13020 2f 2a 20 53 65 72 76 65 72 20 69 6e 66 6f 20 2a  /* Server info *
13030 2f 0a 20 20 20 20 7b 0a 09 6c 6f 6e 67 20 6d 6f  /.    {..long mo
13040 64 65 20 3d 20 53 53 4c 5f 43 54 58 5f 67 65 74  de = SSL_CTX_get
13050 5f 73 65 73 73 69 6f 6e 5f 63 61 63 68 65 5f 6d  _session_cache_m
13060 6f 64 65 28 73 74 61 74 65 50 74 72 2d 3e 63 74  ode(statePtr->ct
13070 78 29 3b 0a 09 63 68 61 72 20 2a 6d 73 67 3b 0a  x);..char *msg;.
13080 0a 09 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c  ..if (mode & SSL
13090 5f 53 45 53 53 5f 43 41 43 48 45 5f 4f 46 46 29  _SESS_CACHE_OFF)
130a0 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 6f   {..    msg = "o
130b0 66 66 22 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20  ff";..} else if 
130c0 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53  (mode & SSL_SESS
130d0 5f 43 41 43 48 45 5f 43 4c 49 45 4e 54 29 20 7b  _CACHE_CLIENT) {
130e0 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 63 6c 69  ..    msg = "cli
130f0 65 6e 74 22 3b 0a 09 7d 20 65 6c 73 65 20 69 66  ent";..} else if
13100 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53   (mode & SSL_SES
13110 53 5f 43 41 43 48 45 5f 53 45 52 56 45 52 29 20  S_CACHE_SERVER) 
13120 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 73 65  {..    msg = "se
13130 72 76 65 72 22 3b 0a 09 7d 20 65 6c 73 65 20 69  rver";..} else i
13140 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45  f (mode & SSL_SE
13150 53 53 5f 43 41 43 48 45 5f 42 4f 54 48 29 20 7b  SS_CACHE_BOTH) {
13160 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 62 6f 74  ..    msg = "bot
13170 68 22 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20  h";..} else {.. 
13180 20 20 20 6d 73 67 20 3d 20 22 75 6e 6b 6e 6f 77     msg = "unknow
13190 6e 22 3b 0a 09 7d 0a 09 4c 41 50 50 45 4e 44 5f  n";..}..LAPPEND_
131a0 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
131b0 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f 63 61 63  tr, "session_cac
131c0 68 65 5f 6d 6f 64 65 22 2c 20 6d 73 67 2c 20 2d  he_mode", msg, -
131d0 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  1);.    }..    /
131e0 2a 20 43 41 20 4c 69 73 74 20 2a 2f 0a 20 20 20  * CA List */.   
131f0 20 2f 2a 20 49 46 20 6e 6f 74 20 61 20 73 65 72   /* IF not a ser
13200 76 65 72 2c 20 73 61 6d 65 20 61 73 20 53 53 4c  ver, same as SSL
13210 5f 67 65 74 30 5f 70 65 65 72 5f 43 41 5f 6c 69  _get0_peer_CA_li
13220 73 74 2e 20 49 66 20 73 65 72 76 65 72 20 73 61  st. If server sa
13230 6d 65 20 61 73 20 53 53 4c 5f 43 54 58 5f 67 65  me as SSL_CTX_ge
13240 74 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 74  t_client_CA_list
13250 20 2a 2f 0a 20 20 20 20 6c 69 73 74 50 74 72 20   */.    listPtr 
13260 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a  = Tcl_NewListObj
13270 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 53  (0, NULL);.    S
13280 54 41 43 4b 5f 4f 46 28 58 35 30 39 5f 4e 41 4d  TACK_OF(X509_NAM
13290 45 29 20 2a 63 61 5f 6c 69 73 74 3b 0a 20 20 20  E) *ca_list;.   
132a0 20 69 66 20 28 28 63 61 5f 6c 69 73 74 20 3d 20   if ((ca_list = 
132b0 53 53 4c 5f 67 65 74 5f 63 6c 69 65 6e 74 5f 43  SSL_get_client_C
132c0 41 5f 6c 69 73 74 28 73 73 6c 29 29 20 21 3d 20  A_list(ssl)) != 
132d0 4e 55 4c 4c 29 20 7b 0a 09 63 68 61 72 20 62 75  NULL) {..char bu
132e0 66 66 65 72 5b 42 55 46 53 49 5a 5d 3b 0a 09 66  ffer[BUFSIZ];..f
132f0 6f 72 20 28 69 6e 74 20 69 20 3d 20 30 3b 20 69  or (int i = 0; i
13300 20 3c 20 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f   < sk_X509_NAME_
13310 6e 75 6d 28 63 61 5f 6c 69 73 74 29 3b 20 69 2b  num(ca_list); i+
13320 2b 29 20 7b 0a 09 20 20 20 20 58 35 30 39 5f 4e  +) {..    X509_N
13330 41 4d 45 20 2a 6e 61 6d 65 20 3d 20 73 6b 5f 58  AME *name = sk_X
13340 35 30 39 5f 4e 41 4d 45 5f 76 61 6c 75 65 28 63  509_NAME_value(c
13350 61 5f 6c 69 73 74 2c 20 69 29 3b 0a 09 20 20 20  a_list, i);..   
13360 20 69 66 20 28 6e 61 6d 65 29 20 7b 0a 09 09 58   if (name) {...X
13370 35 30 39 5f 4e 41 4d 45 5f 6f 6e 65 6c 69 6e 65  509_NAME_oneline
13380 28 6e 61 6d 65 2c 20 62 75 66 66 65 72 2c 20 42  (name, buffer, B
13390 55 46 53 49 5a 29 3b 0a 09 09 54 63 6c 5f 4c 69  UFSIZ);...Tcl_Li
133a0 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
133b0 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 50  nt(interp, listP
133c0 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
133d0 67 4f 62 6a 28 62 75 66 66 65 72 2c 20 2d 31 29  gObj(buffer, -1)
133e0 29 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 20 20 20  );..    }..}.   
133f0 20 7d 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f   }.    LAPPEND_O
13400 42 4a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  BJ(interp, objPt
13410 72 2c 20 22 63 61 4c 69 73 74 22 2c 20 6c 69 73  r, "caList", lis
13420 74 50 74 72 29 3b 0a 20 20 20 20 4c 41 50 50 45  tPtr);.    LAPPE
13430 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f  ND_INT(interp, o
13440 62 6a 50 74 72 2c 20 22 63 61 4c 69 73 74 43 6f  bjPtr, "caListCo
13450 75 6e 74 22 2c 20 73 6b 5f 58 35 30 39 5f 4e 41  unt", sk_X509_NA
13460 4d 45 5f 6e 75 6d 28 63 61 5f 6c 69 73 74 29 29  ME_num(ca_list))
13470 3b 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62  ;..    Tcl_SetOb
13480 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
13490 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74  objPtr);.    ret
134a0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a  urn TCL_OK;.}...
134b0 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
134c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
134d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
134e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
134f0 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 56  --------. *. * V
13500 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 20 2d 2d 20  ersionObjCmd -- 
13510 72 65 74 75 72 6e 20 76 65 72 73 69 6f 6e 20 73  return version s
13520 74 72 69 6e 67 20 66 72 6f 6d 20 4f 70 65 6e 53  tring from OpenS
13530 53 4c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  SL.. *. * Result
13540 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64  s:. *.A standard
13550 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a   Tcl result.. *.
13560 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
13570 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d  . *.None.. *. *-
13580 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13590 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
135a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
135b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
135c0 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  --. */.static in
135d0 74 0a 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 28  t.VersionObjCmd(
135e0 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
135f0 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72  tData, Tcl_Inter
13600 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f  p *interp, int o
13610 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f  bjc, Tcl_Obj *co
13620 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20  nst objv[]) {.  
13630 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74    Tcl_Obj *objPt
13640 72 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c  r;.    (void) cl
13650 69 65 6e 74 44 61 74 61 3b 0a 20 20 20 20 28 76  ientData;.    (v
13660 6f 69 64 29 20 6f 62 6a 63 3b 0a 20 20 20 20 28  oid) objc;.    (
13670 76 6f 69 64 29 20 6f 62 6a 76 3b 0a 0a 20 20 20  void) objv;..   
13680 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
13690 22 29 3b 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20  ");..    objPtr 
136a0 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  = Tcl_NewStringO
136b0 62 6a 28 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49  bj(OPENSSL_VERSI
136c0 4f 4e 5f 54 45 58 54 2c 20 2d 31 29 3b 0a 20 20  ON_TEXT, -1);.  
136d0 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
136e0 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  lt(interp, objPt
136f0 72 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 20  r);..    return 
13700 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  TCL_OK;.}.../*. 
13710 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
13720 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13730 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13740 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13750 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d 69 73 63 4f  ----. *. * MiscO
13760 62 6a 43 6d 64 20 2d 2d 20 6d 69 73 63 20 63 6f  bjCmd -- misc co
13770 6d 6d 61 6e 64 73 0a 20 2a 0a 20 2a 20 52 65 73  mmands. *. * Res
13780 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64  ults:. *.A stand
13790 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a  ard Tcl result..
137a0 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
137b0 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a  ts:. *.None.. *.
137c0 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
137d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
137e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
137f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13800 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63  -----. */.static
13810 20 69 6e 74 0a 4d 69 73 63 4f 62 6a 43 6d 64 28   int.MiscObjCmd(
13820 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
13830 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72  tData, Tcl_Inter
13840 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f  p *interp, int o
13850 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f  bjc, Tcl_Obj *co
13860 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20  nst objv[]) {.  
13870 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
13880 68 61 72 20 2a 63 6f 6d 6d 61 6e 64 73 20 5b 5d  har *commands []
13890 20 3d 20 7b 20 22 72 65 71 22 2c 20 22 73 74 72   = { "req", "str
138a0 72 65 71 22 2c 20 4e 55 4c 4c 20 7d 3b 0a 20 20  req", NULL };.  
138b0 20 20 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64 20 7b    enum command {
138c0 20 43 5f 52 45 51 2c 20 43 5f 53 54 52 52 45 51   C_REQ, C_STRREQ
138d0 2c 20 43 5f 44 55 4d 4d 59 20 7d 3b 0a 20 20 20  , C_DUMMY };.   
138e0 20 54 63 6c 5f 53 69 7a 65 20 63 6d 64 3b 0a 20   Tcl_Size cmd;. 
138f0 20 20 20 69 6e 74 20 69 73 53 74 72 3b 0a 20 20     int isStr;.  
13900 20 20 63 68 61 72 20 62 75 66 66 65 72 5b 31 36    char buffer[16
13910 33 38 34 5d 3b 0a 20 20 20 20 28 76 6f 69 64 29  384];.    (void)
13920 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20   clientData;..  
13930 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
13940 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62  d");..    if (ob
13950 6a 63 20 3c 20 32 29 20 7b 0a 09 54 63 6c 5f 57  jc < 2) {..Tcl_W
13960 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
13970 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 73 75  rp, 1, objv, "su
13980 62 63 6f 6d 6d 61 6e 64 20 3f 61 72 67 73 3f 22  bcommand ?args?"
13990 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  );..return TCL_E
139a0 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
139b0 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78  if (Tcl_GetIndex
139c0 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
139d0 6f 62 6a 76 5b 31 5d 2c 20 63 6f 6d 6d 61 6e 64  objv[1], command
139e0 73 2c 20 22 63 6f 6d 6d 61 6e 64 22 2c 20 30 2c  s, "command", 0,
139f0 20 26 63 6d 64 29 20 21 3d 20 54 43 4c 5f 4f 4b   &cmd) != TCL_OK
13a00 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  ) {..return TCL_
13a10 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
13a20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f    ERR_clear_erro
13a30 72 28 29 3b 0a 0a 20 20 20 20 69 73 53 74 72 20  r();..    isStr 
13a40 3d 20 28 63 6d 64 20 3d 3d 20 43 5f 53 54 52 52  = (cmd == C_STRR
13a50 45 51 29 3b 0a 20 20 20 20 73 77 69 74 63 68 20  EQ);.    switch 
13a60 28 28 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64 29 20  ((enum command) 
13a70 63 6d 64 29 20 7b 0a 09 63 61 73 65 20 43 5f 52  cmd) {..case C_R
13a80 45 51 3a 0a 09 63 61 73 65 20 43 5f 53 54 52 52  EQ:..case C_STRR
13a90 45 51 3a 20 7b 0a 09 20 20 20 20 45 56 50 5f 50  EQ: {..    EVP_P
13aa0 4b 45 59 20 2a 70 6b 65 79 3d 4e 55 4c 4c 3b 0a  KEY *pkey=NULL;.
13ab0 09 20 20 20 20 58 35 30 39 20 2a 63 65 72 74 3d  .    X509 *cert=
13ac0 4e 55 4c 4c 3b 0a 09 20 20 20 20 58 35 30 39 5f  NULL;..    X509_
13ad0 4e 41 4d 45 20 2a 6e 61 6d 65 3d 4e 55 4c 4c 3b  NAME *name=NULL;
13ae0 0a 09 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a  ..    Tcl_Obj **
13af0 6c 69 73 74 76 3b 0a 09 20 20 20 20 54 63 6c 5f  listv;..    Tcl_
13b00 53 69 7a 65 20 6c 69 73 74 63 3b 0a 09 20 20 20  Size listc;..   
13b10 20 69 6e 74 20 69 3b 0a 0a 09 20 20 20 20 42 49   int i;...    BI
13b20 4f 20 2a 6f 75 74 3d 4e 55 4c 4c 3b 0a 0a 09 20  O *out=NULL;... 
13b30 20 20 20 63 68 61 72 20 2a 6b 5f 43 3d 22 22 2c     char *k_C="",
13b40 2a 6b 5f 53 54 3d 22 22 2c 2a 6b 5f 4c 3d 22 22  *k_ST="",*k_L=""
13b50 2c 2a 6b 5f 4f 3d 22 22 2c 2a 6b 5f 4f 55 3d 22  ,*k_O="",*k_OU="
13b60 22 2c 2a 6b 5f 43 4e 3d 22 22 2c 2a 6b 5f 45 6d  ",*k_CN="",*k_Em
13b70 61 69 6c 3d 22 22 3b 0a 09 20 20 20 20 63 68 61  ail="";..    cha
13b80 72 20 2a 6b 65 79 6f 75 74 2c 2a 70 65 6d 6f 75  r *keyout,*pemou
13b90 74 2c 2a 73 74 72 3b 0a 09 20 20 20 20 69 6e 74  t,*str;..    int
13ba0 20 6b 65 79 73 69 7a 65 2c 73 65 72 69 61 6c 3d   keysize,serial=
13bb0 30 2c 64 61 79 73 3d 33 36 35 3b 0a 0a 23 69 66  0,days=365;..#if
13bc0 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e   OPENSSL_VERSION
13bd0 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30  _NUMBER < 0x3000
13be0 30 30 30 30 4c 0a 09 20 20 20 20 42 49 47 4e 55  0000L..    BIGNU
13bf0 4d 20 2a 62 6e 65 20 3d 20 4e 55 4c 4c 3b 0a 09  M *bne = NULL;..
13c00 20 20 20 20 52 53 41 20 2a 72 73 61 20 3d 20 4e      RSA *rsa = N
13c10 55 4c 4c 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20  ULL;.#else..    
13c20 45 56 50 5f 50 4b 45 59 5f 43 54 58 20 2a 63 74  EVP_PKEY_CTX *ct
13c30 78 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66  x = NULL;.#endif
13c40 0a 0a 09 20 20 20 20 69 66 20 28 28 6f 62 6a 63  ...    if ((objc
13c50 3c 35 29 20 7c 7c 20 28 6f 62 6a 63 3e 36 29 29  <5) || (objc>6))
13c60 20 7b 0a 09 09 54 63 6c 5f 57 72 6f 6e 67 4e 75   {...Tcl_WrongNu
13c70 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
13c80 20 6f 62 6a 76 2c 20 22 6b 65 79 73 69 7a 65 20   objv, "keysize 
13c90 6b 65 79 66 69 6c 65 20 63 65 72 74 66 69 6c 65  keyfile certfile
13ca0 20 3f 69 6e 66 6f 3f 22 29 3b 0a 09 09 72 65 74   ?info?");...ret
13cb0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
13cc0 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 28      }...    if (
13cd0 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
13ce0 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
13cf0 5d 2c 20 26 6b 65 79 73 69 7a 65 29 20 21 3d 20  ], &keysize) != 
13d00 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 72 65 74 75  TCL_OK) {...retu
13d10 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20  rn TCL_ERROR;.. 
13d20 20 20 20 7d 0a 09 20 20 20 20 6b 65 79 6f 75 74     }..    keyout
13d30 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f  =Tcl_GetString(o
13d40 62 6a 76 5b 33 5d 29 3b 0a 09 20 20 20 20 70 65  bjv[3]);..    pe
13d50 6d 6f 75 74 3d 54 63 6c 5f 47 65 74 53 74 72 69  mout=Tcl_GetStri
13d60 6e 67 28 6f 62 6a 76 5b 34 5d 29 3b 0a 09 20 20  ng(objv[4]);..  
13d70 20 20 69 66 20 28 69 73 53 74 72 29 20 7b 0a 09    if (isStr) {..
13d80 09 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65  .Tcl_SetVar(inte
13d90 72 70 2c 6b 65 79 6f 75 74 2c 22 22 2c 30 29 3b  rp,keyout,"",0);
13da0 0a 09 09 54 63 6c 5f 53 65 74 56 61 72 28 69 6e  ...Tcl_SetVar(in
13db0 74 65 72 70 2c 70 65 6d 6f 75 74 2c 22 22 2c 30  terp,pemout,"",0
13dc0 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20  );..    }...    
13dd0 69 66 20 28 6f 62 6a 63 3e 3d 36 29 20 7b 0a 09  if (objc>=6) {..
13de0 09 69 66 20 28 54 63 6c 5f 4c 69 73 74 4f 62 6a  .if (Tcl_ListObj
13df0 47 65 74 45 6c 65 6d 65 6e 74 73 28 69 6e 74 65  GetElements(inte
13e00 72 70 2c 20 6f 62 6a 76 5b 35 5d 2c 20 26 6c 69  rp, objv[5], &li
13e10 73 74 63 2c 20 26 6c 69 73 74 76 29 20 21 3d 20  stc, &listv) != 
13e20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 20 20 20 20  TCL_OK) {...    
13e30 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
13e40 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 28 6c 69  ;...}....if ((li
13e50 73 74 63 25 32 29 20 21 3d 20 30 29 20 7b 0a 09  stc%2) != 0) {..
13e60 09 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75  .    Tcl_SetResu
13e70 6c 74 28 69 6e 74 65 72 70 2c 22 49 6e 66 6f 72  lt(interp,"Infor
13e80 6d 61 74 69 6f 6e 20 6c 69 73 74 20 6d 75 73 74  mation list must
13e90 20 68 61 76 65 20 65 76 65 6e 20 6e 75 6d 62 65   have even numbe
13ea0 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 22 2c  r of arguments",
13eb0 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 72 65 74  NULL);...    ret
13ec0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
13ed0 09 7d 0a 09 09 66 6f 72 20 28 69 3d 30 3b 20 69  .}...for (i=0; i
13ee0 3c 6c 69 73 74 63 3b 20 69 2b 3d 32 29 20 7b 0a  <listc; i+=2) {.
13ef0 09 09 20 20 20 20 73 74 72 3d 54 63 6c 5f 47 65  ..    str=Tcl_Ge
13f00 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 5d  tString(listv[i]
13f10 29 3b 0a 09 09 20 20 20 20 69 66 20 28 73 74 72  );...    if (str
13f20 63 6d 70 28 73 74 72 2c 22 64 61 79 73 22 29 3d  cmp(str,"days")=
13f30 3d 30 29 20 7b 0a 09 09 09 69 66 20 28 54 63 6c  =0) {....if (Tcl
13f40 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
13f50 6e 74 65 72 70 2c 6c 69 73 74 76 5b 69 2b 31 5d  nterp,listv[i+1]
13f60 2c 26 64 61 79 73 29 21 3d 54 43 4c 5f 4f 4b 29  ,&days)!=TCL_OK)
13f70 0a 09 09 09 20 20 20 20 72 65 74 75 72 6e 20 54  ....    return T
13f80 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20 20  CL_ERROR;...    
13f90 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d  } else if (strcm
13fa0 70 28 73 74 72 2c 22 73 65 72 69 61 6c 22 29 3d  p(str,"serial")=
13fb0 3d 30 29 20 7b 0a 09 09 09 69 66 20 28 54 63 6c  =0) {....if (Tcl
13fc0 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
13fd0 6e 74 65 72 70 2c 6c 69 73 74 76 5b 69 2b 31 5d  nterp,listv[i+1]
13fe0 2c 26 73 65 72 69 61 6c 29 21 3d 54 43 4c 5f 4f  ,&serial)!=TCL_O
13ff0 4b 29 0a 09 09 09 20 20 20 20 72 65 74 75 72 6e  K)....    return
14000 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20   TCL_ERROR;...  
14010 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72    } else if (str
14020 63 6d 70 28 73 74 72 2c 22 43 22 29 3d 3d 30 29  cmp(str,"C")==0)
14030 20 7b 0a 09 09 09 6b 5f 43 3d 54 63 6c 5f 47 65   {....k_C=Tcl_Ge
14040 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b  tString(listv[i+
14050 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73  1]);...    } els
14060 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72  e if (strcmp(str
14070 2c 22 53 54 22 29 3d 3d 30 29 20 7b 0a 09 09 09  ,"ST")==0) {....
14080 6b 5f 53 54 3d 54 63 6c 5f 47 65 74 53 74 72 69  k_ST=Tcl_GetStri
14090 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a  ng(listv[i+1]);.
140a0 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ..    } else if 
140b0 28 73 74 72 63 6d 70 28 73 74 72 2c 22 4c 22 29  (strcmp(str,"L")
140c0 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4c 3d 54 63  ==0) {....k_L=Tc
140d0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74  l_GetString(list
140e0 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d  v[i+1]);...    }
140f0 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70   else if (strcmp
14100 28 73 74 72 2c 22 4f 22 29 3d 3d 30 29 20 7b 0a  (str,"O")==0) {.
14110 09 09 09 6b 5f 4f 3d 54 63 6c 5f 47 65 74 53 74  ...k_O=Tcl_GetSt
14120 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29  ring(listv[i+1])
14130 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69  ;...    } else i
14140 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 4f  f (strcmp(str,"O
14150 55 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4f  U")==0) {....k_O
14160 55 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  U=Tcl_GetString(
14170 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20  listv[i+1]);... 
14180 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74     } else if (st
14190 72 63 6d 70 28 73 74 72 2c 22 43 4e 22 29 3d 3d  rcmp(str,"CN")==
141a0 30 29 20 7b 0a 09 09 09 6b 5f 43 4e 3d 54 63 6c  0) {....k_CN=Tcl
141b0 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76  _GetString(listv
141c0 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20  [i+1]);...    } 
141d0 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28  else if (strcmp(
141e0 73 74 72 2c 22 45 6d 61 69 6c 22 29 3d 3d 30 29  str,"Email")==0)
141f0 20 7b 0a 09 09 09 6b 5f 45 6d 61 69 6c 3d 54 63   {....k_Email=Tc
14200 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74  l_GetString(list
14210 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d  v[i+1]);...    }
14220 20 65 6c 73 65 20 7b 0a 09 09 09 54 63 6c 5f 53   else {....Tcl_S
14230 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
14240 22 55 6e 6b 6e 6f 77 6e 20 70 61 72 61 6d 65 74  "Unknown paramet
14250 65 72 22 2c 4e 55 4c 4c 29 3b 0a 09 09 09 72 65  er",NULL);....re
14260 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
14270 09 09 20 20 20 20 7d 0a 09 09 7d 0a 09 20 20 20  ..    }...}..   
14280 20 7d 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f   }..#if OPENSSL_
14290 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c  VERSION_NUMBER <
142a0 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 20 20   0x30000000L..  
142b0 20 20 62 6e 65 20 3d 20 42 4e 5f 6e 65 77 28 29    bne = BN_new()
142c0 3b 0a 09 20 20 20 20 72 73 61 20 3d 20 52 53 41  ;..    rsa = RSA
142d0 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20 70 6b 65  _new();..    pke
142e0 79 20 3d 20 45 56 50 5f 50 4b 45 59 5f 6e 65 77  y = EVP_PKEY_new
142f0 28 29 3b 0a 09 20 20 20 20 69 66 20 28 62 6e 65  ();..    if (bne
14300 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 72 73 61 20   == NULL || rsa 
14310 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 70 6b 65 79 20  == NULL || pkey 
14320 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21 42 4e 5f 73  == NULL || !BN_s
14330 65 74 5f 77 6f 72 64 28 62 6e 65 2c 52 53 41 5f  et_word(bne,RSA_
14340 46 34 29 20 7c 7c 0a 09 09 21 52 53 41 5f 67 65  F4) ||...!RSA_ge
14350 6e 65 72 61 74 65 5f 6b 65 79 5f 65 78 28 72 73  nerate_key_ex(rs
14360 61 2c 20 6b 65 79 73 69 7a 65 2c 20 62 6e 65 2c  a, keysize, bne,
14370 20 4e 55 4c 4c 29 20 7c 7c 20 21 45 56 50 5f 50   NULL) || !EVP_P
14380 4b 45 59 5f 61 73 73 69 67 6e 5f 52 53 41 28 70  KEY_assign_RSA(p
14390 6b 65 79 2c 20 72 73 61 29 29 20 7b 0a 09 09 45  key, rsa)) {...E
143a0 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65  VP_PKEY_free(pke
143b0 79 29 3b 0a 09 09 2f 2a 20 52 53 41 5f 66 72 65  y);.../* RSA_fre
143c0 65 28 72 73 61 29 3b 20 66 72 65 65 64 20 62 79  e(rsa); freed by
143d0 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 20 2a   EVP_PKEY_free *
143e0 2f 0a 09 09 42 4e 5f 66 72 65 65 28 62 6e 65 29  /...BN_free(bne)
143f0 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 70 6b 65  ;.#else..    pke
14400 79 20 3d 20 45 56 50 5f 52 53 41 5f 67 65 6e 28  y = EVP_RSA_gen(
14410 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 6b  (unsigned int) k
14420 65 79 73 69 7a 65 29 3b 0a 09 20 20 20 20 63 74  eysize);..    ct
14430 78 20 3d 20 45 56 50 5f 50 4b 45 59 5f 43 54 58  x = EVP_PKEY_CTX
14440 5f 6e 65 77 28 70 6b 65 79 2c 4e 55 4c 4c 29 3b  _new(pkey,NULL);
14450 0a 09 20 20 20 20 69 66 20 28 70 6b 65 79 20 3d  ..    if (pkey =
14460 3d 20 4e 55 4c 4c 20 7c 7c 20 63 74 78 20 3d 3d  = NULL || ctx ==
14470 20 4e 55 4c 4c 20 7c 7c 20 21 45 56 50 5f 50 4b   NULL || !EVP_PK
14480 45 59 5f 6b 65 79 67 65 6e 5f 69 6e 69 74 28 63  EY_keygen_init(c
14490 74 78 29 20 7c 7c 0a 09 09 21 45 56 50 5f 50 4b  tx) ||...!EVP_PK
144a0 45 59 5f 43 54 58 5f 73 65 74 5f 72 73 61 5f 6b  EY_CTX_set_rsa_k
144b0 65 79 67 65 6e 5f 62 69 74 73 28 63 74 78 2c 20  eygen_bits(ctx, 
144c0 6b 65 79 73 69 7a 65 29 20 7c 7c 20 21 45 56 50  keysize) || !EVP
144d0 5f 50 4b 45 59 5f 6b 65 79 67 65 6e 28 63 74 78  _PKEY_keygen(ctx
144e0 2c 20 26 70 6b 65 79 29 29 20 7b 0a 09 09 45 56  , &pkey)) {...EV
144f0 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79  P_PKEY_free(pkey
14500 29 3b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 43 54  );...EVP_PKEY_CT
14510 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 23 65 6e  X_free(ctx);.#en
14520 64 69 66 0a 09 09 54 63 6c 5f 53 65 74 52 65 73  dif...Tcl_SetRes
14530 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f  ult(interp,"Erro
14540 72 20 67 65 6e 65 72 61 74 69 6e 67 20 70 72 69  r generating pri
14550 76 61 74 65 20 6b 65 79 22 2c 4e 55 4c 4c 29 3b  vate key",NULL);
14560 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ...return TCL_ER
14570 52 4f 52 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65  ROR;..    } else
14580 20 7b 0a 09 09 69 66 20 28 69 73 53 74 72 29 20   {...if (isStr) 
14590 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f  {...    out=BIO_
145a0 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28 29 29  new(BIO_s_mem())
145b0 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74  ;...    PEM_writ
145c0 65 5f 62 69 6f 5f 50 72 69 76 61 74 65 4b 65 79  e_bio_PrivateKey
145d0 28 6f 75 74 2c 70 6b 65 79 2c 4e 55 4c 4c 2c 4e  (out,pkey,NULL,N
145e0 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29  ULL,0,NULL,NULL)
145f0 3b 0a 09 09 20 20 20 20 69 3d 42 49 4f 5f 72 65  ;...    i=BIO_re
14600 61 64 28 6f 75 74 2c 62 75 66 66 65 72 2c 73 69  ad(out,buffer,si
14610 7a 65 6f 66 28 62 75 66 66 65 72 29 2d 31 29 3b  zeof(buffer)-1);
14620 0a 09 09 20 20 20 20 69 3d 28 69 3c 30 29 20 3f  ...    i=(i<0) ?
14630 20 30 20 3a 20 69 3b 0a 09 09 20 20 20 20 62 75   0 : i;...    bu
14640 66 66 65 72 5b 69 5d 3d 27 5c 30 27 3b 0a 09 09  ffer[i]='\0';...
14650 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69      Tcl_SetVar(i
14660 6e 74 65 72 70 2c 6b 65 79 6f 75 74 2c 62 75 66  nterp,keyout,buf
14670 66 65 72 2c 30 29 3b 0a 09 09 20 20 20 20 42 49  fer,0);...    BI
14680 4f 5f 66 6c 75 73 68 28 6f 75 74 29 3b 0a 09 09  O_flush(out);...
14690 20 20 20 20 42 49 4f 5f 66 72 65 65 28 6f 75 74      BIO_free(out
146a0 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  );...} else {...
146b0 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28      out=BIO_new(
146c0 42 49 4f 5f 73 5f 66 69 6c 65 28 29 29 3b 0a 09  BIO_s_file());..
146d0 09 20 20 20 20 42 49 4f 5f 77 72 69 74 65 5f 66  .    BIO_write_f
146e0 69 6c 65 6e 61 6d 65 28 6f 75 74 2c 6b 65 79 6f  ilename(out,keyo
146f0 75 74 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77  ut);...    PEM_w
14700 72 69 74 65 5f 62 69 6f 5f 50 72 69 76 61 74 65  rite_bio_Private
14710 4b 65 79 28 6f 75 74 2c 70 6b 65 79 2c 4e 55 4c  Key(out,pkey,NUL
14720 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55  L,NULL,0,NULL,NU
14730 4c 4c 29 3b 0a 09 09 20 20 20 20 2f 2a 20 50 45  LL);...    /* PE
14740 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 52 53 41 50  M_write_bio_RSAP
14750 72 69 76 61 74 65 4b 65 79 28 6f 75 74 2c 20 72  rivateKey(out, r
14760 73 61 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20  sa, NULL, NULL, 
14770 30 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 20  0, NULL, NULL); 
14780 2a 2f 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65  */...    BIO_fre
14790 65 5f 61 6c 6c 28 6f 75 74 29 3b 0a 09 20 09 7d  e_all(out);.. .}
147a0 0a 0a 09 09 69 66 20 28 28 63 65 72 74 3d 58 35  ....if ((cert=X5
147b0 30 39 5f 6e 65 77 28 29 29 3d 3d 4e 55 4c 4c 29  09_new())==NULL)
147c0 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74   {...    Tcl_Set
147d0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45  Result(interp,"E
147e0 72 72 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20  rror generating 
147f0 63 65 72 74 69 66 69 63 61 74 65 20 72 65 71 75  certificate requ
14800 65 73 74 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20  est",NULL);...  
14810 20 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28    EVP_PKEY_free(
14820 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53  pkey);.#if OPENS
14830 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45  SL_VERSION_NUMBE
14840 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a  R < 0x30000000L.
14850 09 09 20 20 20 20 42 4e 5f 66 72 65 65 28 62 6e  ..    BN_free(bn
14860 65 29 3b 0a 23 65 6e 64 69 66 0a 09 09 20 20 20  e);.#endif...   
14870 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
14880 52 3b 0a 09 09 7d 0a 0a 09 09 58 35 30 39 5f 73  R;...}....X509_s
14890 65 74 5f 76 65 72 73 69 6f 6e 28 63 65 72 74 2c  et_version(cert,
148a0 32 29 3b 0a 09 09 41 53 4e 31 5f 49 4e 54 45 47  2);...ASN1_INTEG
148b0 45 52 5f 73 65 74 28 58 35 30 39 5f 67 65 74 5f  ER_set(X509_get_
148c0 73 65 72 69 61 6c 4e 75 6d 62 65 72 28 63 65 72  serialNumber(cer
148d0 74 29 2c 73 65 72 69 61 6c 29 3b 0a 09 09 58 35  t),serial);...X5
148e0 30 39 5f 67 6d 74 69 6d 65 5f 61 64 6a 28 58 35  09_gmtime_adj(X5
148f0 30 39 5f 67 65 74 6d 5f 6e 6f 74 42 65 66 6f 72  09_getm_notBefor
14900 65 28 63 65 72 74 29 2c 30 29 3b 0a 09 09 58 35  e(cert),0);...X5
14910 30 39 5f 67 6d 74 69 6d 65 5f 61 64 6a 28 58 35  09_gmtime_adj(X5
14920 30 39 5f 67 65 74 6d 5f 6e 6f 74 41 66 74 65 72  09_getm_notAfter
14930 28 63 65 72 74 29 2c 28 6c 6f 6e 67 29 36 30 2a  (cert),(long)60*
14940 36 30 2a 32 34 2a 64 61 79 73 29 3b 0a 09 09 58  60*24*days);...X
14950 35 30 39 5f 73 65 74 5f 70 75 62 6b 65 79 28 63  509_set_pubkey(c
14960 65 72 74 2c 70 6b 65 79 29 3b 0a 0a 09 09 6e 61  ert,pkey);....na
14970 6d 65 3d 58 35 30 39 5f 67 65 74 5f 73 75 62 6a  me=X509_get_subj
14980 65 63 74 5f 6e 61 6d 65 28 63 65 72 74 29 3b 0a  ect_name(cert);.
14990 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64  ...X509_NAME_add
149a0 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61  _entry_by_txt(na
149b0 6d 65 2c 22 43 22 2c 20 4d 42 53 54 52 49 4e 47  me,"C", MBSTRING
149c0 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73  _ASC, (const uns
149d0 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f  igned char *) k_
149e0 43 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09  C, -1, -1, 0);..
149f0 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65  .X509_NAME_add_e
14a00 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65  ntry_by_txt(name
14a10 2c 22 53 54 22 2c 20 4d 42 53 54 52 49 4e 47 5f  ,"ST", MBSTRING_
14a20 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69  ASC, (const unsi
14a30 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 53  gned char *) k_S
14a40 54 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09  T, -1, -1, 0);..
14a50 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65  .X509_NAME_add_e
14a60 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65  ntry_by_txt(name
14a70 2c 22 4c 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41  ,"L", MBSTRING_A
14a80 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67  SC, (const unsig
14a90 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 4c 2c  ned char *) k_L,
14aa0 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58   -1, -1, 0);...X
14ab0 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74  509_NAME_add_ent
14ac0 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22  ry_by_txt(name,"
14ad0 4f 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43  O", MBSTRING_ASC
14ae0 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  , (const unsigne
14af0 64 20 63 68 61 72 20 2a 29 20 6b 5f 4f 2c 20 2d  d char *) k_O, -
14b00 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30  1, -1, 0);...X50
14b10 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79  9_NAME_add_entry
14b20 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4f 55  _by_txt(name,"OU
14b30 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c  ", MBSTRING_ASC,
14b40 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64   (const unsigned
14b50 20 63 68 61 72 20 2a 29 20 6b 5f 4f 55 2c 20 2d   char *) k_OU, -
14b60 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30  1, -1, 0);...X50
14b70 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79  9_NAME_add_entry
14b80 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 43 4e  _by_txt(name,"CN
14b90 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c  ", MBSTRING_ASC,
14ba0 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64   (const unsigned
14bb0 20 63 68 61 72 20 2a 29 20 6b 5f 43 4e 2c 20 2d   char *) k_CN, -
14bc0 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30  1, -1, 0);...X50
14bd0 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79  9_NAME_add_entry
14be0 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 45 6d  _by_txt(name,"Em
14bf0 61 69 6c 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41  ail", MBSTRING_A
14c00 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67  SC, (const unsig
14c10 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 45 6d  ned char *) k_Em
14c20 61 69 6c 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b  ail, -1, -1, 0);
14c30 0a 0a 09 09 58 35 30 39 5f 73 65 74 5f 73 75 62  ....X509_set_sub
14c40 6a 65 63 74 5f 6e 61 6d 65 28 63 65 72 74 2c 6e  ject_name(cert,n
14c50 61 6d 65 29 3b 0a 0a 09 09 69 66 20 28 21 58 35  ame);....if (!X5
14c60 30 39 5f 73 69 67 6e 28 63 65 72 74 2c 70 6b 65  09_sign(cert,pke
14c70 79 2c 45 56 50 5f 73 68 61 32 35 36 28 29 29 29  y,EVP_sha256()))
14c80 20 7b 0a 09 09 20 20 20 20 58 35 30 39 5f 66 72   {...    X509_fr
14c90 65 65 28 63 65 72 74 29 3b 0a 09 09 20 20 20 20  ee(cert);...    
14ca0 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b  EVP_PKEY_free(pk
14cb0 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c  ey);.#if OPENSSL
14cc0 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20  _VERSION_NUMBER 
14cd0 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 09  < 0x30000000L...
14ce0 20 20 20 20 42 4e 5f 66 72 65 65 28 62 6e 65 29      BN_free(bne)
14cf0 3b 0a 23 65 6e 64 69 66 0a 09 09 20 20 20 20 54  ;.#endif...    T
14d00 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
14d10 65 72 70 2c 22 45 72 72 6f 72 20 73 69 67 6e 69  erp,"Error signi
14d20 6e 67 20 63 65 72 74 69 66 69 63 61 74 65 22 2c  ng certificate",
14d30 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 72 65 74  NULL);...    ret
14d40 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
14d50 09 7d 0a 0a 09 09 69 66 20 28 69 73 53 74 72 29  .}....if (isStr)
14d60 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f   {...    out=BIO
14d70 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28 29  _new(BIO_s_mem()
14d80 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 69  );...    PEM_wri
14d90 74 65 5f 62 69 6f 5f 58 35 30 39 28 6f 75 74 2c  te_bio_X509(out,
14da0 63 65 72 74 29 3b 0a 09 09 20 20 20 20 69 3d 42  cert);...    i=B
14db0 49 4f 5f 72 65 61 64 28 6f 75 74 2c 62 75 66 66  IO_read(out,buff
14dc0 65 72 2c 73 69 7a 65 6f 66 28 62 75 66 66 65 72  er,sizeof(buffer
14dd0 29 2d 31 29 3b 0a 09 09 20 20 20 20 69 3d 28 69  )-1);...    i=(i
14de0 3c 30 29 20 3f 20 30 20 3a 20 69 3b 0a 09 09 20  <0) ? 0 : i;... 
14df0 20 20 20 62 75 66 66 65 72 5b 69 5d 3d 27 5c 30     buffer[i]='\0
14e00 27 3b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74  ';...    Tcl_Set
14e10 56 61 72 28 69 6e 74 65 72 70 2c 70 65 6d 6f 75  Var(interp,pemou
14e20 74 2c 62 75 66 66 65 72 2c 30 29 3b 0a 09 09 20  t,buffer,0);... 
14e30 20 20 20 42 49 4f 5f 66 6c 75 73 68 28 6f 75 74     BIO_flush(out
14e40 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65  );...    BIO_fre
14e50 65 28 6f 75 74 29 3b 0a 09 09 7d 20 65 6c 73 65  e(out);...} else
14e60 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f   {...    out=BIO
14e70 5f 6e 65 77 28 42 49 4f 5f 73 5f 66 69 6c 65 28  _new(BIO_s_file(
14e80 29 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 77 72  ));...    BIO_wr
14e90 69 74 65 5f 66 69 6c 65 6e 61 6d 65 28 6f 75 74  ite_filename(out
14ea0 2c 70 65 6d 6f 75 74 29 3b 0a 09 09 20 20 20 20  ,pemout);...    
14eb0 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 58 35  PEM_write_bio_X5
14ec0 30 39 28 6f 75 74 2c 63 65 72 74 29 3b 0a 09 09  09(out,cert);...
14ed0 20 20 20 20 42 49 4f 5f 66 72 65 65 5f 61 6c 6c      BIO_free_all
14ee0 28 6f 75 74 29 3b 0a 09 09 7d 0a 0a 09 09 58 35  (out);...}....X5
14ef0 30 39 5f 66 72 65 65 28 63 65 72 74 29 3b 0a 09  09_free(cert);..
14f00 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70  .EVP_PKEY_free(p
14f10 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53  key);.#if OPENSS
14f20 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52  L_VERSION_NUMBER
14f30 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09   < 0x30000000L..
14f40 09 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23  .BN_free(bne);.#
14f50 65 6e 64 69 66 0a 09 20 20 20 20 7d 0a 09 7d 0a  endif..    }..}.
14f60 09 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61  .break;.    defa
14f70 75 6c 74 3a 0a 09 62 72 65 61 6b 3b 0a 20 20 20  ult:..break;.   
14f80 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43   }.    return TC
14f90 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a  L_OK;.}.../*****
14fa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
14fb0 0a 2f 2a 20 49 6e 69 74 20 20 20 20 20 20 20 20  ./* Init        
14fc0 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a       */./*******
14fd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
14fe0 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
14ff0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15000 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15010 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15020 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54  --------. *. * T
15030 6c 73 5f 46 72 65 65 20 2d 2d 0a 20 2a 0a 20 2a  ls_Free --. *. *
15040 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20  .This procedure 
15050 63 6c 65 61 6e 73 20 75 70 20 77 68 65 6e 20 61  cleans up when a
15060 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 65   SSL socket base
15070 64 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 69 73 20  d channel. *.is 
15080 63 6c 6f 73 65 64 20 61 6e 64 20 69 74 73 20 72  closed and its r
15090 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66  eference count f
150a0 61 6c 6c 73 20 62 65 6c 6f 77 20 31 0a 20 2a 0a  alls below 1. *.
150b0 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 6e   * Results:. *.n
150c0 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  one. *. * Side e
150d0 66 66 65 63 74 73 3a 0a 20 2a 09 46 72 65 65 73  ffects:. *.Frees
150e0 20 61 6c 6c 20 74 68 65 20 73 74 61 74 65 0a 20   all the state. 
150f0 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
15100 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15110 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15120 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15130 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64  -------. */.void
15140 0a 54 6c 73 5f 46 72 65 65 28 74 6c 73 5f 66 72  .Tls_Free(tls_fr
15150 65 65 5f 74 79 70 65 20 2a 62 6c 6f 63 6b 50 74  ee_type *blockPt
15160 72 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a  r) {.    State *
15170 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74  statePtr = (Stat
15180 65 20 2a 29 62 6c 6f 63 6b 50 74 72 3b 0a 0a 20  e *)blockPtr;.. 
15190 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
151a0 65 64 22 29 3b 0a 0a 20 20 20 20 54 6c 73 5f 43  ed");..    Tls_C
151b0 6c 65 61 6e 28 73 74 61 74 65 50 74 72 29 3b 0a  lean(statePtr);.
151c0 20 20 20 20 63 6b 66 72 65 65 28 62 6c 6f 63 6b      ckfree(block
151d0 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d  Ptr);.}.../*. *-
151e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
151f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15200 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15210 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15220 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 43 6c 65  --. *. * Tls_Cle
15230 61 6e 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73  an --. *. *.This
15240 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e   procedure clean
15250 73 20 75 70 20 77 68 65 6e 20 61 20 53 53 4c 20  s up when a SSL 
15260 73 6f 63 6b 65 74 20 62 61 73 65 64 20 63 68 61  socket based cha
15270 6e 6e 65 6c 0a 20 2a 09 69 73 20 63 6c 6f 73 65  nnel. *.is close
15280 64 20 61 6e 64 20 69 74 73 20 72 65 66 65 72 65  d and its refere
15290 6e 63 65 20 63 6f 75 6e 74 20 66 61 6c 6c 73 20  nce count falls 
152a0 62 65 6c 6f 77 20 31 2e 20 20 54 68 69 73 20 73  below 1.  This s
152b0 68 6f 75 6c 64 0a 20 2a 09 62 65 20 63 61 6c 6c  hould. *.be call
152c0 65 64 20 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79  ed synchronously
152d0 20 62 79 20 74 68 65 20 43 6c 6f 73 65 50 72 6f   by the ClosePro
152e0 63 2c 20 6e 6f 74 20 69 6e 20 74 68 65 0a 20 2a  c, not in the. *
152f0 09 45 76 65 6e 74 75 61 6c 6c 79 46 72 65 65 20  .EventuallyFree 
15300 63 61 6c 6c 62 61 63 6b 2e 0a 20 2a 0a 20 2a 20  callback.. *. * 
15310 52 65 73 75 6c 74 73 3a 0a 20 2a 09 6e 6f 6e 65  Results:. *.none
15320 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
15330 63 74 73 3a 0a 20 2a 09 46 72 65 65 73 20 61 6c  cts:. *.Frees al
15340 6c 20 74 68 65 20 73 74 61 74 65 0a 20 2a 0a 20  l the state. *. 
15350 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
15360 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15370 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15380 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15390 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 20 54 6c  ----. */.void Tl
153a0 73 5f 43 6c 65 61 6e 28 53 74 61 74 65 20 2a 73  s_Clean(State *s
153b0 74 61 74 65 50 74 72 29 20 7b 0a 20 20 20 20 64  tatePtr) {.    d
153c0 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
153d0 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65  ;..    if (state
153e0 50 74 72 2d 3e 73 73 6c 29 20 7b 0a 09 2f 2a 20  Ptr->ssl) {../* 
153f0 53 65 6e 64 20 63 6c 6f 73 65 5f 6e 6f 74 69 66  Send close_notif
15400 79 20 6d 65 73 73 61 67 65 20 2a 2f 0a 09 64 70  y message */..dp
15410 72 69 6e 74 66 28 22 53 53 4c 5f 73 68 75 74 64  rintf("SSL_shutd
15420 6f 77 6e 28 25 70 29 22 2c 20 73 74 61 74 65 50  own(%p)", stateP
15430 74 72 2d 3e 73 73 6c 29 3b 0a 09 53 53 4c 5f 73  tr->ssl);..SSL_s
15440 68 75 74 64 6f 77 6e 28 73 74 61 74 65 50 74 72  hutdown(statePtr
15450 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20  ->ssl);.    }.. 
15460 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 77 65 27     /*.     * we'
15470 72 65 20 61 73 73 75 6d 69 6e 67 20 68 65 72 65  re assuming here
15480 20 74 68 61 74 20 77 65 27 72 65 20 73 69 6e 67   that we're sing
15490 6c 65 2d 74 68 72 65 61 64 65 64 0a 20 20 20 20  le-threaded.    
154a0 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74   */.    if (stat
154b0 65 50 74 72 2d 3e 74 69 6d 65 72 20 21 3d 20 28  ePtr->timer != (
154c0 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20  Tcl_TimerToken) 
154d0 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 65 6c  NULL) {..Tcl_Del
154e0 65 74 65 54 69 6d 65 72 48 61 6e 64 6c 65 72 28  eteTimerHandler(
154f0 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 29  statePtr->timer)
15500 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 74 69 6d  ;..statePtr->tim
15510 65 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  er = NULL;.    }
15520 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20  ..    /* Remove 
15530 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 20 20 20  callbacks */.   
15540 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63   if (statePtr->c
15550 61 6c 6c 62 61 63 6b 29 20 7b 0a 09 54 63 6c 5f  allback) {..Tcl_
15560 44 65 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61  DecrRefCount(sta
15570 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29  tePtr->callback)
15580 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 63 61 6c  ;..statePtr->cal
15590 6c 62 61 63 6b 20 3d 20 4e 55 4c 4c 3b 0a 20 20  lback = NULL;.  
155a0 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74    }.    if (stat
155b0 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 20  ePtr->password) 
155c0 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f  {..Tcl_DecrRefCo
155d0 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 70 61  unt(statePtr->pa
155e0 73 73 77 6f 72 64 29 3b 0a 09 73 74 61 74 65 50  ssword);..stateP
155f0 74 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d 20 4e  tr->password = N
15600 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ULL;.    }.    i
15610 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d  f (statePtr->vcm
15620 64 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65  d) {..Tcl_DecrRe
15630 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d  fCount(statePtr-
15640 3e 76 63 6d 64 29 3b 0a 09 73 74 61 74 65 50 74  >vcmd);..statePt
15650 72 2d 3e 76 63 6d 64 20 3d 20 4e 55 4c 4c 3b 0a  r->vcmd = NULL;.
15660 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73      }..    if (s
15670 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 29  tatePtr->protos)
15680 20 7b 0a 09 63 6b 66 72 65 65 28 73 74 61 74 65   {..ckfree(state
15690 50 74 72 2d 3e 70 72 6f 74 6f 73 29 3b 0a 09 73  Ptr->protos);..s
156a0 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20  tatePtr->protos 
156b0 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20  = NULL;.    }.. 
156c0 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
156d0 3e 62 69 6f 29 20 7b 0a 09 2f 2a 20 54 68 69 73  >bio) {../* This
156e0 20 77 69 6c 6c 20 63 61 6c 6c 20 53 53 4c 5f 73   will call SSL_s
156f0 68 75 74 64 6f 77 6e 2e 20 42 75 67 20 31 34 31  hutdown. Bug 141
15700 34 30 34 35 20 2a 2f 0a 09 64 70 72 69 6e 74 66  4045 */..dprintf
15710 28 22 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 25  ("BIO_free_all(%
15720 70 29 22 2c 20 73 74 61 74 65 50 74 72 2d 3e 62  p)", statePtr->b
15730 69 6f 29 3b 0a 09 42 49 4f 5f 66 72 65 65 5f 61  io);..BIO_free_a
15740 6c 6c 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f  ll(statePtr->bio
15750 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 62 69  );..statePtr->bi
15760 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a  o = NULL;.    }.
15770 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
15780 72 2d 3e 73 73 6c 29 20 7b 0a 09 64 70 72 69 6e  r->ssl) {..dprin
15790 74 66 28 22 53 53 4c 5f 66 72 65 65 28 25 70 29  tf("SSL_free(%p)
157a0 22 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  ", statePtr->ssl
157b0 29 3b 0a 09 53 53 4c 5f 66 72 65 65 28 73 74 61  );..SSL_free(sta
157c0 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 73 74  tePtr->ssl);..st
157d0 61 74 65 50 74 72 2d 3e 73 73 6c 20 3d 20 4e 55  atePtr->ssl = NU
157e0 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  LL;.    }..    i
157f0 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78  f (statePtr->ctx
15800 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65  ) {..SSL_CTX_fre
15810 65 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29  e(statePtr->ctx)
15820 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 63 74 78  ;..statePtr->ctx
15830 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a   = NULL;.    }..
15840 20 20 20 20 64 70 72 69 6e 74 66 28 22 52 65 74      dprintf("Ret
15850 75 72 6e 69 6e 67 22 29 3b 0a 7d 0a 0c 0a 2f 2a  urning");.}.../*
15860 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
15870 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15880 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15890 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
158a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
158b0 42 75 69 6c 64 20 49 6e 66 6f 20 43 6f 6d 6d 61  Build Info Comma
158c0 6e 64 20 2d 2d 0a 20 2a 0a 20 2a 09 43 72 65 61  nd --. *. *.Crea
158d0 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 72 65  te command to re
158e0 74 75 72 6e 20 62 75 69 6c 64 20 69 6e 66 6f 20  turn build info 
158f0 66 6f 72 20 70 61 63 6b 61 67 65 2e 0a 20 2a 0a  for package.. *.
15900 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41   * Results:. *.A
15910 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65   standard Tcl re
15920 73 75 6c 74 0a 20 2a 0a 20 2a 20 53 69 64 65 20  sult. *. * Side 
15930 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 72 65 61  effects:. *.Crea
15940 74 65 64 20 62 75 69 6c 64 2d 69 6e 66 6f 20 63  ted build-info c
15950 6f 6d 6d 61 6e 64 2e 0a 20 2a 0a 20 2a 2d 2d 2d  ommand.. *. *---
15960 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15970 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15980 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15990 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
159a0 2d 2d 2d 0a 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  ---. */..#ifndef
159b0 20 53 54 52 49 4e 47 49 46 59 0a 23 20 20 64 65   STRINGIFY.#  de
159c0 66 69 6e 65 20 53 54 52 49 4e 47 49 46 59 28 78  fine STRINGIFY(x
159d0 29 20 53 54 52 49 4e 47 49 46 59 31 28 78 29 0a  ) STRINGIFY1(x).
159e0 23 20 20 64 65 66 69 6e 65 20 53 54 52 49 4e 47  #  define STRING
159f0 49 46 59 31 28 78 29 20 23 78 0a 23 65 6e 64 69  IFY1(x) #x.#endi
15a00 66 0a 0a 69 6e 74 0a 42 75 69 6c 64 49 6e 66 6f  f..int.BuildInfo
15a10 43 6f 6d 6d 61 6e 64 28 54 63 6c 5f 49 6e 74 65  Command(Tcl_Inte
15a20 72 70 2a 20 69 6e 74 65 72 70 29 20 7b 0a 20 20  rp* interp) {.  
15a30 20 20 54 63 6c 5f 43 6d 64 49 6e 66 6f 20 69 6e    Tcl_CmdInfo in
15a40 66 6f 3b 0a 0a 20 20 20 20 69 66 20 28 54 63 6c  fo;..    if (Tcl
15a50 5f 47 65 74 43 6f 6d 6d 61 6e 64 49 6e 66 6f 28  _GetCommandInfo(
15a60 69 6e 74 65 72 70 2c 20 22 3a 3a 74 63 6c 3a 3a  interp, "::tcl::
15a70 62 75 69 6c 64 2d 69 6e 66 6f 22 2c 20 26 69 6e  build-info", &in
15a80 66 6f 29 29 20 7b 0a 09 54 63 6c 5f 43 72 65 61  fo)) {..Tcl_Crea
15a90 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74  teObjCommand(int
15aa0 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 62 75 69  erp, "::tls::bui
15ab0 6c 64 2d 69 6e 66 6f 22 2c 20 69 6e 66 6f 2e 6f  ld-info", info.o
15ac0 62 6a 50 72 6f 63 2c 20 28 76 6f 69 64 20 2a 29  bjProc, (void *)
15ad0 28 0a 09 09 50 41 43 4b 41 47 45 5f 56 45 52 53  (...PACKAGE_VERS
15ae0 49 4f 4e 20 22 2b 22 20 53 54 52 49 4e 47 49 46  ION "+" STRINGIF
15af0 59 28 54 4c 53 5f 56 45 52 53 49 4f 4e 5f 55 55  Y(TLS_VERSION_UU
15b00 49 44 29 0a 23 69 66 20 64 65 66 69 6e 65 64 28  ID).#if defined(
15b10 5f 5f 63 6c 61 6e 67 5f 5f 29 20 26 26 20 64 65  __clang__) && de
15b20 66 69 6e 65 64 28 5f 5f 63 6c 61 6e 67 5f 6d 61  fined(__clang_ma
15b30 6a 6f 72 5f 5f 29 0a 09 09 09 20 20 20 20 22 2e  jor__)....    ".
15b40 63 6c 61 6e 67 2d 22 20 53 54 52 49 4e 47 49 46  clang-" STRINGIF
15b50 59 28 5f 5f 63 6c 61 6e 67 5f 6d 61 6a 6f 72 5f  Y(__clang_major_
15b60 5f 29 0a 23 69 66 20 5f 5f 63 6c 61 6e 67 5f 6d  _).#if __clang_m
15b70 69 6e 6f 72 5f 5f 20 3c 20 31 30 0a 09 09 09 20  inor__ < 10.... 
15b80 20 20 20 22 30 22 0a 23 65 6e 64 69 66 0a 09 09     "0".#endif...
15b90 09 20 20 20 20 53 54 52 49 4e 47 49 46 59 28 5f  .    STRINGIFY(_
15ba0 5f 63 6c 61 6e 67 5f 6d 69 6e 6f 72 5f 5f 29 0a  _clang_minor__).
15bb0 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
15bc0 65 64 28 5f 5f 63 70 6c 75 73 70 6c 75 73 29 20  ed(__cplusplus) 
15bd0 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 4f 42  && !defined(__OB
15be0 4a 43 5f 5f 29 0a 09 09 09 20 20 20 20 22 2e 63  JC__)....    ".c
15bf0 70 6c 75 73 70 6c 75 73 22 0a 23 65 6e 64 69 66  plusplus".#endif
15c00 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
15c10 09 09 09 20 20 20 20 22 2e 64 65 62 75 67 22 0a  ...    ".debug".
15c20 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69  #endif.#if !defi
15c30 6e 65 64 28 5f 5f 63 6c 61 6e 67 5f 5f 29 20 26  ned(__clang__) &
15c40 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 49 4e 54  & !defined(__INT
15c50 45 4c 5f 43 4f 4d 50 49 4c 45 52 29 20 26 26 20  EL_COMPILER) && 
15c60 64 65 66 69 6e 65 64 28 5f 5f 47 4e 55 43 5f 5f  defined(__GNUC__
15c70 29 0a 09 09 09 20 20 20 20 22 2e 67 63 63 2d 22  )....    ".gcc-"
15c80 20 53 54 52 49 4e 47 49 46 59 28 5f 5f 47 4e 55   STRINGIFY(__GNU
15c90 43 5f 5f 29 0a 23 69 66 20 5f 5f 47 4e 55 43 5f  C__).#if __GNUC_
15ca0 4d 49 4e 4f 52 5f 5f 20 3c 20 31 30 0a 09 09 09  MINOR__ < 10....
15cb0 20 20 20 20 22 30 22 0a 23 65 6e 64 69 66 0a 09      "0".#endif..
15cc0 09 09 20 20 20 20 53 54 52 49 4e 47 49 46 59 28  ..    STRINGIFY(
15cd0 5f 5f 47 4e 55 43 5f 4d 49 4e 4f 52 5f 5f 29 0a  __GNUC_MINOR__).
15ce0 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f  #endif.#ifdef __
15cf0 49 4e 54 45 4c 5f 43 4f 4d 50 49 4c 45 52 0a 09  INTEL_COMPILER..
15d00 09 09 20 20 20 20 22 2e 69 63 63 2d 22 20 53 54  ..    ".icc-" ST
15d10 52 49 4e 47 49 46 59 28 5f 5f 49 4e 54 45 4c 5f  RINGIFY(__INTEL_
15d20 43 4f 4d 50 49 4c 45 52 29 0a 23 65 6e 64 69 66  COMPILER).#endif
15d30 0a 23 69 66 64 65 66 20 54 43 4c 5f 4d 45 4d 5f  .#ifdef TCL_MEM_
15d40 44 45 42 55 47 0a 09 09 09 20 20 20 20 22 2e 6d  DEBUG....    ".m
15d50 65 6d 64 65 62 75 67 22 0a 23 65 6e 64 69 66 0a  emdebug".#endif.
15d60 23 69 66 20 64 65 66 69 6e 65 64 28 5f 4d 53 43  #if defined(_MSC
15d70 5f 56 45 52 29 0a 09 09 09 20 20 20 20 22 2e 6d  _VER)....    ".m
15d80 73 76 63 2d 22 20 53 54 52 49 4e 47 49 46 59 28  svc-" STRINGIFY(
15d90 5f 4d 53 43 5f 56 45 52 29 0a 23 65 6e 64 69 66  _MSC_VER).#endif
15da0 0a 23 69 66 64 65 66 20 55 53 45 5f 4e 4d 41 4b  .#ifdef USE_NMAK
15db0 45 0a 09 09 09 20 20 20 20 22 2e 6e 6d 61 6b 65  E....    ".nmake
15dc0 22 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66  ".#endif.#ifndef
15dd0 20 54 43 4c 5f 43 46 47 5f 4f 50 54 49 4d 49 5a   TCL_CFG_OPTIMIZ
15de0 45 44 0a 09 09 09 20 20 20 20 22 2e 6e 6f 2d 6f  ED....    ".no-o
15df0 70 74 69 6d 69 7a 65 22 0a 23 65 6e 64 69 66 0a  ptimize".#endif.
15e00 23 69 66 64 65 66 20 5f 5f 4f 42 4a 43 5f 5f 0a  #ifdef __OBJC__.
15e10 09 09 09 20 20 20 20 22 2e 6f 62 6a 65 63 74 69  ...    ".objecti
15e20 76 65 2d 63 22 0a 23 69 66 20 64 65 66 69 6e 65  ve-c".#if define
15e30 64 28 5f 5f 63 70 6c 75 73 70 6c 75 73 29 0a 09  d(__cplusplus)..
15e40 09 09 20 20 20 20 22 70 6c 75 73 70 6c 75 73 22  ..    "plusplus"
15e50 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 23  .#endif.#endif.#
15e60 69 66 64 65 66 20 54 43 4c 5f 43 46 47 5f 50 52  ifdef TCL_CFG_PR
15e70 4f 46 49 4c 45 44 0a 09 09 09 20 20 20 20 22 2e  OFILED....    ".
15e80 70 72 6f 66 69 6c 65 22 0a 23 65 6e 64 69 66 0a  profile".#endif.
15e90 23 69 66 64 65 66 20 50 55 52 49 46 59 0a 09 09  #ifdef PURIFY...
15ea0 09 20 20 20 20 22 2e 70 75 72 69 66 79 22 0a 23  .    ".purify".#
15eb0 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 54 41  endif.#ifdef STA
15ec0 54 49 43 5f 42 55 49 4c 44 0a 09 09 09 20 20 20  TIC_BUILD....   
15ed0 20 22 2e 73 74 61 74 69 63 22 0a 23 65 6e 64 69   ".static".#endi
15ee0 66 0a 09 09 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20  f...), NULL);.  
15ef0 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 54    }.    return T
15f00 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  CL_OK;.}.../*. *
15f10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15f20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15f30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15f40 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 20 54 6c  ------*. *. * Tl
15f50 73 4c 69 62 53 68 75 74 64 6f 77 6e 20 2d 2d 0a  sLibShutdown --.
15f60 20 2a 0a 20 2a 09 53 68 75 74 64 6f 77 6e 20 53   *. *.Shutdown S
15f70 53 4c 20 6c 69 62 72 61 72 79 20 6f 6e 63 65 20  SL library once 
15f80 70 65 72 20 61 70 70 6c 69 63 61 74 69 6f 6e 0a  per application.
15f90 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
15fa0 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 43 4c  *.A standard TCL
15fb0 20 72 65 73 75 6c 74 0a 20 2a 0a 20 2a 20 53 69   result. *. * Si
15fc0 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 53  de effects:. *.S
15fd0 68 75 74 64 6f 77 6e 20 53 53 4c 20 6c 69 62 72  hutdown SSL libr
15fe0 61 72 79 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  ary. *. *-------
15ff0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16000 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16010 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a  ---------------*
16020 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  . */.static int 
16030 54 6c 73 4c 69 62 53 68 75 74 64 6f 77 6e 28 43  TlsLibShutdown(C
16040 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
16050 44 61 74 61 29 20 7b 0a 20 20 20 20 42 49 4f 5f  Data) {.    BIO_
16060 63 6c 65 61 6e 75 70 28 29 3b 0a 20 20 20 20 72  cleanup();.    r
16070 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
16080 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
16090 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
160a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
160b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a  ------------*. *
160c0 0a 20 2a 09 54 6c 73 4c 69 62 49 6e 69 74 20 2d  . *.TlsLibInit -
160d0 2d 0a 20 2a 0a 20 2a 09 49 6e 69 74 69 61 6c 69  -. *. *.Initiali
160e0 7a 65 73 20 53 53 4c 20 6c 69 62 72 61 72 79 20  zes SSL library 
160f0 6f 6e 63 65 20 70 65 72 20 61 70 70 6c 69 63 61  once per applica
16100 74 69 6f 6e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  tion. *. * Resul
16110 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72  ts:. *.A standar
16120 64 20 54 63 6c 20 72 65 73 75 6c 74 0a 20 2a 0a  d Tcl result. *.
16130 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
16140 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a 65 73 20  . *.Initializes 
16150 53 53 4c 20 6c 69 62 72 61 72 79 0a 20 2a 0a 20  SSL library. *. 
16160 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
16170 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16180 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16190 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 73 74 61  -------*. */.sta
161a0 74 69 63 20 69 6e 74 20 54 6c 73 4c 69 62 49 6e  tic int TlsLibIn
161b0 69 74 28 29 20 7b 0a 20 20 20 20 73 74 61 74 69  it() {.    stati
161c0 63 20 69 6e 74 20 69 6e 69 74 69 61 6c 69 7a 65  c int initialize
161d0 64 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70 72 69  d = 0;..    dpri
161e0 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a  ntf("Called");..
161f0 20 20 20 20 69 66 20 28 21 69 6e 69 74 69 61 6c      if (!initial
16200 69 7a 65 64 29 20 7b 0a 09 2f 2a 20 49 6e 69 74  ized) {../* Init
16210 69 61 6c 69 7a 65 20 42 4f 54 48 20 6c 69 62 63  ialize BOTH libc
16220 72 79 70 74 6f 20 61 6e 64 20 6c 69 62 73 73 6c  rypto and libssl
16230 2e 20 2a 2f 0a 09 69 66 20 28 21 4f 50 45 4e 53  . */..if (!OPENS
16240 53 4c 5f 69 6e 69 74 5f 73 73 6c 28 4f 50 45 4e  SL_init_ssl(OPEN
16250 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f 53 53  SSL_INIT_LOAD_SS
16260 4c 5f 53 54 52 49 4e 47 53 20 7c 20 4f 50 45 4e  L_STRINGS | OPEN
16270 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f 43 52  SSL_INIT_LOAD_CR
16280 59 50 54 4f 5f 53 54 52 49 4e 47 53 0a 09 20 20  YPTO_STRINGS..  
16290 20 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54    | OPENSSL_INIT
162a0 5f 41 44 44 5f 41 4c 4c 5f 43 49 50 48 45 52 53  _ADD_ALL_CIPHERS
162b0 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f   | OPENSSL_INIT_
162c0 41 44 44 5f 41 4c 4c 5f 44 49 47 45 53 54 53 0a  ADD_ALL_DIGESTS.
162d0 09 20 20 20 20 7c 20 4f 50 45 4e 53 53 4c 5f 49  .    | OPENSSL_I
162e0 4e 49 54 5f 4c 4f 41 44 5f 43 4f 4e 46 49 47 20  NIT_LOAD_CONFIG 
162f0 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 41  | OPENSSL_INIT_A
16300 53 59 4e 43 2c 20 4e 55 4c 4c 29 29 20 7b 0a 09  SYNC, NULL)) {..
16310 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
16320 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 72  RROR;..}.../* Cr
16330 65 61 74 65 20 42 49 4f 20 68 61 6e 64 6c 65 72  eate BIO handler
16340 73 20 2a 2f 0a 09 42 49 4f 5f 6e 65 77 5f 74 63  s */..BIO_new_tc
16350 6c 28 4e 55 4c 4c 2c 20 30 29 3b 0a 09 0a 09 2f  l(NULL, 0);..../
16360 2a 20 43 72 65 61 74 65 20 65 78 69 74 20 68 61  * Create exit ha
16370 6e 64 6c 65 72 20 2a 2f 0a 09 54 63 6c 5f 43 72  ndler */..Tcl_Cr
16380 65 61 74 65 45 78 69 74 48 61 6e 64 6c 65 72 28  eateExitHandler(
16390 54 6c 73 4c 69 62 53 68 75 74 64 6f 77 6e 2c 20  TlsLibShutdown, 
163a0 4e 55 4c 4c 29 3b 0a 09 69 6e 69 74 69 61 6c 69  NULL);..initiali
163b0 7a 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  zed = 1;.    }. 
163c0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b     return TCL_OK
163d0 3b 0a 7d 0a 0c 0a 2f 2a 20 49 6e 69 74 20 73 63  ;.}.../* Init sc
163e0 72 69 70 74 20 2a 2f 0a 73 74 61 74 69 63 20 63  ript */.static c
163f0 6f 6e 73 74 20 63 68 61 72 20 74 6c 73 54 63 6c  onst char tlsTcl
16400 49 6e 69 74 53 63 72 69 70 74 5b 5d 20 3d 20 7b  InitScript[] = {
16410 0a 23 69 6e 63 6c 75 64 65 20 22 74 6c 73 2e 74  .#include "tls.t
16420 63 6c 2e 68 22 0a 7d 3b 0a 0a 2f 2a 0a 20 2a 2d  cl.h".};../*. *-
16430 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16440 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16450 2d 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a 0a 20 2a 20 54 6c 73 5f 49 6e 69  --. *. * Tls_Ini
16480 74 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20  t --. *. *.This 
16490 69 73 20 61 20 70 61 63 6b 61 67 65 20 69 6e 69  is a package ini
164a0 74 69 61 6c 69 7a 61 74 69 6f 6e 20 70 72 6f 63  tialization proc
164b0 65 64 75 72 65 2c 20 77 68 69 63 68 20 69 73 20  edure, which is 
164c0 63 61 6c 6c 65 64 0a 20 2a 09 62 79 20 54 43 4c  called. *.by TCL
164d0 20 77 68 65 6e 20 74 68 69 73 20 70 61 63 6b 61   when this packa
164e0 67 65 20 69 73 20 74 6f 20 62 65 20 61 64 64 65  ge is to be adde
164f0 64 20 74 6f 20 61 6e 20 69 6e 74 65 72 70 72 65  d to an interpre
16500 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  ter.. *. * Resul
16510 74 73 3a 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a  ts:. *.Initializ
16520 65 73 20 73 74 72 75 63 74 75 72 65 73 20 61 6e  es structures an
16530 64 20 63 72 65 61 74 65 73 20 63 6f 6d 6d 61 6e  d creates comman
16540 64 73 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  ds.. *. * Side e
16550 66 66 65 63 74 73 3a 0a 20 2a 09 20 43 72 65 61  ffects:. *. Crea
16560 74 65 20 74 68 65 20 63 6f 6d 6d 61 6e 64 73 0a  te the commands.
16570 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
16580 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16590 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
165a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
165b0 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 23 69  --------. */..#i
165c0 66 20 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53  f TCL_MAJOR_VERS
165d0 49 4f 4e 20 3e 20 38 0a 23 64 65 66 69 6e 65 20  ION > 8.#define 
165e0 4d 49 4e 5f 56 45 52 53 49 4f 4e 20 22 39 2e 30  MIN_VERSION "9.0
165f0 22 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  ".#else.#define 
16600 4d 49 4e 5f 56 45 52 53 49 4f 4e 20 22 38 2e 35  MIN_VERSION "8.5
16610 22 0a 23 65 6e 64 69 66 0a 0a 44 4c 4c 45 58 50  ".#endif..DLLEXP
16620 4f 52 54 20 69 6e 74 20 54 6c 73 5f 49 6e 69 74  ORT int Tls_Init
16630 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
16640 65 72 70 29 20 7b 0a 0a 20 20 20 20 64 70 72 69  erp) {..    dpri
16650 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a  ntf("Called");..
16660 23 69 66 64 65 66 20 55 53 45 5f 54 43 4c 5f 53  #ifdef USE_TCL_S
16670 54 55 42 53 0a 20 20 20 20 69 66 20 28 54 63 6c  TUBS.    if (Tcl
16680 5f 49 6e 69 74 53 74 75 62 73 28 69 6e 74 65 72  _InitStubs(inter
16690 70 2c 20 4d 49 4e 5f 56 45 52 53 49 4f 4e 2c 20  p, MIN_VERSION, 
166a0 30 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72  0) == NULL) {..r
166b0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
166c0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
166d0 20 20 69 66 20 28 54 63 6c 5f 50 6b 67 52 65 71    if (Tcl_PkgReq
166e0 75 69 72 65 28 69 6e 74 65 72 70 2c 20 22 54 63  uire(interp, "Tc
166f0 6c 22 2c 20 4d 49 4e 5f 56 45 52 53 49 4f 4e 2c  l", MIN_VERSION,
16700 20 30 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09   0) == NULL) {..
16710 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
16720 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20  ;.    }..    if 
16730 28 54 6c 73 4c 69 62 49 6e 69 74 28 29 20 21 3d  (TlsLibInit() !=
16740 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 54 63 6c 5f   TCL_OK) {..Tcl_
16750 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
16760 65 72 70 2c 20 22 63 6f 75 6c 64 20 6e 6f 74 20  erp, "could not 
16770 69 6e 69 74 69 61 6c 69 7a 65 20 53 53 4c 20 6c  initialize SSL l
16780 69 62 72 61 72 79 22 2c 20 28 63 68 61 72 20 2a  ibrary", (char *
16790 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e  ) NULL);..return
167a0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
167b0 7d 0a 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74  }..    Tcl_Creat
167c0 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eObjCommand(inte
167d0 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 63 69 70 68  rp, "::tls::ciph
167e0 65 72 73 22 2c 20 43 69 70 68 65 72 73 4f 62 6a  ers", CiphersObj
167f0 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61  Cmd, (ClientData
16800 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64  ) NULL, (Tcl_Cmd
16810 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55  DeleteProc *) NU
16820 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65  LL);.    Tcl_Cre
16830 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e  ateObjCommand(in
16840 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 63 6f  terp, "::tls::co
16850 6e 6e 65 63 74 69 6f 6e 22 2c 20 43 6f 6e 6e 65  nnection", Conne
16860 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 2c  ctionInfoObjCmd,
16870 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55   (ClientData) NU
16880 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65  LL, (Tcl_CmdDele
16890 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b  teProc *) NULL);
168a0 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f  .    Tcl_CreateO
168b0 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  bjCommand(interp
168c0 2c 20 22 3a 3a 74 6c 73 3a 3a 68 61 6e 64 73 68  , "::tls::handsh
168d0 61 6b 65 22 2c 20 48 61 6e 64 73 68 61 6b 65 4f  ake", HandshakeO
168e0 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61  bjCmd, (ClientDa
168f0 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43  ta) NULL, (Tcl_C
16900 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20  mdDeleteProc *) 
16910 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43  NULL);.    Tcl_C
16920 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28  reateObjCommand(
16930 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a  interp, "::tls::
16940 69 6d 70 6f 72 74 22 2c 20 49 6d 70 6f 72 74 4f  import", ImportO
16950 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61  bjCmd, (ClientDa
16960 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43  ta) NULL, (Tcl_C
16970 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20  mdDeleteProc *) 
16980 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43  NULL);.    Tcl_C
16990 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28  reateObjCommand(
169a0 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a  interp, "::tls::
169b0 75 6e 69 6d 70 6f 72 74 22 2c 20 55 6e 69 6d 70  unimport", Unimp
169c0 6f 72 74 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65  ortObjCmd, (Clie
169d0 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54  ntData) NULL, (T
169e0 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63  cl_CmdDeleteProc
169f0 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54   *) NULL);.    T
16a00 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
16a10 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74  and(interp, "::t
16a20 6c 73 3a 3a 75 6e 73 74 61 63 6b 22 2c 20 55 6e  ls::unstack", Un
16a30 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 28 43  importObjCmd, (C
16a40 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c  lientData) NULL,
16a50 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50   (Tcl_CmdDeleteP
16a60 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20  roc *) NULL);.  
16a70 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43    Tcl_CreateObjC
16a80 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22  ommand(interp, "
16a90 3a 3a 74 6c 73 3a 3a 73 74 61 74 75 73 22 2c 20  ::tls::status", 
16aa0 53 74 61 74 75 73 4f 62 6a 43 6d 64 2c 20 28 43  StatusObjCmd, (C
16ab0 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c  lientData) NULL,
16ac0 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50   (Tcl_CmdDeleteP
16ad0 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20  roc *) NULL);.  
16ae0 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43    Tcl_CreateObjC
16af0 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22  ommand(interp, "
16b00 3a 3a 74 6c 73 3a 3a 76 65 72 73 69 6f 6e 22 2c  ::tls::version",
16b10 20 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 2c 20   VersionObjCmd, 
16b20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c  (ClientData) NUL
16b30 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74  L, (Tcl_CmdDelet
16b40 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a  eProc *) NULL);.
16b50 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62      Tcl_CreateOb
16b60 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  jCommand(interp,
16b70 20 22 3a 3a 74 6c 73 3a 3a 6d 69 73 63 22 2c 20   "::tls::misc", 
16b80 4d 69 73 63 4f 62 6a 43 6d 64 2c 20 28 43 6c 69  MiscObjCmd, (Cli
16b90 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28  entData) NULL, (
16ba0 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f  Tcl_CmdDeletePro
16bb0 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  c *) NULL);.    
16bc0 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d  Tcl_CreateObjCom
16bd0 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a  mand(interp, "::
16be0 74 6c 73 3a 3a 70 72 6f 74 6f 63 6f 6c 73 22 2c  tls::protocols",
16bf0 20 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64   ProtocolsObjCmd
16c00 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e  , (ClientData) N
16c10 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c  ULL, (Tcl_CmdDel
16c20 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29  eteProc *) NULL)
16c30 3b 0a 0a 20 20 20 20 42 75 69 6c 64 49 6e 66 6f  ;..    BuildInfo
16c40 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 29 3b  Command(interp);
16c50 0a 0a 20 20 20 20 69 66 20 28 69 6e 74 65 72 70  ..    if (interp
16c60 20 26 26 20 54 63 6c 5f 45 76 61 6c 28 69 6e 74   && Tcl_Eval(int
16c70 65 72 70 2c 20 74 6c 73 54 63 6c 49 6e 69 74 53  erp, tlsTclInitS
16c80 63 72 69 70 74 29 20 21 3d 20 54 43 4c 5f 4f 4b  cript) != TCL_OK
16c90 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  ) {..return TCL_
16ca0 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
16cb0 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 50 6b 67    return Tcl_Pkg
16cc0 50 72 6f 76 69 64 65 28 69 6e 74 65 72 70 2c 20  Provide(interp, 
16cd0 50 41 43 4b 41 47 45 5f 4e 41 4d 45 2c 20 50 41  PACKAGE_NAME, PA
16ce0 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 29 3b 0a  CKAGE_VERSION);.
16cf0 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  }../*. *--------
16d00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16d10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16d20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16d30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
16d40 2a 09 54 6c 73 5f 53 61 66 65 49 6e 69 74 20 2d  *.Tls_SafeInit -
16d50 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 69 73 20  -. *. *.This is 
16d60 61 20 70 61 63 6b 61 67 65 20 69 6e 69 74 69 61  a package initia
16d70 6c 69 7a 61 74 69 6f 6e 20 70 72 6f 63 65 64 75  lization procedu
16d80 72 65 20 66 6f 72 20 73 61 66 65 20 69 6e 74 65  re for safe inte
16d90 72 70 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  rps.. *. * Resul
16da0 74 73 3a 0a 20 2a 09 53 61 6d 65 20 61 73 20 6f  ts:. *.Same as o
16db0 66 20 27 54 6c 73 5f 49 6e 69 74 27 0a 20 2a 0a  f 'Tls_Init'. *.
16dc0 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
16dd0 0a 20 2a 09 53 61 6d 65 20 61 73 20 6f 66 20 27  . *.Same as of '
16de0 54 6c 73 5f 49 6e 69 74 27 0a 20 2a 0a 20 2a 2d  Tls_Init'. *. *-
16df0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16e00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16e10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16e20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16e30 2d 2d 0a 20 2a 2f 0a 44 4c 4c 45 58 50 4f 52 54  --. */.DLLEXPORT
16e40 20 69 6e 74 20 54 6c 73 5f 53 61 66 65 49 6e 69   int Tls_SafeIni
16e50 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  t(Tcl_Interp *in
16e60 74 65 72 70 29 20 7b 0a 20 20 20 20 64 70 72 69  terp) {.    dpri
16e70 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 20  ntf("Called");. 
16e80 20 20 20 72 65 74 75 72 6e 20 54 6c 73 5f 49 6e     return Tls_In
16e90 69 74 28 69 6e 74 65 72 70 29 3b 0a 7d 0a        it(interp);.}.