Hex Artifact Content

Artifact 9aada2ce3d78172005faa5c6b4512d8d86f6a1f9732b78b9b2f2ce7f44ca4d76:


0000: 2f 2a 0a 20 2a 20 49 6e 66 6f 72 6d 61 74 69 6f  /*. * Informatio
0010: 6e 20 43 6f 6d 6d 61 6e 64 73 20 4d 6f 64 75 6c  n Commands Modul
0020: 65 0a 20 2a 0a 20 2a 20 50 72 6f 76 69 64 65 73  e. *. * Provides
0030: 20 63 6f 6d 6d 61 6e 64 73 20 74 68 61 74 20 72   commands that r
0040: 65 74 75 72 6e 20 69 6e 66 6f 20 72 65 6c 61 74  eturn info relat
0050: 65 64 20 74 6f 20 74 68 65 20 4f 70 65 6e 53 53  ed to the OpenSS
0060: 4c 20 63 6f 6e 66 69 67 20 61 6e 64 20 64 61 74  L config and dat
0070: 61 2e 0a 20 2a 0a 20 2a 20 43 6f 70 79 72 69 67  a.. *. * Copyrig
0080: 68 74 20 28 43 29 20 32 30 32 33 20 42 72 69 61  ht (C) 2023 Bria
0090: 6e 20 4f 27 48 61 67 61 6e 0a 20 2a 0a 20 2a 2f  n O'Hagan. *. */
00a0: 0a 0a 23 69 6e 63 6c 75 64 65 20 22 74 6c 73 49  ..#include "tlsI
00b0: 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22  nt.h".#include "
00c0: 74 63 6c 4f 70 74 73 2e 68 22 0a 23 69 6e 63 6c  tclOpts.h".#incl
00d0: 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f 63 72 79  ude <openssl/cry
00e0: 70 74 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  pto.h>.#include 
00f0: 3c 6f 70 65 6e 73 73 6c 2f 73 73 6c 2e 68 3e 0a  <openssl/ssl.h>.
0100: 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73  #include <openss
0110: 6c 2f 73 61 66 65 73 74 61 63 6b 2e 68 3e 0a 0a  l/safestack.h>..
0120: 2f 2a 0a 20 2a 20 56 61 6c 69 64 20 53 53 4c 20  /*. * Valid SSL 
0130: 61 6e 64 20 54 4c 53 20 50 72 6f 74 6f 63 6f 6c  and TLS Protocol
0140: 20 56 65 72 73 69 6f 6e 73 0a 20 2a 2f 0a 73 74   Versions. */.st
0150: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
0160: 2a 70 72 6f 74 6f 63 6f 6c 73 5b 5d 20 3d 20 7b  *protocols[] = {
0170: 0a 09 22 73 73 6c 32 22 2c 20 22 73 73 6c 33 22  .."ssl2", "ssl3"
0180: 2c 20 22 74 6c 73 31 22 2c 20 22 74 6c 73 31 2e  , "tls1", "tls1.
0190: 31 22 2c 20 22 74 6c 73 31 2e 32 22 2c 20 22 74  1", "tls1.2", "t
01a0: 6c 73 31 2e 33 22 2c 20 4e 55 4c 4c 0a 7d 3b 0a  ls1.3", NULL.};.
01b0: 65 6e 75 6d 20 70 72 6f 74 6f 63 6f 6c 20 7b 0a  enum protocol {.
01c0: 20 20 20 20 54 4c 53 5f 53 53 4c 32 2c 20 54 4c      TLS_SSL2, TL
01d0: 53 5f 53 53 4c 33 2c 20 54 4c 53 5f 54 4c 53 31  S_SSL3, TLS_TLS1
01e0: 2c 20 54 4c 53 5f 54 4c 53 31 5f 31 2c 20 54 4c  , TLS_TLS1_1, TL
01f0: 53 5f 54 4c 53 31 5f 32 2c 20 54 4c 53 5f 54 4c  S_TLS1_2, TLS_TL
0200: 53 31 5f 33 2c 20 54 4c 53 5f 4e 4f 4e 45 0a 7d  S1_3, TLS_NONE.}
0210: 3b 0a 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  ;.../*. *-------
0220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
0260: 20 2a 20 4e 61 6d 65 73 43 61 6c 6c 62 61 63 6b   * NamesCallback
0270: 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 62 61   --. *. *.Callba
0280: 63 6b 20 74 6f 20 61 64 64 20 61 6c 67 6f 72 69  ck to add algori
0290: 74 68 6d 20 6f 72 20 6d 65 74 68 6f 64 20 6e 61  thm or method na
02a0: 6d 65 73 20 74 6f 20 61 20 54 43 4c 20 6c 69 73  mes to a TCL lis
02b0: 74 20 6f 62 6a 65 63 74 2e 0a 20 2a 0a 20 2a 20  t object.. *. * 
02c0: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 70 70 65  Results:. *.Appe
02d0: 6e 64 20 6e 61 6d 65 20 74 6f 20 54 43 4c 20 6c  nd name to TCL l
02e0: 69 73 74 20 6f 62 6a 65 63 74 2e 0a 20 2a 0a 20  ist object.. *. 
02f0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
0300: 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d   *.None.. *. *--
0310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0350: 2d 0a 20 2a 2f 0a 76 6f 69 64 20 4e 61 6d 65 73  -. */.void Names
0360: 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 4f  Callback(const O
0370: 42 4a 5f 4e 41 4d 45 20 2a 6f 62 6a 2c 20 76 6f  BJ_NAME *obj, vo
0380: 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 54  id *arg) {.    T
0390: 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 20 3d  cl_Obj *objPtr =
03a0: 20 28 54 63 6c 5f 4f 62 6a 20 2a 29 20 61 72 67   (Tcl_Obj *) arg
03b0: 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 65 6c 64 73  ;..    /* Fields
03c0: 3a 20 28 69 6e 74 29 20 74 79 70 65 20 61 6e 64  : (int) type and
03d0: 20 61 6c 69 61 73 2c 20 28 63 6f 6e 73 74 20 63   alias, (const c
03e0: 68 61 72 2a 29 20 6e 61 6d 65 20 61 6e 64 20 64  har*) name and d
03f0: 61 74 61 20 2a 2f 0a 20 20 20 20 69 66 20 28 31  ata */.    if (1
0400: 20 7c 7c 20 21 6f 62 6a 2d 3e 61 6c 69 61 73 29   || !obj->alias)
0410: 20 7b 0a 09 2f 2a 20 46 69 6c 74 65 72 20 6f 75   {../* Filter ou
0420: 74 20 73 69 67 6e 65 64 20 64 69 67 65 73 74 73  t signed digests
0430: 20 28 61 2e 6b 2e 61 20 73 69 67 6e 61 74 75 72   (a.k.a signatur
0440: 65 20 61 6c 67 6f 72 69 74 68 6d 73 29 20 2a 2f  e algorithms) */
0450: 0a 09 69 66 20 28 73 74 72 73 74 72 28 6f 62 6a  ..if (strstr(obj
0460: 2d 3e 6e 61 6d 65 2c 20 22 72 73 61 22 29 20 3d  ->name, "rsa") =
0470: 3d 20 4e 55 4c 4c 20 26 26 20 73 74 72 73 74 72  = NULL && strstr
0480: 28 6f 62 6a 2d 3e 6e 61 6d 65 2c 20 22 52 53 41  (obj->name, "RSA
0490: 22 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20  ") == NULL) {.. 
04a0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
04b0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 4e 55 4c 4c  pendElement(NULL
04c0: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
04d0: 77 53 74 72 69 6e 67 4f 62 6a 28 6f 62 6a 2d 3e  wStringObj(obj->
04e0: 6e 61 6d 65 2c 2d 31 29 29 3b 0a 09 7d 0a 20 20  name,-1));..}.  
04f0: 20 20 7d 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d    }.}.../*. *---
0500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0540: 0a 20 2a 0a 20 2a 20 43 69 70 68 65 72 73 4f 62  . *. * CiphersOb
0550: 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68  jCmd --. *. *.Th
0560: 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20  is procedure is 
0570: 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65  invoked to proce
0580: 73 73 20 74 68 65 20 22 74 6c 73 3a 3a 63 69 70  ss the "tls::cip
0590: 68 65 72 73 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a  hers" command. *
05a0: 09 74 6f 20 6c 69 73 74 20 61 76 61 69 6c 61 62  .to list availab
05b0: 6c 65 20 63 69 70 68 65 72 73 2c 20 62 61 73 65  le ciphers, base
05c0: 64 20 75 70 6f 6e 20 70 72 6f 74 6f 63 6f 6c 20  d upon protocol 
05d0: 73 65 6c 65 63 74 65 64 2e 0a 20 2a 0a 20 2a 20  selected.. *. * 
05e0: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74  Results:. *.A st
05f0: 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c  andard Tcl resul
0600: 74 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 53 69  t list.. *. * Si
0610: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 63  de effects:. *.c
0620: 6f 6e 73 74 72 75 63 74 73 20 61 6e 64 20 64 65  onstructs and de
0630: 73 74 72 6f 79 73 20 53 53 4c 20 63 6f 6e 74 65  stroys SSL conte
0640: 78 74 20 28 43 54 58 29 0a 20 2a 0a 20 2a 2d 2d  xt (CTX). *. *--
0650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0690: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  -. */.static int
06a0: 20 43 69 70 68 65 72 73 4f 62 6a 43 6d 64 28 43   CiphersObjCmd(C
06b0: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
06c0: 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70  Data, Tcl_Interp
06d0: 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62   *interp, int ob
06e0: 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e  jc, Tcl_Obj *con
06f0: 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20  st objv[]) {.   
0700: 20 53 53 4c 5f 43 54 58 20 2a 63 74 78 20 3d 20   SSL_CTX *ctx = 
0710: 4e 55 4c 4c 3b 0a 20 20 20 20 53 53 4c 20 2a 73  NULL;.    SSL *s
0720: 73 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53  sl = NULL;.    S
0730: 54 41 43 4b 5f 4f 46 28 53 53 4c 5f 43 49 50 48  TACK_OF(SSL_CIPH
0740: 45 52 29 20 2a 73 6b 20 3d 20 4e 55 4c 4c 3b 0a  ER) *sk = NULL;.
0750: 20 20 20 20 69 6e 74 20 69 6e 64 65 78 2c 20 76      int index, v
0760: 65 72 62 6f 73 65 20 3d 20 30 2c 20 75 73 65 5f  erbose = 0, use_
0770: 73 75 70 70 6f 72 74 65 64 20 3d 20 30 3b 0a 0a  supported = 0;..
0780: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
0790: 6c 65 64 22 29 3b 0a 0a 23 69 66 20 4f 50 45 4e  led");..#if OPEN
07a0: 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42  SSL_VERSION_NUMB
07b0: 45 52 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c  ER < 0x10100000L
07c0: 0a 20 20 20 20 4f 70 65 6e 53 53 4c 5f 61 64 64  .    OpenSSL_add
07d0: 5f 61 6c 6c 5f 63 69 70 68 65 72 73 28 29 3b 20  _all_ciphers(); 
07e0: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
07f0: 79 27 72 65 20 6c 6f 61 64 65 64 20 2a 2f 0a 23  y're loaded */.#
0800: 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 43 6c  endif..    /* Cl
0810: 65 61 72 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20  ear errors */.  
0820: 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c    Tcl_ResetResul
0830: 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 45  t(interp);.    E
0840: 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29  RR_clear_error()
0850: 3b 0a 0a 20 20 20 20 2f 2a 20 56 61 6c 69 64 61  ;..    /* Valida
0860: 74 65 20 61 72 67 20 63 6f 75 6e 74 20 2a 2f 0a  te arg count */.
0870: 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3e 20 34      if (objc > 4
0880: 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75  ) {..Tcl_WrongNu
0890: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
08a0: 20 6f 62 6a 76 2c 20 22 3f 70 72 6f 74 6f 63 6f   objv, "?protoco
08b0: 6c 3f 20 3f 76 65 72 62 6f 73 65 3f 20 3f 73 75  l? ?verbose? ?su
08c0: 70 70 6f 72 74 65 64 3f 22 29 3b 0a 09 72 65 74  pported?");..ret
08d0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
08e0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 69 73     }..    /* Lis
08f0: 74 20 61 6c 6c 20 63 69 70 68 65 72 73 20 2a 2f  t all ciphers */
0900: 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d  .    if (objc ==
0910: 20 31 29 20 7b 0a 09 54 63 6c 5f 4f 62 6a 20 2a   1) {..Tcl_Obj *
0920: 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77  objPtr = Tcl_New
0930: 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29  ListObj(0, NULL)
0940: 3b 0a 0a 09 4f 42 4a 5f 4e 41 4d 45 5f 64 6f 5f  ;...OBJ_NAME_do_
0950: 61 6c 6c 28 4f 42 4a 5f 4e 41 4d 45 5f 54 59 50  all(OBJ_NAME_TYP
0960: 45 5f 43 49 50 48 45 52 5f 4d 45 54 48 2c 20 4e  E_CIPHER_METH, N
0970: 61 6d 65 73 43 61 6c 6c 62 61 63 6b 2c 20 28 76  amesCallback, (v
0980: 6f 69 64 20 2a 29 20 6f 62 6a 50 74 72 29 3b 0a  oid *) objPtr);.
0990: 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c  .Tcl_SetObjResul
09a0: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
09b0: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 4f  );..return TCL_O
09c0: 4b 3b 0a 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  K;..    }..    /
09d0: 2a 20 47 65 74 20 6f 70 74 69 6f 6e 73 20 2a 2f  * Get options */
09e0: 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74  .    if (Tcl_Get
09f0: 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74  IndexFromObj(int
0a00: 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 70 72  erp, objv[1], pr
0a10: 6f 74 6f 63 6f 6c 73 2c 20 22 70 72 6f 74 6f 63  otocols, "protoc
0a20: 6f 6c 22 2c 20 30 2c 20 26 69 6e 64 65 78 29 20  ol", 0, &index) 
0a30: 21 3d 20 54 43 4c 5f 4f 4b 20 7c 7c 0a 09 28 6f  != TCL_OK ||..(o
0a40: 62 6a 63 20 3e 20 32 20 26 26 20 54 63 6c 5f 47  bjc > 2 && Tcl_G
0a50: 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a  etBooleanFromObj
0a60: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
0a70: 2c 20 26 76 65 72 62 6f 73 65 29 20 21 3d 20 54  , &verbose) != T
0a80: 43 4c 5f 4f 4b 29 20 7c 7c 0a 09 28 6f 62 6a 63  CL_OK) ||..(objc
0a90: 20 3e 20 33 20 26 26 20 54 63 6c 5f 47 65 74 42   > 3 && Tcl_GetB
0aa0: 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e  ooleanFromObj(in
0ab0: 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26  terp, objv[3], &
0ac0: 75 73 65 5f 73 75 70 70 6f 72 74 65 64 29 20 21  use_supported) !
0ad0: 3d 20 54 43 4c 5f 4f 4b 29 29 20 7b 0a 09 72 65  = TCL_OK)) {..re
0ae0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
0af0: 20 20 20 20 7d 0a 0a 20 20 20 20 73 77 69 74 63      }..    switc
0b00: 68 20 28 28 65 6e 75 6d 20 70 72 6f 74 6f 63 6f  h ((enum protoco
0b10: 6c 29 69 6e 64 65 78 29 20 7b 0a 09 63 61 73 65  l)index) {..case
0b20: 20 54 4c 53 5f 53 53 4c 32 3a 0a 09 20 20 20 20   TLS_SSL2:..    
0b30: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
0b40: 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f  (interp, protoco
0b50: 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72  ls[index], ": pr
0b60: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f  otocol not suppo
0b70: 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20  rted", NULL);.. 
0b80: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
0b90: 52 4f 52 3b 0a 09 63 61 73 65 20 54 4c 53 5f 53  ROR;..case TLS_S
0ba0: 53 4c 33 3a 0a 23 69 66 20 64 65 66 69 6e 65 64  SL3:.#if defined
0bb0: 28 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 65 66  (NO_SSL3) || def
0bc0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
0bd0: 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e 65 64  SSL3) || defined
0be0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33  (OPENSSL_NO_SSL3
0bf0: 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 54 63  _METHOD)..    Tc
0c00: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
0c10: 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73  nterp, protocols
0c20: 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74  [index], ": prot
0c30: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74  ocol not support
0c40: 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20  ed", NULL);..   
0c50: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
0c60: 52 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20  R;.#else.       
0c70: 20 20 20 20 20 6d 69 6e 5f 76 65 72 73 69 6f 6e       min_version
0c80: 20 3d 20 53 53 4c 33 5f 56 45 52 53 49 4f 4e 3b   = SSL3_VERSION;
0c90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 61 78  .            max
0ca0: 5f 76 65 72 73 69 6f 6e 20 3d 20 53 53 4c 33 5f  _version = SSL3_
0cb0: 56 45 52 53 49 4f 4e 3b 0a 09 20 20 20 20 62 72  VERSION;..    br
0cc0: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73  eak;.#endif..cas
0cd0: 65 20 54 4c 53 5f 54 4c 53 31 3a 0a 23 69 66 20  e TLS_TLS1:.#if 
0ce0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29  defined(NO_TLS1)
0cf0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e   || defined(OPEN
0d00: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20  SSL_NO_TLS1) || 
0d10: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
0d20: 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 29 0a  NO_TLS1_METHOD).
0d30: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
0d40: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72  esult(interp, pr
0d50: 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20  otocols[index], 
0d60: 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20  ": protocol not 
0d70: 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c  supported", NULL
0d80: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54  );..    return T
0d90: 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a  CL_ERROR;.#else.
0da0: 20 20 20 20 20 20 20 20 20 20 20 20 6d 69 6e 5f              min_
0db0: 76 65 72 73 69 6f 6e 20 3d 20 54 4c 53 31 5f 56  version = TLS1_V
0dc0: 45 52 53 49 4f 4e 3b 0a 20 20 20 20 20 20 20 20  ERSION;.        
0dd0: 20 20 20 20 6d 61 78 5f 76 65 72 73 69 6f 6e 20      max_version 
0de0: 3d 20 54 4c 53 31 5f 56 45 52 53 49 4f 4e 3b 0a  = TLS1_VERSION;.
0df0: 09 20 20 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64  .    break;.#end
0e00: 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c 53  if..case TLS_TLS
0e10: 31 5f 31 3a 0a 23 69 66 20 64 65 66 69 6e 65 64  1_1:.#if defined
0e20: 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64  (NO_TLS1_1) || d
0e30: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
0e40: 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66  O_TLS1_1) || def
0e50: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
0e60: 54 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 09  TLS1_1_METHOD)..
0e70: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
0e80: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f  sult(interp, pro
0e90: 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22  tocols[index], "
0ea0: 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73  : protocol not s
0eb0: 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29  upported", NULL)
0ec0: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  ;..    return TC
0ed0: 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 20  L_ERROR;.#else. 
0ee0: 20 20 20 20 20 20 20 20 20 20 20 6d 69 6e 5f 76             min_v
0ef0: 65 72 73 69 6f 6e 20 3d 20 54 4c 53 31 5f 31 5f  ersion = TLS1_1_
0f00: 56 45 52 53 49 4f 4e 3b 0a 20 20 20 20 20 20 20  VERSION;.       
0f10: 20 20 20 20 20 6d 61 78 5f 76 65 72 73 69 6f 6e       max_version
0f20: 20 3d 20 54 4c 53 31 5f 31 5f 56 45 52 53 49 4f   = TLS1_1_VERSIO
0f30: 4e 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 23  N;..    break;.#
0f40: 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f  endif..case TLS_
0f50: 54 4c 53 31 5f 32 3a 0a 23 69 66 20 64 65 66 69  TLS1_2:.#if defi
0f60: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c  ned(NO_TLS1_2) |
0f70: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  | defined(OPENSS
0f80: 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20  L_NO_TLS1_2) || 
0f90: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
0fa0: 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 48 4f 44  NO_TLS1_2_METHOD
0fb0: 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  )..    Tcl_Appen
0fc0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
0fd0: 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d  protocols[index]
0fe0: 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f  , ": protocol no
0ff0: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55  t supported", NU
1000: 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e  LL);..    return
1010: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73   TCL_ERROR;.#els
1020: 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 69  e.            mi
1030: 6e 5f 76 65 72 73 69 6f 6e 20 3d 20 54 4c 53 31  n_version = TLS1
1040: 5f 32 5f 56 45 52 53 49 4f 4e 3b 0a 20 20 20 20  _2_VERSION;.    
1050: 20 20 20 20 20 20 20 20 6d 61 78 5f 76 65 72 73          max_vers
1060: 69 6f 6e 20 3d 20 54 4c 53 31 5f 32 5f 56 45 52  ion = TLS1_2_VER
1070: 53 49 4f 4e 3b 0a 09 20 20 20 20 62 72 65 61 6b  SION;..    break
1080: 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 20 54  ;.#endif..case T
1090: 4c 53 5f 54 4c 53 31 5f 33 3a 0a 23 69 66 20 64  LS_TLS1_3:.#if d
10a0: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33  efined(NO_TLS1_3
10b0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45  ) || defined(OPE
10c0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a  NSSL_NO_TLS1_3).
10d0: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
10e0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72  esult(interp, pr
10f0: 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20  otocols[index], 
1100: 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20  ": protocol not 
1110: 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c  supported", NULL
1120: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54  );..    return T
1130: 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a  CL_ERROR;.#else.
1140: 20 20 20 20 20 20 20 20 20 20 20 20 6d 69 6e 5f              min_
1150: 76 65 72 73 69 6f 6e 20 3d 20 54 4c 53 31 5f 33  version = TLS1_3
1160: 5f 56 45 52 53 49 4f 4e 3b 0a 20 20 20 20 20 20  _VERSION;.      
1170: 20 20 20 20 20 20 6d 61 78 5f 76 65 72 73 69 6f        max_versio
1180: 6e 20 3d 20 54 4c 53 31 5f 33 5f 56 45 52 53 49  n = TLS1_3_VERSI
1190: 4f 4e 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a  ON;..    break;.
11a0: 23 65 6e 64 69 66 0a 09 64 65 66 61 75 6c 74 3a  #endif..default:
11b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 69 6e  .            min
11c0: 5f 76 65 72 73 69 6f 6e 20 3d 20 53 53 4c 33 5f  _version = SSL3_
11d0: 56 45 52 53 49 4f 4e 3b 0a 20 20 20 20 20 20 20  VERSION;.       
11e0: 20 20 20 20 20 6d 61 78 5f 76 65 72 73 69 6f 6e       max_version
11f0: 20 3d 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f   = TLS1_3_VERSIO
1200: 4e 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 20  N;..    break;. 
1210: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65     }..    /* Cre
1220: 61 74 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ate context */. 
1230: 20 20 20 69 66 20 28 28 63 74 78 20 3d 20 53 53     if ((ctx = SS
1240: 4c 5f 43 54 58 5f 6e 65 77 28 54 4c 53 5f 73 65  L_CTX_new(TLS_se
1250: 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 29 29 20  rver_method())) 
1260: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f  == NULL) {..Tcl_
1270: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1280: 65 72 70 2c 20 52 45 41 53 4f 4e 28 29 2c 20 4e  erp, REASON(), N
1290: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43  ULL);..return TC
12a0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
12b0: 20 20 20 20 2f 2a 20 53 65 74 20 70 72 6f 74 6f      /* Set proto
12c0: 63 6f 6c 20 76 65 72 73 69 6f 6e 73 20 2a 2f 0a  col versions */.
12d0: 20 20 20 20 69 66 20 28 53 53 4c 5f 43 54 58 5f      if (SSL_CTX_
12e0: 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65  set_min_proto_ve
12f0: 72 73 69 6f 6e 28 63 74 78 2c 20 6d 69 6e 5f 76  rsion(ctx, min_v
1300: 65 72 73 69 6f 6e 29 20 3d 3d 20 30 20 7c 7c 0a  ersion) == 0 ||.
1310: 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 78  .SSL_CTX_set_max
1320: 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63  _proto_version(c
1330: 74 78 2c 20 6d 61 78 5f 76 65 72 73 69 6f 6e 29  tx, max_version)
1340: 20 3d 3d 20 30 29 20 7b 0a 09 53 53 4c 5f 43 54   == 0) {..SSL_CT
1350: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65  X_free(ctx);..re
1360: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1370: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72      }..    /* Cr
1380: 65 61 74 65 20 53 53 4c 20 63 6f 6e 74 65 78 74  eate SSL context
1390: 20 2a 2f 0a 20 20 20 20 69 66 20 28 28 73 73 6c   */.    if ((ssl
13a0: 20 3d 20 53 53 4c 5f 6e 65 77 28 63 74 78 29 29   = SSL_new(ctx))
13b0: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c   == NULL) {..Tcl
13c0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
13d0: 74 65 72 70 2c 20 52 45 41 53 4f 4e 28 29 2c 20  terp, REASON(), 
13e0: 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f  NULL);..SSL_CTX_
13f0: 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75  free(ctx);..retu
1400: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1410: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20    }..    /* Use 
1420: 6c 69 73 74 20 61 6e 64 20 6f 72 64 65 72 20 61  list and order a
1430: 73 20 77 6f 75 6c 64 20 62 65 20 73 65 6e 74 20  s would be sent 
1440: 69 6e 20 61 20 43 6c 69 65 6e 74 48 65 6c 6c 6f  in a ClientHello
1450: 20 6f 72 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c   or all availabl
1460: 65 20 63 69 70 68 65 72 73 20 2a 2f 0a 20 20 20  e ciphers */.   
1470: 20 69 66 20 28 75 73 65 5f 73 75 70 70 6f 72 74   if (use_support
1480: 65 64 29 20 7b 0a 09 73 6b 20 3d 20 53 53 4c 5f  ed) {..sk = SSL_
1490: 67 65 74 31 5f 73 75 70 70 6f 72 74 65 64 5f 63  get1_supported_c
14a0: 69 70 68 65 72 73 28 73 73 6c 29 3b 0a 20 20 20  iphers(ssl);.   
14b0: 20 7d 20 65 6c 73 65 20 7b 0a 09 73 6b 20 3d 20   } else {..sk = 
14c0: 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 73 28  SSL_get_ciphers(
14d0: 73 73 6c 29 3b 0a 09 2f 2a 73 6b 20 3d 20 53 53  ssl);../*sk = SS
14e0: 4c 5f 43 54 58 5f 67 65 74 5f 63 69 70 68 65 72  L_CTX_get_cipher
14f0: 73 28 63 74 78 29 3b 2a 2f 0a 20 20 20 20 7d 0a  s(ctx);*/.    }.
1500: 0a 20 20 20 20 69 66 20 28 73 6b 20 21 3d 20 4e  .    if (sk != N
1510: 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 4f 62 6a 20  ULL) {..Tcl_Obj 
1520: 2a 6f 62 6a 50 74 72 20 3d 20 4e 55 4c 4c 3b 0a  *objPtr = NULL;.
1530: 0a 09 69 66 20 28 21 76 65 72 62 6f 73 65 29 20  ..if (!verbose) 
1540: 7b 0a 09 20 20 20 20 63 68 61 72 20 2a 63 70 3b  {..    char *cp;
1550: 0a 09 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54  ..    objPtr = T
1560: 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c  cl_NewListObj(0,
1570: 20 4e 55 4c 4c 29 3b 0a 0a 09 20 20 20 20 66 6f   NULL);...    fo
1580: 72 20 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 20  r (int i = 0; i 
1590: 3c 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f  < sk_SSL_CIPHER_
15a0: 6e 75 6d 28 73 6b 29 3b 20 69 2b 2b 29 20 7b 0a  num(sk); i++) {.
15b0: 09 09 63 6f 6e 73 74 20 53 53 4c 5f 43 49 50 48  ..const SSL_CIPH
15c0: 45 52 20 2a 63 20 3d 20 73 6b 5f 53 53 4c 5f 43  ER *c = sk_SSL_C
15d0: 49 50 48 45 52 5f 76 61 6c 75 65 28 73 6b 2c 20  IPHER_value(sk, 
15e0: 69 29 3b 0a 09 09 69 66 20 28 63 20 3d 3d 20 4e  i);...if (c == N
15f0: 55 4c 4c 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a  ULL) continue;..
1600: 09 09 2f 2a 20 63 69 70 68 65 72 20 6e 61 6d 65  ../* cipher name
1610: 20 6f 72 20 28 4e 4f 4e 45 29 20 2a 2f 0a 09 09   or (NONE) */...
1620: 63 70 20 3d 20 53 53 4c 5f 43 49 50 48 45 52 5f  cp = SSL_CIPHER_
1630: 67 65 74 5f 6e 61 6d 65 28 63 29 3b 0a 09 09 69  get_name(c);...i
1640: 66 20 28 63 70 20 3d 3d 20 4e 55 4c 4c 29 20 62  f (cp == NULL) b
1650: 72 65 61 6b 3b 0a 09 09 54 63 6c 5f 4c 69 73 74  reak;...Tcl_List
1660: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
1670: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
1680: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
1690: 6a 28 63 70 2c 20 2d 31 29 29 3b 0a 09 20 20 20  j(cp, -1));..   
16a0: 20 7d 0a 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20   }...} else {.. 
16b0: 20 20 20 63 68 61 72 20 62 75 66 5b 42 55 46 53     char buf[BUFS
16c0: 49 5a 5d 3b 0a 09 20 20 20 20 6f 62 6a 50 74 72  IZ];..    objPtr
16d0: 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67   = Tcl_NewString
16e0: 4f 62 6a 28 22 22 2c 30 29 3b 0a 0a 09 20 20 20  Obj("",0);...   
16f0: 20 66 6f 72 20 28 69 6e 74 20 69 20 3d 20 30 3b   for (int i = 0;
1700: 20 69 20 3c 20 73 6b 5f 53 53 4c 5f 43 49 50 48   i < sk_SSL_CIPH
1710: 45 52 5f 6e 75 6d 28 73 6b 29 3b 20 69 2b 2b 29  ER_num(sk); i++)
1720: 20 7b 0a 09 09 2f 2a 20 75 69 6e 74 33 32 5f 74   {.../* uint32_t
1730: 20 69 64 3b 2a 2f 0a 09 09 63 6f 6e 73 74 20 53   id;*/...const S
1740: 53 4c 5f 43 49 50 48 45 52 20 2a 63 20 3d 20 73  SL_CIPHER *c = s
1750: 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 76 61 6c  k_SSL_CIPHER_val
1760: 75 65 28 73 6b 2c 20 69 29 3b 0a 09 09 69 66 20  ue(sk, i);...if 
1770: 28 63 20 3d 3d 20 4e 55 4c 4c 29 20 63 6f 6e 74  (c == NULL) cont
1780: 69 6e 75 65 3b 0a 0a 09 09 2f 2a 20 47 65 74 20  inue;..../* Get 
1790: 4f 70 65 6e 53 53 4c 2d 73 70 65 63 69 66 69 63  OpenSSL-specific
17a0: 20 49 44 2c 20 6e 6f 74 20 49 41 4e 41 20 49 44   ID, not IANA ID
17b0: 20 2a 2f 0a 09 09 2f 2a 69 64 20 3d 20 53 53 4c   */.../*id = SSL
17c0: 5f 43 49 50 48 45 52 5f 67 65 74 5f 69 64 28 63  _CIPHER_get_id(c
17d0: 29 3b 2a 2f 0a 0a 09 09 2f 2a 20 54 4c 53 20 70  );*/..../* TLS p
17e0: 72 6f 74 6f 63 6f 6c 20 74 77 6f 2d 62 79 74 65  rotocol two-byte
17f0: 20 69 64 20 2a 2f 0a 09 09 2f 2a 69 64 20 3d 20   id */.../*id = 
1800: 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 70  SSL_CIPHER_get_p
1810: 72 6f 74 6f 63 6f 6c 5f 69 64 28 63 29 3b 2a 2f  rotocol_id(c);*/
1820: 0a 0a 09 09 2f 2a 20 53 74 61 6e 64 61 72 64 20  ..../* Standard 
1830: 52 46 43 20 6e 61 6d 65 20 6f 66 20 63 69 70 68  RFC name of ciph
1840: 65 72 20 6f 72 20 28 4e 4f 4e 45 29 20 2a 2f 0a  er or (NONE) */.
1850: 09 09 2f 2a 63 6f 6e 73 74 20 63 68 61 72 20 2a  ../*const char *
1860: 6e 6d 20 3d 20 53 53 4c 5f 43 49 50 48 45 52 5f  nm = SSL_CIPHER_
1870: 73 74 61 6e 64 61 72 64 5f 6e 61 6d 65 28 63 29  standard_name(c)
1880: 3b 0a 09 09 69 66 20 28 6e 6d 20 3d 3d 20 4e 55  ;...if (nm == NU
1890: 4c 4c 29 20 7b 6e 6d 20 3d 20 22 55 4e 4b 4e 4f  LL) {nm = "UNKNO
18a0: 57 4e 22 3b 7d 2a 2f 0a 0a 09 09 2f 2a 20 74 65  WN";}*/..../* te
18b0: 78 74 75 61 6c 20 64 65 73 63 72 69 70 74 69 6f  xtual descriptio
18c0: 6e 20 6f 66 20 74 68 65 20 63 69 70 68 65 72 20  n of the cipher 
18d0: 2a 2f 0a 09 09 69 66 20 28 53 53 4c 5f 43 49 50  */...if (SSL_CIP
18e0: 48 45 52 5f 64 65 73 63 72 69 70 74 69 6f 6e 28  HER_description(
18f0: 63 2c 20 62 75 66 2c 20 73 69 7a 65 6f 66 28 62  c, buf, sizeof(b
1900: 75 66 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  uf)) != NULL) {.
1910: 09 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ..    Tcl_Append
1920: 54 6f 4f 62 6a 28 6f 62 6a 50 74 72 2c 20 62 75  ToObj(objPtr, bu
1930: 66 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 73 74  f, (Tcl_Size) st
1940: 72 6c 65 6e 28 62 75 66 29 29 3b 0a 09 09 7d 20  rlen(buf));...} 
1950: 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 54 63 6c  else {...    Tcl
1960: 5f 41 70 70 65 6e 64 54 6f 4f 62 6a 28 6f 62 6a  _AppendToObj(obj
1970: 50 74 72 2c 20 22 55 4e 4b 4e 4f 57 4e 5c 6e 22  Ptr, "UNKNOWN\n"
1980: 2c 20 38 29 3b 0a 09 09 7d 0a 09 20 20 20 20 7d  , 8);...}..    }
1990: 0a 09 7d 0a 0a 09 2f 2a 20 43 6c 65 61 6e 20 75  ..}.../* Clean u
19a0: 70 20 2a 2f 0a 09 69 66 20 28 75 73 65 5f 73 75  p */..if (use_su
19b0: 70 70 6f 72 74 65 64 29 20 7b 0a 09 20 20 20 20  pported) {..    
19c0: 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 66 72  sk_SSL_CIPHER_fr
19d0: 65 65 28 73 6b 29 3b 0a 09 7d 0a 09 54 63 6c 5f  ee(sk);..}..Tcl_
19e0: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
19f0: 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20  erp, objPtr);.  
1a00: 20 20 7d 0a 0a 20 20 20 20 53 53 4c 5f 66 72 65    }..    SSL_fre
1a10: 65 28 73 73 6c 29 3b 0a 20 20 20 20 53 53 4c 5f  e(ssl);.    SSL_
1a20: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 20  CTX_free(ctx);. 
1a30: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b     return TCL_OK
1a40: 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20  ;..clientData = 
1a50: 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a  clientData;.}...
1a60: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
1a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1aa0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44  --------. *. * D
1ab0: 69 67 65 73 74 73 4f 62 6a 43 6d 64 20 2d 2d 0a  igestsObjCmd --.
1ac0: 20 2a 0a 20 2a 09 52 65 74 75 72 6e 20 61 20 6c   *. *.Return a l
1ad0: 69 73 74 20 6f 66 20 61 6c 6c 20 76 61 6c 69 64  ist of all valid
1ae0: 20 68 61 73 68 20 61 6c 67 6f 72 69 74 68 6d 73   hash algorithms
1af0: 20 6f 72 20 6d 65 73 73 61 67 65 20 64 69 67 65   or message dige
1b00: 73 74 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  sts.. *. * Resul
1b10: 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72  ts:. *.A standar
1b20: 64 20 54 63 6c 20 6c 69 73 74 2e 0a 20 2a 0a 20  d Tcl list.. *. 
1b30: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
1b40: 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d   *.None.. *. *--
1b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1b90: 2d 0a 20 2a 2f 0a 69 6e 74 20 44 69 67 65 73 74  -. */.int Digest
1ba0: 73 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61  sObjCmd(ClientDa
1bb0: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54  ta clientData, T
1bc0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1bd0: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c  p, int objc, Tcl
1be0: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76  _Obj *const objv
1bf0: 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62  []) {.    Tcl_Ob
1c00: 6a 20 2a 6f 62 6a 50 74 72 3b 0a 0a 20 20 20 20  j *objPtr;..    
1c10: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
1c20: 29 3b 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f  );..#if OPENSSL_
1c30: 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c  VERSION_NUMBER <
1c40: 20 30 78 31 30 31 30 30 30 30 30 4c 0a 20 20 20   0x10100000L.   
1c50: 20 4f 70 65 6e 53 53 4c 5f 61 64 64 5f 61 6c 6c   OpenSSL_add_all
1c60: 5f 64 69 67 65 73 74 73 28 29 3b 20 2f 2a 20 4d  _digests(); /* M
1c70: 61 6b 65 20 73 75 72 65 20 74 68 65 79 27 72 65  ake sure they're
1c80: 20 6c 6f 61 64 65 64 20 2a 2f 0a 23 65 6e 64 69   loaded */.#endi
1c90: 66 0a 0a 20 20 20 20 2f 2a 20 56 61 6c 69 64 61  f..    /* Valida
1ca0: 74 65 20 61 72 67 20 63 6f 75 6e 74 20 2a 2f 0a  te arg count */.
1cb0: 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d 20      if (objc != 
1cc0: 31 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e  1) {..Tcl_WrongN
1cd0: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
1ce0: 2c 20 6f 62 6a 76 2c 20 4e 55 4c 4c 29 3b 0a 09  , objv, NULL);..
1cf0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1d00: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1d10: 4c 69 73 74 20 61 6c 6c 20 64 69 67 65 73 74 73  List all digests
1d20: 20 2a 2f 0a 20 20 20 20 6f 62 6a 50 74 72 20 3d   */.    objPtr =
1d30: 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28   Tcl_NewListObj(
1d40: 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 4f 42  0, NULL);.    OB
1d50: 4a 5f 4e 41 4d 45 5f 64 6f 5f 61 6c 6c 28 4f 42  J_NAME_do_all(OB
1d60: 4a 5f 4e 41 4d 45 5f 54 59 50 45 5f 4d 44 5f 4d  J_NAME_TYPE_MD_M
1d70: 45 54 48 2c 20 4e 61 6d 65 73 43 61 6c 6c 62 61  ETH, NamesCallba
1d80: 63 6b 2c 20 28 76 6f 69 64 20 2a 29 20 6f 62 6a  ck, (void *) obj
1d90: 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65  Ptr);.    Tcl_Se
1da0: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
1db0: 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20  p, objPtr);.    
1dc0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09  return TCL_OK;..
1dd0: 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69  clientData = cli
1de0: 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a  entData;.}.../*.
1df0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
1e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1e30: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d 61 63 73  -----. *. * Macs
1e40: 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09  ObjCmd --. *. *.
1e50: 52 65 74 75 72 6e 20 61 20 6c 69 73 74 20 6f 66  Return a list of
1e60: 20 61 6c 6c 20 76 61 6c 69 64 20 6d 65 73 73 61   all valid messa
1e70: 67 65 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f  ge authenticatio
1e80: 6e 20 63 6f 64 65 73 20 28 4d 41 43 29 2e 0a 20  n codes (MAC).. 
1e90: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
1ea0: 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20  .A standard Tcl 
1eb0: 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65  list.. *. * Side
1ec0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e   effects:. *.Non
1ed0: 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  e.. *. *--------
1ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
1f20: 69 6e 74 20 4d 61 63 73 4f 62 6a 43 6d 64 28 43  int MacsObjCmd(C
1f30: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
1f40: 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70  Data, Tcl_Interp
1f50: 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62   *interp, int ob
1f60: 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e  jc, Tcl_Obj *con
1f70: 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20  st objv[]) {.   
1f80: 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72   Tcl_Obj *objPtr
1f90: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
1fa0: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f  Called");..    /
1fb0: 2a 20 56 61 6c 69 64 61 74 65 20 61 72 67 20 63  * Validate arg c
1fc0: 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 69 66 20 28  ount */.    if (
1fd0: 6f 62 6a 63 20 21 3d 20 31 29 20 7b 0a 09 54 63  objc != 1) {..Tc
1fe0: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
1ff0: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
2000: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54  NULL);..return T
2010: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
2020: 0a 20 20 20 20 2f 2a 20 4c 69 73 74 20 61 6c 6c  .    /* List all
2030: 20 4d 41 43 73 20 2a 2f 0a 20 20 20 20 6f 62 6a   MACs */.    obj
2040: 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73  Ptr = Tcl_NewLis
2050: 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20  tObj(0, NULL);. 
2060: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
2070: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
2080: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
2090: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 63 6d  NewStringObj("cm
20a0: 61 63 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54  ac", -1));.    T
20b0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
20c0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
20d0: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  objPtr, Tcl_NewS
20e0: 74 72 69 6e 67 4f 62 6a 28 22 68 6d 61 63 22 2c  tringObj("hmac",
20f0: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53   -1));.    Tcl_S
2100: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
2110: 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20  rp, objPtr);.   
2120: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
2130: 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c  .clientData = cl
2140: 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a  ientData;.}.../*
2150: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
2160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2190: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 50 72 6f  ------. *. * Pro
21a0: 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 20 2d 2d 0a  tocolsObjCmd --.
21b0: 20 2a 0a 20 2a 09 52 65 74 75 72 6e 20 61 20 6c   *. *.Return a l
21c0: 69 73 74 20 6f 66 20 74 68 65 20 61 76 61 69 6c  ist of the avail
21d0: 61 62 6c 65 20 6f 72 20 73 75 70 70 6f 72 74 65  able or supporte
21e0: 64 20 53 53 4c 2f 54 4c 53 20 70 72 6f 74 6f 63  d SSL/TLS protoc
21f0: 6f 6c 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  ols.. *. * Resul
2200: 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72  ts:. *.A standar
2210: 64 20 54 63 6c 20 6c 69 73 74 2e 0a 20 2a 0a 20  d Tcl list.. *. 
2220: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
2230: 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d   *.none. *. *---
2240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2280: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a  . */.static int.
2290: 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 28  ProtocolsObjCmd(
22a0: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
22b0: 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72  tData, Tcl_Inter
22c0: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f  p *interp, int o
22d0: 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f  bjc, Tcl_Obj *co
22e0: 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20  nst objv[]) {.  
22f0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74    Tcl_Obj *objPt
2300: 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  r;..    dprintf(
2310: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20  "Called");..    
2320: 2f 2a 20 56 61 6c 69 64 61 74 65 20 61 72 67 20  /* Validate arg 
2330: 63 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 69 66 20  count */.    if 
2340: 28 6f 62 6a 63 20 21 3d 20 31 29 20 7b 0a 09 54  (objc != 1) {..T
2350: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
2360: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
2370: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20   NULL);..return 
2380: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
2390: 0a 0a 20 20 20 20 2f 2a 20 4c 69 73 74 20 61 6c  ..    /* List al
23a0: 6c 20 4d 41 43 73 20 2a 2f 0a 20 20 20 20 6f 62  l MACs */.    ob
23b0: 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69  jPtr = Tcl_NewLi
23c0: 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a  stObj(0, NULL);.
23d0: 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53  #if OPENSSL_VERS
23e0: 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31  ION_NUMBER < 0x1
23f0: 30 31 30 30 30 30 30 4c 20 26 26 20 21 64 65 66  0100000L && !def
2400: 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26  ined(NO_SSL2) &&
2410: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
2420: 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20 54  L_NO_SSL2).    T
2430: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
2440: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
2450: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  objPtr, Tcl_NewS
2460: 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f  tringObj(protoco
2470: 6c 73 5b 54 4c 53 5f 53 53 4c 32 5d 2c 20 2d 31  ls[TLS_SSL2], -1
2480: 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21  ));.#endif.#if !
2490: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29  defined(NO_SSL3)
24a0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
24b0: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 26 26  NSSL_NO_SSL3) &&
24c0: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
24d0: 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44  L_NO_SSL3_METHOD
24e0: 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ).    Tcl_ListOb
24f0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
2500: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
2510: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
2520: 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 53 53  protocols[TLS_SS
2530: 4c 33 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69  L3], -1));.#endi
2540: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  f.#if !defined(N
2550: 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66 69  O_TLS1) && !defi
2560: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
2570: 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 64  LS1) && !defined
2580: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
2590: 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 54 63 6c  _METHOD).    Tcl
25a0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
25b0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
25c0: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
25d0: 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73  ingObj(protocols
25e0: 5b 54 4c 53 5f 54 4c 53 31 5d 2c 20 2d 31 29 29  [TLS_TLS1], -1))
25f0: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65  ;.#endif.#if !de
2600: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29  fined(NO_TLS1_1)
2610: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
2620: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 20  NSSL_NO_TLS1_1) 
2630: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
2640: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d 45  SSL_NO_TLS1_1_ME
2650: 54 48 4f 44 29 0a 20 20 20 20 54 63 6c 5f 4c 69  THOD).    Tcl_Li
2660: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
2670: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
2680: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
2690: 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c  Obj(protocols[TL
26a0: 53 5f 54 4c 53 31 5f 31 5d 2c 20 2d 31 29 29 3b  S_TLS1_1], -1));
26b0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66  .#endif.#if !def
26c0: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20  ined(NO_TLS1_2) 
26d0: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
26e0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 26  SSL_NO_TLS1_2) &
26f0: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
2700: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54  SL_NO_TLS1_2_MET
2710: 48 4f 44 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73  HOD).    Tcl_Lis
2720: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
2730: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
2740: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
2750: 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53  bj(protocols[TLS
2760: 5f 54 4c 53 31 5f 32 5d 2c 20 2d 31 29 29 3b 0a  _TLS1_2], -1));.
2770: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69  #endif.#if !defi
2780: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26  ned(NO_TLS1_3) &
2790: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
27a0: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20  SL_NO_TLS1_3).  
27b0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
27c0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
27d0: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
27e0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74  ewStringObj(prot
27f0: 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f 33  ocols[TLS_TLS1_3
2800: 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a  ], -1));.#endif.
2810: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
2820: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  sult(interp, obj
2830: 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Ptr);.    return
2840: 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74   TCL_OK;..client
2850: 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74  Data = clientDat
2860: 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  a;.}.../*. *----
2870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
28a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
28b0: 20 2a 0a 20 2a 20 56 65 72 73 69 6f 6e 4f 62 6a   *. * VersionObj
28c0: 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 52 65 74  Cmd --. *. *.Ret
28d0: 75 72 6e 20 61 20 73 74 72 69 6e 67 20 77 69 74  urn a string wit
28e0: 68 20 74 68 65 20 4f 70 65 6e 53 53 4c 20 76 65  h the OpenSSL ve
28f0: 72 73 69 6f 6e 20 69 6e 66 6f 2e 0a 20 2a 0a 20  rsion info.. *. 
2900: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20  * Results:. *.A 
2910: 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73  standard Tcl res
2920: 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  ult.. *. * Side 
2930: 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65  effects:. *.None
2940: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  .. *. *---------
2950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73  ----------. */.s
2990: 74 61 74 69 63 20 69 6e 74 0a 56 65 72 73 69 6f  tatic int.Versio
29a0: 6e 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61  nObjCmd(ClientDa
29b0: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54  ta clientData, T
29c0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
29d0: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c  p, int objc, Tcl
29e0: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76  _Obj *const objv
29f0: 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62  []) {.    Tcl_Ob
2a00: 6a 20 2a 6f 62 6a 50 74 72 3b 0a 0a 20 20 20 20  j *objPtr;..    
2a10: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
2a20: 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 61 6c 69 64  );..    /* Valid
2a30: 61 74 65 20 61 72 67 20 63 6f 75 6e 74 20 2a 2f  ate arg count */
2a40: 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d  .    if (objc !=
2a50: 20 31 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67   1) {..Tcl_Wrong
2a60: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
2a70: 31 2c 20 6f 62 6a 76 2c 20 4e 55 4c 4c 29 3b 0a  1, objv, NULL);.
2a80: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
2a90: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6f 62  R;.    }..    ob
2aa0: 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 53 74  jPtr = Tcl_NewSt
2ab0: 72 69 6e 67 4f 62 6a 28 4f 50 45 4e 53 53 4c 5f  ringObj(OPENSSL_
2ac0: 56 45 52 53 49 4f 4e 5f 54 45 58 54 2c 20 2d 31  VERSION_TEXT, -1
2ad0: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62  );.    Tcl_SetOb
2ae0: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
2af0: 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74  objPtr);.    ret
2b00: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69  urn TCL_OK;..cli
2b10: 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74  entData = client
2b20: 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d  Data;.}.../*. *-
2b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b70: 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 49 6e 66  --. *. * Tls_Inf
2b80: 6f 43 6f 6d 6d 61 6e 64 73 20 2d 2d 0a 20 2a 0a  oCommands --. *.
2b90: 20 2a 09 43 72 65 61 74 65 20 69 6e 66 6f 20 63   *.Create info c
2ba0: 6f 6d 6d 61 6e 64 73 0a 20 2a 0a 20 2a 20 52 65  ommands. *. * Re
2bb0: 74 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b  turns:. *.TCL_OK
2bc0: 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a   or TCL_ERROR. *
2bd0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
2be0: 3a 0a 20 2a 09 43 72 65 61 74 65 73 20 63 6f 6d  :. *.Creates com
2bf0: 6d 61 6e 64 73 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  mands. *. *-----
2c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
2c40: 2a 2f 0a 69 6e 74 20 54 6c 73 5f 49 6e 66 6f 43  */.int Tls_InfoC
2c50: 6f 6d 6d 61 6e 64 73 28 54 63 6c 5f 49 6e 74 65  ommands(Tcl_Inte
2c60: 72 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20 20  rp *interp) {.  
2c70: 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43    Tcl_CreateObjC
2c80: 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22  ommand(interp, "
2c90: 74 6c 73 3a 3a 63 69 70 68 65 72 73 22 2c 20 43  tls::ciphers", C
2ca0: 69 70 68 65 72 73 4f 62 6a 43 6d 64 2c 20 28 43  iphersObjCmd, (C
2cb0: 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54  lientData) 0, (T
2cc0: 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63  cl_CmdDeleteProc
2cd0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54   *) NULL);.    T
2ce0: 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
2cf0: 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73  and(interp, "tls
2d00: 3a 3a 64 69 67 65 73 74 73 22 2c 20 44 69 67 65  ::digests", Dige
2d10: 73 74 73 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65  stsObjCmd, (Clie
2d20: 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f  ntData) 0, (Tcl_
2d30: 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29  CmdDeleteProc *)
2d40: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f   NULL);.    Tcl_
2d50: 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64  CreateObjCommand
2d60: 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 6d  (interp, "tls::m
2d70: 61 63 73 22 2c 20 4d 61 63 73 4f 62 6a 43 6d 64  acs", MacsObjCmd
2d80: 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30  , (ClientData) 0
2d90: 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65  , (Tcl_CmdDelete
2da0: 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20  Proc *) NULL);. 
2db0: 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a     Tcl_CreateObj
2dc0: 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
2dd0: 22 74 6c 73 3a 3a 70 72 6f 74 6f 63 6f 6c 73 22  "tls::protocols"
2de0: 2c 20 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d  , ProtocolsObjCm
2df0: 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20  d, (ClientData) 
2e00: 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74  0, (Tcl_CmdDelet
2e10: 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a  eProc *) NULL);.
2e20: 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62      Tcl_CreateOb
2e30: 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  jCommand(interp,
2e40: 20 22 74 6c 73 3a 3a 76 65 72 73 69 6f 6e 22 2c   "tls::version",
2e50: 20 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 2c 20   VersionObjCmd, 
2e60: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20  (ClientData) 0, 
2e70: 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72  (Tcl_CmdDeletePr
2e80: 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20  oc *) NULL);.   
2e90: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
2ea0: 7d 0a                                            }.