Hex Artifact Content

Artifact 9b024f9b809011c41c83d5d0dfd77c3b6be98e6bc60ce68d7c349db9589ae063:


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 20 20 20 20 69 66 20 28 31 20 7c 7c 20 21  ;.    if (1 || !
03c0: 6f 62 6a 2d 3e 61 6c 69 61 73 29 20 7b 0a 09 2f  obj->alias) {../
03d0: 2a 20 46 69 6c 74 65 72 20 6f 75 74 20 73 69 67  * Filter out sig
03e0: 6e 65 64 20 64 69 67 65 73 74 73 20 28 61 2e 6b  ned digests (a.k
03f0: 2e 61 20 73 69 67 6e 61 74 75 72 65 20 61 6c 67  .a signature alg
0400: 6f 72 69 74 68 6d 73 29 20 2a 2f 0a 09 69 66 20  orithms) */..if 
0410: 28 73 74 72 73 74 72 28 6f 62 6a 2d 3e 6e 61 6d  (strstr(obj->nam
0420: 65 2c 20 22 72 73 61 22 29 20 3d 3d 20 4e 55 4c  e, "rsa") == NUL
0430: 4c 20 26 26 20 73 74 72 73 74 72 28 6f 62 6a 2d  L && strstr(obj-
0440: 3e 6e 61 6d 65 2c 20 22 52 53 41 22 29 20 3d 3d  >name, "RSA") ==
0450: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 63   NULL) {..    Tc
0460: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
0470: 6c 65 6d 65 6e 74 28 4e 55 4c 4c 2c 20 6f 62 6a  lement(NULL, obj
0480: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
0490: 6e 67 4f 62 6a 28 6f 62 6a 2d 3e 6e 61 6d 65 2c  ngObj(obj->name,
04a0: 2d 31 29 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 7d  -1));..}.    }.}
04b0: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
04c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
04d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
04e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
04f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
0500: 2a 20 43 69 70 68 65 72 73 4f 62 6a 43 6d 64 20  * CiphersObjCmd 
0510: 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72  --. *. *.This pr
0520: 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b  ocedure is invok
0530: 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68  ed to process th
0540: 65 20 22 74 6c 73 3a 3a 63 69 70 68 65 72 73 22  e "tls::ciphers"
0550: 20 63 6f 6d 6d 61 6e 64 0a 20 2a 09 74 6f 20 6c   command. *.to l
0560: 69 73 74 20 61 76 61 69 6c 61 62 6c 65 20 63 69  ist available ci
0570: 70 68 65 72 73 2c 20 62 61 73 65 64 20 75 70 6f  phers, based upo
0580: 6e 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63  n protocol selec
0590: 74 65 64 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  ted.. *. * Resul
05a0: 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72  ts:. *.A standar
05b0: 64 20 54 63 6c 20 72 65 73 75 6c 74 20 6c 69 73  d Tcl result lis
05c0: 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  t.. *. * Side ef
05d0: 66 65 63 74 73 3a 0a 20 2a 09 63 6f 6e 73 74 72  fects:. *.constr
05e0: 75 63 74 73 20 61 6e 64 20 64 65 73 74 72 6f 79  ucts and destroy
05f0: 73 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 28 43  s SSL context (C
0600: 54 58 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  TX). *. *-------
0610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
0650: 0a 73 74 61 74 69 63 20 69 6e 74 20 43 69 70 68  .static int Ciph
0660: 65 72 73 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74  ersObjCmd(Client
0670: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
0680: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
0690: 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54  erp, int objc, T
06a0: 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62  cl_Obj *const ob
06b0: 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f  jv[]) {.    Tcl_
06c0: 4f 62 6a 20 2a 6f 62 6a 50 74 72 20 3d 20 4e 55  Obj *objPtr = NU
06d0: 4c 4c 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 20  LL;.    SSL_CTX 
06e0: 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  *ctx = NULL;.   
06f0: 20 53 53 4c 20 2a 73 73 6c 20 3d 20 4e 55 4c 4c   SSL *ssl = NULL
0700: 3b 0a 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 53  ;.    STACK_OF(S
0710: 53 4c 5f 43 49 50 48 45 52 29 20 2a 73 6b 3b 0a  SL_CIPHER) *sk;.
0720: 20 20 20 20 63 68 61 72 20 2a 63 70 2c 20 62 75      char *cp, bu
0730: 66 5b 42 55 46 53 49 5a 5d 3b 0a 20 20 20 20 69  f[BUFSIZ];.    i
0740: 6e 74 20 69 6e 64 65 78 2c 20 76 65 72 62 6f 73  nt index, verbos
0750: 65 20 3d 20 30 2c 20 75 73 65 5f 73 75 70 70 6f  e = 0, use_suppo
0760: 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 63 6f  rted = 0;.    co
0770: 6e 73 74 20 53 53 4c 5f 4d 45 54 48 4f 44 20 2a  nst SSL_METHOD *
0780: 6d 65 74 68 6f 64 3b 0a 0a 20 20 20 20 64 70 72  method;..    dpr
0790: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
07a0: 0a 20 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3c  .    if ((objc <
07b0: 20 31 29 20 7c 7c 20 28 6f 62 6a 63 20 3e 20 34   1) || (objc > 4
07c0: 29 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e  )) {..Tcl_WrongN
07d0: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
07e0: 2c 20 6f 62 6a 76 2c 20 22 3f 70 72 6f 74 6f 63  , objv, "?protoc
07f0: 6f 6c 3f 20 3f 76 65 72 62 6f 73 65 3f 20 3f 73  ol? ?verbose? ?s
0800: 75 70 70 6f 72 74 65 64 3f 22 29 3b 0a 09 72 65  upported?");..re
0810: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
0820: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 6f 62      }.    if (ob
0830: 6a 63 20 3d 3d 20 31 29 20 7b 0a 09 2f 2a 20 4c  jc == 1) {../* L
0840: 69 73 74 20 61 6c 6c 20 63 69 70 68 65 72 73 20  ist all ciphers 
0850: 2a 2f 0a 09 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a  */..Tcl_Obj *obj
0860: 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73  Ptr = Tcl_NewLis
0870: 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a  tObj(0, NULL);..
0880: 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53  #if OPENSSL_VERS
0890: 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31  ION_NUMBER < 0x1
08a0: 30 31 30 30 30 30 30 4c 0a 09 4f 70 65 6e 53 53  0100000L..OpenSS
08b0: 4c 5f 61 64 64 5f 61 6c 6c 5f 63 69 70 68 65 72  L_add_all_cipher
08c0: 73 28 29 3b 20 2f 2a 20 4d 61 6b 65 20 73 75 72  s(); /* Make sur
08d0: 65 20 74 68 65 79 27 72 65 20 6c 6f 61 64 65 64  e they're loaded
08e0: 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 09 4f 42 4a   */.#endif...OBJ
08f0: 5f 4e 41 4d 45 5f 64 6f 5f 61 6c 6c 28 4f 42 4a  _NAME_do_all(OBJ
0900: 5f 4e 41 4d 45 5f 54 59 50 45 5f 43 49 50 48 45  _NAME_TYPE_CIPHE
0910: 52 5f 4d 45 54 48 2c 20 4e 61 6d 65 73 43 61 6c  R_METH, NamesCal
0920: 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 20  lback, (void *) 
0930: 6f 62 6a 50 74 72 29 3b 0a 09 54 63 6c 5f 52 65  objPtr);..Tcl_Re
0940: 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  setResult(interp
0950: 29 3b 0a 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65  );..Tcl_SetObjRe
0960: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  sult(interp, obj
0970: 50 74 72 29 3b 0a 09 72 65 74 75 72 6e 20 54 43  Ptr);..return TC
0980: 4c 5f 4f 4b 3b 0a 0a 20 20 20 20 7d 20 65 6c 73  L_OK;..    } els
0990: 65 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 64  e if (Tcl_GetInd
09a0: 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  exFromObj(interp
09b0: 2c 20 6f 62 6a 76 5b 31 5d 2c 20 70 72 6f 74 6f  , objv[1], proto
09c0: 63 6f 6c 73 2c 20 22 70 72 6f 74 6f 63 6f 6c 22  cols, "protocol"
09d0: 2c 20 30 2c 20 26 69 6e 64 65 78 29 20 21 3d 20  , 0, &index) != 
09e0: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72  TCL_OK) {..retur
09f0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
0a00: 20 7d 0a 20 20 20 20 69 66 20 28 28 6f 62 6a 63   }.    if ((objc
0a10: 20 3e 20 32 29 20 26 26 20 54 63 6c 5f 47 65 74   > 2) && Tcl_Get
0a20: 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69  BooleanFromObj(i
0a30: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
0a40: 26 76 65 72 62 6f 73 65 29 20 21 3d 20 54 43 4c  &verbose) != TCL
0a50: 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54  _OK) {..return T
0a60: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
0a70: 20 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3e 20      if ((objc > 
0a80: 33 29 20 26 26 20 54 63 6c 5f 47 65 74 42 6f 6f  3) && Tcl_GetBoo
0a90: 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  leanFromObj(inte
0aa0: 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 75 73  rp, objv[3], &us
0ab0: 65 5f 73 75 70 70 6f 72 74 65 64 29 20 21 3d 20  e_supported) != 
0ac0: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72  TCL_OK) {..retur
0ad0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
0ae0: 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61   }..    ERR_clea
0af0: 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20  r_error();..    
0b00: 73 77 69 74 63 68 20 28 28 65 6e 75 6d 20 70 72  switch ((enum pr
0b10: 6f 74 6f 63 6f 6c 29 69 6e 64 65 78 29 20 7b 0a  otocol)index) {.
0b20: 09 63 61 73 65 20 54 4c 53 5f 53 53 4c 32 3a 0a  .case TLS_SSL2:.
0b30: 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53  #if OPENSSL_VERS
0b40: 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 78  ION_NUMBER >= 0x
0b50: 31 30 31 30 30 30 30 30 4c 20 7c 7c 20 64 65 66  10100000L || def
0b60: 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 7c 7c  ined(NO_SSL2) ||
0b70: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
0b80: 5f 4e 4f 5f 53 53 4c 32 29 0a 09 20 20 20 20 54  _NO_SSL2)..    T
0b90: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
0ba0: 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c  interp, protocol
0bb0: 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f  s[index], ": pro
0bc0: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72  tocol not suppor
0bd0: 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20  ted", NULL);..  
0be0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
0bf0: 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d  OR;.#else..    m
0c00: 65 74 68 6f 64 20 3d 20 53 53 4c 76 32 5f 6d 65  ethod = SSLv2_me
0c10: 74 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23  thod(); break;.#
0c20: 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f  endif..case TLS_
0c30: 53 53 4c 33 3a 0a 23 69 66 20 64 65 66 69 6e 65  SSL3:.#if define
0c40: 64 28 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 65  d(NO_SSL3) || de
0c50: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
0c60: 5f 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e 65  _SSL3) || define
0c70: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c  d(OPENSSL_NO_SSL
0c80: 33 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 54  3_METHOD)..    T
0c90: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
0ca0: 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c  interp, protocol
0cb0: 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f  s[index], ": pro
0cc0: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72  tocol not suppor
0cd0: 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20  ted", NULL);..  
0ce0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
0cf0: 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d  OR;.#else..    m
0d00: 65 74 68 6f 64 20 3d 20 53 53 4c 76 33 5f 6d 65  ethod = SSLv3_me
0d10: 74 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23  thod(); break;.#
0d20: 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f  endif..case TLS_
0d30: 54 4c 53 31 3a 0a 23 69 66 20 64 65 66 69 6e 65  TLS1:.#if define
0d40: 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65  d(NO_TLS1) || de
0d50: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
0d60: 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65  _TLS1) || define
0d70: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
0d80: 31 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 54  1_METHOD)..    T
0d90: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
0da0: 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c  interp, protocol
0db0: 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f  s[index], ": pro
0dc0: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72  tocol not suppor
0dd0: 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20  ted", NULL);..  
0de0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
0df0: 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d  OR;.#else..    m
0e00: 65 74 68 6f 64 20 3d 20 54 4c 53 76 31 5f 6d 65  ethod = TLSv1_me
0e10: 74 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23  thod(); break;.#
0e20: 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f  endif..case TLS_
0e30: 54 4c 53 31 5f 31 3a 0a 23 69 66 20 64 65 66 69  TLS1_1:.#if defi
0e40: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c  ned(NO_TLS1_1) |
0e50: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  | defined(OPENSS
0e60: 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20  L_NO_TLS1_1) || 
0e70: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
0e80: 4e 4f 5f 54 4c 53 31 5f 31 5f 4d 45 54 48 4f 44  NO_TLS1_1_METHOD
0e90: 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  )..    Tcl_Appen
0ea0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
0eb0: 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d  protocols[index]
0ec0: 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f  , ": protocol no
0ed0: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55  t supported", NU
0ee0: 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e  LL);..    return
0ef0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73   TCL_ERROR;.#els
0f00: 65 0a 09 20 20 20 20 6d 65 74 68 6f 64 20 3d 20  e..    method = 
0f10: 54 4c 53 76 31 5f 31 5f 6d 65 74 68 6f 64 28 29  TLSv1_1_method()
0f20: 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a  ; break;.#endif.
0f30: 09 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 5f 32  .case TLS_TLS1_2
0f40: 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f  :.#if defined(NO
0f50: 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69  _TLS1_2) || defi
0f60: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
0f70: 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65  LS1_2) || define
0f80: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
0f90: 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20  1_2_METHOD)..   
0fa0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
0fb0: 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63  t(interp, protoc
0fc0: 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70  ols[index], ": p
0fd0: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70  rotocol not supp
0fe0: 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09  orted", NULL);..
0ff0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1000: 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20  RROR;.#else..   
1010: 20 6d 65 74 68 6f 64 20 3d 20 54 4c 53 76 31 5f   method = TLSv1_
1020: 32 5f 6d 65 74 68 6f 64 28 29 3b 20 62 72 65 61  2_method(); brea
1030: 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 20  k;.#endif..case 
1040: 54 4c 53 5f 54 4c 53 31 5f 33 3a 0a 23 69 66 20  TLS_TLS1_3:.#if 
1050: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f  defined(NO_TLS1_
1060: 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50  3) || defined(OP
1070: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29  ENSSL_NO_TLS1_3)
1080: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ..    Tcl_Append
1090: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70  Result(interp, p
10a0: 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c  rotocols[index],
10b0: 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74   ": protocol not
10c0: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c   supported", NUL
10d0: 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  L);..    return 
10e0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65  TCL_ERROR;.#else
10f0: 0a 09 20 20 20 20 6d 65 74 68 6f 64 20 3d 20 54  ..    method = T
1100: 4c 53 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 20 20  LS_method();..  
1110: 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 69    SSL_CTX_set_mi
1120: 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28  n_proto_version(
1130: 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53  ctx, TLS1_3_VERS
1140: 49 4f 4e 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43  ION);..    SSL_C
1150: 54 58 5f 73 65 74 5f 6d 61 78 5f 70 72 6f 74 6f  TX_set_max_proto
1160: 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c  _version(ctx, TL
1170: 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 09  S1_3_VERSION);..
1180: 20 20 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69      break;.#endi
1190: 66 0a 09 64 65 66 61 75 6c 74 3a 0a 09 20 20 20  f..default:..   
11a0: 20 6d 65 74 68 6f 64 20 3d 20 54 4c 53 5f 6d 65   method = TLS_me
11b0: 74 68 6f 64 28 29 3b 0a 09 20 20 20 20 62 72 65  thod();..    bre
11c0: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63  ak;.    }..    c
11d0: 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77  tx = SSL_CTX_new
11e0: 28 6d 65 74 68 6f 64 29 3b 0a 20 20 20 20 69 66  (method);.    if
11f0: 20 28 63 74 78 20 3d 3d 20 4e 55 4c 4c 29 20 7b   (ctx == NULL) {
1200: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
1210: 6c 74 28 69 6e 74 65 72 70 2c 20 52 45 41 53 4f  lt(interp, REASO
1220: 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74  N(), NULL);..ret
1230: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1240: 20 20 20 7d 0a 0a 20 20 20 20 73 73 6c 20 3d 20     }..    ssl = 
1250: 53 53 4c 5f 6e 65 77 28 63 74 78 29 3b 0a 20 20  SSL_new(ctx);.  
1260: 20 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c    if (ssl == NUL
1270: 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  L) {..Tcl_Append
1280: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 52  Result(interp, R
1290: 45 41 53 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a  EASON(), NULL);.
12a0: 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74  .SSL_CTX_free(ct
12b0: 78 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  x);..return TCL_
12c0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
12d0: 20 20 2f 2a 20 55 73 65 20 6c 69 73 74 20 61 6e    /* Use list an
12e0: 64 20 6f 72 64 65 72 20 61 73 20 77 6f 75 6c 64  d order as would
12f0: 20 62 65 20 73 65 6e 74 20 69 6e 20 61 20 43 6c   be sent in a Cl
1300: 69 65 6e 74 48 65 6c 6c 6f 20 6f 72 20 61 6c 6c  ientHello or all
1310: 20 61 76 61 69 6c 61 62 6c 65 20 63 69 70 68 65   available ciphe
1320: 72 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 75 73  rs */.    if (us
1330: 65 5f 73 75 70 70 6f 72 74 65 64 29 20 7b 0a 09  e_supported) {..
1340: 73 6b 20 3d 20 53 53 4c 5f 67 65 74 31 5f 73 75  sk = SSL_get1_su
1350: 70 70 6f 72 74 65 64 5f 63 69 70 68 65 72 73 28  pported_ciphers(
1360: 73 73 6c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65  ssl);.    } else
1370: 20 7b 0a 09 73 6b 20 3d 20 53 53 4c 5f 67 65 74   {..sk = SSL_get
1380: 5f 63 69 70 68 65 72 73 28 73 73 6c 29 3b 0a 20  _ciphers(ssl);. 
1390: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 6b     }..    if (sk
13a0: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20   != NULL) {..if 
13b0: 28 21 76 65 72 62 6f 73 65 29 20 7b 0a 09 20 20  (!verbose) {..  
13c0: 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e    objPtr = Tcl_N
13d0: 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c  ewListObj(0, NUL
13e0: 4c 29 3b 0a 09 20 20 20 20 66 6f 72 20 28 69 6e  L);..    for (in
13f0: 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b 5f  t i = 0; i < sk_
1400: 53 53 4c 5f 43 49 50 48 45 52 5f 6e 75 6d 28 73  SSL_CIPHER_num(s
1410: 6b 29 3b 20 69 2b 2b 29 20 7b 0a 09 09 63 6f 6e  k); i++) {...con
1420: 73 74 20 53 53 4c 5f 43 49 50 48 45 52 20 2a 63  st SSL_CIPHER *c
1430: 20 3d 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52   = sk_SSL_CIPHER
1440: 5f 76 61 6c 75 65 28 73 6b 2c 20 69 29 3b 0a 09  _value(sk, i);..
1450: 09 69 66 20 28 63 20 3d 3d 20 4e 55 4c 4c 29 20  .if (c == NULL) 
1460: 63 6f 6e 74 69 6e 75 65 3b 0a 0a 09 09 2f 2a 20  continue;..../* 
1470: 63 69 70 68 65 72 20 6e 61 6d 65 20 6f 72 20 28  cipher name or (
1480: 4e 4f 4e 45 29 20 2a 2f 0a 09 09 63 70 20 3d 20  NONE) */...cp = 
1490: 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 6e  SSL_CIPHER_get_n
14a0: 61 6d 65 28 63 29 3b 0a 09 09 69 66 20 28 63 70  ame(c);...if (cp
14b0: 20 3d 3d 20 4e 55 4c 4c 29 20 62 72 65 61 6b 3b   == NULL) break;
14c0: 0a 09 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  ...Tcl_ListObjAp
14d0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
14e0: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
14f0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 63 70 2c  NewStringObj(cp,
1500: 20 2d 31 29 29 3b 0a 09 20 20 20 20 7d 0a 0a 09   -1));..    }...
1510: 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 6f 62  } else {..    ob
1520: 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 53 74  jPtr = Tcl_NewSt
1530: 72 69 6e 67 4f 62 6a 28 22 22 2c 30 29 3b 0a 09  ringObj("",0);..
1540: 20 20 20 20 66 6f 72 20 28 69 6e 74 20 69 20 3d      for (int i =
1550: 20 30 3b 20 69 20 3c 20 73 6b 5f 53 53 4c 5f 43   0; i < sk_SSL_C
1560: 49 50 48 45 52 5f 6e 75 6d 28 73 6b 29 3b 20 69  IPHER_num(sk); i
1570: 2b 2b 29 20 7b 0a 09 09 2f 2a 20 75 69 6e 74 33  ++) {.../* uint3
1580: 32 5f 74 20 69 64 3b 2a 2f 0a 09 09 63 6f 6e 73  2_t id;*/...cons
1590: 74 20 53 53 4c 5f 43 49 50 48 45 52 20 2a 63 20  t SSL_CIPHER *c 
15a0: 3d 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f  = sk_SSL_CIPHER_
15b0: 76 61 6c 75 65 28 73 6b 2c 20 69 29 3b 0a 09 09  value(sk, i);...
15c0: 69 66 20 28 63 20 3d 3d 20 4e 55 4c 4c 29 20 63  if (c == NULL) c
15d0: 6f 6e 74 69 6e 75 65 3b 0a 0a 09 09 2f 2a 20 47  ontinue;..../* G
15e0: 65 74 20 4f 70 65 6e 53 53 4c 2d 73 70 65 63 69  et OpenSSL-speci
15f0: 66 69 63 20 49 44 2c 20 6e 6f 74 20 49 41 4e 41  fic ID, not IANA
1600: 20 49 44 20 2a 2f 0a 09 09 2f 2a 69 64 20 3d 20   ID */.../*id = 
1610: 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 69  SSL_CIPHER_get_i
1620: 64 28 63 29 3b 2a 2f 0a 0a 09 09 2f 2a 20 54 4c  d(c);*/..../* TL
1630: 53 20 70 72 6f 74 6f 63 6f 6c 20 74 77 6f 2d 62  S protocol two-b
1640: 79 74 65 20 69 64 20 2a 2f 0a 09 09 2f 2a 69 64  yte id */.../*id
1650: 20 3d 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65   = SSL_CIPHER_ge
1660: 74 5f 70 72 6f 74 6f 63 6f 6c 5f 69 64 28 63 29  t_protocol_id(c)
1670: 3b 2a 2f 0a 0a 09 09 2f 2a 20 53 74 61 6e 64 61  ;*/..../* Standa
1680: 72 64 20 52 46 43 20 6e 61 6d 65 20 6f 66 20 63  rd RFC name of c
1690: 69 70 68 65 72 20 6f 72 20 28 4e 4f 4e 45 29 20  ipher or (NONE) 
16a0: 2a 2f 0a 09 09 2f 2a 63 6f 6e 73 74 20 63 68 61  */.../*const cha
16b0: 72 20 2a 6e 6d 20 3d 20 53 53 4c 5f 43 49 50 48  r *nm = SSL_CIPH
16c0: 45 52 5f 73 74 61 6e 64 61 72 64 5f 6e 61 6d 65  ER_standard_name
16d0: 28 63 29 3b 0a 09 09 69 66 20 28 6e 6d 20 3d 3d  (c);...if (nm ==
16e0: 20 4e 55 4c 4c 29 20 7b 6e 6d 20 3d 20 22 55 4e   NULL) {nm = "UN
16f0: 4b 4e 4f 57 4e 22 3b 7d 2a 2f 0a 0a 09 09 2f 2a  KNOWN";}*/..../*
1700: 20 74 65 78 74 75 61 6c 20 64 65 73 63 72 69 70   textual descrip
1710: 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 69 70 68  tion of the ciph
1720: 65 72 20 2a 2f 0a 09 09 69 66 20 28 53 53 4c 5f  er */...if (SSL_
1730: 43 49 50 48 45 52 5f 64 65 73 63 72 69 70 74 69  CIPHER_descripti
1740: 6f 6e 28 63 2c 20 62 75 66 2c 20 73 69 7a 65 6f  on(c, buf, sizeo
1750: 66 28 62 75 66 29 29 20 21 3d 20 4e 55 4c 4c 29  f(buf)) != NULL)
1760: 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 41 70 70   {...    Tcl_App
1770: 65 6e 64 54 6f 4f 62 6a 28 6f 62 6a 50 74 72 2c  endToObj(objPtr,
1780: 20 62 75 66 2c 20 28 54 63 6c 5f 53 69 7a 65 29   buf, (Tcl_Size)
1790: 20 73 74 72 6c 65 6e 28 62 75 66 29 29 3b 0a 09   strlen(buf));..
17a0: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20  .} else {...    
17b0: 54 63 6c 5f 41 70 70 65 6e 64 54 6f 4f 62 6a 28  Tcl_AppendToObj(
17c0: 6f 62 6a 50 74 72 2c 20 22 55 4e 4b 4e 4f 57 4e  objPtr, "UNKNOWN
17d0: 5c 6e 22 2c 20 38 29 3b 0a 09 09 7d 0a 09 20 20  \n", 8);...}..  
17e0: 20 20 7d 0a 09 7d 0a 09 69 66 20 28 75 73 65 5f    }..}..if (use_
17f0: 73 75 70 70 6f 72 74 65 64 29 20 7b 0a 09 20 20  supported) {..  
1800: 20 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f    sk_SSL_CIPHER_
1810: 66 72 65 65 28 73 6b 29 3b 0a 09 7d 0a 20 20 20  free(sk);..}.   
1820: 20 7d 0a 20 20 20 20 53 53 4c 5f 66 72 65 65 28   }.    SSL_free(
1830: 73 73 6c 29 3b 0a 20 20 20 20 53 53 4c 5f 43 54  ssl);.    SSL_CT
1840: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 0a 20 20  X_free(ctx);..  
1850: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
1860: 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  lt(interp, objPt
1870: 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  r);.    return T
1880: 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61  CL_OK;..clientDa
1890: 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b  ta = clientData;
18a0: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
18b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
18f0: 0a 20 2a 20 44 69 67 65 73 74 73 4f 62 6a 43 6d  . * DigestsObjCm
1900: 64 20 2d 2d 20 0a 20 2a 0a 20 2a 09 52 65 74 75  d -- . *. *.Retu
1910: 72 6e 20 61 20 6c 69 73 74 20 6f 66 20 61 6c 6c  rn a list of all
1920: 20 76 61 6c 69 64 20 68 61 73 68 20 61 6c 67 6f   valid hash algo
1930: 72 69 74 68 6d 73 20 6f 72 20 6d 65 73 73 61 67  rithms or messag
1940: 65 20 64 69 67 65 73 74 73 2e 0a 20 2a 0a 20 2a  e digests.. *. *
1950: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73   Results:. *.A s
1960: 74 61 6e 64 61 72 64 20 54 63 6c 20 6c 69 73 74  tandard Tcl list
1970: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  .. *. * Side eff
1980: 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20  ects:. *.None.. 
1990: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
19a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
19b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
19c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
19d0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20  -------. */.int 
19e0: 44 69 67 65 73 74 73 4f 62 6a 43 6d 64 28 43 6c  DigestsObjCmd(Cl
19f0: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
1a00: 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20  ata, Tcl_Interp 
1a10: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a  *interp, int obj
1a20: 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73  c, Tcl_Obj *cons
1a30: 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20  t objv[]) {.    
1a40: 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 20  Tcl_Obj *objPtr 
1a50: 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a  = Tcl_NewListObj
1a60: 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 0a  (0, NULL);.    .
1a70: 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53  #if OPENSSL_VERS
1a80: 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31  ION_NUMBER < 0x1
1a90: 30 31 30 30 30 30 30 4c 0a 20 20 20 20 4f 70 65  0100000L.    Ope
1aa0: 6e 53 53 4c 5f 61 64 64 5f 61 6c 6c 5f 64 69 67  nSSL_add_all_dig
1ab0: 65 73 74 73 28 29 3b 20 2f 2a 20 4d 61 6b 65 20  ests(); /* Make 
1ac0: 73 75 72 65 20 74 68 65 79 27 72 65 20 6c 6f 61  sure they're loa
1ad0: 64 65 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20  ded */.#endif.. 
1ae0: 20 20 20 4f 42 4a 5f 4e 41 4d 45 5f 64 6f 5f 61     OBJ_NAME_do_a
1af0: 6c 6c 28 4f 42 4a 5f 4e 41 4d 45 5f 54 59 50 45  ll(OBJ_NAME_TYPE
1b00: 5f 4d 44 5f 4d 45 54 48 2c 20 4e 61 6d 65 73 43  _MD_METH, NamesC
1b10: 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a  allback, (void *
1b20: 29 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 54  ) objPtr);.    T
1b30: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
1b40: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b  interp, objPtr);
1b50: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1b60: 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20  OK;..clientData 
1b70: 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 09 6f  = clientData;..o
1b80: 62 6a 63 20 3d 20 6f 62 6a 63 3b 0a 09 6f 62 6a  bjc = objc;..obj
1b90: 76 20 3d 20 6f 62 6a 76 3b 0a 7d 0a 0c 0a 2f 2a  v = objv;.}.../*
1ba0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
1bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1be0: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d 61 63  ------. *. * Mac
1bf0: 73 4f 62 6a 43 6d 64 20 2d 2d 20 0a 20 2a 0a 20  sObjCmd -- . *. 
1c00: 2a 09 52 65 74 75 72 6e 20 61 20 6c 69 73 74 20  *.Return a list 
1c10: 6f 66 20 61 6c 6c 20 76 61 6c 69 64 20 6d 65 73  of all valid mes
1c20: 73 61 67 65 20 61 75 74 68 65 6e 74 69 63 61 74  sage authenticat
1c30: 69 6f 6e 20 63 6f 64 65 73 20 28 4d 41 43 29 2e  ion codes (MAC).
1c40: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
1c50: 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63   *.A standard Tc
1c60: 6c 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 53 69  l list.. *. * Si
1c70: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e  de effects:. *.N
1c80: 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  one.. *. *------
1c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
1cd0: 2f 0a 69 6e 74 20 4d 61 63 73 4f 62 6a 43 6d 64  /.int MacsObjCmd
1ce0: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65  (ClientData clie
1cf0: 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65  ntData, Tcl_Inte
1d00: 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20  rp *interp, int 
1d10: 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63  objc, Tcl_Obj *c
1d20: 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20  onst objv[]) {. 
1d30: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50     Tcl_Obj *objP
1d40: 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74  tr = Tcl_NewList
1d50: 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20  Obj(0, NULL);.  
1d60: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
1d70: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
1d80: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
1d90: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 63 6d 61  ewStringObj("cma
1da0: 63 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63  c", -1));.    Tc
1db0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
1dc0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
1dd0: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
1de0: 72 69 6e 67 4f 62 6a 28 22 68 6d 61 63 22 2c 20  ringObj("hmac", 
1df0: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65  -1));.    Tcl_Se
1e00: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
1e10: 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20  p, objPtr);.    
1e20: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09  return TCL_OK;..
1e30: 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69  clientData = cli
1e40: 65 6e 74 44 61 74 61 3b 0a 09 6f 62 6a 63 20 3d  entData;..objc =
1e50: 20 6f 62 6a 63 3b 0a 09 6f 62 6a 76 20 3d 20 6f   objc;..objv = o
1e60: 62 6a 76 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  bjv;.}.../*. *--
1e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1eb0: 2d 0a 20 2a 0a 20 2a 20 50 72 6f 74 6f 63 6f 6c  -. *. * Protocol
1ec0: 73 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a  sObjCmd --. *. *
1ed0: 09 52 65 74 75 72 6e 20 61 20 6c 69 73 74 20 6f  .Return a list o
1ee0: 66 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20  f the available 
1ef0: 6f 72 20 73 75 70 70 6f 72 74 65 64 20 53 53 4c  or supported SSL
1f00: 2f 54 4c 53 20 70 72 6f 74 6f 63 6f 6c 73 2e 0a  /TLS protocols..
1f10: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
1f20: 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c  *.A standard Tcl
1f30: 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 53 69 64   list.. *. * Sid
1f40: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 6e 6f  e effects:. *.no
1f50: 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  ne. *. *--------
1f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
1fa0: 73 74 61 74 69 63 20 69 6e 74 0a 50 72 6f 74 6f  static int.Proto
1fb0: 63 6f 6c 73 4f 62 6a 43 6d 64 28 43 6c 69 65 6e  colsObjCmd(Clien
1fc0: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
1fd0: 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  , Tcl_Interp *in
1fe0: 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20  terp, int objc, 
1ff0: 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f  Tcl_Obj *const o
2000: 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c  bjv[]) {.    Tcl
2010: 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 0a 20  _Obj *objPtr;.. 
2020: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
2030: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f  ed");..    if (o
2040: 62 6a 63 20 21 3d 20 31 29 20 7b 0a 09 54 63 6c  bjc != 1) {..Tcl
2050: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
2060: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 4e  terp, 1, objv, N
2070: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43  ULL);..return TC
2080: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
2090: 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72      ERR_clear_er
20a0: 72 6f 72 28 29 3b 0a 0a 20 20 20 20 6f 62 6a 50  ror();..    objP
20b0: 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74  tr = Tcl_NewList
20c0: 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 23  Obj(0, NULL);..#
20d0: 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49  if OPENSSL_VERSI
20e0: 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30  ON_NUMBER < 0x10
20f0: 31 30 30 30 30 30 4c 20 26 26 20 21 64 65 66 69  100000L && !defi
2100: 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20  ned(NO_SSL2) && 
2110: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
2120: 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20 54 63  _NO_SSL2).    Tc
2130: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
2140: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
2150: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
2160: 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c  ringObj(protocol
2170: 73 5b 54 4c 53 5f 53 53 4c 32 5d 2c 20 2d 31 29  s[TLS_SSL2], -1)
2180: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64  );.#endif.#if !d
2190: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20  efined(NO_SSL3) 
21a0: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
21b0: 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 26 26 20  SSL_NO_SSL3) && 
21c0: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
21d0: 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 29  _NO_SSL3_METHOD)
21e0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
21f0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
2200: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
2210: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70  l_NewStringObj(p
2220: 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 53 53 4c  rotocols[TLS_SSL
2230: 33 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66  3], -1));.#endif
2240: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f  .#if !defined(NO
2250: 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e  _TLS1) && !defin
2260: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
2270: 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  S1) && !defined(
2280: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
2290: 4d 45 54 48 4f 44 29 0a 20 20 20 20 54 63 6c 5f  METHOD).    Tcl_
22a0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
22b0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
22c0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
22d0: 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b  ngObj(protocols[
22e0: 54 4c 53 5f 54 4c 53 31 5d 2c 20 2d 31 29 29 3b  TLS_TLS1], -1));
22f0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66  .#endif.#if !def
2300: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20  ined(NO_TLS1_1) 
2310: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
2320: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 20 26  SSL_NO_TLS1_1) &
2330: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
2340: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d 45 54  SL_NO_TLS1_1_MET
2350: 48 4f 44 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73  HOD).    Tcl_Lis
2360: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
2370: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
2380: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
2390: 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53  bj(protocols[TLS
23a0: 5f 54 4c 53 31 5f 31 5d 2c 20 2d 31 29 29 3b 0a  _TLS1_1], -1));.
23b0: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69  #endif.#if !defi
23c0: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26  ned(NO_TLS1_2) &
23d0: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
23e0: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26  SL_NO_TLS1_2) &&
23f0: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
2400: 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 48  L_NO_TLS1_2_METH
2410: 4f 44 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  OD).    Tcl_List
2420: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
2430: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
2440: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
2450: 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f  j(protocols[TLS_
2460: 54 4c 53 31 5f 32 5d 2c 20 2d 31 29 29 3b 0a 23  TLS1_2], -1));.#
2470: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e  endif.#if !defin
2480: 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26  ed(NO_TLS1_3) &&
2490: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
24a0: 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20  L_NO_TLS1_3).   
24b0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
24c0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
24d0: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
24e0: 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f  wStringObj(proto
24f0: 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f 33 5d  cols[TLS_TLS1_3]
2500: 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 0a  , -1));.#endif..
2510: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
2520: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  sult(interp, obj
2530: 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Ptr);.    return
2540: 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74   TCL_OK;..client
2550: 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74  Data = clientDat
2560: 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  a;.}.../*. *----
2570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
25a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
25b0: 20 2a 0a 20 2a 20 56 65 72 73 69 6f 6e 4f 62 6a   *. * VersionObj
25c0: 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 52 65 74  Cmd --. *. *.Ret
25d0: 75 72 6e 20 61 20 73 74 72 69 6e 67 20 77 69 74  urn a string wit
25e0: 68 20 74 68 65 20 4f 70 65 6e 53 53 4c 20 76 65  h the OpenSSL ve
25f0: 72 73 69 6f 6e 20 69 6e 66 6f 2e 0a 20 2a 0a 20  rsion info.. *. 
2600: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20  * Results:. *.A 
2610: 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73  standard Tcl res
2620: 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  ult.. *. * Side 
2630: 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65  effects:. *.None
2640: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  .. *. *---------
2650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73  ----------. */.s
2690: 74 61 74 69 63 20 69 6e 74 0a 56 65 72 73 69 6f  tatic int.Versio
26a0: 6e 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61  nObjCmd(ClientDa
26b0: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54  ta clientData, T
26c0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
26d0: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c  p, int objc, Tcl
26e0: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76  _Obj *const objv
26f0: 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62  []) {.    Tcl_Ob
2700: 6a 20 2a 6f 62 6a 50 74 72 3b 0a 0a 20 20 20 20  j *objPtr;..    
2710: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
2720: 29 3b 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20 3d  );..    objPtr =
2730: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
2740: 6a 28 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f  j(OPENSSL_VERSIO
2750: 4e 5f 54 45 58 54 2c 20 2d 31 29 3b 0a 20 20 20  N_TEXT, -1);.   
2760: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
2770: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
2780: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
2790: 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74  L_OK;..clientDat
27a0: 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a  a = clientData;.
27b0: 09 6f 62 6a 63 20 3d 20 6f 62 6a 63 3b 0a 09 6f  .objc = objc;..o
27c0: 62 6a 76 20 3d 20 6f 62 6a 76 3b 0a 7d 0a 0c 0a  bjv = objv;.}...
27d0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
27e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
27f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2810: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54  --------. *. * T
2820: 6c 73 5f 49 6e 66 6f 43 6f 6d 6d 61 6e 64 73 20  ls_InfoCommands 
2830: 2d 2d 0a 20 2a 0a 20 2a 09 43 72 65 61 74 65 20  --. *. *.Create 
2840: 69 6e 66 6f 20 63 6f 6d 6d 61 6e 64 73 0a 20 2a  info commands. *
2850: 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09  . * Returns:. *.
2860: 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 52  TCL_OK or TCL_ER
2870: 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  ROR. *. * Side e
2880: 66 66 65 63 74 73 3a 0a 20 2a 09 43 72 65 61 74  ffects:. *.Creat
2890: 65 73 20 63 6f 6d 6d 61 6e 64 73 0a 20 2a 0a 20  es commands. *. 
28a0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
28b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
28c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
28d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
28e0: 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 54 6c 73  ----. */.int Tls
28f0: 5f 49 6e 66 6f 43 6f 6d 6d 61 6e 64 73 28 54 63  _InfoCommands(Tc
2900: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
2910: 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61  ) {.    Tcl_Crea
2920: 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74  teObjCommand(int
2930: 65 72 70 2c 20 22 74 6c 73 3a 3a 63 69 70 68 65  erp, "tls::ciphe
2940: 72 73 22 2c 20 43 69 70 68 65 72 73 4f 62 6a 43  rs", CiphersObjC
2950: 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29  md, (ClientData)
2960: 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65   0, (Tcl_CmdDele
2970: 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b  teProc *) NULL);
2980: 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f  .    Tcl_CreateO
2990: 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  bjCommand(interp
29a0: 2c 20 22 74 6c 73 3a 3a 64 69 67 65 73 74 73 22  , "tls::digests"
29b0: 2c 20 44 69 67 65 73 74 73 4f 62 6a 43 6d 64 2c  , DigestsObjCmd,
29c0: 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c   (ClientData) 0,
29d0: 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50   (Tcl_CmdDeleteP
29e0: 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20  roc *) NULL);.  
29f0: 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43    Tcl_CreateObjC
2a00: 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22  ommand(interp, "
2a10: 74 6c 73 3a 3a 70 72 6f 74 6f 63 6f 6c 73 22 2c  tls::protocols",
2a20: 20 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64   ProtocolsObjCmd
2a30: 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30  , (ClientData) 0
2a40: 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65  , (Tcl_CmdDelete
2a50: 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20  Proc *) NULL);. 
2a60: 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a     Tcl_CreateObj
2a70: 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
2a80: 22 74 6c 73 3a 3a 6d 61 63 73 22 2c 20 4d 61 63  "tls::macs", Mac
2a90: 73 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74  sObjCmd, (Client
2aa0: 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d  Data) 0, (Tcl_Cm
2ab0: 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e  dDeleteProc *) N
2ac0: 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72  ULL);.    Tcl_Cr
2ad0: 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
2ae0: 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 76 65 72  nterp, "tls::ver
2af0: 73 69 6f 6e 22 2c 20 56 65 72 73 69 6f 6e 4f 62  sion", VersionOb
2b00: 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74  jCmd, (ClientDat
2b10: 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65  a) 0, (Tcl_CmdDe
2b20: 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c  leteProc *) NULL
2b30: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
2b40: 4c 5f 4f 4b 3b 0a 7d 0a                          L_OK;.}.