Hex Artifact Content

Artifact 3aad12f06f778a53176bb6a5d1cdfd93472145b39cd64f96b5b23130ae280729:


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 3c  nt.h".#include <
00c0: 6f 70 65 6e 73 73 6c 2f 63 72 79 70 74 6f 2e 68  openssl/crypto.h
00d0: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65 6e  >.#include <open
00e0: 73 73 6c 2f 73 73 6c 2e 68 3e 0a 23 69 6e 63 6c  ssl/ssl.h>.#incl
00f0: 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f 73 61 66  ude <openssl/saf
0100: 65 73 74 61 63 6b 2e 68 3e 0a 23 69 66 20 4f 50  estack.h>.#if OP
0110: 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55  ENSSL_VERSION_NU
0120: 4d 42 45 52 20 3e 3d 20 30 78 33 30 30 30 30 30  MBER >= 0x300000
0130: 30 30 4c 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70  00L.#include <op
0140: 65 6e 73 73 6c 2f 70 72 6f 76 69 64 65 72 2e 68  enssl/provider.h
0150: 3e 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20  >.#endif../*. * 
0160: 56 61 6c 69 64 20 53 53 4c 20 61 6e 64 20 54 4c  Valid SSL and TL
0170: 53 20 50 72 6f 74 6f 63 6f 6c 20 56 65 72 73 69  S Protocol Versi
0180: 6f 6e 73 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63  ons. */.static c
0190: 6f 6e 73 74 20 63 68 61 72 20 2a 70 72 6f 74 6f  onst char *proto
01a0: 63 6f 6c 73 5b 5d 20 3d 20 7b 0a 09 22 73 73 6c  cols[] = {.."ssl
01b0: 32 22 2c 20 22 73 73 6c 33 22 2c 20 22 74 6c 73  2", "ssl3", "tls
01c0: 31 22 2c 20 22 74 6c 73 31 2e 31 22 2c 20 22 74  1", "tls1.1", "t
01d0: 6c 73 31 2e 32 22 2c 20 22 74 6c 73 31 2e 33 22  ls1.2", "tls1.3"
01e0: 2c 20 4e 55 4c 4c 0a 7d 3b 0a 65 6e 75 6d 20 70  , NULL.};.enum p
01f0: 72 6f 74 6f 63 6f 6c 20 7b 0a 20 20 20 20 54 4c  rotocol {.    TL
0200: 53 5f 53 53 4c 32 2c 20 54 4c 53 5f 53 53 4c 33  S_SSL2, TLS_SSL3
0210: 2c 20 54 4c 53 5f 54 4c 53 31 2c 20 54 4c 53 5f  , TLS_TLS1, TLS_
0220: 54 4c 53 31 5f 31 2c 20 54 4c 53 5f 54 4c 53 31  TLS1_1, TLS_TLS1
0230: 5f 32 2c 20 54 4c 53 5f 54 4c 53 31 5f 33 2c 20  _2, TLS_TLS1_3, 
0240: 54 4c 53 5f 4e 4f 4e 45 0a 7d 3b 0a 0a 2f 2a 2a  TLS_NONE.};../**
0250: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0260: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0270: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0280: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0290: 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  */../*. *-------
02a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
02b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
02c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
02d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
02e0: 20 2a 20 4e 61 6d 65 73 43 61 6c 6c 62 61 63 6b   * NamesCallback
02f0: 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 62 61   --. *. *.Callba
0300: 63 6b 20 74 6f 20 61 64 64 20 61 6c 67 6f 72 69  ck to add algori
0310: 74 68 6d 20 6f 72 20 6d 65 74 68 6f 64 20 6e 61  thm or method na
0320: 6d 65 73 20 74 6f 20 61 20 54 43 4c 20 6c 69 73  mes to a TCL lis
0330: 74 20 6f 62 6a 65 63 74 2e 0a 20 2a 0a 20 2a 20  t object.. *. * 
0340: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 70 70 65  Results:. *.Appe
0350: 6e 64 20 6e 61 6d 65 20 74 6f 20 54 43 4c 20 6c  nd name to TCL l
0360: 69 73 74 20 6f 62 6a 65 63 74 2e 0a 20 2a 0a 20  ist object.. *. 
0370: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
0380: 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d   *.None.. *. *--
0390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
03a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
03b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
03c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
03d0: 2d 0a 20 2a 2f 0a 76 6f 69 64 20 4e 61 6d 65 73  -. */.void Names
03e0: 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 4f  Callback(const O
03f0: 42 4a 5f 4e 41 4d 45 20 2a 6f 62 6a 2c 20 76 6f  BJ_NAME *obj, vo
0400: 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 54  id *arg) {.    T
0410: 63 6c 5f 4f 62 6a 20 2a 6c 69 73 74 4f 62 6a 20  cl_Obj *listObj 
0420: 3d 20 28 54 63 6c 5f 4f 62 6a 20 2a 29 20 61 72  = (Tcl_Obj *) ar
0430: 67 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 65 6c 64  g;..    /* Field
0440: 73 3a 20 28 69 6e 74 29 20 74 79 70 65 20 61 6e  s: (int) type an
0450: 64 20 61 6c 69 61 73 2c 20 28 63 6f 6e 73 74 20  d alias, (const 
0460: 63 68 61 72 2a 29 20 6e 61 6d 65 20 28 61 6c 69  char*) name (ali
0470: 61 73 20 66 72 6f 6d 29 20 61 6e 64 20 64 61 74  as from) and dat
0480: 61 20 28 61 6c 69 61 73 20 74 6f 29 20 2a 2f 0a  a (alias to) */.
0490: 20 20 20 20 69 66 20 28 73 74 72 73 74 72 28 6f      if (strstr(o
04a0: 62 6a 2d 3e 6e 61 6d 65 2c 20 22 72 73 61 22 29  bj->name, "rsa")
04b0: 20 3d 3d 20 4e 55 4c 4c 20 26 26 20 73 74 72 73   == NULL && strs
04c0: 74 72 28 6f 62 6a 2d 3e 6e 61 6d 65 2c 20 22 52  tr(obj->name, "R
04d0: 53 41 22 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  SA") == NULL) {.
04e0: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
04f0: 6e 64 45 6c 65 6d 65 6e 74 28 4e 55 4c 4c 2c 20  ndElement(NULL, 
0500: 6c 69 73 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77  listObj, Tcl_New
0510: 53 74 72 69 6e 67 4f 62 6a 28 6f 62 6a 2d 3e 6e  StringObj(obj->n
0520: 61 6d 65 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d  ame, -1));.    }
0530: 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}../***********
0540: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0550: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0560: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0570: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a  ********/../*. *
0580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
05a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
05b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
05c0: 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 69 70 68 65 72  ---. *. * Cipher
05d0: 49 6e 66 6f 20 2d 2d 0a 20 2a 0a 20 2a 09 52 65  Info --. *. *.Re
05e0: 74 75 72 6e 20 61 20 6c 69 73 74 20 6f 66 20 70  turn a list of p
05f0: 72 6f 70 65 72 74 69 65 73 20 61 6e 64 20 76 61  roperties and va
0600: 6c 75 65 73 20 66 6f 72 20 63 69 70 68 65 72 2e  lues for cipher.
0610: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
0620: 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63   *.A standard Tc
0630: 6c 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 53 69  l list.. *. * Si
0640: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e  de effects:. *.N
0650: 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  one.. *. *------
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
06a0: 2f 0a 69 6e 74 20 43 69 70 68 65 72 49 6e 66 6f  /.int CipherInfo
06b0: 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
06c0: 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 20 2a 6e 61  erp, Tcl_Obj *na
06d0: 6d 65 4f 62 6a 29 20 7b 0a 20 20 20 20 63 6f 6e  meObj) {.    con
06e0: 73 74 20 45 56 50 5f 43 49 50 48 45 52 20 2a 63  st EVP_CIPHER *c
06f0: 69 70 68 65 72 3b 0a 20 20 20 20 54 63 6c 5f 4f  ipher;.    Tcl_O
0700: 62 6a 20 2a 72 65 73 75 6c 74 4f 62 6a 2c 20 2a  bj *resultObj, *
0710: 6c 69 73 74 4f 62 6a 3b 0a 20 20 20 20 75 6e 73  listObj;.    uns
0720: 69 67 6e 65 64 20 6c 6f 6e 67 20 66 6c 61 67 73  igned long flags
0730: 2c 20 6d 6f 64 65 3b 0a 20 20 20 20 63 68 61 72  , mode;.    char
0740: 20 2a 6d 6f 64 65 4e 61 6d 65 20 3d 20 4e 55 4c   *modeName = NUL
0750: 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 6e 61 6d  L;.    char *nam
0760: 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
0770: 67 46 72 6f 6d 4f 62 6a 28 6e 61 6d 65 4f 62 6a  gFromObj(nameObj
0780: 2c 20 28 54 63 6c 5f 53 69 7a 65 20 2a 29 20 4e  , (Tcl_Size *) N
0790: 55 4c 4c 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 65  ULL);..    /* Ge
07a0: 74 20 63 69 70 68 65 72 20 2a 2f 0a 20 20 20 20  t cipher */.    
07b0: 63 69 70 68 65 72 20 3d 20 45 56 50 5f 67 65 74  cipher = EVP_get
07c0: 5f 63 69 70 68 65 72 62 79 6e 61 6d 65 28 6e 61  _cipherbyname(na
07d0: 6d 65 29 3b 0a 0a 20 20 20 20 69 66 20 28 63 69  me);..    if (ci
07e0: 70 68 65 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  pher == NULL) {.
07f0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
0800: 74 28 69 6e 74 65 72 70 2c 20 22 49 6e 76 61 6c  t(interp, "Inval
0810: 69 64 20 63 69 70 68 65 72 20 5c 22 22 2c 20 6e  id cipher \"", n
0820: 61 6d 65 2c 20 22 5c 22 22 2c 20 28 63 68 61 72  ame, "\"", (char
0830: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75   *) NULL);..retu
0840: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
0850: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20    }..    /* Get 
0860: 70 72 6f 70 65 72 74 69 65 73 20 2a 2f 0a 20 20  properties */.  
0870: 20 20 72 65 73 75 6c 74 4f 62 6a 20 3d 20 54 63    resultObj = Tc
0880: 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20  l_NewListObj(0, 
0890: 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 72  NULL);.    if (r
08a0: 65 73 75 6c 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c  esultObj == NULL
08b0: 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  ) {..return TCL_
08c0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
08d0: 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74   LAPPEND_STR(int
08e0: 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20  erp, resultObj, 
08f0: 22 6e 69 64 22 2c 20 4f 42 4a 5f 6e 69 64 32 6c  "nid", OBJ_nid2l
0900: 6e 28 45 56 50 5f 43 49 50 48 45 52 5f 6e 69 64  n(EVP_CIPHER_nid
0910: 28 63 69 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a  (cipher)), -1);.
0920: 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28      LAPPEND_STR(
0930: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62  interp, resultOb
0940: 6a 2c 20 22 6e 61 6d 65 22 2c 20 45 56 50 5f 43  j, "name", EVP_C
0950: 49 50 48 45 52 5f 6e 61 6d 65 28 63 69 70 68 65  IPHER_name(ciphe
0960: 72 29 2c 20 2d 31 29 3b 0a 20 20 20 20 4c 41 50  r), -1);.    LAP
0970: 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
0980: 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 64 65 73   resultObj, "des
0990: 63 72 69 70 74 69 6f 6e 22 2c 20 22 22 2c 20 2d  cription", "", -
09a0: 31 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f  1);.    LAPPEND_
09b0: 49 4e 54 28 69 6e 74 65 72 70 2c 20 72 65 73 75  INT(interp, resu
09c0: 6c 74 4f 62 6a 2c 20 22 62 6c 6f 63 6b 5f 73 69  ltObj, "block_si
09d0: 7a 65 22 2c 20 45 56 50 5f 43 49 50 48 45 52 5f  ze", EVP_CIPHER_
09e0: 62 6c 6f 63 6b 5f 73 69 7a 65 28 63 69 70 68 65  block_size(ciphe
09f0: 72 29 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44  r));.    LAPPEND
0a00: 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 72 65 73  _INT(interp, res
0a10: 75 6c 74 4f 62 6a 2c 20 22 6b 65 79 5f 6c 65 6e  ultObj, "key_len
0a20: 67 74 68 22 2c 20 45 56 50 5f 43 49 50 48 45 52  gth", EVP_CIPHER
0a30: 5f 6b 65 79 5f 6c 65 6e 67 74 68 28 63 69 70 68  _key_length(ciph
0a40: 65 72 29 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e  er));.    LAPPEN
0a50: 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 72 65  D_INT(interp, re
0a60: 73 75 6c 74 4f 62 6a 2c 20 22 69 76 5f 6c 65 6e  sultObj, "iv_len
0a70: 67 74 68 22 2c 20 45 56 50 5f 43 49 50 48 45 52  gth", EVP_CIPHER
0a80: 5f 69 76 5f 6c 65 6e 67 74 68 28 63 69 70 68 65  _iv_length(ciphe
0a90: 72 29 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44  r));.    LAPPEND
0aa0: 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 72 65 73  _STR(interp, res
0ab0: 75 6c 74 4f 62 6a 2c 20 22 74 79 70 65 22 2c 20  ultObj, "type", 
0ac0: 4f 42 4a 5f 6e 69 64 32 6c 6e 28 45 56 50 5f 43  OBJ_nid2ln(EVP_C
0ad0: 49 50 48 45 52 5f 74 79 70 65 28 63 69 70 68 65  IPHER_type(ciphe
0ae0: 72 29 29 2c 20 2d 31 29 3b 0a 20 20 20 20 4c 41  r)), -1);.    LA
0af0: 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
0b00: 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 70 72  , resultObj, "pr
0b10: 6f 76 69 64 65 72 22 2c 20 22 22 2c 20 2d 31 29  ovider", "", -1)
0b20: 3b 0a 20 20 20 20 66 6c 61 67 73 20 3d 20 45 56  ;.    flags = EV
0b30: 50 5f 43 49 50 48 45 52 5f 66 6c 61 67 73 28 63  P_CIPHER_flags(c
0b40: 69 70 68 65 72 29 3b 0a 20 20 20 20 6d 6f 64 65  ipher);.    mode
0b50: 20 20 3d 20 45 56 50 5f 43 49 50 48 45 52 5f 6d    = EVP_CIPHER_m
0b60: 6f 64 65 28 63 69 70 68 65 72 29 3b 0a 0a 20 20  ode(cipher);..  
0b70: 20 20 2f 2a 20 45 56 50 5f 43 49 50 48 45 52 5f    /* EVP_CIPHER_
0b80: 67 65 74 5f 6d 6f 64 65 20 2a 2f 0a 20 20 20 20  get_mode */.    
0b90: 73 77 69 74 63 68 28 6d 6f 64 65 29 20 7b 0a 09  switch(mode) {..
0ba0: 63 61 73 65 20 45 56 50 5f 43 49 50 48 5f 53 54  case EVP_CIPH_ST
0bb0: 52 45 41 4d 5f 43 49 50 48 45 52 3a 0a 09 20 20  REAM_CIPHER:..  
0bc0: 20 20 6d 6f 64 65 4e 61 6d 65 20 3d 20 22 53 54    modeName = "ST
0bd0: 52 45 41 4d 22 3b 0a 09 20 20 20 20 62 72 65 61  REAM";..    brea
0be0: 6b 3b 0a 09 63 61 73 65 20 45 56 50 5f 43 49 50  k;..case EVP_CIP
0bf0: 48 5f 45 43 42 5f 4d 4f 44 45 3a 0a 09 20 20 20  H_ECB_MODE:..   
0c00: 20 6d 6f 64 65 4e 61 6d 65 20 3d 20 22 45 43 42   modeName = "ECB
0c10: 22 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09  ";..    break;..
0c20: 63 61 73 65 20 45 56 50 5f 43 49 50 48 5f 43 42  case EVP_CIPH_CB
0c30: 43 5f 4d 4f 44 45 3a 0a 09 20 20 20 20 6d 6f 64  C_MODE:..    mod
0c40: 65 4e 61 6d 65 20 3d 20 22 43 42 43 22 3b 0a 09  eName = "CBC";..
0c50: 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65      break;..case
0c60: 20 45 56 50 5f 43 49 50 48 5f 43 46 42 5f 4d 4f   EVP_CIPH_CFB_MO
0c70: 44 45 3a 0a 09 20 20 20 20 6d 6f 64 65 4e 61 6d  DE:..    modeNam
0c80: 65 20 3d 20 22 43 46 42 22 3b 0a 09 20 20 20 20  e = "CFB";..    
0c90: 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 45 56 50  break;..case EVP
0ca0: 5f 43 49 50 48 5f 4f 46 42 5f 4d 4f 44 45 3a 0a  _CIPH_OFB_MODE:.
0cb0: 09 20 20 20 20 6d 6f 64 65 4e 61 6d 65 20 3d 20  .    modeName = 
0cc0: 22 4f 46 42 22 3b 0a 09 20 20 20 20 62 72 65 61  "OFB";..    brea
0cd0: 6b 3b 0a 09 63 61 73 65 20 45 56 50 5f 43 49 50  k;..case EVP_CIP
0ce0: 48 5f 43 54 52 5f 4d 4f 44 45 3a 0a 09 20 20 20  H_CTR_MODE:..   
0cf0: 20 6d 6f 64 65 4e 61 6d 65 20 3d 20 22 43 54 52   modeName = "CTR
0d00: 22 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09  ";..    break;..
0d10: 63 61 73 65 20 45 56 50 5f 43 49 50 48 5f 47 43  case EVP_CIPH_GC
0d20: 4d 5f 4d 4f 44 45 3a 0a 09 20 20 20 20 6d 6f 64  M_MODE:..    mod
0d30: 65 4e 61 6d 65 20 3d 20 22 47 43 4d 22 3b 0a 09  eName = "GCM";..
0d40: 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65      break;..case
0d50: 20 45 56 50 5f 43 49 50 48 5f 58 54 53 5f 4d 4f   EVP_CIPH_XTS_MO
0d60: 44 45 3a 0a 09 20 20 20 20 6d 6f 64 65 4e 61 6d  DE:..    modeNam
0d70: 65 20 3d 20 22 58 54 53 22 3b 0a 09 20 20 20 20  e = "XTS";..    
0d80: 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 45 56 50  break;..case EVP
0d90: 5f 43 49 50 48 5f 43 43 4d 5f 4d 4f 44 45 3a 0a  _CIPH_CCM_MODE:.
0da0: 09 20 20 20 20 6d 6f 64 65 4e 61 6d 65 20 3d 20  .    modeName = 
0db0: 22 43 43 4d 22 3b 0a 09 20 20 20 20 62 72 65 61  "CCM";..    brea
0dc0: 6b 3b 0a 09 63 61 73 65 20 45 56 50 5f 43 49 50  k;..case EVP_CIP
0dd0: 48 5f 4f 43 42 5f 4d 4f 44 45 3a 0a 09 20 20 20  H_OCB_MODE:..   
0de0: 20 6d 6f 64 65 4e 61 6d 65 20 3d 20 22 4f 43 42   modeName = "OCB
0df0: 22 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09  ";..    break;..
0e00: 63 61 73 65 20 45 56 50 5f 43 49 50 48 5f 57 52  case EVP_CIPH_WR
0e10: 41 50 5f 4d 4f 44 45 20 3a 0a 09 20 20 20 20 6d  AP_MODE :..    m
0e20: 6f 64 65 4e 61 6d 65 20 3d 20 22 57 52 41 50 22  odeName = "WRAP"
0e30: 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 64  ;..    break;..d
0e40: 65 66 61 75 6c 74 3a 0a 09 20 20 20 20 6d 6f 64  efault:..    mod
0e50: 65 4e 61 6d 65 20 3d 20 22 75 6e 6b 6e 6f 77 6e  eName = "unknown
0e60: 22 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 20  ";..    break;. 
0e70: 20 20 20 7d 0a 20 20 20 20 4c 41 50 50 45 4e 44     }.    LAPPEND
0e80: 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 72 65 73  _STR(interp, res
0e90: 75 6c 74 4f 62 6a 2c 20 22 6d 6f 64 65 22 2c 20  ultObj, "mode", 
0ea0: 6d 6f 64 65 4e 61 6d 65 2c 20 2d 31 29 3b 0a 0a  modeName, -1);..
0eb0: 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 2a 2f 0a      /* Flags */.
0ec0: 20 20 20 20 6c 69 73 74 4f 62 6a 20 3d 20 54 63      listObj = Tc
0ed0: 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20  l_NewListObj(0, 
0ee0: 4e 55 4c 4c 29 3b 0a 20 20 20 20 4c 41 50 50 45  NULL);.    LAPPE
0ef0: 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20  ND_BOOL(interp, 
0f00: 6c 69 73 74 4f 62 6a 2c 20 22 56 61 72 69 61 62  listObj, "Variab
0f10: 6c 65 20 4c 65 6e 67 74 68 22 2c 20 66 6c 61 67  le Length", flag
0f20: 73 20 26 20 45 56 50 5f 43 49 50 48 5f 56 41 52  s & EVP_CIPH_VAR
0f30: 49 41 42 4c 45 5f 4c 45 4e 47 54 48 29 3b 0a 20  IABLE_LENGTH);. 
0f40: 20 20 20 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28     LAPPEND_BOOL(
0f50: 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a 2c  interp, listObj,
0f60: 20 22 41 6c 77 61 79 73 20 43 61 6c 6c 20 49 6e   "Always Call In
0f70: 69 74 22 2c 20 66 6c 61 67 73 20 26 20 45 56 50  it", flags & EVP
0f80: 5f 43 49 50 48 5f 41 4c 57 41 59 53 5f 43 41 4c  _CIPH_ALWAYS_CAL
0f90: 4c 5f 49 4e 49 54 29 3b 0a 20 20 20 20 4c 41 50  L_INIT);.    LAP
0fa0: 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70  PEND_BOOL(interp
0fb0: 2c 20 6c 69 73 74 4f 62 6a 2c 20 22 43 75 73 74  , listObj, "Cust
0fc0: 6f 6d 20 49 56 22 2c 20 66 6c 61 67 73 20 26 20  om IV", flags & 
0fd0: 45 56 50 5f 43 49 50 48 5f 43 55 53 54 4f 4d 5f  EVP_CIPH_CUSTOM_
0fe0: 49 56 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44  IV);.    LAPPEND
0ff0: 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6c 69  _BOOL(interp, li
1000: 73 74 4f 62 6a 2c 20 22 43 6f 6e 74 72 6f 6c 20  stObj, "Control 
1010: 49 6e 69 74 22 2c 20 66 6c 61 67 73 20 26 20 45  Init", flags & E
1020: 56 50 5f 43 49 50 48 5f 43 54 52 4c 5f 49 4e 49  VP_CIPH_CTRL_INI
1030: 54 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f  T);.    LAPPEND_
1040: 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6c 69 73  BOOL(interp, lis
1050: 74 4f 62 6a 2c 20 22 43 75 73 74 6f 6d 20 43 69  tObj, "Custom Ci
1060: 70 68 65 72 22 2c 20 66 6c 61 67 73 20 26 20 45  pher", flags & E
1070: 56 50 5f 43 49 50 48 5f 46 4c 41 47 5f 43 55 53  VP_CIPH_FLAG_CUS
1080: 54 4f 4d 5f 43 49 50 48 45 52 29 3b 0a 20 20 20  TOM_CIPHER);.   
1090: 20 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e   LAPPEND_BOOL(in
10a0: 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a 2c 20 22  terp, listObj, "
10b0: 41 45 41 44 20 43 69 70 68 65 72 22 2c 20 66 6c  AEAD Cipher", fl
10c0: 61 67 73 20 26 20 45 56 50 5f 43 49 50 48 5f 46  ags & EVP_CIPH_F
10d0: 4c 41 47 5f 41 45 41 44 5f 43 49 50 48 45 52 29  LAG_AEAD_CIPHER)
10e0: 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 42 4f  ;.    LAPPEND_BO
10f0: 4f 4c 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f  OL(interp, listO
1100: 62 6a 2c 20 22 43 75 73 74 6f 6d 20 43 6f 70 79  bj, "Custom Copy
1110: 22 2c 20 66 6c 61 67 73 20 26 20 45 56 50 5f 43  ", flags & EVP_C
1120: 49 50 48 5f 43 55 53 54 4f 4d 5f 43 4f 50 59 29  IPH_CUSTOM_COPY)
1130: 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 42 4f  ;.    LAPPEND_BO
1140: 4f 4c 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f  OL(interp, listO
1150: 62 6a 2c 20 22 4e 6f 6e 20 46 49 50 53 20 41 6c  bj, "Non FIPS Al
1160: 6c 6f 77 22 2c 20 66 6c 61 67 73 20 26 20 45 56  low", flags & EV
1170: 50 5f 43 49 50 48 5f 46 4c 41 47 5f 4e 4f 4e 5f  P_CIPH_FLAG_NON_
1180: 46 49 50 53 5f 41 4c 4c 4f 57 29 3b 0a 20 20 20  FIPS_ALLOW);.   
1190: 20 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74   LAPPEND_OBJ(int
11a0: 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20  erp, resultObj, 
11b0: 22 66 6c 61 67 73 22 2c 20 6c 69 73 74 4f 62 6a  "flags", listObj
11c0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 54 58 20 6f  );..    /* CTX o
11d0: 6e 6c 79 20 70 72 6f 70 65 72 74 69 65 73 20 2a  nly properties *
11e0: 2f 0a 20 20 20 20 7b 0a 09 45 56 50 5f 43 49 50  /.    {..EVP_CIP
11f0: 48 45 52 5f 43 54 58 20 2a 63 74 78 20 3d 20 45  HER_CTX *ctx = E
1200: 56 50 5f 43 49 50 48 45 52 5f 43 54 58 5f 6e 65  VP_CIPHER_CTX_ne
1210: 77 28 29 3b 0a 09 69 6e 74 20 74 61 67 5f 6c 65  w();..int tag_le
1220: 6e 20 3d 20 30 3b 0a 0a 09 45 56 50 5f 45 6e 63  n = 0;...EVP_Enc
1230: 72 79 70 74 49 6e 69 74 5f 65 78 28 63 74 78 2c  ryptInit_ex(ctx,
1240: 20 63 69 70 68 65 72 2c 20 4e 55 4c 4c 2c 20 4e   cipher, NULL, N
1250: 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66 20  ULL, NULL);..if 
1260: 28 6d 6f 64 65 20 3d 3d 20 45 56 50 5f 43 49 50  (mode == EVP_CIP
1270: 48 5f 47 43 4d 5f 4d 4f 44 45 20 7c 7c 20 6d 6f  H_GCM_MODE || mo
1280: 64 65 20 3d 3d 20 45 56 50 5f 43 49 50 48 5f 4f  de == EVP_CIPH_O
1290: 43 42 5f 4d 4f 44 45 29 20 7b 0a 09 20 20 20 20  CB_MODE) {..    
12a0: 74 61 67 5f 6c 65 6e 20 3d 20 45 56 50 5f 47 43  tag_len = EVP_GC
12b0: 4d 5f 54 4c 53 5f 54 41 47 5f 4c 45 4e 3b 20 2f  M_TLS_TAG_LEN; /
12c0: 2a 20 45 56 50 5f 4d 41 58 5f 41 45 41 44 5f 54  * EVP_MAX_AEAD_T
12d0: 41 47 5f 4c 45 4e 47 54 48 20 2a 2f 0a 09 7d 20  AG_LENGTH */..} 
12e0: 65 6c 73 65 20 69 66 20 28 6d 6f 64 65 20 3d 3d  else if (mode ==
12f0: 20 45 56 50 5f 43 49 50 48 5f 43 43 4d 5f 4d 4f   EVP_CIPH_CCM_MO
1300: 44 45 29 20 7b 0a 09 20 20 20 20 74 61 67 5f 6c  DE) {..    tag_l
1310: 65 6e 20 3d 20 45 56 50 5f 43 43 4d 5f 54 4c 53  en = EVP_CCM_TLS
1320: 5f 54 41 47 5f 4c 45 4e 3b 0a 09 7d 20 65 6c 73  _TAG_LEN;..} els
1330: 65 20 69 66 20 28 63 69 70 68 65 72 20 3d 3d 20  e if (cipher == 
1340: 45 56 50 5f 67 65 74 5f 63 69 70 68 65 72 62 79  EVP_get_cipherby
1350: 6e 61 6d 65 28 22 63 68 61 63 68 61 32 30 2d 70  name("chacha20-p
1360: 6f 6c 79 31 33 30 35 22 29 29 20 7b 0a 09 20 20  oly1305")) {..  
1370: 20 20 74 61 67 5f 6c 65 6e 20 3d 20 45 56 50 5f    tag_len = EVP_
1380: 43 48 41 43 48 41 50 4f 4c 59 5f 54 4c 53 5f 54  CHACHAPOLY_TLS_T
1390: 41 47 5f 4c 45 4e 3b 20 2f 2a 20 50 4f 4c 59 31  AG_LEN; /* POLY1
13a0: 33 30 35 5f 42 4c 4f 43 4b 5f 53 49 5a 45 20 2a  305_BLOCK_SIZE *
13b0: 2f 0a 09 7d 0a 09 45 56 50 5f 43 49 50 48 45 52  /..}..EVP_CIPHER
13c0: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a  _CTX_free(ctx);.
13d0: 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74  .LAPPEND_INT(int
13e0: 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20  erp, resultObj, 
13f0: 22 74 61 67 5f 6c 65 6e 67 74 68 22 2c 20 74 61  "tag_length", ta
1400: 67 5f 6c 65 6e 29 3b 0a 20 20 20 20 7d 0a 20 20  g_len);.    }.  
1410: 20 20 0a 20 20 20 20 2f 2a 20 41 45 41 44 20 70    .    /* AEAD p
1420: 72 6f 70 65 72 74 69 65 73 20 2a 2f 0a 20 20 20  roperties */.   
1430: 20 7b 0a 09 69 6e 74 20 61 61 64 5f 6c 65 6e 20   {..int aad_len 
1440: 3d 20 30 3b 0a 09 69 66 20 28 66 6c 61 67 73 20  = 0;..if (flags 
1450: 26 20 45 56 50 5f 43 49 50 48 5f 46 4c 41 47 5f  & EVP_CIPH_FLAG_
1460: 41 45 41 44 5f 43 49 50 48 45 52 29 20 7b 0a 09  AEAD_CIPHER) {..
1470: 20 20 20 20 61 61 64 5f 6c 65 6e 20 3d 20 45 56      aad_len = EV
1480: 50 5f 41 45 41 44 5f 54 4c 53 31 5f 41 41 44 5f  P_AEAD_TLS1_AAD_
1490: 4c 45 4e 3b 0a 09 7d 0a 09 4c 41 50 50 45 4e 44  LEN;..}..LAPPEND
14a0: 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 72 65 73  _INT(interp, res
14b0: 75 6c 74 4f 62 6a 2c 20 22 61 61 64 5f 6c 65 6e  ultObj, "aad_len
14c0: 67 74 68 22 2c 20 61 61 64 5f 6c 65 6e 29 3b 0a  gth", aad_len);.
14d0: 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 53      }..    Tcl_S
14e0: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
14f0: 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 29 3b 0a  rp, resultObj);.
1500: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f      return TCL_O
1510: 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  K;.}../*. *-----
1520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
1560: 2a 0a 20 2a 20 43 69 70 68 65 72 4c 69 73 74 20  *. * CipherList 
1570: 2d 2d 0a 20 2a 0a 20 2a 09 52 65 74 75 72 6e 20  --. *. *.Return 
1580: 61 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63 69  a list of all ci
1590: 70 68 65 72 20 61 6c 67 6f 72 69 74 68 6d 73 0a  pher algorithms.
15a0: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
15b0: 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c  *.A standard Tcl
15c0: 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 53 69 64   list.. *. * Sid
15d0: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f  e effects:. *.No
15e0: 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  ne.. *. *-------
15f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
1630: 0a 69 6e 74 20 43 69 70 68 65 72 4c 69 73 74 28  .int CipherList(
1640: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1650: 72 70 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62  rp) {.    Tcl_Ob
1660: 6a 20 2a 72 65 73 75 6c 74 4f 62 6a 20 3d 20 54  j *resultObj = T
1670: 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c  cl_NewListObj(0,
1680: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28   NULL);.    if (
1690: 72 65 73 75 6c 74 4f 62 6a 20 3d 3d 20 4e 55 4c  resultObj == NUL
16a0: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c  L) {..return TCL
16b0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
16c0: 20 20 20 2f 2a 20 53 61 6d 65 20 61 73 20 45 56     /* Same as EV
16d0: 50 5f 43 49 50 48 45 52 5f 64 6f 5f 61 6c 6c 20  P_CIPHER_do_all 
16e0: 2a 2f 0a 20 20 20 20 4f 42 4a 5f 4e 41 4d 45 5f  */.    OBJ_NAME_
16f0: 64 6f 5f 61 6c 6c 28 4f 42 4a 5f 4e 41 4d 45 5f  do_all(OBJ_NAME_
1700: 54 59 50 45 5f 43 49 50 48 45 52 5f 4d 45 54 48  TYPE_CIPHER_METH
1710: 2c 20 4e 61 6d 65 73 43 61 6c 6c 62 61 63 6b 2c  , NamesCallback,
1720: 20 28 76 6f 69 64 20 2a 29 20 72 65 73 75 6c 74   (void *) result
1730: 4f 62 6a 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65  Obj);.    Tcl_Se
1740: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
1750: 70 2c 20 72 65 73 75 6c 74 4f 62 6a 29 3b 0a 20  p, resultObj);. 
1760: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b     return TCL_OK
1770: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  ;.}../*. *------
1780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
17c0: 0a 20 2a 20 43 69 70 68 65 72 4f 62 6a 43 6d 64  . * CipherObjCmd
17d0: 20 2d 2d 0a 20 2a 0a 20 2a 09 52 65 74 75 72 6e   --. *. *.Return
17e0: 20 61 20 6c 69 73 74 20 6f 66 20 70 72 6f 70 65   a list of prope
17f0: 72 74 69 65 73 20 61 6e 64 20 76 61 6c 75 65 73  rties and values
1800: 20 66 6f 72 20 63 69 70 68 65 72 4e 61 6d 65 2e   for cipherName.
1810: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
1820: 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63   *.A standard Tc
1830: 6c 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 53 69  l list.. *. * Si
1840: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e  de effects:. *.N
1850: 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  one.. *. *------
1860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
18a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 43 69 70  /.static int Cip
18b0: 68 65 72 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74  herObjCmd(Client
18c0: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
18d0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
18e0: 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54  erp, int objc, T
18f0: 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62  cl_Obj *const ob
1900: 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 28 76 6f 69  jv[]) {.    (voi
1910: 64 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a  d) clientData;..
1920: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
1930: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  led");..    /* C
1940: 6c 65 61 72 20 65 72 72 6f 72 73 20 2a 2f 0a 20  lear errors */. 
1950: 20 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75     Tcl_ResetResu
1960: 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  lt(interp);.    
1970: 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28  ERR_clear_error(
1980: 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 61 6c 69 64  );..    /* Valid
1990: 61 74 65 20 61 72 67 20 63 6f 75 6e 74 20 2a 2f  ate arg count */
19a0: 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d  .    if (objc ==
19b0: 20 31 29 20 7b 0a 09 72 65 74 75 72 6e 20 43 69   1) {..return Ci
19c0: 70 68 65 72 4c 69 73 74 28 69 6e 74 65 72 70 29  pherList(interp)
19d0: 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66  ;..    } else if
19e0: 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09   (objc == 2) {..
19f0: 72 65 74 75 72 6e 20 43 69 70 68 65 72 49 6e 66  return CipherInf
1a00: 6f 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31  o(interp, objv[1
1a10: 5d 29 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20  ]);..    } else 
1a20: 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41  {..Tcl_WrongNumA
1a30: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
1a40: 62 6a 76 2c 20 22 3f 6e 61 6d 65 3f 22 29 3b 0a  bjv, "?name?");.
1a50: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
1a60: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  R;.    }.    ret
1a70: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
1a80: 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ac0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 69  -------. *. * Ci
1ad0: 70 68 65 72 73 4f 62 6a 43 6d 64 20 2d 2d 0a 20  phersObjCmd --. 
1ae0: 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64  *. *.This proced
1af0: 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 74  ure is invoked t
1b00: 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20 22 74  o process the "t
1b10: 6c 73 3a 3a 63 69 70 68 65 72 73 22 20 63 6f 6d  ls::ciphers" com
1b20: 6d 61 6e 64 0a 20 2a 09 74 6f 20 6c 69 73 74 20  mand. *.to list 
1b30: 61 76 61 69 6c 61 62 6c 65 20 63 69 70 68 65 72  available cipher
1b40: 73 2c 20 62 61 73 65 64 20 75 70 6f 6e 20 70 72  s, based upon pr
1b50: 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 2e  otocol selected.
1b60: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
1b70: 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63   *.A standard Tc
1b80: 6c 20 72 65 73 75 6c 74 20 6c 69 73 74 2e 0a 20  l result list.. 
1b90: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
1ba0: 73 3a 0a 20 2a 09 63 6f 6e 73 74 72 75 63 74 73  s:. *.constructs
1bb0: 20 61 6e 64 20 64 65 73 74 72 6f 79 73 20 53 53   and destroys SS
1bc0: 4c 20 63 6f 6e 74 65 78 74 20 28 43 54 58 29 0a  L context (CTX).
1bd0: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
1be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1c10: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61  --------. */.sta
1c20: 74 69 63 20 69 6e 74 20 43 69 70 68 65 72 73 4f  tic int CiphersO
1c30: 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61  bjCmd(ClientData
1c40: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c   clientData, Tcl
1c50: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1c60: 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f   int objc, Tcl_O
1c70: 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d  bj *const objv[]
1c80: 29 20 7b 0a 20 20 20 20 53 53 4c 5f 43 54 58 20  ) {.    SSL_CTX 
1c90: 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  *ctx = NULL;.   
1ca0: 20 53 53 4c 20 2a 73 73 6c 20 3d 20 4e 55 4c 4c   SSL *ssl = NULL
1cb0: 3b 0a 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 53  ;.    STACK_OF(S
1cc0: 53 4c 5f 43 49 50 48 45 52 29 20 2a 73 6b 20 3d  SL_CIPHER) *sk =
1cd0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 53   NULL;.    Tcl_S
1ce0: 69 7a 65 20 69 6e 64 65 78 3b 0a 20 20 20 20 69  ize index;.    i
1cf0: 6e 74 20 76 65 72 62 6f 73 65 20 3d 20 30 2c 20  nt verbose = 0, 
1d00: 75 73 65 5f 73 75 70 70 6f 72 74 65 64 20 3d 20  use_supported = 
1d10: 30 2c 20 72 65 73 20 3d 20 54 43 4c 5f 4f 4b 3b  0, res = TCL_OK;
1d20: 0a 20 20 20 20 69 6e 74 20 6d 69 6e 5f 76 65 72  .    int min_ver
1d30: 73 69 6f 6e 2c 20 6d 61 78 5f 76 65 72 73 69 6f  sion, max_versio
1d40: 6e 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c  n;.    (void) cl
1d50: 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 64  ientData;..    d
1d60: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
1d70: 3b 0a 0a 20 20 20 20 2f 2a 20 43 6c 65 61 72 20  ;..    /* Clear 
1d80: 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20 54 63  errors */.    Tc
1d90: 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e  l_ResetResult(in
1da0: 74 65 72 70 29 3b 0a 20 20 20 20 45 52 52 5f 63  terp);.    ERR_c
1db0: 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20  lear_error();.. 
1dc0: 20 20 20 2f 2a 20 56 61 6c 69 64 61 74 65 20 61     /* Validate a
1dd0: 72 67 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 20 20  rg count */.    
1de0: 69 66 20 28 6f 62 6a 63 20 3e 20 34 29 20 7b 0a  if (objc > 4) {.
1df0: 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67  .Tcl_WrongNumArg
1e00: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
1e10: 76 2c 20 22 3f 70 72 6f 74 6f 63 6f 6c 3f 20 3f  v, "?protocol? ?
1e20: 76 65 72 62 6f 73 65 3f 20 3f 73 75 70 70 6f 72  verbose? ?suppor
1e30: 74 65 64 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20  ted?");..return 
1e40: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
1e50: 0a 0a 20 20 20 20 2f 2a 20 4c 69 73 74 20 61 6c  ..    /* List al
1e60: 6c 20 63 69 70 68 65 72 73 20 2a 2f 0a 20 20 20  l ciphers */.   
1e70: 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 31 29 20   if (objc == 1) 
1e80: 7b 0a 09 72 65 74 75 72 6e 20 43 69 70 68 65 72  {..return Cipher
1e90: 4c 69 73 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  List(interp);.  
1ea0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20    }..    /* Get 
1eb0: 6f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 69  options */.    i
1ec0: 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78 46  f (Tcl_GetIndexF
1ed0: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
1ee0: 62 6a 76 5b 31 5d 2c 20 70 72 6f 74 6f 63 6f 6c  bjv[1], protocol
1ef0: 73 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 30  s, "protocol", 0
1f00: 2c 20 26 69 6e 64 65 78 29 20 21 3d 20 54 43 4c  , &index) != TCL
1f10: 5f 4f 4b 20 7c 7c 0a 09 28 6f 62 6a 63 20 3e 20  _OK ||..(objc > 
1f20: 32 20 26 26 20 54 63 6c 5f 47 65 74 42 6f 6f 6c  2 && Tcl_GetBool
1f30: 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  eanFromObj(inter
1f40: 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 76 65 72  p, objv[2], &ver
1f50: 62 6f 73 65 29 20 21 3d 20 54 43 4c 5f 4f 4b 29  bose) != TCL_OK)
1f60: 20 7c 7c 0a 09 28 6f 62 6a 63 20 3e 20 33 20 26   ||..(objc > 3 &
1f70: 26 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e  & Tcl_GetBoolean
1f80: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
1f90: 6f 62 6a 76 5b 33 5d 2c 20 26 75 73 65 5f 73 75  objv[3], &use_su
1fa0: 70 70 6f 72 74 65 64 29 20 21 3d 20 54 43 4c 5f  pported) != TCL_
1fb0: 4f 4b 29 29 20 7b 0a 09 72 65 74 75 72 6e 20 54  OK)) {..return T
1fc0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
1fd0: 0a 20 20 20 20 73 77 69 74 63 68 20 28 28 65 6e  .    switch ((en
1fe0: 75 6d 20 70 72 6f 74 6f 63 6f 6c 29 69 6e 64 65  um protocol)inde
1ff0: 78 29 20 7b 0a 09 63 61 73 65 20 54 4c 53 5f 53  x) {..case TLS_S
2000: 53 4c 32 3a 0a 09 20 20 20 20 54 63 6c 5f 41 70  SL2:..    Tcl_Ap
2010: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
2020: 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64  p, protocols[ind
2030: 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c  ex], ": protocol
2040: 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c   not supported",
2050: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
2060: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
2070: 5f 45 52 52 4f 52 3b 0a 09 63 61 73 65 20 54 4c  _ERROR;..case TL
2080: 53 5f 53 53 4c 33 3a 0a 23 69 66 20 64 65 66 69  S_SSL3:.#if defi
2090: 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20  ned(NO_SSL3) || 
20a0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
20b0: 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 65 66 69  NO_SSL3) || defi
20c0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53  ned(OPENSSL_NO_S
20d0: 53 4c 33 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20  SL3_METHOD)..   
20e0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
20f0: 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63  t(interp, protoc
2100: 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70  ols[index], ": p
2110: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70  rotocol not supp
2120: 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29  orted", (char *)
2130: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74   NULL);..    ret
2140: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23  urn TCL_ERROR;.#
2150: 65 6c 73 65 0a 20 20 20 20 20 20 20 20 20 20 20  else.           
2160: 20 6d 69 6e 5f 76 65 72 73 69 6f 6e 20 3d 20 53   min_version = S
2170: 53 4c 33 5f 56 45 52 53 49 4f 4e 3b 0a 20 20 20  SL3_VERSION;.   
2180: 20 20 20 20 20 20 20 20 20 6d 61 78 5f 76 65 72           max_ver
2190: 73 69 6f 6e 20 3d 20 53 53 4c 33 5f 56 45 52 53  sion = SSL3_VERS
21a0: 49 4f 4e 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b  ION;..    break;
21b0: 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c  .#endif..case TL
21c0: 53 5f 54 4c 53 31 3a 0a 23 69 66 20 64 65 66 69  S_TLS1:.#if defi
21d0: 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20  ned(NO_TLS1) || 
21e0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
21f0: 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69  NO_TLS1) || defi
2200: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
2210: 4c 53 31 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20  LS1_METHOD)..   
2220: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
2230: 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63  t(interp, protoc
2240: 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70  ols[index], ": p
2250: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70  rotocol not supp
2260: 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29  orted", (char *)
2270: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74   NULL);..    ret
2280: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23  urn TCL_ERROR;.#
2290: 65 6c 73 65 0a 20 20 20 20 20 20 20 20 20 20 20  else.           
22a0: 20 6d 69 6e 5f 76 65 72 73 69 6f 6e 20 3d 20 54   min_version = T
22b0: 4c 53 31 5f 56 45 52 53 49 4f 4e 3b 0a 20 20 20  LS1_VERSION;.   
22c0: 20 20 20 20 20 20 20 20 20 6d 61 78 5f 76 65 72           max_ver
22d0: 73 69 6f 6e 20 3d 20 54 4c 53 31 5f 56 45 52 53  sion = TLS1_VERS
22e0: 49 4f 4e 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b  ION;..    break;
22f0: 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c  .#endif..case TL
2300: 53 5f 54 4c 53 31 5f 31 3a 0a 23 69 66 20 64 65  S_TLS1_1:.#if de
2310: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29  fined(NO_TLS1_1)
2320: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e   || defined(OPEN
2330: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c  SSL_NO_TLS1_1) |
2340: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  | defined(OPENSS
2350: 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d 45 54 48  L_NO_TLS1_1_METH
2360: 4f 44 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 70  OD)..    Tcl_App
2370: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
2380: 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65  , protocols[inde
2390: 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20  x], ": protocol 
23a0: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20  not supported", 
23b0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
23c0: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
23d0: 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 20 20 20  ERROR;.#else.   
23e0: 20 20 20 20 20 20 20 20 20 6d 69 6e 5f 76 65 72           min_ver
23f0: 73 69 6f 6e 20 3d 20 54 4c 53 31 5f 31 5f 56 45  sion = TLS1_1_VE
2400: 52 53 49 4f 4e 3b 0a 20 20 20 20 20 20 20 20 20  RSION;.         
2410: 20 20 20 6d 61 78 5f 76 65 72 73 69 6f 6e 20 3d     max_version =
2420: 20 54 4c 53 31 5f 31 5f 56 45 52 53 49 4f 4e 3b   TLS1_1_VERSION;
2430: 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 23 65 6e  ..    break;.#en
2440: 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c  dif..case TLS_TL
2450: 53 31 5f 32 3a 0a 23 69 66 20 64 65 66 69 6e 65  S1_2:.#if define
2460: 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20  d(NO_TLS1_2) || 
2470: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
2480: 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65  NO_TLS1_2) || de
2490: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
24a0: 5f 54 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a  _TLS1_2_METHOD).
24b0: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
24c0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72  esult(interp, pr
24d0: 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20  otocols[index], 
24e0: 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20  ": protocol not 
24f0: 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61  supported", (cha
2500: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20  r *) NULL);..   
2510: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2520: 52 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20  R;.#else.       
2530: 20 20 20 20 20 6d 69 6e 5f 76 65 72 73 69 6f 6e       min_version
2540: 20 3d 20 54 4c 53 31 5f 32 5f 56 45 52 53 49 4f   = TLS1_2_VERSIO
2550: 4e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d  N;.            m
2560: 61 78 5f 76 65 72 73 69 6f 6e 20 3d 20 54 4c 53  ax_version = TLS
2570: 31 5f 32 5f 56 45 52 53 49 4f 4e 3b 0a 09 20 20  1_2_VERSION;..  
2580: 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a    break;.#endif.
2590: 09 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 5f 33  .case TLS_TLS1_3
25a0: 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f  :.#if defined(NO
25b0: 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65 66 69  _TLS1_3) || defi
25c0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
25d0: 4c 53 31 5f 33 29 0a 09 20 20 20 20 54 63 6c 5f  LS1_3)..    Tcl_
25e0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
25f0: 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69  erp, protocols[i
2600: 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63  ndex], ": protoc
2610: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64  ol not supported
2620: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
2630: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54  );..    return T
2640: 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a  CL_ERROR;.#else.
2650: 20 20 20 20 20 20 20 20 20 20 20 20 6d 69 6e 5f              min_
2660: 76 65 72 73 69 6f 6e 20 3d 20 54 4c 53 31 5f 33  version = TLS1_3
2670: 5f 56 45 52 53 49 4f 4e 3b 0a 20 20 20 20 20 20  _VERSION;.      
2680: 20 20 20 20 20 20 6d 61 78 5f 76 65 72 73 69 6f        max_versio
2690: 6e 20 3d 20 54 4c 53 31 5f 33 5f 56 45 52 53 49  n = TLS1_3_VERSI
26a0: 4f 4e 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a  ON;..    break;.
26b0: 23 65 6e 64 69 66 0a 09 64 65 66 61 75 6c 74 3a  #endif..default:
26c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 69 6e  .            min
26d0: 5f 76 65 72 73 69 6f 6e 20 3d 20 53 53 4c 33 5f  _version = SSL3_
26e0: 56 45 52 53 49 4f 4e 3b 0a 20 20 20 20 20 20 20  VERSION;.       
26f0: 20 20 20 20 20 6d 61 78 5f 76 65 72 73 69 6f 6e       max_version
2700: 20 3d 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f   = TLS1_3_VERSIO
2710: 4e 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 20  N;..    break;. 
2720: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65     }..    /* Cre
2730: 61 74 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ate context */. 
2740: 20 20 20 69 66 20 28 28 63 74 78 20 3d 20 53 53     if ((ctx = SS
2750: 4c 5f 43 54 58 5f 6e 65 77 28 54 4c 53 5f 73 65  L_CTX_new(TLS_se
2760: 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 29 29 20  rver_method())) 
2770: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f  == NULL) {..Tcl_
2780: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
2790: 65 72 70 2c 20 47 45 54 5f 45 52 52 5f 52 45 41  erp, GET_ERR_REA
27a0: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20  SON(), (char *) 
27b0: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54  NULL);..return T
27c0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
27d0: 0a 20 20 20 20 2f 2a 20 53 65 74 20 70 72 6f 74  .    /* Set prot
27e0: 6f 63 6f 6c 20 76 65 72 73 69 6f 6e 73 20 2a 2f  ocol versions */
27f0: 0a 20 20 20 20 69 66 20 28 53 53 4c 5f 43 54 58  .    if (SSL_CTX
2800: 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76  _set_min_proto_v
2810: 65 72 73 69 6f 6e 28 63 74 78 2c 20 6d 69 6e 5f  ersion(ctx, min_
2820: 76 65 72 73 69 6f 6e 29 20 3d 3d 20 30 20 7c 7c  version) == 0 ||
2830: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 61  ..SSL_CTX_set_ma
2840: 78 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28  x_proto_version(
2850: 63 74 78 2c 20 6d 61 78 5f 76 65 72 73 69 6f 6e  ctx, max_version
2860: 29 20 3d 3d 20 30 29 20 7b 0a 09 53 53 4c 5f 43  ) == 0) {..SSL_C
2870: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72  TX_free(ctx);..r
2880: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2890: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
28a0: 72 65 61 74 65 20 53 53 4c 20 63 6f 6e 74 65 78  reate SSL contex
28b0: 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 28 73 73  t */.    if ((ss
28c0: 6c 20 3d 20 53 53 4c 5f 6e 65 77 28 63 74 78 29  l = SSL_new(ctx)
28d0: 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63  ) == NULL) {..Tc
28e0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
28f0: 6e 74 65 72 70 2c 20 47 45 54 5f 45 52 52 5f 52  nterp, GET_ERR_R
2900: 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a  EASON(), (char *
2910: 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54  ) NULL);..SSL_CT
2920: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65  X_free(ctx);..re
2930: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
2940: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 73      }..    /* Us
2950: 65 20 6c 69 73 74 20 61 6e 64 20 6f 72 64 65 72  e list and order
2960: 20 61 73 20 77 6f 75 6c 64 20 62 65 20 73 65 6e   as would be sen
2970: 74 20 69 6e 20 61 20 43 6c 69 65 6e 74 48 65 6c  t in a ClientHel
2980: 6c 6f 20 6f 72 20 61 6c 6c 20 61 76 61 69 6c 61  lo or all availa
2990: 62 6c 65 20 63 69 70 68 65 72 73 20 2a 2f 0a 20  ble ciphers */. 
29a0: 20 20 20 69 66 20 28 75 73 65 5f 73 75 70 70 6f     if (use_suppo
29b0: 72 74 65 64 29 20 7b 0a 09 73 6b 20 3d 20 53 53  rted) {..sk = SS
29c0: 4c 5f 67 65 74 31 5f 73 75 70 70 6f 72 74 65 64  L_get1_supported
29d0: 5f 63 69 70 68 65 72 73 28 73 73 6c 29 3b 0a 20  _ciphers(ssl);. 
29e0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 73 6b 20     } else {..sk 
29f0: 3d 20 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72  = SSL_get_cipher
2a00: 73 28 73 73 6c 29 3b 0a 09 2f 2a 73 6b 20 3d 20  s(ssl);../*sk = 
2a10: 53 53 4c 5f 43 54 58 5f 67 65 74 5f 63 69 70 68  SSL_CTX_get_ciph
2a20: 65 72 73 28 63 74 78 29 3b 2a 2f 0a 20 20 20 20  ers(ctx);*/.    
2a30: 7d 0a 0a 20 20 20 20 69 66 20 28 73 6b 20 21 3d  }..    if (sk !=
2a40: 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 4f 62   NULL) {..Tcl_Ob
2a50: 6a 20 2a 72 65 73 75 6c 74 4f 62 6a 20 3d 20 4e  j *resultObj = N
2a60: 55 4c 4c 3b 0a 0a 09 69 66 20 28 21 76 65 72 62  ULL;...if (!verb
2a70: 6f 73 65 29 20 7b 0a 09 20 20 20 20 63 6f 6e 73  ose) {..    cons
2a80: 74 20 63 68 61 72 20 2a 63 70 3b 0a 09 20 20 20  t char *cp;..   
2a90: 20 72 65 73 75 6c 74 4f 62 6a 20 3d 20 54 63 6c   resultObj = Tcl
2aa0: 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e  _NewListObj(0, N
2ab0: 55 4c 4c 29 3b 0a 09 20 20 20 20 69 66 20 28 72  ULL);..    if (r
2ac0: 65 73 75 6c 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c  esultObj == NULL
2ad0: 29 20 7b 0a 09 09 72 65 73 20 3d 20 54 43 4c 5f  ) {...res = TCL_
2ae0: 45 52 52 4f 52 3b 0a 09 09 67 6f 74 6f 20 64 6f  ERROR;...goto do
2af0: 6e 65 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20  ne;..    }...   
2b00: 20 66 6f 72 20 28 69 6e 74 20 69 20 3d 20 30 3b   for (int i = 0;
2b10: 20 69 20 3c 20 73 6b 5f 53 53 4c 5f 43 49 50 48   i < sk_SSL_CIPH
2b20: 45 52 5f 6e 75 6d 28 73 6b 29 3b 20 69 2b 2b 29  ER_num(sk); i++)
2b30: 20 7b 0a 09 09 63 6f 6e 73 74 20 53 53 4c 5f 43   {...const SSL_C
2b40: 49 50 48 45 52 20 2a 63 20 3d 20 73 6b 5f 53 53  IPHER *c = sk_SS
2b50: 4c 5f 43 49 50 48 45 52 5f 76 61 6c 75 65 28 73  L_CIPHER_value(s
2b60: 6b 2c 20 69 29 3b 0a 09 09 69 66 20 28 63 20 3d  k, i);...if (c =
2b70: 3d 20 4e 55 4c 4c 29 20 63 6f 6e 74 69 6e 75 65  = NULL) continue
2b80: 3b 0a 0a 09 09 2f 2a 20 63 69 70 68 65 72 20 6e  ;..../* cipher n
2b90: 61 6d 65 20 6f 72 20 28 4e 4f 4e 45 29 20 2a 2f  ame or (NONE) */
2ba0: 0a 09 09 63 70 20 3d 20 53 53 4c 5f 43 49 50 48  ...cp = SSL_CIPH
2bb0: 45 52 5f 67 65 74 5f 6e 61 6d 65 28 63 29 3b 0a  ER_get_name(c);.
2bc0: 09 09 69 66 20 28 63 70 20 3d 3d 20 4e 55 4c 4c  ..if (cp == NULL
2bd0: 29 20 62 72 65 61 6b 3b 0a 09 09 54 63 6c 5f 4c  ) break;...Tcl_L
2be0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
2bf0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 65 73 75  ent(interp, resu
2c00: 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 53 74  ltObj, Tcl_NewSt
2c10: 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a 29  ringObj((char *)
2c20: 20 63 70 2c 20 2d 31 29 29 3b 0a 09 20 20 20 20   cp, -1));..    
2c30: 7d 0a 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20  }...} else {..  
2c40: 20 20 63 68 61 72 20 62 75 66 5b 42 55 46 53 49    char buf[BUFSI
2c50: 5a 5d 3b 0a 09 20 20 20 20 72 65 73 75 6c 74 4f  Z];..    resultO
2c60: 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69  bj = Tcl_NewStri
2c70: 6e 67 4f 62 6a 28 22 22 2c 20 30 29 3b 0a 09 20  ngObj("", 0);.. 
2c80: 20 20 20 69 66 20 28 72 65 73 75 6c 74 4f 62 6a     if (resultObj
2c90: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65   == NULL) {...re
2ca0: 73 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  s = TCL_ERROR;..
2cb0: 09 67 6f 74 6f 20 64 6f 6e 65 3b 0a 09 20 20 20  .goto done;..   
2cc0: 20 7d 0a 0a 09 20 20 20 20 66 6f 72 20 28 69 6e   }...    for (in
2cd0: 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b 5f  t i = 0; i < sk_
2ce0: 53 53 4c 5f 43 49 50 48 45 52 5f 6e 75 6d 28 73  SSL_CIPHER_num(s
2cf0: 6b 29 3b 20 69 2b 2b 29 20 7b 0a 09 09 63 6f 6e  k); i++) {...con
2d00: 73 74 20 53 53 4c 5f 43 49 50 48 45 52 20 2a 63  st SSL_CIPHER *c
2d10: 20 3d 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52   = sk_SSL_CIPHER
2d20: 5f 76 61 6c 75 65 28 73 6b 2c 20 69 29 3b 0a 09  _value(sk, i);..
2d30: 09 69 66 20 28 63 20 3d 3d 20 4e 55 4c 4c 29 20  .if (c == NULL) 
2d40: 63 6f 6e 74 69 6e 75 65 3b 0a 0a 09 09 2f 2a 20  continue;..../* 
2d50: 74 65 78 74 75 61 6c 20 64 65 73 63 72 69 70 74  textual descript
2d60: 69 6f 6e 20 6f 66 20 74 68 65 20 63 69 70 68 65  ion of the ciphe
2d70: 72 20 2a 2f 0a 09 09 69 66 20 28 53 53 4c 5f 43  r */...if (SSL_C
2d80: 49 50 48 45 52 5f 64 65 73 63 72 69 70 74 69 6f  IPHER_descriptio
2d90: 6e 28 63 2c 20 62 75 66 2c 20 73 69 7a 65 6f 66  n(c, buf, sizeof
2da0: 28 62 75 66 29 29 20 21 3d 20 4e 55 4c 4c 29 20  (buf)) != NULL) 
2db0: 7b 0a 09 09 20 20 20 20 54 63 6c 5f 41 70 70 65  {...    Tcl_Appe
2dc0: 6e 64 54 6f 4f 62 6a 28 72 65 73 75 6c 74 4f 62  ndToObj(resultOb
2dd0: 6a 2c 20 62 75 66 2c 20 28 54 63 6c 5f 53 69 7a  j, buf, (Tcl_Siz
2de0: 65 29 20 73 74 72 6c 65 6e 28 62 75 66 29 29 3b  e) strlen(buf));
2df0: 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20  ...} else {...  
2e00: 20 20 54 63 6c 5f 41 70 70 65 6e 64 54 6f 4f 62    Tcl_AppendToOb
2e10: 6a 28 72 65 73 75 6c 74 4f 62 6a 2c 20 22 55 4e  j(resultObj, "UN
2e20: 4b 4e 4f 57 4e 5c 6e 22 2c 20 38 29 3b 0a 09 09  KNOWN\n", 8);...
2e30: 7d 0a 09 20 20 20 20 7d 0a 09 7d 0a 0a 09 2f 2a  }..    }..}.../*
2e40: 20 43 6c 65 61 6e 20 75 70 20 2a 2f 0a 09 69 66   Clean up */..if
2e50: 20 28 75 73 65 5f 73 75 70 70 6f 72 74 65 64 29   (use_supported)
2e60: 20 7b 0a 09 20 20 20 20 73 6b 5f 53 53 4c 5f 43   {..    sk_SSL_C
2e70: 49 50 48 45 52 5f 66 72 65 65 28 73 6b 29 3b 0a  IPHER_free(sk);.
2e80: 09 7d 0a 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65  .}..Tcl_SetObjRe
2e90: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 72 65 73  sult(interp, res
2ea0: 75 6c 74 4f 62 6a 29 3b 0a 20 20 20 20 7d 0a 0a  ultObj);.    }..
2eb0: 64 6f 6e 65 3a 0a 20 20 20 20 53 53 4c 5f 66 72  done:.    SSL_fr
2ec0: 65 65 28 73 73 6c 29 3b 0a 20 20 20 20 53 53 4c  ee(ssl);.    SSL
2ed0: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a  _CTX_free(ctx);.
2ee0: 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a      return res;.
2ef0: 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }../************
2f00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f30: 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d  *******/../*. *-
2f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f80: 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 49  --. *. * DigestI
2f90: 6e 66 6f 20 2d 2d 0a 20 2a 0a 20 2a 09 52 65 74  nfo --. *. *.Ret
2fa0: 75 72 6e 20 61 20 6c 69 73 74 20 6f 66 20 70 72  urn a list of pr
2fb0: 6f 70 65 72 74 69 65 73 20 61 6e 64 20 76 61 6c  operties and val
2fc0: 75 65 73 20 66 6f 72 20 64 69 67 65 73 74 2e 0a  ues for digest..
2fd0: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
2fe0: 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c  *.A standard Tcl
2ff0: 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 53 69 64   list.. *. * Sid
3000: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f  e effects:. *.No
3010: 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  ne.. *. *-------
3020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
3060: 0a 69 6e 74 20 44 69 67 65 73 74 49 6e 66 6f 28  .int DigestInfo(
3070: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
3080: 72 70 2c 20 54 63 6c 5f 4f 62 6a 20 2a 6e 61 6d  rp, Tcl_Obj *nam
3090: 65 4f 62 6a 29 20 7b 0a 20 20 20 20 63 6f 6e 73  eObj) {.    cons
30a0: 74 20 45 56 50 5f 4d 44 20 2a 6d 64 3b 0a 20 20  t EVP_MD *md;.  
30b0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c    Tcl_Obj *resul
30c0: 74 4f 62 6a 2c 20 2a 6c 69 73 74 4f 62 6a 3b 0a  tObj, *listObj;.
30d0: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e      unsigned lon
30e0: 67 20 66 6c 61 67 73 3b 0a 20 20 20 20 63 68 61  g flags;.    cha
30f0: 72 20 2a 6e 61 6d 65 20 3d 20 54 63 6c 5f 47 65  r *name = Tcl_Ge
3100: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6e  tStringFromObj(n
3110: 61 6d 65 4f 62 6a 2c 20 28 54 63 6c 5f 53 69 7a  ameObj, (Tcl_Siz
3120: 65 20 2a 29 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20  e *) NULL);..   
3130: 20 2f 2a 20 47 65 74 20 6d 65 73 73 61 67 65 20   /* Get message 
3140: 64 69 67 65 73 74 20 2a 2f 0a 20 20 20 20 6d 64  digest */.    md
3150: 20 3d 20 45 56 50 5f 67 65 74 5f 64 69 67 65 73   = EVP_get_diges
3160: 74 62 79 6e 61 6d 65 28 6e 61 6d 65 29 3b 0a 0a  tbyname(name);..
3170: 20 20 20 20 69 66 20 28 6d 64 20 3d 3d 20 4e 55      if (md == NU
3180: 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e  LL) {..Tcl_Appen
3190: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
31a0: 22 49 6e 76 61 6c 69 64 20 64 69 67 65 73 74 20  "Invalid digest 
31b0: 5c 22 22 2c 20 6e 61 6d 65 2c 20 22 5c 22 22 2c  \"", name, "\"",
31c0: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
31d0: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
31e0: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  OR;.    }..    /
31f0: 2a 20 47 65 74 20 70 72 6f 70 65 72 74 69 65 73  * Get properties
3200: 20 2a 2f 0a 20 20 20 20 72 65 73 75 6c 74 4f 62   */.    resultOb
3210: 6a 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f  j = Tcl_NewListO
3220: 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20  bj(0, NULL);.   
3230: 20 69 66 20 28 72 65 73 75 6c 74 4f 62 6a 20 3d   if (resultObj =
3240: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  = NULL) {..retur
3250: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
3260: 20 7d 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53   }.    LAPPEND_S
3270: 54 52 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c  TR(interp, resul
3280: 74 4f 62 6a 2c 20 22 6e 61 6d 65 22 2c 20 45 56  tObj, "name", EV
3290: 50 5f 4d 44 5f 6e 61 6d 65 28 6d 64 29 2c 20 2d  P_MD_name(md), -
32a0: 31 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f  1);.    LAPPEND_
32b0: 53 54 52 28 69 6e 74 65 72 70 2c 20 72 65 73 75  STR(interp, resu
32c0: 6c 74 4f 62 6a 2c 20 22 64 65 73 63 72 69 70 74  ltObj, "descript
32d0: 69 6f 6e 22 2c 20 22 22 2c 20 2d 31 29 3b 0a 20  ion", "", -1);. 
32e0: 20 20 20 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69     LAPPEND_INT(i
32f0: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a  nterp, resultObj
3300: 2c 20 22 73 69 7a 65 22 2c 20 45 56 50 5f 4d 44  , "size", EVP_MD
3310: 5f 73 69 7a 65 28 6d 64 29 29 3b 0a 20 20 20 20  _size(md));.    
3320: 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65  LAPPEND_INT(inte
3330: 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22  rp, resultObj, "
3340: 62 6c 6f 63 6b 5f 73 69 7a 65 22 2c 20 45 56 50  block_size", EVP
3350: 5f 4d 44 5f 62 6c 6f 63 6b 5f 73 69 7a 65 28 6d  _MD_block_size(m
3360: 64 29 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44  d));.    LAPPEND
3370: 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 72 65 73  _STR(interp, res
3380: 75 6c 74 4f 62 6a 2c 20 22 70 72 6f 76 69 64 65  ultObj, "provide
3390: 72 22 2c 20 22 22 2c 20 2d 31 29 3b 0a 20 20 20  r", "", -1);.   
33a0: 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74   LAPPEND_STR(int
33b0: 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20  erp, resultObj, 
33c0: 22 74 79 70 65 22 2c 20 4f 42 4a 5f 6e 69 64 32  "type", OBJ_nid2
33d0: 6c 6e 28 45 56 50 5f 4d 44 5f 74 79 70 65 28 6d  ln(EVP_MD_type(m
33e0: 64 29 29 2c 20 2d 31 29 3b 0a 20 20 20 20 4c 41  d)), -1);.    LA
33f0: 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
3400: 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 70 6b  , resultObj, "pk
3410: 65 79 5f 74 79 70 65 22 2c 20 4f 42 4a 5f 6e 69  ey_type", OBJ_ni
3420: 64 32 6c 6e 28 45 56 50 5f 4d 44 5f 70 6b 65 79  d2ln(EVP_MD_pkey
3430: 5f 74 79 70 65 28 6d 64 29 29 2c 20 2d 31 29 3b  _type(md)), -1);
3440: 0a 20 20 20 20 66 6c 61 67 73 20 3d 20 45 56 50  .    flags = EVP
3450: 5f 4d 44 5f 66 6c 61 67 73 28 6d 64 29 3b 0a 0a  _MD_flags(md);..
3460: 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 2a 2f 0a      /* Flags */.
3470: 20 20 20 20 6c 69 73 74 4f 62 6a 20 3d 20 54 63      listObj = Tc
3480: 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20  l_NewListObj(0, 
3490: 4e 55 4c 4c 29 3b 0a 20 20 20 20 4c 41 50 50 45  NULL);.    LAPPE
34a0: 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20  ND_BOOL(interp, 
34b0: 6c 69 73 74 4f 62 6a 2c 20 22 4f 6e 65 2d 73 68  listObj, "One-sh
34c0: 6f 74 22 2c 20 66 6c 61 67 73 20 26 20 45 56 50  ot", flags & EVP
34d0: 5f 4d 44 5f 46 4c 41 47 5f 4f 4e 45 53 48 4f 54  _MD_FLAG_ONESHOT
34e0: 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 42  );.    LAPPEND_B
34f0: 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6c 69 73 74  OOL(interp, list
3500: 4f 62 6a 2c 20 22 58 4f 46 22 2c 20 66 6c 61 67  Obj, "XOF", flag
3510: 73 20 26 20 45 56 50 5f 4d 44 5f 46 4c 41 47 5f  s & EVP_MD_FLAG_
3520: 58 4f 46 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e  XOF);.    LAPPEN
3530: 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6c  D_BOOL(interp, l
3540: 69 73 74 4f 62 6a 2c 20 22 44 69 67 65 73 74 41  istObj, "DigestA
3550: 6c 67 6f 72 69 74 68 6d 49 64 5f 4e 55 4c 4c 22  lgorithmId_NULL"
3560: 2c 20 66 6c 61 67 73 20 26 20 45 56 50 5f 4d 44  , flags & EVP_MD
3570: 5f 46 4c 41 47 5f 44 49 47 41 4c 47 49 44 5f 4e  _FLAG_DIGALGID_N
3580: 55 4c 4c 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e  ULL);.    LAPPEN
3590: 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6c  D_BOOL(interp, l
35a0: 69 73 74 4f 62 6a 2c 20 22 44 69 67 65 73 74 41  istObj, "DigestA
35b0: 6c 67 6f 72 69 74 68 6d 49 64 5f 41 62 73 63 65  lgorithmId_Absce
35c0: 6e 74 22 2c 20 66 6c 61 67 73 20 26 20 45 56 50  nt", flags & EVP
35d0: 5f 4d 44 5f 46 4c 41 47 5f 44 49 47 41 4c 47 49  _MD_FLAG_DIGALGI
35e0: 44 5f 41 42 53 45 4e 54 29 3b 0a 20 20 20 20 4c  D_ABSENT);.    L
35f0: 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65  APPEND_BOOL(inte
3600: 72 70 2c 20 6c 69 73 74 4f 62 6a 2c 20 22 44 69  rp, listObj, "Di
3610: 67 65 73 74 41 6c 67 6f 72 69 74 68 6d 49 64 5f  gestAlgorithmId_
3620: 43 75 73 74 6f 6d 22 2c 20 66 6c 61 67 73 20 26  Custom", flags &
3630: 20 45 56 50 5f 4d 44 5f 46 4c 41 47 5f 44 49 47   EVP_MD_FLAG_DIG
3640: 41 4c 47 49 44 5f 43 55 53 54 4f 4d 29 3b 0a 20  ALGID_CUSTOM);. 
3650: 20 20 20 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28     LAPPEND_BOOL(
3660: 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a 2c  interp, listObj,
3670: 20 22 46 49 50 53 22 2c 20 66 6c 61 67 73 20 26   "FIPS", flags &
3680: 20 45 56 50 5f 4d 44 5f 46 4c 41 47 5f 46 49 50   EVP_MD_FLAG_FIP
3690: 53 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f  S);.    LAPPEND_
36a0: 4f 42 4a 28 69 6e 74 65 72 70 2c 20 72 65 73 75  OBJ(interp, resu
36b0: 6c 74 4f 62 6a 2c 20 22 66 6c 61 67 73 22 2c 20  ltObj, "flags", 
36c0: 6c 69 73 74 4f 62 6a 29 3b 0a 0a 20 20 20 20 54  listObj);..    T
36d0: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
36e0: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62  interp, resultOb
36f0: 6a 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  j);.    return T
3700: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d  CL_OK;.}../*. *-
3710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3750: 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 4c  --. *. * DigestL
3760: 69 73 74 20 2d 2d 0a 20 2a 0a 20 2a 09 52 65 74  ist --. *. *.Ret
3770: 75 72 6e 20 61 20 6c 69 73 74 20 6f 66 20 61 6c  urn a list of al
3780: 6c 20 64 69 67 65 73 74 20 61 6c 67 6f 72 69 74  l digest algorit
3790: 68 6d 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  hms. *. * Result
37a0: 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64  s:. *.A standard
37b0: 20 54 63 6c 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a   Tcl list.. *. *
37c0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
37d0: 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d  *.None.. *. *---
37e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3820: 0a 20 2a 2f 0a 69 6e 74 20 44 69 67 65 73 74 4c  . */.int DigestL
3830: 69 73 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ist(Tcl_Interp *
3840: 69 6e 74 65 72 70 29 20 7b 0a 20 20 20 20 54 63  interp) {.    Tc
3850: 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 4f 62 6a  l_Obj *resultObj
3860: 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62   = Tcl_NewListOb
3870: 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  j(0, NULL);.    
3880: 69 66 20 28 72 65 73 75 6c 74 4f 62 6a 20 3d 3d  if (resultObj ==
3890: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e   NULL) {..return
38a0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
38b0: 7d 0a 0a 20 20 20 20 2f 2a 20 53 61 6d 65 20 61  }..    /* Same a
38c0: 73 20 45 56 50 5f 4d 44 5f 64 6f 5f 61 6c 6c 20  s EVP_MD_do_all 
38d0: 2a 2f 0a 20 20 20 20 4f 42 4a 5f 4e 41 4d 45 5f  */.    OBJ_NAME_
38e0: 64 6f 5f 61 6c 6c 28 4f 42 4a 5f 4e 41 4d 45 5f  do_all(OBJ_NAME_
38f0: 54 59 50 45 5f 4d 44 5f 4d 45 54 48 2c 20 4e 61  TYPE_MD_METH, Na
3900: 6d 65 73 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f  mesCallback, (vo
3910: 69 64 20 2a 29 20 72 65 73 75 6c 74 4f 62 6a 29  id *) resultObj)
3920: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a  ;.    Tcl_SetObj
3930: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 72  Result(interp, r
3940: 65 73 75 6c 74 4f 62 6a 29 3b 0a 20 20 20 20 72  esultObj);.    r
3950: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
3960: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
3970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
39a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
39b0: 44 69 67 65 73 74 73 4f 62 6a 43 6d 64 20 2d 2d  DigestsObjCmd --
39c0: 0a 20 2a 0a 20 2a 09 52 65 74 75 72 6e 20 61 20  . *. *.Return a 
39d0: 6c 69 73 74 20 6f 66 20 61 6c 6c 20 76 61 6c 69  list of all vali
39e0: 64 20 68 61 73 68 20 61 6c 67 6f 72 69 74 68 6d  d hash algorithm
39f0: 73 20 6f 72 20 6d 65 73 73 61 67 65 20 64 69 67  s or message dig
3a00: 65 73 74 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  ests.. *. * Resu
3a10: 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61  lts:. *.A standa
3a20: 72 64 20 54 63 6c 20 6c 69 73 74 2e 0a 20 2a 0a  rd Tcl list.. *.
3a30: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
3a40: 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d  . *.None.. *. *-
3a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a90: 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 44 69 67 65 73  --. */.int Diges
3aa0: 74 73 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44  tsObjCmd(ClientD
3ab0: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
3ac0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
3ad0: 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63  rp, int objc, Tc
3ae0: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a  l_Obj *const obj
3af0: 76 5b 5d 29 20 7b 0a 20 20 20 20 28 76 6f 69 64  v[]) {.    (void
3b00: 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20  ) clientData;.. 
3b10: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
3b20: 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6c  ed");..    /* Cl
3b30: 65 61 72 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20  ear errors */.  
3b40: 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c    Tcl_ResetResul
3b50: 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 45  t(interp);.    E
3b60: 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29  RR_clear_error()
3b70: 3b 0a 0a 0a 20 20 20 20 2f 2a 20 56 61 6c 69 64  ;...    /* Valid
3b80: 61 74 65 20 61 72 67 20 63 6f 75 6e 74 20 2a 2f  ate arg count */
3b90: 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d  .    if (objc ==
3ba0: 20 31 29 20 7b 0a 09 72 65 74 75 72 6e 20 44 69   1) {..return Di
3bb0: 67 65 73 74 4c 69 73 74 28 69 6e 74 65 72 70 29  gestList(interp)
3bc0: 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66  ;..    } else if
3bd0: 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09   (objc == 2) {..
3be0: 72 65 74 75 72 6e 20 44 69 67 65 73 74 49 6e 66  return DigestInf
3bf0: 6f 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31  o(interp, objv[1
3c00: 5d 29 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20  ]);..    } else 
3c10: 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41  {..Tcl_WrongNumA
3c20: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
3c30: 62 6a 76 2c 20 22 3f 6e 61 6d 65 3f 22 29 3b 0a  bjv, "?name?");.
3c40: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
3c50: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  R;.    }.    ret
3c60: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
3c70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3c80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3c90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3ca0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3cb0: 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ***/../*. *-----
3cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
3d00: 2a 0a 20 2a 20 4b 64 66 4c 69 73 74 20 2d 2d 0a  *. * KdfList --.
3d10: 20 2a 0a 20 2a 09 52 65 74 75 72 6e 20 61 20 6c   *. *.Return a l
3d20: 69 73 74 20 6f 66 20 61 6c 6c 20 4b 44 46 20 61  ist of all KDF a
3d30: 6c 67 6f 72 69 74 68 6d 73 0a 20 2a 0a 20 2a 20  lgorithms. *. * 
3d40: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74  Results:. *.A st
3d50: 61 6e 64 61 72 64 20 54 63 6c 20 6c 69 73 74 2e  andard Tcl list.
3d60: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
3d70: 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a  cts:. *.None.. *
3d80: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
3d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3dc0: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 4b  ------. */.int K
3dd0: 64 66 4c 69 73 74 28 54 63 6c 5f 49 6e 74 65 72  dfList(Tcl_Inter
3de0: 70 20 2a 69 6e 74 65 72 70 2c 20 63 68 61 72 20  p *interp, char 
3df0: 2a 73 65 6c 65 63 74 5f 6e 61 6d 65 29 20 7b 0a  *select_name) {.
3e00: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 72 65 73      Tcl_Obj *res
3e10: 75 6c 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77  ultObj = Tcl_New
3e20: 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29  ListObj(0, NULL)
3e30: 3b 0a 20 20 20 20 69 66 20 28 72 65 73 75 6c 74  ;.    if (result
3e40: 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  Obj == NULL) {..
3e50: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
3e60: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c  ;.    }..    Tcl
3e70: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
3e80: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 65  ement(interp, re
3e90: 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77  sultObj, Tcl_New
3ea0: 53 74 72 69 6e 67 4f 62 6a 28 22 68 6b 64 66 22  StringObj("hkdf"
3eb0: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f  , -1));.    Tcl_
3ec0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
3ed0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 65 73  ment(interp, res
3ee0: 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 53  ultObj, Tcl_NewS
3ef0: 74 72 69 6e 67 4f 62 6a 28 22 70 62 6b 64 66 32  tringObj("pbkdf2
3f00: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c  ", -1));.    Tcl
3f10: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
3f20: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 65  ement(interp, re
3f30: 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77  sultObj, Tcl_New
3f40: 53 74 72 69 6e 67 4f 62 6a 28 22 73 63 72 79 70  StringObj("scryp
3f50: 74 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63  t", -1));.    Tc
3f60: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
3f70: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a  nterp, resultObj
3f80: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
3f90: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d  L_OK;.}../*. *--
3fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3fe0: 2d 0a 20 2a 0a 20 2a 20 4b 64 66 73 4f 62 6a 43  -. *. * KdfsObjC
3ff0: 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 52 65 74 75  md --. *. *.Retu
4000: 72 6e 20 61 20 6c 69 73 74 20 6f 66 20 61 6c 6c  rn a list of all
4010: 20 76 61 6c 69 64 20 4b 65 79 20 44 65 72 69 76   valid Key Deriv
4020: 61 74 69 6f 6e 20 46 75 6e 63 74 69 6f 6e 20 28  ation Function (
4030: 4b 44 46 29 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  KDF).. *. * Resu
4040: 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61  lts:. *.A standa
4050: 72 64 20 54 63 6c 20 6c 69 73 74 2e 0a 20 2a 0a  rd Tcl list.. *.
4060: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
4070: 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d  . *.None.. *. *-
4080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
40a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
40b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
40c0: 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 4b 64 66 73 4f  --. */.int KdfsO
40d0: 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61  bjCmd(ClientData
40e0: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c   clientData, Tcl
40f0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
4100: 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f   int objc, Tcl_O
4110: 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d  bj *const objv[]
4120: 29 20 7b 0a 20 20 20 20 28 76 6f 69 64 29 20 63  ) {.    (void) c
4130: 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20  lientData;..    
4140: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
4150: 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6c 65 61 72  );..    /* Clear
4160: 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20 54   errors */.    T
4170: 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69  cl_ResetResult(i
4180: 6e 74 65 72 70 29 3b 0a 20 20 20 20 45 52 52 5f  nterp);.    ERR_
4190: 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a  clear_error();..
41a0: 0a 20 20 20 20 2f 2a 20 56 61 6c 69 64 61 74 65  .    /* Validate
41b0: 20 61 72 67 20 63 6f 75 6e 74 20 2a 2f 0a 20 20   arg count */.  
41c0: 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 31 29    if (objc == 1)
41d0: 20 7b 0a 09 72 65 74 75 72 6e 20 4b 64 66 4c 69   {..return KdfLi
41e0: 73 74 28 69 6e 74 65 72 70 2c 20 4e 55 4c 4c 29  st(interp, NULL)
41f0: 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66  ;..    } else if
4200: 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 0a   (objc == 2) {..
4210: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54  .    } else {..T
4220: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
4230: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
4240: 20 22 3f 6e 61 6d 65 3f 22 29 3b 0a 09 72 65 74   "?name?");..ret
4250: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
4260: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
4270: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a  TCL_OK;.}../****
4280: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4290: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
42a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
42b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
42c0: 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
42d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
42e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
42f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
4310: 20 4d 61 63 49 6e 66 6f 20 2d 2d 0a 20 2a 0a 20   MacInfo --. *. 
4320: 2a 09 52 65 74 75 72 6e 20 61 20 6c 69 73 74 20  *.Return a list 
4330: 6f 66 20 70 72 6f 70 65 72 74 69 65 73 20 61 6e  of properties an
4340: 64 20 76 61 6c 75 65 73 20 66 6f 72 20 6d 61 63  d values for mac
4350: 4e 61 6d 65 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  Name.. *. * Resu
4360: 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61  lts:. *.A standa
4370: 72 64 20 54 63 6c 20 6c 69 73 74 2e 0a 20 2a 0a  rd Tcl list.. *.
4380: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
4390: 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d  . *.None.. *. *-
43a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
43b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
43c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
43d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
43e0: 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 4d 61 63 49 6e  --. */.int MacIn
43f0: 66 6f 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  fo(Tcl_Interp *i
4400: 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 20 2a  nterp, Tcl_Obj *
4410: 6e 61 6d 65 4f 62 6a 29 20 7b 0a 20 20 20 20 54  nameObj) {.    T
4420: 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 4f 62  cl_Obj *resultOb
4430: 6a 3b 0a 20 20 20 20 69 6e 74 20 72 65 73 20 3d  j;.    int res =
4440: 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 63 68 61   TCL_OK;.    cha
4450: 72 20 2a 6e 61 6d 65 20 3d 20 54 63 6c 5f 47 65  r *name = Tcl_Ge
4460: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6e  tStringFromObj(n
4470: 61 6d 65 4f 62 6a 2c 20 28 54 63 6c 5f 53 69 7a  ameObj, (Tcl_Siz
4480: 65 20 2a 29 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20  e *) NULL);..   
4490: 20 69 66 20 28 73 74 72 63 6d 70 28 6e 61 6d 65   if (strcmp(name
44a0: 2c 20 22 63 6d 61 63 22 29 20 21 3d 20 30 20 26  , "cmac") != 0 &
44b0: 26 20 73 74 72 63 6d 70 28 6e 61 6d 65 2c 20 22  & strcmp(name, "
44c0: 68 6d 61 63 22 29 20 21 3d 20 30 29 20 7b 0a 09  hmac") != 0) {..
44d0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
44e0: 28 69 6e 74 65 72 70 2c 20 22 49 6e 76 61 6c 69  (interp, "Invali
44f0: 64 20 4d 41 43 20 5c 22 22 2c 20 6e 61 6d 65 2c  d MAC \"", name,
4500: 20 22 5c 22 22 2c 20 28 63 68 61 72 20 2a 29 20   "\"", (char *) 
4510: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54  NULL);..return T
4520: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
4530: 0a 20 20 20 20 2f 2a 20 47 65 74 20 70 72 6f 70  .    /* Get prop
4540: 65 72 74 69 65 73 20 2a 2f 0a 20 20 20 20 72 65  erties */.    re
4550: 73 75 6c 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65  sultObj = Tcl_Ne
4560: 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c  wListObj(0, NULL
4570: 29 3b 0a 20 20 20 20 69 66 20 28 72 65 73 75 6c  );.    if (resul
4580: 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  tObj == NULL) {.
4590: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
45a0: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 4c 41 50  R;.    }.    LAP
45b0: 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
45c0: 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 6e 61 6d   resultObj, "nam
45d0: 65 22 2c 20 6e 61 6d 65 2c 20 2d 31 29 3b 0a 20  e", name, -1);. 
45e0: 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69     LAPPEND_STR(i
45f0: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a  nterp, resultObj
4600: 2c 20 22 64 65 73 63 72 69 70 74 69 6f 6e 22 2c  , "description",
4610: 20 22 22 2c 20 2d 31 29 3b 0a 20 20 20 20 4c 41   "", -1);.    LA
4620: 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
4630: 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 70 72  , resultObj, "pr
4640: 6f 76 69 64 65 72 22 2c 20 22 22 2c 20 2d 31 29  ovider", "", -1)
4650: 3b 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62  ;..    Tcl_SetOb
4660: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
4670: 72 65 73 75 6c 74 4f 62 6a 29 3b 0a 20 20 20 20  resultObj);.    
4680: 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f  return res;.}../
4690: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
46a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
46b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
46c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
46d0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d 61  -------. *. * Ma
46e0: 63 4c 69 73 74 20 2d 2d 0a 20 2a 0a 20 2a 09 52  cList --. *. *.R
46f0: 65 74 75 72 6e 20 61 20 6c 69 73 74 20 6f 66 20  eturn a list of 
4700: 61 6c 6c 20 4d 41 43 20 61 6c 67 6f 72 69 74 68  all MAC algorith
4710: 6d 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  ms. *. * Results
4720: 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20  :. *.A standard 
4730: 54 63 6c 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20  Tcl list.. *. * 
4740: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
4750: 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d  .None.. *. *----
4760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
47a0: 20 2a 2f 0a 69 6e 74 20 4d 61 63 4c 69 73 74 28   */.int MacList(
47b0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
47c0: 72 70 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62  rp) {.    Tcl_Ob
47d0: 6a 20 2a 72 65 73 75 6c 74 4f 62 6a 20 3d 20 54  j *resultObj = T
47e0: 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c  cl_NewListObj(0,
47f0: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28   NULL);.    if (
4800: 72 65 73 75 6c 74 4f 62 6a 20 3d 3d 20 4e 55 4c  resultObj == NUL
4810: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c  L) {..return TCL
4820: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
4830: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
4840: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
4850: 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54  rp, resultObj, T
4860: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
4870: 22 63 6d 61 63 22 2c 20 2d 31 29 29 3b 0a 20 20  "cmac", -1));.  
4880: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
4890: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
48a0: 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63  p, resultObj, Tc
48b0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
48c0: 68 6d 61 63 22 2c 20 2d 31 29 29 3b 0a 20 20 20  hmac", -1));.   
48d0: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
48e0: 74 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74  t(interp, result
48f0: 4f 62 6a 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Obj);.    return
4900: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20   TCL_OK;.}../*. 
4910: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
4920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4950: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d 61 63 73 4f  ----. *. * MacsO
4960: 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 52  bjCmd --. *. *.R
4970: 65 74 75 72 6e 20 61 20 6c 69 73 74 20 6f 66 20  eturn a list of 
4980: 61 6c 6c 20 76 61 6c 69 64 20 6d 65 73 73 61 67  all valid messag
4990: 65 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e  e authentication
49a0: 20 63 6f 64 65 73 20 28 4d 41 43 29 2e 0a 20 2a   codes (MAC).. *
49b0: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
49c0: 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 6c  A standard Tcl l
49d0: 69 73 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  ist.. *. * Side 
49e0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65  effects:. *.None
49f0: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  .. *. *---------
4a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69  ----------. */.i
4a40: 6e 74 20 4d 61 63 73 4f 62 6a 43 6d 64 28 43 6c  nt MacsObjCmd(Cl
4a50: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
4a60: 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20  ata, Tcl_Interp 
4a70: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a  *interp, int obj
4a80: 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73  c, Tcl_Obj *cons
4a90: 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20  t objv[]) {.    
4aa0: 28 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 74  (void) clientDat
4ab0: 61 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  a;..    dprintf(
4ac0: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20  "Called");..    
4ad0: 2f 2a 20 43 6c 65 61 72 20 65 72 72 6f 72 73 20  /* Clear errors 
4ae0: 2a 2f 0a 20 20 20 20 54 63 6c 5f 52 65 73 65 74  */.    Tcl_Reset
4af0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a  Result(interp);.
4b00: 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72      ERR_clear_er
4b10: 72 6f 72 28 29 3b 0a 0a 20 20 20 20 2f 2a 20 56  ror();..    /* V
4b20: 61 6c 69 64 61 74 65 20 61 72 67 20 63 6f 75 6e  alidate arg coun
4b30: 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f 62 6a  t */.    if (obj
4b40: 63 20 3d 3d 20 31 29 20 7b 0a 09 72 65 74 75 72  c == 1) {..retur
4b50: 6e 20 4d 61 63 4c 69 73 74 28 69 6e 74 65 72 70  n MacList(interp
4b60: 29 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  );..    } else i
4b70: 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a  f (objc == 2) {.
4b80: 09 72 65 74 75 72 6e 20 4d 61 63 49 6e 66 6f 28  .return MacInfo(
4b90: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 29  interp, objv[1])
4ba0: 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  ;..    } else {.
4bb0: 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67  .Tcl_WrongNumArg
4bc0: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
4bd0: 76 2c 20 22 3f 6e 61 6d 65 3f 22 29 3b 0a 09 72  v, "?name?");..r
4be0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
4bf0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
4c00: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 2a  n TCL_OK;.}../**
4c10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4c20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4c30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4c40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4c50: 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  */../*. *-------
4c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
4ca0: 20 2a 20 50 6b 65 79 49 6e 66 6f 20 2d 2d 0a 20   * PkeyInfo --. 
4cb0: 2a 0a 20 2a 09 52 65 74 75 72 6e 20 61 20 6c 69  *. *.Return a li
4cc0: 73 74 20 6f 66 20 70 72 6f 70 65 72 74 69 65 73  st of properties
4cd0: 20 61 6e 64 20 76 61 6c 75 65 73 20 66 6f 72 20   and values for 
4ce0: 70 6b 65 79 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  pkey.. *. * Resu
4cf0: 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61  lts:. *.A standa
4d00: 72 64 20 54 63 6c 20 6c 69 73 74 2e 0a 20 2a 0a  rd Tcl list.. *.
4d10: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
4d20: 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d  . *.None.. *. *-
4d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4d70: 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 50 6b 65 79 49  --. */.int PkeyI
4d80: 6e 66 6f 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  nfo(Tcl_Interp *
4d90: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 20  interp, Tcl_Obj 
4da0: 2a 6e 61 6d 65 4f 62 6a 29 20 7b 0a 20 20 20 20  *nameObj) {.    
4db0: 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 4f  Tcl_Obj *resultO
4dc0: 62 6a 3b 0a 20 20 20 20 69 6e 74 20 72 65 73 20  bj;.    int res 
4dd0: 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 63 68  = TCL_OK;.    ch
4de0: 61 72 20 2a 6e 61 6d 65 20 3d 20 54 63 6c 5f 47  ar *name = Tcl_G
4df0: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
4e00: 6e 61 6d 65 4f 62 6a 2c 20 28 54 63 6c 5f 53 69  nameObj, (Tcl_Si
4e10: 7a 65 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20  ze *) NULL);.   
4e20: 20 45 56 50 5f 50 4b 45 59 20 2a 70 6b 65 79 20   EVP_PKEY *pkey 
4e30: 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 69 66 20  = NULL;..    if 
4e40: 28 70 6b 65 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b  (pkey == NULL) {
4e50: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
4e60: 6c 74 28 69 6e 74 65 72 70 2c 20 22 49 6e 76 61  lt(interp, "Inva
4e70: 6c 69 64 20 70 75 62 6c 69 63 20 6b 65 79 20 6d  lid public key m
4e80: 65 74 68 6f 64 20 5c 22 22 2c 20 6e 61 6d 65 2c  ethod \"", name,
4e90: 20 22 5c 22 22 2c 20 28 63 68 61 72 20 2a 29 20   "\"", (char *) 
4ea0: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54  NULL);..return T
4eb0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
4ec0: 0a 20 20 20 20 2f 2a 20 47 65 74 20 70 72 6f 70  .    /* Get prop
4ed0: 65 72 74 69 65 73 20 2a 2f 0a 20 20 20 20 72 65  erties */.    re
4ee0: 73 75 6c 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65  sultObj = Tcl_Ne
4ef0: 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c  wListObj(0, NULL
4f00: 29 3b 0a 20 20 20 20 69 66 20 28 72 65 73 75 6c  );.    if (resul
4f10: 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  tObj == NULL) {.
4f20: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
4f30: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 4c 41 50  R;.    }.    LAP
4f40: 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
4f50: 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 6e 61 6d   resultObj, "nam
4f60: 65 22 2c 20 4f 42 4a 5f 6e 69 64 32 6c 6e 28 45  e", OBJ_nid2ln(E
4f70: 56 50 5f 50 4b 45 59 5f 69 64 28 70 6b 65 79 29  VP_PKEY_id(pkey)
4f80: 29 2c 20 2d 31 29 3b 0a 20 20 20 20 4c 41 50 50  ), -1);.    LAPP
4f90: 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
4fa0: 72 65 73 75 6c 74 4f 62 6a 2c 20 22 64 65 73 63  resultObj, "desc
4fb0: 72 69 70 74 69 6f 6e 22 2c 20 22 22 2c 20 2d 31  ription", "", -1
4fc0: 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 49  );.    LAPPEND_I
4fd0: 4e 54 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c  NT(interp, resul
4fe0: 74 4f 62 6a 2c 20 22 73 69 7a 65 22 2c 20 45 56  tObj, "size", EV
4ff0: 50 5f 50 4b 45 59 5f 73 69 7a 65 28 70 6b 65 79  P_PKEY_size(pkey
5000: 29 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f  ));.    LAPPEND_
5010: 49 4e 54 28 69 6e 74 65 72 70 2c 20 72 65 73 75  INT(interp, resu
5020: 6c 74 4f 62 6a 2c 20 22 62 69 74 73 22 2c 20 45  ltObj, "bits", E
5030: 56 50 5f 50 4b 45 59 5f 62 69 74 73 28 70 6b 65  VP_PKEY_bits(pke
5040: 79 29 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44  y));.    LAPPEND
5050: 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 72 65 73  _INT(interp, res
5060: 75 6c 74 4f 62 6a 2c 20 22 73 65 63 75 72 69 74  ultObj, "securit
5070: 79 5f 62 69 74 73 22 2c 20 45 56 50 5f 50 4b 45  y_bits", EVP_PKE
5080: 59 5f 73 65 63 75 72 69 74 79 5f 62 69 74 73 28  Y_security_bits(
5090: 70 6b 65 79 29 29 3b 0a 20 20 20 20 4c 41 50 50  pkey));.    LAPP
50a0: 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
50b0: 72 65 73 75 6c 74 4f 62 6a 2c 20 22 62 61 73 65  resultObj, "base
50c0: 49 64 22 2c 20 4f 42 4a 5f 6e 69 64 32 6c 6e 28  Id", OBJ_nid2ln(
50d0: 45 56 50 5f 50 4b 45 59 5f 62 61 73 65 5f 69 64  EVP_PKEY_base_id
50e0: 28 70 6b 65 79 29 29 2c 20 2d 31 29 3b 0a 20 20  (pkey)), -1);.  
50f0: 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e    LAPPEND_STR(in
5100: 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c  terp, resultObj,
5110: 20 22 70 72 6f 76 69 64 65 72 22 2c 20 22 22 2c   "provider", "",
5120: 20 2d 31 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e   -1);.    LAPPEN
5130: 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 72 65  D_STR(interp, re
5140: 73 75 6c 74 4f 62 6a 2c 20 22 74 79 70 65 22 2c  sultObj, "type",
5150: 20 4f 42 4a 5f 6e 69 64 32 6c 6e 28 45 56 50 5f   OBJ_nid2ln(EVP_
5160: 50 4b 45 59 5f 74 79 70 65 28 45 56 50 5f 50 4b  PKEY_type(EVP_PK
5170: 45 59 5f 69 64 28 70 6b 65 79 29 29 29 2c 20 2d  EY_id(pkey))), -
5180: 31 29 3b 0a 0a 20 20 20 20 7b 0a 09 69 6e 74 20  1);..    {..int 
5190: 70 6e 69 64 3b 0a 09 69 66 20 28 45 56 50 5f 50  pnid;..if (EVP_P
51a0: 4b 45 59 5f 67 65 74 5f 64 65 66 61 75 6c 74 5f  KEY_get_default_
51b0: 64 69 67 65 73 74 5f 6e 69 64 28 70 6b 65 79 2c  digest_nid(pkey,
51c0: 20 26 70 6e 69 64 29 20 3e 20 30 29 20 7b 0a 09   &pnid) > 0) {..
51d0: 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28      LAPPEND_STR(
51e0: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62  interp, resultOb
51f0: 6a 2c 20 22 64 65 66 61 75 6c 74 5f 64 69 67 65  j, "default_dige
5200: 73 74 22 2c 20 4f 42 4a 5f 6e 69 64 32 6c 6e 28  st", OBJ_nid2ln(
5210: 70 6e 69 64 29 2c 20 2d 32 29 3b 0a 09 7d 0a 20  pnid), -2);..}. 
5220: 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 53 65     }..    Tcl_Se
5230: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
5240: 70 2c 20 72 65 73 75 6c 74 4f 62 6a 29 3b 0a 20  p, resultObj);. 
5250: 20 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d     return res;.}
5260: 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
5270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
52a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
52b0: 20 50 6b 65 79 4c 69 73 74 20 2d 2d 0a 20 2a 0a   PkeyList --. *.
52c0: 20 2a 09 52 65 74 75 72 6e 20 61 20 6c 69 73 74   *.Return a list
52d0: 20 6f 66 20 61 6c 6c 20 70 75 62 6c 69 63 20 6b   of all public k
52e0: 65 79 20 6d 65 74 68 6f 64 73 0a 20 2a 0a 20 2a  ey methods. *. *
52f0: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73   Results:. *.A s
5300: 74 61 6e 64 61 72 64 20 54 63 6c 20 6c 69 73 74  tandard Tcl list
5310: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  .. *. * Side eff
5320: 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20  ects:. *.None.. 
5330: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
5340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5370: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20  -------. */.int 
5380: 50 6b 65 79 4c 69 73 74 28 54 63 6c 5f 49 6e 74  PkeyList(Tcl_Int
5390: 65 72 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20  erp *interp) {. 
53a0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75     Tcl_Obj *resu
53b0: 6c 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 4c  ltObj = Tcl_NewL
53c0: 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b  istObj(0, NULL);
53d0: 0a 20 20 20 20 69 66 20 28 72 65 73 75 6c 74 4f  .    if (resultO
53e0: 62 6a 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72  bj == NULL) {..r
53f0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
5400: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 20  .    }..    for 
5410: 28 73 69 7a 65 5f 74 20 69 20 3d 20 30 3b 20 69  (size_t i = 0; i
5420: 20 3c 20 45 56 50 5f 50 4b 45 59 5f 6d 65 74 68   < EVP_PKEY_meth
5430: 5f 67 65 74 5f 63 6f 75 6e 74 28 29 3b 20 69 2b  _get_count(); i+
5440: 2b 29 20 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  +) {.        con
5450: 73 74 20 45 56 50 5f 50 4b 45 59 5f 4d 45 54 48  st EVP_PKEY_METH
5460: 4f 44 20 2a 70 6d 65 74 68 20 3d 20 45 56 50 5f  OD *pmeth = EVP_
5470: 50 4b 45 59 5f 6d 65 74 68 5f 67 65 74 30 28 69  PKEY_meth_get0(i
5480: 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 70  );.        int p
5490: 6b 65 79 5f 69 64 2c 20 70 6b 65 79 5f 66 6c 61  key_id, pkey_fla
54a0: 67 73 3b 0a 0a 20 20 20 20 20 20 20 20 45 56 50  gs;..        EVP
54b0: 5f 50 4b 45 59 5f 6d 65 74 68 5f 67 65 74 30 5f  _PKEY_meth_get0_
54c0: 69 6e 66 6f 28 26 70 6b 65 79 5f 69 64 2c 20 26  info(&pkey_id, &
54d0: 70 6b 65 79 5f 66 6c 61 67 73 2c 20 70 6d 65 74  pkey_flags, pmet
54e0: 68 29 3b 0a 09 2f 2a 4c 41 50 50 45 4e 44 5f 53  h);../*LAPPEND_S
54f0: 54 52 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c  TR(interp, resul
5500: 74 4f 62 6a 2c 20 22 6e 61 6d 65 22 2c 20 4f 42  tObj, "name", OB
5510: 4a 5f 6e 69 64 32 6c 6e 28 70 6b 65 79 5f 69 64  J_nid2ln(pkey_id
5520: 29 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44  ), -1);..LAPPEND
5530: 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 72 65 73  _STR(interp, res
5540: 75 6c 74 4f 62 6a 2c 20 22 74 79 70 65 22 2c 20  ultObj, "type", 
5550: 70 6b 65 79 5f 66 6c 61 67 73 20 26 20 41 53 4e  pkey_flags & ASN
5560: 31 5f 50 4b 45 59 5f 44 59 4e 41 4d 49 43 20 3f  1_PKEY_DYNAMIC ?
5570: 20 22 45 78 74 65 72 6e 61 6c 22 20 3a 20 22 42   "External" : "B
5580: 75 69 6c 74 2d 69 6e 22 2c 20 2d 31 29 3b 2a 2f  uilt-in", -1);*/
5590: 0a 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  ...Tcl_ListObjAp
55a0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
55b0: 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54  rp, resultObj, T
55c0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
55d0: 4f 42 4a 5f 6e 69 64 32 6c 6e 28 70 6b 65 79 5f  OBJ_nid2ln(pkey_
55e0: 69 64 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d  id), -1));.    }
55f0: 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  .    Tcl_SetObjR
5600: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 72 65  esult(interp, re
5610: 73 75 6c 74 4f 62 6a 29 3b 0a 20 20 20 20 72 65  sultObj);.    re
5620: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
5630: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
5640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5670: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 50  --------. *. * P
5680: 6b 65 79 73 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a  keysObjCmd --. *
5690: 0a 20 2a 09 52 65 74 75 72 6e 20 61 20 6c 69 73  . *.Return a lis
56a0: 74 20 6f 66 20 61 6c 6c 20 76 61 6c 69 64 20 68  t of all valid h
56b0: 61 73 68 20 61 6c 67 6f 72 69 74 68 6d 73 20 6f  ash algorithms o
56c0: 72 20 6d 65 73 73 61 67 65 20 64 69 67 65 73 74  r message digest
56d0: 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  s.. *. * Results
56e0: 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20  :. *.A standard 
56f0: 54 63 6c 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20  Tcl list.. *. * 
5700: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
5710: 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d  .None.. *. *----
5720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
5760: 20 2a 2f 0a 69 6e 74 20 50 6b 65 79 73 4f 62 6a   */.int PkeysObj
5770: 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63  Cmd(ClientData c
5780: 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49  lientData, Tcl_I
5790: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69  nterp *interp, i
57a0: 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a  nt objc, Tcl_Obj
57b0: 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20   *const objv[]) 
57c0: 7b 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69  {.    (void) cli
57d0: 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 64 70  entData;..    dp
57e0: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
57f0: 0a 0a 20 20 20 20 2f 2a 20 43 6c 65 61 72 20 65  ..    /* Clear e
5800: 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20 54 63 6c  rrors */.    Tcl
5810: 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74  _ResetResult(int
5820: 65 72 70 29 3b 0a 20 20 20 20 45 52 52 5f 63 6c  erp);.    ERR_cl
5830: 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20  ear_error();..  
5840: 20 20 2f 2a 20 56 61 6c 69 64 61 74 65 20 61 72    /* Validate ar
5850: 67 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 69  g count */.    i
5860: 66 20 28 6f 62 6a 63 20 3d 3d 20 31 29 20 7b 0a  f (objc == 1) {.
5870: 09 72 65 74 75 72 6e 20 50 6b 65 79 4c 69 73 74  .return PkeyList
5880: 28 69 6e 74 65 72 70 29 3b 0a 0a 20 20 20 20 7d  (interp);..    }
5890: 20 65 6c 73 65 20 69 66 20 28 6f 62 6a 63 20 3d   else if (objc =
58a0: 3d 20 32 29 20 7b 0a 09 72 65 74 75 72 6e 20 50  = 2) {..return P
58b0: 6b 65 79 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20  keyInfo(interp, 
58c0: 6f 62 6a 76 5b 31 5d 29 3b 0a 0a 20 20 20 20 7d  objv[1]);..    }
58d0: 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 57 72 6f   else {..Tcl_Wro
58e0: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
58f0: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3f 6e 61 6d  , 1, objv, "?nam
5900: 65 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43  e?");..return TC
5910: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
5920: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b     return TCL_OK
5930: 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.}../**********
5940: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5950: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5960: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5970: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20  *********/../*. 
5980: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
5990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
59a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
59b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
59c0: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 50 72 6f 74 6f  ----. *. * Proto
59d0: 63 6f 6c 73 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a  colsObjCmd --. *
59e0: 0a 20 2a 09 52 65 74 75 72 6e 20 61 20 6c 69 73  . *.Return a lis
59f0: 74 20 6f 66 20 74 68 65 20 61 76 61 69 6c 61 62  t of the availab
5a00: 6c 65 20 6f 72 20 73 75 70 70 6f 72 74 65 64 20  le or supported 
5a10: 53 53 4c 2f 54 4c 53 20 70 72 6f 74 6f 63 6f 6c  SSL/TLS protocol
5a20: 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  s.. *. * Results
5a30: 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20  :. *.A standard 
5a40: 54 63 6c 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20  Tcl list.. *. * 
5a50: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
5a60: 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  .none. *. *-----
5a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
5ab0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 50 72  */.static int.Pr
5ac0: 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 28 43 6c  otocolsObjCmd(Cl
5ad0: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
5ae0: 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20  ata, Tcl_Interp 
5af0: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a  *interp, int obj
5b00: 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73  c, Tcl_Obj *cons
5b10: 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20  t objv[]) {.    
5b20: 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 4f  Tcl_Obj *resultO
5b30: 62 6a 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 63  bj;.    (void) c
5b40: 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20  lientData;..    
5b50: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
5b60: 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6c 65 61 72  );..    /* Clear
5b70: 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20 54   errors */.    T
5b80: 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69  cl_ResetResult(i
5b90: 6e 74 65 72 70 29 3b 0a 20 20 20 20 45 52 52 5f  nterp);.    ERR_
5ba0: 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a  clear_error();..
5bb0: 20 20 20 20 2f 2a 20 56 61 6c 69 64 61 74 65 20      /* Validate 
5bc0: 61 72 67 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 20  arg count */.   
5bd0: 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 31 29 20   if (objc != 1) 
5be0: 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41  {..Tcl_WrongNumA
5bf0: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
5c00: 62 6a 76 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74  bjv, NULL);..ret
5c10: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
5c20: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 69 73     }..    /* Lis
5c30: 74 20 61 6c 6c 20 70 72 6f 74 6f 63 6f 6c 73 20  t all protocols 
5c40: 2a 2f 0a 20 20 20 20 72 65 73 75 6c 74 4f 62 6a  */.    resultObj
5c50: 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62   = Tcl_NewListOb
5c60: 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  j(0, NULL);.    
5c70: 69 66 20 28 72 65 73 75 6c 74 4f 62 6a 20 3d 3d  if (resultObj ==
5c80: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e   NULL) {..return
5c90: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
5ca0: 7d 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45  }.#if OPENSSL_VE
5cb0: 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30  RSION_NUMBER < 0
5cc0: 78 31 30 31 30 30 30 30 30 4c 20 26 26 20 21 64  x10100000L && !d
5cd0: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20  efined(NO_SSL2) 
5ce0: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
5cf0: 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20  SSL_NO_SSL2).   
5d00: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
5d10: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
5d20: 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c  , resultObj, Tcl
5d30: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72  _NewStringObj(pr
5d40: 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 53 53 4c 32  otocols[TLS_SSL2
5d50: 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a  ], -1));.#endif.
5d60: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f  #if !defined(NO_
5d70: 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65  SSL3) && !define
5d80: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c  d(OPENSSL_NO_SSL
5d90: 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  3) && !defined(O
5da0: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d  PENSSL_NO_SSL3_M
5db0: 45 54 48 4f 44 29 0a 20 20 20 20 54 63 6c 5f 4c  ETHOD).    Tcl_L
5dc0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
5dd0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 65 73 75  ent(interp, resu
5de0: 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 53 74  ltObj, Tcl_NewSt
5df0: 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c  ringObj(protocol
5e00: 73 5b 54 4c 53 5f 53 53 4c 33 5d 2c 20 2d 31 29  s[TLS_SSL3], -1)
5e10: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64  );.#endif.#if !d
5e20: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20  efined(NO_TLS1) 
5e30: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
5e40: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 26 26 20  SSL_NO_TLS1) && 
5e50: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
5e60: 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 29  _NO_TLS1_METHOD)
5e70: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
5e80: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
5e90: 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c  terp, resultObj,
5ea0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
5eb0: 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f  j(protocols[TLS_
5ec0: 54 4c 53 31 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e  TLS1], -1));.#en
5ed0: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64  dif.#if !defined
5ee0: 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21  (NO_TLS1_1) && !
5ef0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
5f00: 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64  NO_TLS1_1) && !d
5f10: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
5f20: 4f 5f 54 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29  O_TLS1_1_METHOD)
5f30: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
5f40: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
5f50: 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c  terp, resultObj,
5f60: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
5f70: 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f  j(protocols[TLS_
5f80: 54 4c 53 31 5f 31 5d 2c 20 2d 31 29 29 3b 0a 23  TLS1_1], -1));.#
5f90: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e  endif.#if !defin
5fa0: 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26  ed(NO_TLS1_2) &&
5fb0: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
5fc0: 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20  L_NO_TLS1_2) && 
5fd0: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
5fe0: 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 48 4f  _NO_TLS1_2_METHO
5ff0: 44 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  D).    Tcl_ListO
6000: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
6010: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62  interp, resultOb
6020: 6a 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  j, Tcl_NewString
6030: 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c  Obj(protocols[TL
6040: 53 5f 54 4c 53 31 5f 32 5d 2c 20 2d 31 29 29 3b  S_TLS1_2], -1));
6050: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66  .#endif.#if !def
6060: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20  ined(NO_TLS1_3) 
6070: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
6080: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20  SSL_NO_TLS1_3). 
6090: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
60a0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
60b0: 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54  rp, resultObj, T
60c0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
60d0: 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c  protocols[TLS_TL
60e0: 53 31 5f 33 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e  S1_3], -1));.#en
60f0: 64 69 66 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f  dif.    Tcl_SetO
6100: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
6110: 20 72 65 73 75 6c 74 4f 62 6a 29 3b 0a 20 20 20   resultObj);.   
6120: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
6130: 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }../************
6140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6170: 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d  *******/../*. *-
6180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
61a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
61b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
61c0: 2d 2d 0a 20 2a 0a 20 2a 20 50 72 6f 76 69 64 65  --. *. * Provide
61d0: 72 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a  rObjCmd --. *. *
61e0: 09 4c 6f 61 64 20 61 20 70 72 6f 76 69 64 65 72  .Load a provider
61f0: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
6200: 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54  . *.A standard T
6210: 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a  cl result.. *. *
6220: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
6230: 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d  *.None.. *. *---
6240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6280: 0a 20 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 53 4c  . */.#if OPENSSL
6290: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20  _VERSION_NUMBER 
62a0: 3e 3d 20 30 78 33 30 30 30 30 30 30 30 4c 0a 73  >= 0x30000000L.s
62b0: 74 61 74 69 63 20 69 6e 74 0a 50 72 6f 76 69 64  tatic int.Provid
62c0: 65 72 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44  erObjCmd(ClientD
62d0: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
62e0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
62f0: 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63  rp, int objc, Tc
6300: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a  l_Obj *const obj
6310: 76 5b 5d 29 20 7b 0a 20 20 20 20 63 68 61 72 20  v[]) {.    char 
6320: 2a 6e 61 6d 65 3b 0a 20 20 20 20 28 76 6f 69 64  *name;.    (void
6330: 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20  ) clientData;.. 
6340: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
6350: 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 61  ed");..    /* Va
6360: 6c 69 64 61 74 65 20 61 72 67 20 63 6f 75 6e 74  lidate arg count
6370: 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f 62 6a 63   */.    if (objc
6380: 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72   != 2) {..Tcl_Wr
6390: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
63a0: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 6e 61 6d  p, 1, objv, "nam
63b0: 65 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  e");..return TCL
63c0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
63d0: 20 20 20 6e 61 6d 65 20 3d 20 54 63 6c 5f 47 65     name = Tcl_Ge
63e0: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
63f0: 62 6a 76 5b 31 5d 2c 20 4e 55 4c 4c 29 3b 0a 20  bjv[1], NULL);. 
6400: 20 20 20 69 66 20 28 21 4f 53 53 4c 5f 50 52 4f     if (!OSSL_PRO
6410: 56 49 44 45 52 5f 74 72 79 5f 6c 6f 61 64 28 4e  VIDER_try_load(N
6420: 55 4c 4c 2c 20 28 63 6f 6e 73 74 20 63 68 61 72  ULL, (const char
6430: 20 2a 29 20 6e 61 6d 65 2c 20 31 29 29 20 7b 0a   *) name, 1)) {.
6440: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
6450: 74 28 69 6e 74 65 72 70 2c 20 47 45 54 5f 45 52  t(interp, GET_ER
6460: 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61  R_REASON(), (cha
6470: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74  r *) NULL);..ret
6480: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
6490: 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e     }..    return
64a0: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69   TCL_OK;.}.#endi
64b0: 66 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  f../************
64c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
64d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
64e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
64f0: 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d  *******/../*. *-
6500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6540: 2d 2d 0a 20 2a 0a 20 2a 20 56 65 72 73 69 6f 6e  --. *. * Version
6550: 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09  ObjCmd --. *. *.
6560: 52 65 74 75 72 6e 20 61 20 73 74 72 69 6e 67 20  Return a string 
6570: 77 69 74 68 20 74 68 65 20 4f 70 65 6e 53 53 4c  with the OpenSSL
6580: 20 76 65 72 73 69 6f 6e 20 69 6e 66 6f 2e 0a 20   version info.. 
6590: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
65a0: 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20  .A standard Tcl 
65b0: 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69  result.. *. * Si
65c0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e  de effects:. *.N
65d0: 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  one.. *. *------
65e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
65f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
6620: 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 56 65 72  /.static int.Ver
6630: 73 69 6f 6e 4f 62 6a 43 6d 64 28 43 6c 69 65 6e  sionObjCmd(Clien
6640: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
6650: 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  , Tcl_Interp *in
6660: 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20  terp, int objc, 
6670: 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f  Tcl_Obj *const o
6680: 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c  bjv[]) {.    Tcl
6690: 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 4f 62 6a 3b  _Obj *resultObj;
66a0: 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65  .    (void) clie
66b0: 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 72  ntData;..    dpr
66c0: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
66d0: 0a 20 20 20 20 2f 2a 20 56 61 6c 69 64 61 74 65  .    /* Validate
66e0: 20 61 72 67 20 63 6f 75 6e 74 20 2a 2f 0a 20 20   arg count */.  
66f0: 20 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 31 29    if (objc != 1)
6700: 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d   {..Tcl_WrongNum
6710: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
6720: 6f 62 6a 76 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65  objv, NULL);..re
6730: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
6740: 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 73 75 6c      }..    resul
6750: 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 53 74  tObj = Tcl_NewSt
6760: 72 69 6e 67 4f 62 6a 28 4f 50 45 4e 53 53 4c 5f  ringObj(OPENSSL_
6770: 56 45 52 53 49 4f 4e 5f 54 45 58 54 2c 20 2d 31  VERSION_TEXT, -1
6780: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62  );.    Tcl_SetOb
6790: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
67a0: 72 65 73 75 6c 74 4f 62 6a 29 3b 0a 20 20 20 20  resultObj);.    
67b0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
67c0: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
67d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
67e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
67f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6800: 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d  ******/../*. *--
6810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6850: 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 49 6e 66 6f  -. *. * Tls_Info
6860: 43 6f 6d 6d 61 6e 64 73 20 2d 2d 0a 20 2a 0a 20  Commands --. *. 
6870: 2a 09 43 72 65 61 74 65 20 69 6e 66 6f 20 63 6f  *.Create info co
6880: 6d 6d 61 6e 64 73 0a 20 2a 0a 20 2a 20 52 65 74  mmands. *. * Ret
6890: 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20  urns:. *.TCL_OK 
68a0: 6f 72 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a  or TCL_ERROR. *.
68b0: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
68c0: 0a 20 2a 09 43 72 65 61 74 65 73 20 63 6f 6d 6d  . *.Creates comm
68d0: 61 6e 64 73 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  ands. *. *------
68e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
68f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
6920: 2f 0a 69 6e 74 20 54 6c 73 5f 49 6e 66 6f 43 6f  /.int Tls_InfoCo
6930: 6d 6d 61 6e 64 73 28 54 63 6c 5f 49 6e 74 65 72  mmands(Tcl_Inter
6940: 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a 0a 23 69  p *interp) {..#i
6950: 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f  f OPENSSL_VERSIO
6960: 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31  N_NUMBER < 0x101
6970: 30 30 30 30 30 4c 0a 20 20 20 20 4f 70 65 6e 53  00000L.    OpenS
6980: 53 4c 5f 61 64 64 5f 61 6c 6c 5f 63 69 70 68 65  SL_add_all_ciphe
6990: 72 73 28 29 3b 0a 20 20 20 20 4f 70 65 6e 53 53  rs();.    OpenSS
69a0: 4c 5f 61 64 64 5f 61 6c 6c 5f 64 69 67 65 73 74  L_add_all_digest
69b0: 73 28 29 3b 0a 20 20 20 20 4f 70 65 6e 53 53 4c  s();.    OpenSSL
69c0: 5f 61 64 64 5f 61 6c 6c 5f 61 6c 67 6f 72 69 74  _add_all_algorit
69d0: 68 6d 73 28 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  hms();.#endif.. 
69e0: 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a     Tcl_CreateObj
69f0: 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
6a00: 22 74 6c 73 3a 3a 63 69 70 68 65 72 22 2c 20 43  "tls::cipher", C
6a10: 69 70 68 65 72 4f 62 6a 43 6d 64 2c 20 28 43 6c  ipherObjCmd, (Cl
6a20: 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20  ientData) NULL, 
6a30: 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72  (Tcl_CmdDeletePr
6a40: 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20  oc *) NULL);.   
6a50: 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
6a60: 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74  mmand(interp, "t
6a70: 6c 73 3a 3a 63 69 70 68 65 72 73 22 2c 20 43 69  ls::ciphers", Ci
6a80: 70 68 65 72 73 4f 62 6a 43 6d 64 2c 20 28 43 6c  phersObjCmd, (Cl
6a90: 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20  ientData) NULL, 
6aa0: 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72  (Tcl_CmdDeletePr
6ab0: 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20  oc *) NULL);.   
6ac0: 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
6ad0: 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74  mmand(interp, "t
6ae0: 6c 73 3a 3a 64 69 67 65 73 74 73 22 2c 20 44 69  ls::digests", Di
6af0: 67 65 73 74 73 4f 62 6a 43 6d 64 2c 20 28 43 6c  gestsObjCmd, (Cl
6b00: 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20  ientData) NULL, 
6b10: 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72  (Tcl_CmdDeletePr
6b20: 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20  oc *) NULL);.   
6b30: 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
6b40: 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74  mmand(interp, "t
6b50: 6c 73 3a 3a 6b 64 66 73 22 2c 20 4b 64 66 73 4f  ls::kdfs", KdfsO
6b60: 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61  bjCmd, (ClientDa
6b70: 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43  ta) NULL, (Tcl_C
6b80: 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20  mdDeleteProc *) 
6b90: 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43  NULL);.    Tcl_C
6ba0: 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28  reateObjCommand(
6bb0: 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 6d 61  interp, "tls::ma
6bc0: 63 73 22 2c 20 4d 61 63 73 4f 62 6a 43 6d 64 2c  cs", MacsObjCmd,
6bd0: 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55   (ClientData) NU
6be0: 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65  LL, (Tcl_CmdDele
6bf0: 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b  teProc *) NULL);
6c00: 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f  .    Tcl_CreateO
6c10: 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  bjCommand(interp
6c20: 2c 20 22 74 6c 73 3a 3a 70 6b 65 79 73 22 2c 20  , "tls::pkeys", 
6c30: 50 6b 65 79 73 4f 62 6a 43 6d 64 2c 20 28 43 6c  PkeysObjCmd, (Cl
6c40: 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20  ientData) NULL, 
6c50: 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72  (Tcl_CmdDeletePr
6c60: 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20  oc *) NULL);.   
6c70: 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
6c80: 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74  mmand(interp, "t
6c90: 6c 73 3a 3a 70 72 6f 74 6f 63 6f 6c 73 22 2c 20  ls::protocols", 
6ca0: 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 2c  ProtocolsObjCmd,
6cb0: 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55   (ClientData) NU
6cc0: 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65  LL, (Tcl_CmdDele
6cd0: 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b  teProc *) NULL);
6ce0: 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52  .#if OPENSSL_VER
6cf0: 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 30  SION_NUMBER >= 0
6d00: 78 33 30 30 30 30 30 30 30 4c 0a 20 20 20 20 54  x30000000L.    T
6d10: 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
6d20: 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73  and(interp, "tls
6d30: 3a 3a 70 72 6f 76 69 64 65 72 22 2c 20 50 72 6f  ::provider", Pro
6d40: 76 69 64 65 72 4f 62 6a 43 6d 64 2c 20 28 43 6c  viderObjCmd, (Cl
6d50: 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20  ientData) NULL, 
6d60: 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72  (Tcl_CmdDeletePr
6d70: 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 23 65 6e  oc *) NULL);.#en
6d80: 64 69 66 0a 20 20 20 20 54 63 6c 5f 43 72 65 61  dif.    Tcl_Crea
6d90: 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74  teObjCommand(int
6da0: 65 72 70 2c 20 22 74 6c 73 3a 3a 76 65 72 73 69  erp, "tls::versi
6db0: 6f 6e 22 2c 20 56 65 72 73 69 6f 6e 4f 62 6a 43  on", VersionObjC
6dc0: 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29  md, (ClientData)
6dd0: 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44   NULL, (Tcl_CmdD
6de0: 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c  eleteProc *) NUL
6df0: 4c 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  L);.    return T
6e00: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a                    CL_OK;.}..