Hex Artifact Content

Artifact 89b87048d2f108adc91076d1cdce13081b1af0ddb02a5aa780713ca7448327fa:


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 0a 2f 2a 0a 20 2a  estack.h>../*. *
0110: 20 56 61 6c 69 64 20 53 53 4c 20 61 6e 64 20 54   Valid SSL and T
0120: 4c 53 20 50 72 6f 74 6f 63 6f 6c 20 56 65 72 73  LS Protocol Vers
0130: 69 6f 6e 73 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ions. */.static 
0140: 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 72 6f 74  const char *prot
0150: 6f 63 6f 6c 73 5b 5d 20 3d 20 7b 0a 09 22 73 73  ocols[] = {.."ss
0160: 6c 32 22 2c 20 22 73 73 6c 33 22 2c 20 22 74 6c  l2", "ssl3", "tl
0170: 73 31 22 2c 20 22 74 6c 73 31 2e 31 22 2c 20 22  s1", "tls1.1", "
0180: 74 6c 73 31 2e 32 22 2c 20 22 74 6c 73 31 2e 33  tls1.2", "tls1.3
0190: 22 2c 20 4e 55 4c 4c 0a 7d 3b 0a 65 6e 75 6d 20  ", NULL.};.enum 
01a0: 70 72 6f 74 6f 63 6f 6c 20 7b 0a 20 20 20 20 54  protocol {.    T
01b0: 4c 53 5f 53 53 4c 32 2c 20 54 4c 53 5f 53 53 4c  LS_SSL2, TLS_SSL
01c0: 33 2c 20 54 4c 53 5f 54 4c 53 31 2c 20 54 4c 53  3, TLS_TLS1, TLS
01d0: 5f 54 4c 53 31 5f 31 2c 20 54 4c 53 5f 54 4c 53  _TLS1_1, TLS_TLS
01e0: 31 5f 32 2c 20 54 4c 53 5f 54 4c 53 31 5f 33 2c  1_2, TLS_TLS1_3,
01f0: 20 54 4c 53 5f 4e 4f 4e 45 0a 7d 3b 0a 0a 2f 2a   TLS_NONE.};../*
0200: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0210: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0220: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0230: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0240: 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  **/../*. *------
0250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
0290: 0a 20 2a 20 4e 61 6d 65 73 43 61 6c 6c 62 61 63  . * NamesCallbac
02a0: 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 62  k --. *. *.Callb
02b0: 61 63 6b 20 74 6f 20 61 64 64 20 61 6c 67 6f 72  ack to add algor
02c0: 69 74 68 6d 20 6f 72 20 6d 65 74 68 6f 64 20 6e  ithm or method n
02d0: 61 6d 65 73 20 74 6f 20 61 20 54 43 4c 20 6c 69  ames to a TCL li
02e0: 73 74 20 6f 62 6a 65 63 74 2e 0a 20 2a 0a 20 2a  st object.. *. *
02f0: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 70 70   Results:. *.App
0300: 65 6e 64 20 6e 61 6d 65 20 74 6f 20 54 43 4c 20  end name to TCL 
0310: 6c 69 73 74 20 6f 62 6a 65 63 74 2e 0a 20 2a 0a  list object.. *.
0320: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
0330: 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d  . *.None.. *. *-
0340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0380: 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 20 4e 61 6d 65  --. */.void Name
0390: 73 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20  sCallback(const 
03a0: 4f 42 4a 5f 4e 41 4d 45 20 2a 6f 62 6a 2c 20 76  OBJ_NAME *obj, v
03b0: 6f 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 20  oid *arg) {.    
03c0: 54 63 6c 5f 4f 62 6a 20 2a 6c 69 73 74 4f 62 6a  Tcl_Obj *listObj
03d0: 20 3d 20 28 54 63 6c 5f 4f 62 6a 20 2a 29 20 61   = (Tcl_Obj *) a
03e0: 72 67 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 65 6c  rg;..    /* Fiel
03f0: 64 73 3a 20 28 69 6e 74 29 20 74 79 70 65 20 61  ds: (int) type a
0400: 6e 64 20 61 6c 69 61 73 2c 20 28 63 6f 6e 73 74  nd alias, (const
0410: 20 63 68 61 72 2a 29 20 6e 61 6d 65 20 28 61 6c   char*) name (al
0420: 69 61 73 20 66 72 6f 6d 29 20 61 6e 64 20 64 61  ias from) and da
0430: 74 61 20 28 61 6c 69 61 73 20 74 6f 29 20 2a 2f  ta (alias to) */
0440: 0a 20 20 20 20 69 66 20 28 73 74 72 73 74 72 28  .    if (strstr(
0450: 6f 62 6a 2d 3e 6e 61 6d 65 2c 20 22 72 73 61 22  obj->name, "rsa"
0460: 29 20 3d 3d 20 4e 55 4c 4c 20 26 26 20 73 74 72  ) == NULL && str
0470: 73 74 72 28 6f 62 6a 2d 3e 6e 61 6d 65 2c 20 22  str(obj->name, "
0480: 52 53 41 22 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b  RSA") == NULL) {
0490: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
04a0: 65 6e 64 45 6c 65 6d 65 6e 74 28 4e 55 4c 4c 2c  endElement(NULL,
04b0: 20 6c 69 73 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65   listObj, Tcl_Ne
04c0: 77 53 74 72 69 6e 67 4f 62 6a 28 6f 62 6a 2d 3e  wStringObj(obj->
04d0: 6e 61 6d 65 2c 20 2d 31 29 29 3b 0a 20 20 20 20  name, -1));.    
04e0: 7d 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }.}../**********
04f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0500: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0510: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0520: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20  *********/../*. 
0530: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
0540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0570: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 69 70 68 65  ----. *. * Ciphe
0580: 72 49 6e 66 6f 20 2d 2d 0a 20 2a 0a 20 2a 09 52  rInfo --. *. *.R
0590: 65 74 75 72 6e 20 61 20 6c 69 73 74 20 6f 66 20  eturn a list of 
05a0: 70 72 6f 70 65 72 74 69 65 73 20 61 6e 64 20 76  properties and v
05b0: 61 6c 75 65 73 20 66 6f 72 20 63 69 70 68 65 72  alues for cipher
05c0: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
05d0: 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54  . *.A standard T
05e0: 63 6c 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 53  cl list.. *. * S
05f0: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
0600: 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  None.. *. *-----
0610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
0650: 2a 2f 0a 69 6e 74 20 43 69 70 68 65 72 49 6e 66  */.int CipherInf
0660: 6f 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  o(Tcl_Interp *in
0670: 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 20 2a 6e  terp, Tcl_Obj *n
0680: 61 6d 65 4f 62 6a 29 20 7b 0a 20 20 20 20 63 6f  ameObj) {.    co
0690: 6e 73 74 20 45 56 50 5f 43 49 50 48 45 52 20 2a  nst EVP_CIPHER *
06a0: 63 69 70 68 65 72 3b 0a 20 20 20 20 54 63 6c 5f  cipher;.    Tcl_
06b0: 4f 62 6a 20 2a 72 65 73 75 6c 74 4f 62 6a 2c 20  Obj *resultObj, 
06c0: 2a 6c 69 73 74 4f 62 6a 3b 0a 20 20 20 20 75 6e  *listObj;.    un
06d0: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 66 6c 61 67  signed long flag
06e0: 73 2c 20 6d 6f 64 65 3b 0a 20 20 20 20 75 6e 73  s, mode;.    uns
06f0: 69 67 6e 65 64 20 63 68 61 72 20 2a 6d 6f 64 65  igned char *mode
0700: 4e 61 6d 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  Name = NULL;.   
0710: 20 63 68 61 72 20 2a 6e 61 6d 65 20 3d 20 54 63   char *name = Tc
0720: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
0730: 62 6a 28 6e 61 6d 65 4f 62 6a 2c 20 28 54 63 6c  bj(nameObj, (Tcl
0740: 5f 53 69 7a 65 20 2a 29 20 4e 55 4c 4c 29 3b 0a  _Size *) NULL);.
0750: 0a 20 20 20 20 2f 2a 20 47 65 74 20 63 69 70 68  .    /* Get ciph
0760: 65 72 20 2a 2f 0a 20 20 20 20 63 69 70 68 65 72  er */.    cipher
0770: 20 3d 20 45 56 50 5f 67 65 74 5f 63 69 70 68 65   = EVP_get_ciphe
0780: 72 62 79 6e 61 6d 65 28 6e 61 6d 65 29 3b 0a 0a  rbyname(name);..
0790: 20 20 20 20 69 66 20 28 63 69 70 68 65 72 20 3d      if (cipher =
07a0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41  = NULL) {..Tcl_A
07b0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
07c0: 72 70 2c 20 22 49 6e 76 61 6c 69 64 20 63 69 70  rp, "Invalid cip
07d0: 68 65 72 20 5c 22 22 2c 20 6e 61 6d 65 2c 20 22  her \"", name, "
07e0: 5c 22 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  \"", (char *) NU
07f0: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  LL);..return TCL
0800: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
0810: 20 20 20 2f 2a 20 47 65 74 20 70 72 6f 70 65 72     /* Get proper
0820: 74 69 65 73 20 2a 2f 0a 20 20 20 20 72 65 73 75  ties */.    resu
0830: 6c 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 4c  ltObj = Tcl_NewL
0840: 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b  istObj(0, NULL);
0850: 0a 20 20 20 20 69 66 20 28 72 65 73 75 6c 74 4f  .    if (resultO
0860: 62 6a 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72  bj == NULL) {..r
0870: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
0880: 0a 20 20 20 20 7d 0a 20 20 20 20 4c 41 50 50 45  .    }.    LAPPE
0890: 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 72  ND_STR(interp, r
08a0: 65 73 75 6c 74 4f 62 6a 2c 20 22 6e 69 64 22 2c  esultObj, "nid",
08b0: 20 4f 42 4a 5f 6e 69 64 32 6c 6e 28 45 56 50 5f   OBJ_nid2ln(EVP_
08c0: 43 49 50 48 45 52 5f 6e 69 64 28 63 69 70 68 65  CIPHER_nid(ciphe
08d0: 72 29 29 2c 20 2d 31 29 3b 0a 20 20 20 20 4c 41  r)), -1);.    LA
08e0: 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
08f0: 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 6e 61  , resultObj, "na
0900: 6d 65 22 2c 20 45 56 50 5f 43 49 50 48 45 52 5f  me", EVP_CIPHER_
0910: 6e 61 6d 65 28 63 69 70 68 65 72 29 2c 20 2d 31  name(cipher), -1
0920: 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53  );.    LAPPEND_S
0930: 54 52 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c  TR(interp, resul
0940: 74 4f 62 6a 2c 20 22 64 65 73 63 72 69 70 74 69  tObj, "descripti
0950: 6f 6e 22 2c 20 22 22 2c 20 2d 31 29 3b 0a 20 20  on", "", -1);.  
0960: 20 20 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e    LAPPEND_INT(in
0970: 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c  terp, resultObj,
0980: 20 22 62 6c 6f 63 6b 5f 73 69 7a 65 22 2c 20 45   "block_size", E
0990: 56 50 5f 43 49 50 48 45 52 5f 62 6c 6f 63 6b 5f  VP_CIPHER_block_
09a0: 73 69 7a 65 28 63 69 70 68 65 72 29 29 3b 0a 20  size(cipher));. 
09b0: 20 20 20 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69     LAPPEND_INT(i
09c0: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a  nterp, resultObj
09d0: 2c 20 22 6b 65 79 5f 6c 65 6e 67 74 68 22 2c 20  , "key_length", 
09e0: 45 56 50 5f 43 49 50 48 45 52 5f 6b 65 79 5f 6c  EVP_CIPHER_key_l
09f0: 65 6e 67 74 68 28 63 69 70 68 65 72 29 29 3b 0a  ength(cipher));.
0a00: 20 20 20 20 4c 41 50 50 45 4e 44 5f 49 4e 54 28      LAPPEND_INT(
0a10: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62  interp, resultOb
0a20: 6a 2c 20 22 69 76 5f 6c 65 6e 67 74 68 22 2c 20  j, "iv_length", 
0a30: 45 56 50 5f 43 49 50 48 45 52 5f 69 76 5f 6c 65  EVP_CIPHER_iv_le
0a40: 6e 67 74 68 28 63 69 70 68 65 72 29 29 3b 0a 20  ngth(cipher));. 
0a50: 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69     LAPPEND_STR(i
0a60: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a  nterp, resultObj
0a70: 2c 20 22 74 79 70 65 22 2c 20 4f 42 4a 5f 6e 69  , "type", OBJ_ni
0a80: 64 32 6c 6e 28 45 56 50 5f 43 49 50 48 45 52 5f  d2ln(EVP_CIPHER_
0a90: 74 79 70 65 28 63 69 70 68 65 72 29 29 2c 20 2d  type(cipher)), -
0aa0: 31 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f  1);.    LAPPEND_
0ab0: 53 54 52 28 69 6e 74 65 72 70 2c 20 72 65 73 75  STR(interp, resu
0ac0: 6c 74 4f 62 6a 2c 20 22 70 72 6f 76 69 64 65 72  ltObj, "provider
0ad0: 22 2c 20 22 22 2c 20 2d 31 29 3b 0a 20 20 20 20  ", "", -1);.    
0ae0: 66 6c 61 67 73 20 3d 20 45 56 50 5f 43 49 50 48  flags = EVP_CIPH
0af0: 45 52 5f 66 6c 61 67 73 28 63 69 70 68 65 72 29  ER_flags(cipher)
0b00: 3b 0a 20 20 20 20 6d 6f 64 65 20 20 3d 20 45 56  ;.    mode  = EV
0b10: 50 5f 43 49 50 48 45 52 5f 6d 6f 64 65 28 63 69  P_CIPHER_mode(ci
0b20: 70 68 65 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 45  pher);..    /* E
0b30: 56 50 5f 43 49 50 48 45 52 5f 67 65 74 5f 6d 6f  VP_CIPHER_get_mo
0b40: 64 65 20 2a 2f 0a 20 20 20 20 73 77 69 74 63 68  de */.    switch
0b50: 28 6d 6f 64 65 29 20 7b 0a 09 63 61 73 65 20 45  (mode) {..case E
0b60: 56 50 5f 43 49 50 48 5f 53 54 52 45 41 4d 5f 43  VP_CIPH_STREAM_C
0b70: 49 50 48 45 52 3a 0a 09 20 20 20 20 6d 6f 64 65  IPHER:..    mode
0b80: 4e 61 6d 65 20 3d 20 22 53 54 52 45 41 4d 22 3b  Name = "STREAM";
0b90: 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61  ..    break;..ca
0ba0: 73 65 20 45 56 50 5f 43 49 50 48 5f 45 43 42 5f  se EVP_CIPH_ECB_
0bb0: 4d 4f 44 45 3a 0a 09 20 20 20 20 6d 6f 64 65 4e  MODE:..    modeN
0bc0: 61 6d 65 20 3d 20 22 45 43 42 22 3b 0a 09 20 20  ame = "ECB";..  
0bd0: 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 45    break;..case E
0be0: 56 50 5f 43 49 50 48 5f 43 42 43 5f 4d 4f 44 45  VP_CIPH_CBC_MODE
0bf0: 3a 0a 09 20 20 20 20 6d 6f 64 65 4e 61 6d 65 20  :..    modeName 
0c00: 3d 20 22 43 42 43 22 3b 0a 09 20 20 20 20 62 72  = "CBC";..    br
0c10: 65 61 6b 3b 0a 09 63 61 73 65 20 45 56 50 5f 43  eak;..case EVP_C
0c20: 49 50 48 5f 43 46 42 5f 4d 4f 44 45 3a 0a 09 20  IPH_CFB_MODE:.. 
0c30: 20 20 20 6d 6f 64 65 4e 61 6d 65 20 3d 20 22 43     modeName = "C
0c40: 46 42 22 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b  FB";..    break;
0c50: 0a 09 63 61 73 65 20 45 56 50 5f 43 49 50 48 5f  ..case EVP_CIPH_
0c60: 4f 46 42 5f 4d 4f 44 45 3a 0a 09 20 20 20 20 6d  OFB_MODE:..    m
0c70: 6f 64 65 4e 61 6d 65 20 3d 20 22 4f 46 42 22 3b  odeName = "OFB";
0c80: 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61  ..    break;..ca
0c90: 73 65 20 45 56 50 5f 43 49 50 48 5f 43 54 52 5f  se EVP_CIPH_CTR_
0ca0: 4d 4f 44 45 3a 0a 09 20 20 20 20 6d 6f 64 65 4e  MODE:..    modeN
0cb0: 61 6d 65 20 3d 20 22 43 54 52 22 3b 0a 09 20 20  ame = "CTR";..  
0cc0: 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 45    break;..case E
0cd0: 56 50 5f 43 49 50 48 5f 47 43 4d 5f 4d 4f 44 45  VP_CIPH_GCM_MODE
0ce0: 3a 0a 09 20 20 20 20 6d 6f 64 65 4e 61 6d 65 20  :..    modeName 
0cf0: 3d 20 22 47 43 4d 22 3b 0a 09 20 20 20 20 62 72  = "GCM";..    br
0d00: 65 61 6b 3b 0a 09 63 61 73 65 20 45 56 50 5f 43  eak;..case EVP_C
0d10: 49 50 48 5f 58 54 53 5f 4d 4f 44 45 3a 0a 09 20  IPH_XTS_MODE:.. 
0d20: 20 20 20 6d 6f 64 65 4e 61 6d 65 20 3d 20 22 58     modeName = "X
0d30: 54 53 22 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b  TS";..    break;
0d40: 0a 09 63 61 73 65 20 45 56 50 5f 43 49 50 48 5f  ..case EVP_CIPH_
0d50: 43 43 4d 5f 4d 4f 44 45 3a 0a 09 20 20 20 20 6d  CCM_MODE:..    m
0d60: 6f 64 65 4e 61 6d 65 20 3d 20 22 43 43 4d 22 3b  odeName = "CCM";
0d70: 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61  ..    break;..ca
0d80: 73 65 20 45 56 50 5f 43 49 50 48 5f 4f 43 42 5f  se EVP_CIPH_OCB_
0d90: 4d 4f 44 45 3a 0a 09 20 20 20 20 6d 6f 64 65 4e  MODE:..    modeN
0da0: 61 6d 65 20 3d 20 22 4f 43 42 22 3b 0a 09 20 20  ame = "OCB";..  
0db0: 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 45    break;..case E
0dc0: 56 50 5f 43 49 50 48 5f 57 52 41 50 5f 4d 4f 44  VP_CIPH_WRAP_MOD
0dd0: 45 20 3a 0a 09 20 20 20 20 6d 6f 64 65 4e 61 6d  E :..    modeNam
0de0: 65 20 3d 20 22 57 52 41 50 22 3b 0a 09 20 20 20  e = "WRAP";..   
0df0: 20 62 72 65 61 6b 3b 0a 09 64 65 66 61 75 6c 74   break;..default
0e00: 3a 0a 09 20 20 20 20 6d 6f 64 65 4e 61 6d 65 20  :..    modeName 
0e10: 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 09 20 20  = "unknown";..  
0e20: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
0e30: 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69     LAPPEND_STR(i
0e40: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a  nterp, resultObj
0e50: 2c 20 22 6d 6f 64 65 22 2c 20 6d 6f 64 65 4e 61  , "mode", modeNa
0e60: 6d 65 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a  me, -1);..    /*
0e70: 20 46 6c 61 67 73 20 2a 2f 0a 20 20 20 20 6c 69   Flags */.    li
0e80: 73 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 4c  stObj = Tcl_NewL
0e90: 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b  istObj(0, NULL);
0ea0: 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 42 4f 4f  .    LAPPEND_BOO
0eb0: 4c 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62  L(interp, listOb
0ec0: 6a 2c 20 22 56 61 72 69 61 62 6c 65 20 4c 65 6e  j, "Variable Len
0ed0: 67 74 68 22 2c 20 66 6c 61 67 73 20 26 20 45 56  gth", flags & EV
0ee0: 50 5f 43 49 50 48 5f 56 41 52 49 41 42 4c 45 5f  P_CIPH_VARIABLE_
0ef0: 4c 45 4e 47 54 48 29 3b 0a 20 20 20 20 4c 41 50  LENGTH);.    LAP
0f00: 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70  PEND_BOOL(interp
0f10: 2c 20 6c 69 73 74 4f 62 6a 2c 20 22 41 6c 77 61  , listObj, "Alwa
0f20: 79 73 20 43 61 6c 6c 20 49 6e 69 74 22 2c 20 66  ys Call Init", f
0f30: 6c 61 67 73 20 26 20 45 56 50 5f 43 49 50 48 5f  lags & EVP_CIPH_
0f40: 41 4c 57 41 59 53 5f 43 41 4c 4c 5f 49 4e 49 54  ALWAYS_CALL_INIT
0f50: 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 42  );.    LAPPEND_B
0f60: 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6c 69 73 74  OOL(interp, list
0f70: 4f 62 6a 2c 20 22 43 75 73 74 6f 6d 20 49 56 22  Obj, "Custom IV"
0f80: 2c 20 66 6c 61 67 73 20 26 20 45 56 50 5f 43 49  , flags & EVP_CI
0f90: 50 48 5f 43 55 53 54 4f 4d 5f 49 56 29 3b 0a 20  PH_CUSTOM_IV);. 
0fa0: 20 20 20 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28     LAPPEND_BOOL(
0fb0: 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a 2c  interp, listObj,
0fc0: 20 22 43 6f 6e 74 72 6f 6c 20 49 6e 69 74 22 2c   "Control Init",
0fd0: 20 66 6c 61 67 73 20 26 20 45 56 50 5f 43 49 50   flags & EVP_CIP
0fe0: 48 5f 43 54 52 4c 5f 49 4e 49 54 29 3b 0a 20 20  H_CTRL_INIT);.  
0ff0: 20 20 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69    LAPPEND_BOOL(i
1000: 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a 2c 20  nterp, listObj, 
1010: 22 43 75 73 74 6f 6d 20 43 69 70 68 65 72 22 2c  "Custom Cipher",
1020: 20 66 6c 61 67 73 20 26 20 45 56 50 5f 43 49 50   flags & EVP_CIP
1030: 48 5f 46 4c 41 47 5f 43 55 53 54 4f 4d 5f 43 49  H_FLAG_CUSTOM_CI
1040: 50 48 45 52 29 3b 0a 20 20 20 20 4c 41 50 50 45  PHER);.    LAPPE
1050: 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20  ND_BOOL(interp, 
1060: 6c 69 73 74 4f 62 6a 2c 20 22 41 45 41 44 20 43  listObj, "AEAD C
1070: 69 70 68 65 72 22 2c 20 66 6c 61 67 73 20 26 20  ipher", flags & 
1080: 45 56 50 5f 43 49 50 48 5f 46 4c 41 47 5f 41 45  EVP_CIPH_FLAG_AE
1090: 41 44 5f 43 49 50 48 45 52 29 3b 0a 20 20 20 20  AD_CIPHER);.    
10a0: 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74  LAPPEND_BOOL(int
10b0: 65 72 70 2c 20 6c 69 73 74 4f 62 6a 2c 20 22 43  erp, listObj, "C
10c0: 75 73 74 6f 6d 20 43 6f 70 79 22 2c 20 66 6c 61  ustom Copy", fla
10d0: 67 73 20 26 20 45 56 50 5f 43 49 50 48 5f 43 55  gs & EVP_CIPH_CU
10e0: 53 54 4f 4d 5f 43 4f 50 59 29 3b 0a 20 20 20 20  STOM_COPY);.    
10f0: 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74  LAPPEND_BOOL(int
1100: 65 72 70 2c 20 6c 69 73 74 4f 62 6a 2c 20 22 4e  erp, listObj, "N
1110: 6f 6e 20 46 49 50 53 20 41 6c 6c 6f 77 22 2c 20  on FIPS Allow", 
1120: 66 6c 61 67 73 20 26 20 45 56 50 5f 43 49 50 48  flags & EVP_CIPH
1130: 5f 46 4c 41 47 5f 4e 4f 4e 5f 46 49 50 53 5f 41  _FLAG_NON_FIPS_A
1140: 4c 4c 4f 57 29 3b 0a 20 20 20 20 4c 41 50 50 45  LLOW);.    LAPPE
1150: 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 72  ND_OBJ(interp, r
1160: 65 73 75 6c 74 4f 62 6a 2c 20 22 66 6c 61 67 73  esultObj, "flags
1170: 22 2c 20 6c 69 73 74 4f 62 6a 29 3b 0a 0a 20 20  ", listObj);..  
1180: 20 20 2f 2a 20 43 54 58 20 6f 6e 6c 79 20 70 72    /* CTX only pr
1190: 6f 70 65 72 74 69 65 73 20 2a 2f 0a 20 20 20 20  operties */.    
11a0: 7b 0a 09 45 56 50 5f 43 49 50 48 45 52 5f 43 54  {..EVP_CIPHER_CT
11b0: 58 20 2a 63 74 78 20 3d 20 45 56 50 5f 43 49 50  X *ctx = EVP_CIP
11c0: 48 45 52 5f 43 54 58 5f 6e 65 77 28 29 3b 0a 09  HER_CTX_new();..
11d0: 69 6e 74 20 74 61 67 5f 6c 65 6e 20 3d 20 30 3b  int tag_len = 0;
11e0: 0a 0a 09 45 56 50 5f 45 6e 63 72 79 70 74 49 6e  ...EVP_EncryptIn
11f0: 69 74 5f 65 78 28 63 74 78 2c 20 63 69 70 68 65  it_ex(ctx, ciphe
1200: 72 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e  r, NULL, NULL, N
1210: 55 4c 4c 29 3b 0a 09 69 66 20 28 6d 6f 64 65 20  ULL);..if (mode 
1220: 3d 3d 20 45 56 50 5f 43 49 50 48 5f 47 43 4d 5f  == EVP_CIPH_GCM_
1230: 4d 4f 44 45 20 7c 7c 20 6d 6f 64 65 20 3d 3d 20  MODE || mode == 
1240: 45 56 50 5f 43 49 50 48 5f 4f 43 42 5f 4d 4f 44  EVP_CIPH_OCB_MOD
1250: 45 29 20 7b 0a 09 20 20 20 20 74 61 67 5f 6c 65  E) {..    tag_le
1260: 6e 20 3d 20 45 56 50 5f 47 43 4d 5f 54 4c 53 5f  n = EVP_GCM_TLS_
1270: 54 41 47 5f 4c 45 4e 3b 20 2f 2a 20 45 56 50 5f  TAG_LEN; /* EVP_
1280: 4d 41 58 5f 41 45 41 44 5f 54 41 47 5f 4c 45 4e  MAX_AEAD_TAG_LEN
1290: 47 54 48 20 2a 2f 0a 09 7d 20 65 6c 73 65 20 69  GTH */..} else i
12a0: 66 20 28 6d 6f 64 65 20 3d 3d 20 45 56 50 5f 43  f (mode == EVP_C
12b0: 49 50 48 5f 43 43 4d 5f 4d 4f 44 45 29 20 7b 0a  IPH_CCM_MODE) {.
12c0: 09 20 20 20 20 74 61 67 5f 6c 65 6e 20 3d 20 45  .    tag_len = E
12d0: 56 50 5f 43 43 4d 5f 54 4c 53 5f 54 41 47 5f 4c  VP_CCM_TLS_TAG_L
12e0: 45 4e 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28  EN;..} else if (
12f0: 63 69 70 68 65 72 20 3d 3d 20 45 56 50 5f 67 65  cipher == EVP_ge
1300: 74 5f 63 69 70 68 65 72 62 79 6e 61 6d 65 28 22  t_cipherbyname("
1310: 63 68 61 63 68 61 32 30 2d 70 6f 6c 79 31 33 30  chacha20-poly130
1320: 35 22 29 29 20 7b 0a 09 20 20 20 20 74 61 67 5f  5")) {..    tag_
1330: 6c 65 6e 20 3d 20 45 56 50 5f 43 48 41 43 48 41  len = EVP_CHACHA
1340: 50 4f 4c 59 5f 54 4c 53 5f 54 41 47 5f 4c 45 4e  POLY_TLS_TAG_LEN
1350: 3b 20 2f 2a 20 50 4f 4c 59 31 33 30 35 5f 42 4c  ; /* POLY1305_BL
1360: 4f 43 4b 5f 53 49 5a 45 20 2a 2f 0a 09 7d 0a 09  OCK_SIZE */..}..
1370: 45 56 50 5f 43 49 50 48 45 52 5f 43 54 58 5f 66  EVP_CIPHER_CTX_f
1380: 72 65 65 28 63 74 78 29 3b 0a 09 4c 41 50 50 45  ree(ctx);..LAPPE
1390: 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 72  ND_INT(interp, r
13a0: 65 73 75 6c 74 4f 62 6a 2c 20 22 74 61 67 5f 6c  esultObj, "tag_l
13b0: 65 6e 67 74 68 22 2c 20 74 61 67 5f 6c 65 6e 29  ength", tag_len)
13c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 0a 20 20 20  ;.    }.    .   
13d0: 20 2f 2a 20 41 45 41 44 20 70 72 6f 70 65 72 74   /* AEAD propert
13e0: 69 65 73 20 2a 2f 0a 20 20 20 20 7b 0a 09 69 6e  ies */.    {..in
13f0: 74 20 61 61 64 5f 6c 65 6e 20 3d 20 30 3b 0a 09  t aad_len = 0;..
1400: 69 66 20 28 66 6c 61 67 73 20 26 20 45 56 50 5f  if (flags & EVP_
1410: 43 49 50 48 5f 46 4c 41 47 5f 41 45 41 44 5f 43  CIPH_FLAG_AEAD_C
1420: 49 50 48 45 52 29 20 7b 0a 09 20 20 20 20 61 61  IPHER) {..    aa
1430: 64 5f 6c 65 6e 20 3d 20 45 56 50 5f 41 45 41 44  d_len = EVP_AEAD
1440: 5f 54 4c 53 31 5f 41 41 44 5f 4c 45 4e 3b 0a 09  _TLS1_AAD_LEN;..
1450: 7d 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69  }..LAPPEND_INT(i
1460: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a  nterp, resultObj
1470: 2c 20 22 61 61 64 5f 6c 65 6e 67 74 68 22 2c 20  , "aad_length", 
1480: 61 61 64 5f 6c 65 6e 29 3b 0a 20 20 20 20 7d 0a  aad_len);.    }.
1490: 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  .    Tcl_SetObjR
14a0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 72 65  esult(interp, re
14b0: 73 75 6c 74 4f 62 6a 29 3b 0a 20 20 20 20 72 65  sultObj);.    re
14c0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
14d0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
14e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1510: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43  --------. *. * C
1520: 69 70 68 65 72 4c 69 73 74 20 2d 2d 0a 20 2a 0a  ipherList --. *.
1530: 20 2a 09 52 65 74 75 72 6e 20 61 20 6c 69 73 74   *.Return a list
1540: 20 6f 66 20 61 6c 6c 20 63 69 70 68 65 72 20 61   of all cipher a
1550: 6c 67 6f 72 69 74 68 6d 73 0a 20 2a 0a 20 2a 20  lgorithms. *. * 
1560: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74  Results:. *.A st
1570: 61 6e 64 61 72 64 20 54 63 6c 20 6c 69 73 74 2e  andard Tcl list.
1580: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
1590: 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a  cts:. *.None.. *
15a0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
15b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15e0: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 43  ------. */.int C
15f0: 69 70 68 65 72 4c 69 73 74 28 54 63 6c 5f 49 6e  ipherList(Tcl_In
1600: 74 65 72 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a  terp *interp) {.
1610: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 72 65 73      Tcl_Obj *res
1620: 75 6c 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77  ultObj = Tcl_New
1630: 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29  ListObj(0, NULL)
1640: 3b 0a 20 20 20 20 69 66 20 28 72 65 73 75 6c 74  ;.    if (result
1650: 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  Obj == NULL) {..
1660: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1670: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1680: 53 61 6d 65 20 61 73 20 45 56 50 5f 43 49 50 48  Same as EVP_CIPH
1690: 45 52 5f 64 6f 5f 61 6c 6c 20 2a 2f 0a 20 20 20  ER_do_all */.   
16a0: 20 4f 42 4a 5f 4e 41 4d 45 5f 64 6f 5f 61 6c 6c   OBJ_NAME_do_all
16b0: 28 4f 42 4a 5f 4e 41 4d 45 5f 54 59 50 45 5f 43  (OBJ_NAME_TYPE_C
16c0: 49 50 48 45 52 5f 4d 45 54 48 2c 20 4e 61 6d 65  IPHER_METH, Name
16d0: 73 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64  sCallback, (void
16e0: 20 2a 29 20 72 65 73 75 6c 74 4f 62 6a 29 3b 0a   *) resultObj);.
16f0: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
1700: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 72 65 73  sult(interp, res
1710: 75 6c 74 4f 62 6a 29 3b 0a 20 20 20 20 72 65 74  ultObj);.    ret
1720: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
1730: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
1740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1770: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 69  -------. *. * Ci
1780: 70 68 65 72 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a  pherObjCmd --. *
1790: 0a 20 2a 09 52 65 74 75 72 6e 20 61 20 6c 69 73  . *.Return a lis
17a0: 74 20 6f 66 20 70 72 6f 70 65 72 74 69 65 73 20  t of properties 
17b0: 61 6e 64 20 76 61 6c 75 65 73 20 66 6f 72 20 63  and values for c
17c0: 69 70 68 65 72 4e 61 6d 65 2e 0a 20 2a 0a 20 2a  ipherName.. *. *
17d0: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73   Results:. *.A s
17e0: 74 61 6e 64 61 72 64 20 54 63 6c 20 6c 69 73 74  tandard Tcl list
17f0: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  .. *. * Side eff
1800: 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20  ects:. *.None.. 
1810: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
1820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1850: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74  -------. */.stat
1860: 69 63 20 69 6e 74 20 43 69 70 68 65 72 4f 62 6a  ic int CipherObj
1870: 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63  Cmd(ClientData c
1880: 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49  lientData, Tcl_I
1890: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69  nterp *interp, i
18a0: 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a  nt objc, Tcl_Obj
18b0: 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20   *const objv[]) 
18c0: 7b 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69  {.    (void) cli
18d0: 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 64 70  entData;..    dp
18e0: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
18f0: 0a 0a 20 20 20 20 2f 2a 20 43 6c 65 61 72 20 65  ..    /* Clear e
1900: 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20 54 63 6c  rrors */.    Tcl
1910: 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74  _ResetResult(int
1920: 65 72 70 29 3b 0a 20 20 20 20 45 52 52 5f 63 6c  erp);.    ERR_cl
1930: 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20  ear_error();..  
1940: 20 20 2f 2a 20 56 61 6c 69 64 61 74 65 20 61 72    /* Validate ar
1950: 67 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 69  g count */.    i
1960: 66 20 28 6f 62 6a 63 20 3d 3d 20 31 29 20 7b 0a  f (objc == 1) {.
1970: 09 72 65 74 75 72 6e 20 43 69 70 68 65 72 4c 69  .return CipherLi
1980: 73 74 28 69 6e 74 65 72 70 29 3b 0a 0a 20 20 20  st(interp);..   
1990: 20 7d 20 65 6c 73 65 20 69 66 20 28 6f 62 6a 63   } else if (objc
19a0: 20 3d 3d 20 32 29 20 7b 0a 09 72 65 74 75 72 6e   == 2) {..return
19b0: 20 43 69 70 68 65 72 49 6e 66 6f 28 69 6e 74 65   CipherInfo(inte
19c0: 72 70 2c 20 6f 62 6a 76 5b 31 5d 29 3b 0a 0a 20  rp, objv[1]);.. 
19d0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c     } else {..Tcl
19e0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
19f0: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
1a00: 3f 6e 61 6d 65 3f 22 29 3b 0a 09 72 65 74 75 72  ?name?");..retur
1a10: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
1a20: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43   }.    return TC
1a30: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d  L_OK;.}../*. *--
1a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a80: 2d 0a 20 2a 0a 20 2a 20 43 69 70 68 65 72 73 4f  -. *. * CiphersO
1a90: 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54  bjCmd --. *. *.T
1aa0: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73  his procedure is
1ab0: 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63   invoked to proc
1ac0: 65 73 73 20 74 68 65 20 22 74 6c 73 3a 3a 63 69  ess the "tls::ci
1ad0: 70 68 65 72 73 22 20 63 6f 6d 6d 61 6e 64 0a 20  phers" command. 
1ae0: 2a 09 74 6f 20 6c 69 73 74 20 61 76 61 69 6c 61  *.to list availa
1af0: 62 6c 65 20 63 69 70 68 65 72 73 2c 20 62 61 73  ble ciphers, bas
1b00: 65 64 20 75 70 6f 6e 20 70 72 6f 74 6f 63 6f 6c  ed upon protocol
1b10: 20 73 65 6c 65 63 74 65 64 2e 0a 20 2a 0a 20 2a   selected.. *. *
1b20: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73   Results:. *.A s
1b30: 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75  tandard Tcl resu
1b40: 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 53  lt list.. *. * S
1b50: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
1b60: 63 6f 6e 73 74 72 75 63 74 73 20 61 6e 64 20 64  constructs and d
1b70: 65 73 74 72 6f 79 73 20 53 53 4c 20 63 6f 6e 74  estroys SSL cont
1b80: 65 78 74 20 28 43 54 58 29 0a 20 2a 0a 20 2a 2d  ext (CTX). *. *-
1b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1bd0: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  --. */.static in
1be0: 74 20 43 69 70 68 65 72 73 4f 62 6a 43 6d 64 28  t CiphersObjCmd(
1bf0: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
1c00: 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72  tData, Tcl_Inter
1c10: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f  p *interp, int o
1c20: 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f  bjc, Tcl_Obj *co
1c30: 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20  nst objv[]) {.  
1c40: 20 20 53 53 4c 5f 43 54 58 20 2a 63 74 78 20 3d    SSL_CTX *ctx =
1c50: 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 53 4c 20 2a   NULL;.    SSL *
1c60: 73 73 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  ssl = NULL;.    
1c70: 53 54 41 43 4b 5f 4f 46 28 53 53 4c 5f 43 49 50  STACK_OF(SSL_CIP
1c80: 48 45 52 29 20 2a 73 6b 20 3d 20 4e 55 4c 4c 3b  HER) *sk = NULL;
1c90: 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 69 6e  .    Tcl_Size in
1ca0: 64 65 78 3b 0a 20 20 20 20 69 6e 74 20 76 65 72  dex;.    int ver
1cb0: 62 6f 73 65 20 3d 20 30 2c 20 75 73 65 5f 73 75  bose = 0, use_su
1cc0: 70 70 6f 72 74 65 64 20 3d 20 30 2c 20 72 65 73  pported = 0, res
1cd0: 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 69   = TCL_OK;.    i
1ce0: 6e 74 20 6d 69 6e 5f 76 65 72 73 69 6f 6e 2c 20  nt min_version, 
1cf0: 6d 61 78 5f 76 65 72 73 69 6f 6e 3b 0a 20 20 20  max_version;.   
1d00: 20 28 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 61   (void) clientDa
1d10: 74 61 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66  ta;..    dprintf
1d20: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20  ("Called");..   
1d30: 20 2f 2a 20 43 6c 65 61 72 20 65 72 72 6f 72 73   /* Clear errors
1d40: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 52 65 73 65   */.    Tcl_Rese
1d50: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b  tResult(interp);
1d60: 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65  .    ERR_clear_e
1d70: 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 2f 2a 20  rror();..    /* 
1d80: 56 61 6c 69 64 61 74 65 20 61 72 67 20 63 6f 75  Validate arg cou
1d90: 6e 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f 62  nt */.    if (ob
1da0: 6a 63 20 3e 20 34 29 20 7b 0a 09 54 63 6c 5f 57  jc > 4) {..Tcl_W
1db0: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
1dc0: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3f 70  rp, 1, objv, "?p
1dd0: 72 6f 74 6f 63 6f 6c 3f 20 3f 76 65 72 62 6f 73  rotocol? ?verbos
1de0: 65 3f 20 3f 73 75 70 70 6f 72 74 65 64 3f 22 29  e? ?supported?")
1df0: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
1e00: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
1e10: 2f 2a 20 4c 69 73 74 20 61 6c 6c 20 63 69 70 68  /* List all ciph
1e20: 65 72 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f  ers */.    if (o
1e30: 62 6a 63 20 3d 3d 20 31 29 20 7b 0a 09 72 65 74  bjc == 1) {..ret
1e40: 75 72 6e 20 43 69 70 68 65 72 4c 69 73 74 28 69  urn CipherList(i
1e50: 6e 74 65 72 70 29 3b 0a 20 20 20 20 7d 0a 0a 20  nterp);.    }.. 
1e60: 20 20 20 2f 2a 20 47 65 74 20 6f 70 74 69 6f 6e     /* Get option
1e70: 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 54 63 6c  s */.    if (Tcl
1e80: 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a  _GetIndexFromObj
1e90: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d  (interp, objv[1]
1ea0: 2c 20 70 72 6f 74 6f 63 6f 6c 73 2c 20 22 70 72  , protocols, "pr
1eb0: 6f 74 6f 63 6f 6c 22 2c 20 30 2c 20 26 69 6e 64  otocol", 0, &ind
1ec0: 65 78 29 20 21 3d 20 54 43 4c 5f 4f 4b 20 7c 7c  ex) != TCL_OK ||
1ed0: 0a 09 28 6f 62 6a 63 20 3e 20 32 20 26 26 20 54  ..(objc > 2 && T
1ee0: 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f  cl_GetBooleanFro
1ef0: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
1f00: 76 5b 32 5d 2c 20 26 76 65 72 62 6f 73 65 29 20  v[2], &verbose) 
1f10: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7c 7c 0a 09 28  != TCL_OK) ||..(
1f20: 6f 62 6a 63 20 3e 20 33 20 26 26 20 54 63 6c 5f  objc > 3 && Tcl_
1f30: 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62  GetBooleanFromOb
1f40: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33  j(interp, objv[3
1f50: 5d 2c 20 26 75 73 65 5f 73 75 70 70 6f 72 74 65  ], &use_supporte
1f60: 64 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 29 20 7b  d) != TCL_OK)) {
1f70: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
1f80: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73  OR;.    }..    s
1f90: 77 69 74 63 68 20 28 28 65 6e 75 6d 20 70 72 6f  witch ((enum pro
1fa0: 74 6f 63 6f 6c 29 69 6e 64 65 78 29 20 7b 0a 09  tocol)index) {..
1fb0: 63 61 73 65 20 54 4c 53 5f 53 53 4c 32 3a 0a 09  case TLS_SSL2:..
1fc0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1fd0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f  sult(interp, pro
1fe0: 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22  tocols[index], "
1ff0: 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73  : protocol not s
2000: 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72  upported", (char
2010: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20   *) NULL);..    
2020: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2030: 3b 0a 09 63 61 73 65 20 54 4c 53 5f 53 53 4c 33  ;..case TLS_SSL3
2040: 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f  :.#if defined(NO
2050: 5f 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e 65  _SSL3) || define
2060: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c  d(OPENSSL_NO_SSL
2070: 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50  3) || defined(OP
2080: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45  ENSSL_NO_SSL3_ME
2090: 54 48 4f 44 29 0a 09 20 20 20 20 54 63 6c 5f 41  THOD)..    Tcl_A
20a0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
20b0: 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e  rp, protocols[in
20c0: 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f  dex], ": protoco
20d0: 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22  l not supported"
20e0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
20f0: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  ;..    return TC
2100: 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 20  L_ERROR;.#else. 
2110: 20 20 20 20 20 20 20 20 20 20 20 6d 69 6e 5f 76             min_v
2120: 65 72 73 69 6f 6e 20 3d 20 53 53 4c 33 5f 56 45  ersion = SSL3_VE
2130: 52 53 49 4f 4e 3b 0a 20 20 20 20 20 20 20 20 20  RSION;.         
2140: 20 20 20 6d 61 78 5f 76 65 72 73 69 6f 6e 20 3d     max_version =
2150: 20 53 53 4c 33 5f 56 45 52 53 49 4f 4e 3b 0a 09   SSL3_VERSION;..
2160: 20 20 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69      break;.#endi
2170: 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c 53 31  f..case TLS_TLS1
2180: 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f  :.#if defined(NO
2190: 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65  _TLS1) || define
21a0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
21b0: 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50  1) || defined(OP
21c0: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45  ENSSL_NO_TLS1_ME
21d0: 54 48 4f 44 29 0a 09 20 20 20 20 54 63 6c 5f 41  THOD)..    Tcl_A
21e0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
21f0: 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e  rp, protocols[in
2200: 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f  dex], ": protoco
2210: 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22  l not supported"
2220: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
2230: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  ;..    return TC
2240: 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 20  L_ERROR;.#else. 
2250: 20 20 20 20 20 20 20 20 20 20 20 6d 69 6e 5f 76             min_v
2260: 65 72 73 69 6f 6e 20 3d 20 54 4c 53 31 5f 56 45  ersion = TLS1_VE
2270: 52 53 49 4f 4e 3b 0a 20 20 20 20 20 20 20 20 20  RSION;.         
2280: 20 20 20 6d 61 78 5f 76 65 72 73 69 6f 6e 20 3d     max_version =
2290: 20 54 4c 53 31 5f 56 45 52 53 49 4f 4e 3b 0a 09   TLS1_VERSION;..
22a0: 20 20 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69      break;.#endi
22b0: 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c 53 31  f..case TLS_TLS1
22c0: 5f 31 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  _1:.#if defined(
22d0: 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65  NO_TLS1_1) || de
22e0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
22f0: 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69  _TLS1_1) || defi
2300: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
2310: 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 09 20  LS1_1_METHOD).. 
2320: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
2330: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74  ult(interp, prot
2340: 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a  ocols[index], ":
2350: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75   protocol not su
2360: 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20  pported", (char 
2370: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72  *) NULL);..    r
2380: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2390: 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 20  .#else.         
23a0: 20 20 20 6d 69 6e 5f 76 65 72 73 69 6f 6e 20 3d     min_version =
23b0: 20 54 4c 53 31 5f 31 5f 56 45 52 53 49 4f 4e 3b   TLS1_1_VERSION;
23c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 61 78  .            max
23d0: 5f 76 65 72 73 69 6f 6e 20 3d 20 54 4c 53 31 5f  _version = TLS1_
23e0: 31 5f 56 45 52 53 49 4f 4e 3b 0a 09 20 20 20 20  1_VERSION;..    
23f0: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63  break;.#endif..c
2400: 61 73 65 20 54 4c 53 5f 54 4c 53 31 5f 32 3a 0a  ase TLS_TLS1_2:.
2410: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54  #if defined(NO_T
2420: 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65  LS1_2) || define
2430: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
2440: 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  1_2) || defined(
2450: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
2460: 32 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 54  2_METHOD)..    T
2470: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
2480: 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c  interp, protocol
2490: 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f  s[index], ": pro
24a0: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72  tocol not suppor
24b0: 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  ted", (char *) N
24c0: 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72  ULL);..    retur
24d0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c  n TCL_ERROR;.#el
24e0: 73 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d  se.            m
24f0: 69 6e 5f 76 65 72 73 69 6f 6e 20 3d 20 54 4c 53  in_version = TLS
2500: 31 5f 32 5f 56 45 52 53 49 4f 4e 3b 0a 20 20 20  1_2_VERSION;.   
2510: 20 20 20 20 20 20 20 20 20 6d 61 78 5f 76 65 72           max_ver
2520: 73 69 6f 6e 20 3d 20 54 4c 53 31 5f 32 5f 56 45  sion = TLS1_2_VE
2530: 52 53 49 4f 4e 3b 0a 09 20 20 20 20 62 72 65 61  RSION;..    brea
2540: 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 20  k;.#endif..case 
2550: 54 4c 53 5f 54 4c 53 31 5f 33 3a 0a 23 69 66 20  TLS_TLS1_3:.#if 
2560: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f  defined(NO_TLS1_
2570: 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50  3) || defined(OP
2580: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29  ENSSL_NO_TLS1_3)
2590: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ..    Tcl_Append
25a0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70  Result(interp, p
25b0: 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c  rotocols[index],
25c0: 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74   ": protocol not
25d0: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68   supported", (ch
25e0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20  ar *) NULL);..  
25f0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
2600: 4f 52 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20  OR;.#else.      
2610: 20 20 20 20 20 20 6d 69 6e 5f 76 65 72 73 69 6f        min_versio
2620: 6e 20 3d 20 54 4c 53 31 5f 33 5f 56 45 52 53 49  n = TLS1_3_VERSI
2630: 4f 4e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ON;.            
2640: 6d 61 78 5f 76 65 72 73 69 6f 6e 20 3d 20 54 4c  max_version = TL
2650: 53 31 5f 33 5f 56 45 52 53 49 4f 4e 3b 0a 09 20  S1_3_VERSION;.. 
2660: 20 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66     break;.#endif
2670: 0a 09 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20  ..default:.     
2680: 20 20 20 20 20 20 20 6d 69 6e 5f 76 65 72 73 69         min_versi
2690: 6f 6e 20 3d 20 53 53 4c 33 5f 56 45 52 53 49 4f  on = SSL3_VERSIO
26a0: 4e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d  N;.            m
26b0: 61 78 5f 76 65 72 73 69 6f 6e 20 3d 20 54 4c 53  ax_version = TLS
26c0: 31 5f 33 5f 56 45 52 53 49 4f 4e 3b 0a 09 20 20  1_3_VERSION;..  
26d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
26e0: 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f      /* Create co
26f0: 6e 74 65 78 74 20 2a 2f 0a 20 20 20 20 69 66 20  ntext */.    if 
2700: 28 28 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f  ((ctx = SSL_CTX_
2710: 6e 65 77 28 54 4c 53 5f 73 65 72 76 65 72 5f 6d  new(TLS_server_m
2720: 65 74 68 6f 64 28 29 29 29 20 3d 3d 20 4e 55 4c  ethod())) == NUL
2730: 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  L) {..Tcl_Append
2740: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 47  Result(interp, G
2750: 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c  ET_ERR_REASON(),
2760: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
2770: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
2780: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  OR;.    }..    /
2790: 2a 20 53 65 74 20 70 72 6f 74 6f 63 6f 6c 20 76  * Set protocol v
27a0: 65 72 73 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 69  ersions */.    i
27b0: 66 20 28 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d  f (SSL_CTX_set_m
27c0: 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e  in_proto_version
27d0: 28 63 74 78 2c 20 6d 69 6e 5f 76 65 72 73 69 6f  (ctx, min_versio
27e0: 6e 29 20 3d 3d 20 30 20 7c 7c 0a 09 53 53 4c 5f  n) == 0 ||..SSL_
27f0: 43 54 58 5f 73 65 74 5f 6d 61 78 5f 70 72 6f 74  CTX_set_max_prot
2800: 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 6d  o_version(ctx, m
2810: 61 78 5f 76 65 72 73 69 6f 6e 29 20 3d 3d 20 30  ax_version) == 0
2820: 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65  ) {..SSL_CTX_fre
2830: 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20  e(ctx);..return 
2840: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
2850: 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20  ..    /* Create 
2860: 53 53 4c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  SSL context */. 
2870: 20 20 20 69 66 20 28 28 73 73 6c 20 3d 20 53 53     if ((ssl = SS
2880: 4c 5f 6e 65 77 28 63 74 78 29 29 20 3d 3d 20 4e  L_new(ctx)) == N
2890: 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65  ULL) {..Tcl_Appe
28a0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
28b0: 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28   GET_ERR_REASON(
28c0: 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ), (char *) NULL
28d0: 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65  );..SSL_CTX_free
28e0: 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 54  (ctx);..return T
28f0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
2900: 0a 20 20 20 20 2f 2a 20 55 73 65 20 6c 69 73 74  .    /* Use list
2910: 20 61 6e 64 20 6f 72 64 65 72 20 61 73 20 77 6f   and order as wo
2920: 75 6c 64 20 62 65 20 73 65 6e 74 20 69 6e 20 61  uld be sent in a
2930: 20 43 6c 69 65 6e 74 48 65 6c 6c 6f 20 6f 72 20   ClientHello or 
2940: 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20 63 69  all available ci
2950: 70 68 65 72 73 20 2a 2f 0a 20 20 20 20 69 66 20  phers */.    if 
2960: 28 75 73 65 5f 73 75 70 70 6f 72 74 65 64 29 20  (use_supported) 
2970: 7b 0a 09 73 6b 20 3d 20 53 53 4c 5f 67 65 74 31  {..sk = SSL_get1
2980: 5f 73 75 70 70 6f 72 74 65 64 5f 63 69 70 68 65  _supported_ciphe
2990: 72 73 28 73 73 6c 29 3b 0a 20 20 20 20 7d 20 65  rs(ssl);.    } e
29a0: 6c 73 65 20 7b 0a 09 73 6b 20 3d 20 53 53 4c 5f  lse {..sk = SSL_
29b0: 67 65 74 5f 63 69 70 68 65 72 73 28 73 73 6c 29  get_ciphers(ssl)
29c0: 3b 0a 09 2f 2a 73 6b 20 3d 20 53 53 4c 5f 43 54  ;../*sk = SSL_CT
29d0: 58 5f 67 65 74 5f 63 69 70 68 65 72 73 28 63 74  X_get_ciphers(ct
29e0: 78 29 3b 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20 20  x);*/.    }..   
29f0: 20 69 66 20 28 73 6b 20 21 3d 20 4e 55 4c 4c 29   if (sk != NULL)
2a00: 20 7b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 72 65 73   {..Tcl_Obj *res
2a10: 75 6c 74 4f 62 6a 20 3d 20 4e 55 4c 4c 3b 0a 0a  ultObj = NULL;..
2a20: 09 69 66 20 28 21 76 65 72 62 6f 73 65 29 20 7b  .if (!verbose) {
2a30: 0a 09 20 20 20 20 63 68 61 72 20 2a 63 70 3b 0a  ..    char *cp;.
2a40: 09 20 20 20 20 72 65 73 75 6c 74 4f 62 6a 20 3d  .    resultObj =
2a50: 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28   Tcl_NewListObj(
2a60: 30 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 69  0, NULL);..    i
2a70: 66 20 28 72 65 73 75 6c 74 4f 62 6a 20 3d 3d 20  f (resultObj == 
2a80: 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 73 20 3d 20  NULL) {...res = 
2a90: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 67 6f 74  TCL_ERROR;...got
2aa0: 6f 20 64 6f 6e 65 3b 0a 09 20 20 20 20 7d 0a 0a  o done;..    }..
2ab0: 09 20 20 20 20 66 6f 72 20 28 69 6e 74 20 69 20  .    for (int i 
2ac0: 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 53 53 4c 5f  = 0; i < sk_SSL_
2ad0: 43 49 50 48 45 52 5f 6e 75 6d 28 73 6b 29 3b 20  CIPHER_num(sk); 
2ae0: 69 2b 2b 29 20 7b 0a 09 09 63 6f 6e 73 74 20 53  i++) {...const S
2af0: 53 4c 5f 43 49 50 48 45 52 20 2a 63 20 3d 20 73  SL_CIPHER *c = s
2b00: 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 76 61 6c  k_SSL_CIPHER_val
2b10: 75 65 28 73 6b 2c 20 69 29 3b 0a 09 09 69 66 20  ue(sk, i);...if 
2b20: 28 63 20 3d 3d 20 4e 55 4c 4c 29 20 63 6f 6e 74  (c == NULL) cont
2b30: 69 6e 75 65 3b 0a 0a 09 09 2f 2a 20 63 69 70 68  inue;..../* ciph
2b40: 65 72 20 6e 61 6d 65 20 6f 72 20 28 4e 4f 4e 45  er name or (NONE
2b50: 29 20 2a 2f 0a 09 09 63 70 20 3d 20 53 53 4c 5f  ) */...cp = SSL_
2b60: 43 49 50 48 45 52 5f 67 65 74 5f 6e 61 6d 65 28  CIPHER_get_name(
2b70: 63 29 3b 0a 09 09 69 66 20 28 63 70 20 3d 3d 20  c);...if (cp == 
2b80: 4e 55 4c 4c 29 20 62 72 65 61 6b 3b 0a 09 09 54  NULL) break;...T
2b90: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
2ba0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
2bb0: 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e  resultObj, Tcl_N
2bc0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 63 70 2c 20  ewStringObj(cp, 
2bd0: 2d 31 29 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 7d  -1));..    }...}
2be0: 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 63 68 61   else {..    cha
2bf0: 72 20 62 75 66 5b 42 55 46 53 49 5a 5d 3b 0a 09  r buf[BUFSIZ];..
2c00: 20 20 20 20 72 65 73 75 6c 74 4f 62 6a 20 3d 20      resultObj = 
2c10: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
2c20: 28 22 22 2c 20 30 29 3b 0a 09 20 20 20 20 69 66  ("", 0);..    if
2c30: 20 28 72 65 73 75 6c 74 4f 62 6a 20 3d 3d 20 4e   (resultObj == N
2c40: 55 4c 4c 29 20 7b 0a 09 09 72 65 73 20 3d 20 54  ULL) {...res = T
2c50: 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 67 6f 74 6f  CL_ERROR;...goto
2c60: 20 64 6f 6e 65 3b 0a 09 20 20 20 20 7d 0a 0a 09   done;..    }...
2c70: 20 20 20 20 66 6f 72 20 28 69 6e 74 20 69 20 3d      for (int i =
2c80: 20 30 3b 20 69 20 3c 20 73 6b 5f 53 53 4c 5f 43   0; i < sk_SSL_C
2c90: 49 50 48 45 52 5f 6e 75 6d 28 73 6b 29 3b 20 69  IPHER_num(sk); i
2ca0: 2b 2b 29 20 7b 0a 09 09 63 6f 6e 73 74 20 53 53  ++) {...const SS
2cb0: 4c 5f 43 49 50 48 45 52 20 2a 63 20 3d 20 73 6b  L_CIPHER *c = sk
2cc0: 5f 53 53 4c 5f 43 49 50 48 45 52 5f 76 61 6c 75  _SSL_CIPHER_valu
2cd0: 65 28 73 6b 2c 20 69 29 3b 0a 09 09 69 66 20 28  e(sk, i);...if (
2ce0: 63 20 3d 3d 20 4e 55 4c 4c 29 20 63 6f 6e 74 69  c == NULL) conti
2cf0: 6e 75 65 3b 0a 0a 09 09 2f 2a 20 74 65 78 74 75  nue;..../* textu
2d00: 61 6c 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f  al description o
2d10: 66 20 74 68 65 20 63 69 70 68 65 72 20 2a 2f 0a  f the cipher */.
2d20: 09 09 69 66 20 28 53 53 4c 5f 43 49 50 48 45 52  ..if (SSL_CIPHER
2d30: 5f 64 65 73 63 72 69 70 74 69 6f 6e 28 63 2c 20  _description(c, 
2d40: 62 75 66 2c 20 73 69 7a 65 6f 66 28 62 75 66 29  buf, sizeof(buf)
2d50: 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 20  ) != NULL) {... 
2d60: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 54 6f 4f     Tcl_AppendToO
2d70: 62 6a 28 72 65 73 75 6c 74 4f 62 6a 2c 20 62 75  bj(resultObj, bu
2d80: 66 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 73 74  f, (Tcl_Size) st
2d90: 72 6c 65 6e 28 62 75 66 29 29 3b 0a 09 09 7d 20  rlen(buf));...} 
2da0: 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 54 63 6c  else {...    Tcl
2db0: 5f 41 70 70 65 6e 64 54 6f 4f 62 6a 28 72 65 73  _AppendToObj(res
2dc0: 75 6c 74 4f 62 6a 2c 20 22 55 4e 4b 4e 4f 57 4e  ultObj, "UNKNOWN
2dd0: 5c 6e 22 2c 20 38 29 3b 0a 09 09 7d 0a 09 20 20  \n", 8);...}..  
2de0: 20 20 7d 0a 09 7d 0a 0a 09 2f 2a 20 43 6c 65 61    }..}.../* Clea
2df0: 6e 20 75 70 20 2a 2f 0a 09 69 66 20 28 75 73 65  n up */..if (use
2e00: 5f 73 75 70 70 6f 72 74 65 64 29 20 7b 0a 09 20  _supported) {.. 
2e10: 20 20 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52     sk_SSL_CIPHER
2e20: 5f 66 72 65 65 28 73 6b 29 3b 0a 09 7d 0a 09 54  _free(sk);..}..T
2e30: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
2e40: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62  interp, resultOb
2e50: 6a 29 3b 0a 20 20 20 20 7d 0a 0a 64 6f 6e 65 3a  j);.    }..done:
2e60: 0a 20 20 20 20 53 53 4c 5f 66 72 65 65 28 73 73  .    SSL_free(ss
2e70: 6c 29 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f  l);.    SSL_CTX_
2e80: 66 72 65 65 28 63 74 78 29 3b 0a 20 20 20 20 72  free(ctx);.    r
2e90: 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a  eturn res;.}../*
2ea0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2eb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ec0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ed0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ee0: 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  **/../*. *------
2ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
2f30: 0a 20 2a 20 44 69 67 65 73 74 49 6e 66 6f 20 2d  . * DigestInfo -
2f40: 2d 0a 20 2a 0a 20 2a 09 52 65 74 75 72 6e 20 61  -. *. *.Return a
2f50: 20 6c 69 73 74 20 6f 66 20 70 72 6f 70 65 72 74   list of propert
2f60: 69 65 73 20 61 6e 64 20 76 61 6c 75 65 73 20 66  ies and values f
2f70: 6f 72 20 64 69 67 65 73 74 2e 0a 20 2a 0a 20 2a  or digest.. *. *
2f80: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73   Results:. *.A s
2f90: 74 61 6e 64 61 72 64 20 54 63 6c 20 6c 69 73 74  tandard Tcl list
2fa0: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  .. *. * Side eff
2fb0: 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20  ects:. *.None.. 
2fc0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
2fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3000: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20  -------. */.int 
3010: 44 69 67 65 73 74 49 6e 66 6f 28 54 63 6c 5f 49  DigestInfo(Tcl_I
3020: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 54  nterp *interp, T
3030: 63 6c 5f 4f 62 6a 20 2a 6e 61 6d 65 4f 62 6a 29  cl_Obj *nameObj)
3040: 20 7b 0a 20 20 20 20 45 56 50 5f 4d 44 20 2a 6d   {.    EVP_MD *m
3050: 64 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  d;.    Tcl_Obj *
3060: 72 65 73 75 6c 74 4f 62 6a 2c 20 2a 6c 69 73 74  resultObj, *list
3070: 4f 62 6a 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65  Obj;.    unsigne
3080: 64 20 6c 6f 6e 67 20 66 6c 61 67 73 3b 0a 20 20  d long flags;.  
3090: 20 20 69 6e 74 20 72 65 73 20 3d 20 54 43 4c 5f    int res = TCL_
30a0: 4f 4b 3b 0a 20 20 20 20 63 68 61 72 20 2a 6e 61  OK;.    char *na
30b0: 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  me = Tcl_GetStri
30c0: 6e 67 46 72 6f 6d 4f 62 6a 28 6e 61 6d 65 4f 62  ngFromObj(nameOb
30d0: 6a 2c 20 28 54 63 6c 5f 53 69 7a 65 20 2a 29 20  j, (Tcl_Size *) 
30e0: 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 2f 2a 20 47  NULL);..    /* G
30f0: 65 74 20 6d 65 73 73 61 67 65 20 64 69 67 65 73  et message diges
3100: 74 20 2a 2f 0a 20 20 20 20 6d 64 20 3d 20 45 56  t */.    md = EV
3110: 50 5f 67 65 74 5f 64 69 67 65 73 74 62 79 6e 61  P_get_digestbyna
3120: 6d 65 28 6e 61 6d 65 29 3b 0a 0a 20 20 20 20 69  me(name);..    i
3130: 66 20 28 6d 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b  f (md == NULL) {
3140: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
3150: 6c 74 28 69 6e 74 65 72 70 2c 20 22 49 6e 76 61  lt(interp, "Inva
3160: 6c 69 64 20 64 69 67 65 73 74 20 5c 22 22 2c 20  lid digest \"", 
3170: 6e 61 6d 65 2c 20 22 5c 22 22 2c 20 28 63 68 61  name, "\"", (cha
3180: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74  r *) NULL);..ret
3190: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
31a0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74     }..    /* Get
31b0: 20 70 72 6f 70 65 72 74 69 65 73 20 2a 2f 0a 20   properties */. 
31c0: 20 20 20 72 65 73 75 6c 74 4f 62 6a 20 3d 20 54     resultObj = T
31d0: 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c  cl_NewListObj(0,
31e0: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28   NULL);.    if (
31f0: 72 65 73 75 6c 74 4f 62 6a 20 3d 3d 20 4e 55 4c  resultObj == NUL
3200: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c  L) {..return TCL
3210: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
3220: 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e    LAPPEND_STR(in
3230: 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c  terp, resultObj,
3240: 20 22 6e 61 6d 65 22 2c 20 45 56 50 5f 4d 44 5f   "name", EVP_MD_
3250: 6e 61 6d 65 28 6d 64 29 2c 20 2d 31 29 3b 0a 20  name(md), -1);. 
3260: 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69     LAPPEND_STR(i
3270: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a  nterp, resultObj
3280: 2c 20 22 64 65 73 63 72 69 70 74 69 6f 6e 22 2c  , "description",
3290: 20 22 22 2c 20 2d 31 29 3b 0a 20 20 20 20 4c 41   "", -1);.    LA
32a0: 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70  PPEND_INT(interp
32b0: 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 73 69  , resultObj, "si
32c0: 7a 65 22 2c 20 45 56 50 5f 4d 44 5f 73 69 7a 65  ze", EVP_MD_size
32d0: 28 6d 64 29 29 3b 0a 20 20 20 20 4c 41 50 50 45  (md));.    LAPPE
32e0: 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 72  ND_INT(interp, r
32f0: 65 73 75 6c 74 4f 62 6a 2c 20 22 62 6c 6f 63 6b  esultObj, "block
3300: 5f 73 69 7a 65 22 2c 20 45 56 50 5f 4d 44 5f 62  _size", EVP_MD_b
3310: 6c 6f 63 6b 5f 73 69 7a 65 28 6d 64 29 29 3b 0a  lock_size(md));.
3320: 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28      LAPPEND_STR(
3330: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62  interp, resultOb
3340: 6a 2c 20 22 70 72 6f 76 69 64 65 72 22 2c 20 22  j, "provider", "
3350: 22 2c 20 2d 31 29 3b 0a 20 20 20 20 4c 41 50 50  ", -1);.    LAPP
3360: 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
3370: 72 65 73 75 6c 74 4f 62 6a 2c 20 22 74 79 70 65  resultObj, "type
3380: 22 2c 20 4f 42 4a 5f 6e 69 64 32 6c 6e 28 45 56  ", OBJ_nid2ln(EV
3390: 50 5f 4d 44 5f 74 79 70 65 28 6d 64 29 29 2c 20  P_MD_type(md)), 
33a0: 2d 31 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44  -1);.    LAPPEND
33b0: 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 72 65 73  _STR(interp, res
33c0: 75 6c 74 4f 62 6a 2c 20 22 70 6b 65 79 5f 74 79  ultObj, "pkey_ty
33d0: 70 65 22 2c 20 4f 42 4a 5f 6e 69 64 32 6c 6e 28  pe", OBJ_nid2ln(
33e0: 45 56 50 5f 4d 44 5f 70 6b 65 79 5f 74 79 70 65  EVP_MD_pkey_type
33f0: 28 6d 64 29 29 2c 20 2d 31 29 3b 0a 20 20 20 20  (md)), -1);.    
3400: 66 6c 61 67 73 20 3d 20 45 56 50 5f 4d 44 5f 66  flags = EVP_MD_f
3410: 6c 61 67 73 28 6d 64 29 3b 0a 0a 20 20 20 20 2f  lags(md);..    /
3420: 2a 20 46 6c 61 67 73 20 2a 2f 0a 20 20 20 20 6c  * Flags */.    l
3430: 69 73 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77  istObj = Tcl_New
3440: 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29  ListObj(0, NULL)
3450: 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 42 4f  ;.    LAPPEND_BO
3460: 4f 4c 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f  OL(interp, listO
3470: 62 6a 2c 20 22 4f 6e 65 2d 73 68 6f 74 22 2c 20  bj, "One-shot", 
3480: 66 6c 61 67 73 20 26 20 45 56 50 5f 4d 44 5f 46  flags & EVP_MD_F
3490: 4c 41 47 5f 4f 4e 45 53 48 4f 54 29 3b 0a 20 20  LAG_ONESHOT);.  
34a0: 20 20 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69    LAPPEND_BOOL(i
34b0: 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a 2c 20  nterp, listObj, 
34c0: 22 58 4f 46 22 2c 20 66 6c 61 67 73 20 26 20 45  "XOF", flags & E
34d0: 56 50 5f 4d 44 5f 46 4c 41 47 5f 58 4f 46 29 3b  VP_MD_FLAG_XOF);
34e0: 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 42 4f 4f  .    LAPPEND_BOO
34f0: 4c 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62  L(interp, listOb
3500: 6a 2c 20 22 44 69 67 65 73 74 41 6c 67 6f 72 69  j, "DigestAlgori
3510: 74 68 6d 49 64 5f 4e 55 4c 4c 22 2c 20 66 6c 61  thmId_NULL", fla
3520: 67 73 20 26 20 45 56 50 5f 4d 44 5f 46 4c 41 47  gs & EVP_MD_FLAG
3530: 5f 44 49 47 41 4c 47 49 44 5f 4e 55 4c 4c 29 3b  _DIGALGID_NULL);
3540: 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 42 4f 4f  .    LAPPEND_BOO
3550: 4c 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62  L(interp, listOb
3560: 6a 2c 20 22 44 69 67 65 73 74 41 6c 67 6f 72 69  j, "DigestAlgori
3570: 74 68 6d 49 64 5f 41 62 73 63 65 6e 74 22 2c 20  thmId_Abscent", 
3580: 66 6c 61 67 73 20 26 20 45 56 50 5f 4d 44 5f 46  flags & EVP_MD_F
3590: 4c 41 47 5f 44 49 47 41 4c 47 49 44 5f 41 42 53  LAG_DIGALGID_ABS
35a0: 45 4e 54 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e  ENT);.    LAPPEN
35b0: 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6c  D_BOOL(interp, l
35c0: 69 73 74 4f 62 6a 2c 20 22 44 69 67 65 73 74 41  istObj, "DigestA
35d0: 6c 67 6f 72 69 74 68 6d 49 64 5f 43 75 73 74 6f  lgorithmId_Custo
35e0: 6d 22 2c 20 66 6c 61 67 73 20 26 20 45 56 50 5f  m", flags & EVP_
35f0: 4d 44 5f 46 4c 41 47 5f 44 49 47 41 4c 47 49 44  MD_FLAG_DIGALGID
3600: 5f 43 55 53 54 4f 4d 29 3b 0a 20 20 20 20 4c 41  _CUSTOM);.    LA
3610: 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72  PPEND_BOOL(inter
3620: 70 2c 20 6c 69 73 74 4f 62 6a 2c 20 22 46 49 50  p, listObj, "FIP
3630: 53 22 2c 20 66 6c 61 67 73 20 26 20 45 56 50 5f  S", flags & EVP_
3640: 4d 44 5f 46 4c 41 47 5f 46 49 50 53 29 3b 0a 20  MD_FLAG_FIPS);. 
3650: 20 20 20 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69     LAPPEND_OBJ(i
3660: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a  nterp, resultObj
3670: 2c 20 22 66 6c 61 67 73 22 2c 20 6c 69 73 74 4f  , "flags", listO
3680: 62 6a 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 53 65  bj);..    Tcl_Se
3690: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
36a0: 70 2c 20 72 65 73 75 6c 74 4f 62 6a 29 3b 0a 20  p, resultObj);. 
36b0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b     return TCL_OK
36c0: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  ;.}../*. *------
36d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
36e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
36f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
3710: 0a 20 2a 20 44 69 67 65 73 74 4c 69 73 74 20 2d  . * DigestList -
3720: 2d 0a 20 2a 0a 20 2a 09 52 65 74 75 72 6e 20 61  -. *. *.Return a
3730: 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 64 69 67   list of all dig
3740: 65 73 74 20 61 6c 67 6f 72 69 74 68 6d 73 0a 20  est algorithms. 
3750: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
3760: 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20  .A standard Tcl 
3770: 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65  list.. *. * Side
3780: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e   effects:. *.Non
3790: 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  e.. *. *--------
37a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
37e0: 69 6e 74 20 44 69 67 65 73 74 4c 69 73 74 28 54  int DigestList(T
37f0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
3800: 70 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  p) {.    Tcl_Obj
3810: 20 2a 72 65 73 75 6c 74 4f 62 6a 20 3d 20 54 63   *resultObj = Tc
3820: 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20  l_NewListObj(0, 
3830: 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 72  NULL);.    if (r
3840: 65 73 75 6c 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c  esultObj == NULL
3850: 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  ) {..return TCL_
3860: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
3870: 20 20 2f 2a 20 53 61 6d 65 20 61 73 20 45 56 50    /* Same as EVP
3880: 5f 4d 44 5f 64 6f 5f 61 6c 6c 20 2a 2f 0a 20 20  _MD_do_all */.  
3890: 20 20 4f 42 4a 5f 4e 41 4d 45 5f 64 6f 5f 61 6c    OBJ_NAME_do_al
38a0: 6c 28 4f 42 4a 5f 4e 41 4d 45 5f 54 59 50 45 5f  l(OBJ_NAME_TYPE_
38b0: 4d 44 5f 4d 45 54 48 2c 20 4e 61 6d 65 73 43 61  MD_METH, NamesCa
38c0: 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29  llback, (void *)
38d0: 20 72 65 73 75 6c 74 4f 62 6a 29 3b 0a 20 20 20   resultObj);.   
38e0: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
38f0: 74 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74  t(interp, result
3900: 4f 62 6a 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Obj);.    return
3910: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20   TCL_OK;.}../*. 
3920: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
3930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3960: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73  ----. *. * Diges
3970: 74 73 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20  tsObjCmd --. *. 
3980: 2a 09 52 65 74 75 72 6e 20 61 20 6c 69 73 74 20  *.Return a list 
3990: 6f 66 20 61 6c 6c 20 76 61 6c 69 64 20 68 61 73  of all valid has
39a0: 68 20 61 6c 67 6f 72 69 74 68 6d 73 20 6f 72 20  h algorithms or 
39b0: 6d 65 73 73 61 67 65 20 64 69 67 65 73 74 73 2e  message digests.
39c0: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
39d0: 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63   *.A standard Tc
39e0: 6c 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 53 69  l list.. *. * Si
39f0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e  de effects:. *.N
3a00: 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  one.. *. *------
3a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
3a50: 2f 0a 69 6e 74 20 44 69 67 65 73 74 73 4f 62 6a  /.int DigestsObj
3a60: 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63  Cmd(ClientData c
3a70: 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49  lientData, Tcl_I
3a80: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69  nterp *interp, i
3a90: 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a  nt objc, Tcl_Obj
3aa0: 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20   *const objv[]) 
3ab0: 7b 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69  {.    (void) cli
3ac0: 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 64 70  entData;..    dp
3ad0: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
3ae0: 0a 0a 20 20 20 20 2f 2a 20 43 6c 65 61 72 20 65  ..    /* Clear e
3af0: 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20 54 63 6c  rrors */.    Tcl
3b00: 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74  _ResetResult(int
3b10: 65 72 70 29 3b 0a 20 20 20 20 45 52 52 5f 63 6c  erp);.    ERR_cl
3b20: 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 0a 20  ear_error();... 
3b30: 20 20 20 2f 2a 20 56 61 6c 69 64 61 74 65 20 61     /* Validate a
3b40: 72 67 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 20 20  rg count */.    
3b50: 69 66 20 28 6f 62 6a 63 20 3d 3d 20 31 29 20 7b  if (objc == 1) {
3b60: 0a 09 72 65 74 75 72 6e 20 44 69 67 65 73 74 4c  ..return DigestL
3b70: 69 73 74 28 69 6e 74 65 72 70 29 3b 0a 0a 20 20  ist(interp);..  
3b80: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 6f 62 6a    } else if (obj
3b90: 63 20 3d 3d 20 32 29 20 7b 0a 09 72 65 74 75 72  c == 2) {..retur
3ba0: 6e 20 44 69 67 65 73 74 49 6e 66 6f 28 69 6e 74  n DigestInfo(int
3bb0: 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 29 3b 0a 0a  erp, objv[1]);..
3bc0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63      } else {..Tc
3bd0: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
3be0: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
3bf0: 22 3f 6e 61 6d 65 3f 22 29 3b 0a 09 72 65 74 75  "?name?");..retu
3c00: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
3c10: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 54    }.    return T
3c20: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a  CL_OK;.}../*****
3c30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3c40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3c50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3c60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
3c70: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
3c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
3cc0: 4b 64 66 4c 69 73 74 20 2d 2d 0a 20 2a 0a 20 2a  KdfList --. *. *
3cd0: 09 52 65 74 75 72 6e 20 61 20 6c 69 73 74 20 6f  .Return a list o
3ce0: 66 20 61 6c 6c 20 4b 44 46 20 61 6c 67 6f 72 69  f all KDF algori
3cf0: 74 68 6d 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  thms. *. * Resul
3d00: 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72  ts:. *.A standar
3d10: 64 20 54 63 6c 20 6c 69 73 74 2e 0a 20 2a 0a 20  d Tcl list.. *. 
3d20: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
3d30: 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d   *.None.. *. *--
3d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3d80: 2d 0a 20 2a 2f 0a 69 6e 74 20 4b 64 66 4c 69 73  -. */.int KdfLis
3d90: 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  t(Tcl_Interp *in
3da0: 74 65 72 70 2c 20 63 68 61 72 20 2a 73 65 6c 65  terp, char *sele
3db0: 63 74 5f 6e 61 6d 65 29 20 7b 0a 20 20 20 20 54  ct_name) {.    T
3dc0: 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 4f 62  cl_Obj *resultOb
3dd0: 6a 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f  j = Tcl_NewListO
3de0: 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20  bj(0, NULL);.   
3df0: 20 69 66 20 28 72 65 73 75 6c 74 4f 62 6a 20 3d   if (resultObj =
3e00: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  = NULL) {..retur
3e10: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
3e20: 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74   }..    Tcl_List
3e30: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
3e40: 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f  (interp, resultO
3e50: 62 6a 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  bj, Tcl_NewStrin
3e60: 67 4f 62 6a 28 22 68 6b 64 66 22 2c 20 2d 31 29  gObj("hkdf", -1)
3e70: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
3e80: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
3e90: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62  interp, resultOb
3ea0: 6a 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  j, Tcl_NewString
3eb0: 4f 62 6a 28 22 70 62 6b 64 66 32 22 2c 20 2d 31  Obj("pbkdf2", -1
3ec0: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
3ed0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
3ee0: 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f  (interp, resultO
3ef0: 62 6a 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  bj, Tcl_NewStrin
3f00: 67 4f 62 6a 28 22 73 63 72 79 70 74 22 2c 20 2d  gObj("scrypt", -
3f10: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74  1));.    Tcl_Set
3f20: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
3f30: 2c 20 72 65 73 75 6c 74 4f 62 6a 29 3b 0a 20 20  , resultObj);.  
3f40: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
3f50: 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  .}../*. *-------
3f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
3fa0: 20 2a 20 4b 64 66 73 4f 62 6a 43 6d 64 20 2d 2d   * KdfsObjCmd --
3fb0: 0a 20 2a 0a 20 2a 09 52 65 74 75 72 6e 20 61 20  . *. *.Return a 
3fc0: 6c 69 73 74 20 6f 66 20 61 6c 6c 20 76 61 6c 69  list of all vali
3fd0: 64 20 4b 65 79 20 44 65 72 69 76 61 74 69 6f 6e  d Key Derivation
3fe0: 20 46 75 6e 63 74 69 6f 6e 20 28 4b 44 46 29 2e   Function (KDF).
3ff0: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
4000: 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63   *.A standard Tc
4010: 6c 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 53 69  l list.. *. * Si
4020: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e  de effects:. *.N
4030: 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  one.. *. *------
4040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
4080: 2f 0a 69 6e 74 20 4b 64 66 73 4f 62 6a 43 6d 64  /.int KdfsObjCmd
4090: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65  (ClientData clie
40a0: 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65  ntData, Tcl_Inte
40b0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20  rp *interp, int 
40c0: 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63  objc, Tcl_Obj *c
40d0: 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20  onst objv[]) {. 
40e0: 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65 6e 74     (void) client
40f0: 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 72 69 6e  Data;..    dprin
4100: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20  tf("Called");.. 
4110: 20 20 20 2f 2a 20 43 6c 65 61 72 20 65 72 72 6f     /* Clear erro
4120: 72 73 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 52 65  rs */.    Tcl_Re
4130: 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  setResult(interp
4140: 29 3b 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72  );.    ERR_clear
4150: 5f 65 72 72 6f 72 28 29 3b 0a 0a 0a 20 20 20 20  _error();...    
4160: 2f 2a 20 56 61 6c 69 64 61 74 65 20 61 72 67 20  /* Validate arg 
4170: 63 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 69 66 20  count */.    if 
4180: 28 6f 62 6a 63 20 3d 3d 20 31 29 20 7b 0a 09 72  (objc == 1) {..r
4190: 65 74 75 72 6e 20 4b 64 66 4c 69 73 74 28 69 6e  eturn KdfList(in
41a0: 74 65 72 70 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20  terp, NULL);..  
41b0: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 6f 62 6a    } else if (obj
41c0: 63 20 3d 3d 20 32 29 20 7b 0a 0a 0a 20 20 20 20  c == 2) {...    
41d0: 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 57 72  } else {..Tcl_Wr
41e0: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
41f0: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3f 6e 61  p, 1, objv, "?na
4200: 6d 65 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 54  me?");..return T
4210: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
4220: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f      return TCL_O
4230: 4b 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  K;.}../*********
4240: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4250: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4260: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4270: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a  **********/../*.
4280: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
4290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
42a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
42b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
42c0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d 61 63 49  -----. *. * MacI
42d0: 6e 66 6f 20 2d 2d 0a 20 2a 0a 20 2a 09 52 65 74  nfo --. *. *.Ret
42e0: 75 72 6e 20 61 20 6c 69 73 74 20 6f 66 20 70 72  urn a list of pr
42f0: 6f 70 65 72 74 69 65 73 20 61 6e 64 20 76 61 6c  operties and val
4300: 75 65 73 20 66 6f 72 20 6d 61 63 4e 61 6d 65 2e  ues for macName.
4310: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
4320: 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63   *.A standard Tc
4330: 6c 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 53 69  l list.. *. * Si
4340: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e  de effects:. *.N
4350: 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  one.. *. *------
4360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
43a0: 2f 0a 69 6e 74 20 4d 61 63 49 6e 66 6f 28 54 63  /.int MacInfo(Tc
43b0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
43c0: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 6e 61 6d 65 4f  , Tcl_Obj *nameO
43d0: 62 6a 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62  bj) {.    Tcl_Ob
43e0: 6a 20 2a 72 65 73 75 6c 74 4f 62 6a 3b 0a 20 20  j *resultObj;.  
43f0: 20 20 69 6e 74 20 72 65 73 20 3d 20 54 43 4c 5f    int res = TCL_
4400: 4f 4b 3b 0a 20 20 20 20 63 68 61 72 20 2a 6e 61  OK;.    char *na
4410: 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  me = Tcl_GetStri
4420: 6e 67 46 72 6f 6d 4f 62 6a 28 6e 61 6d 65 4f 62  ngFromObj(nameOb
4430: 6a 2c 20 28 54 63 6c 5f 53 69 7a 65 20 2a 29 20  j, (Tcl_Size *) 
4440: 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 69 66 20 28  NULL);..    if (
4450: 73 74 72 63 6d 70 28 6e 61 6d 65 2c 20 22 63 6d  strcmp(name, "cm
4460: 61 63 22 29 20 21 3d 20 30 20 26 26 20 73 74 72  ac") != 0 && str
4470: 63 6d 70 28 6e 61 6d 65 2c 20 22 68 6d 61 63 22  cmp(name, "hmac"
4480: 29 20 21 3d 20 30 29 20 7b 0a 09 54 63 6c 5f 41  ) != 0) {..Tcl_A
4490: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
44a0: 72 70 2c 20 22 49 6e 76 61 6c 69 64 20 4d 41 43  rp, "Invalid MAC
44b0: 20 5c 22 22 2c 20 6e 61 6d 65 2c 20 22 5c 22 22   \"", name, "\""
44c0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
44d0: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
44e0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
44f0: 2f 2a 20 47 65 74 20 70 72 6f 70 65 72 74 69 65  /* Get propertie
4500: 73 20 2a 2f 0a 20 20 20 20 72 65 73 75 6c 74 4f  s */.    resultO
4510: 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74  bj = Tcl_NewList
4520: 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20  Obj(0, NULL);.  
4530: 20 20 69 66 20 28 72 65 73 75 6c 74 4f 62 6a 20    if (resultObj 
4540: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75  == NULL) {..retu
4550: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
4560: 20 20 7d 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f    }.    LAPPEND_
4570: 53 54 52 28 69 6e 74 65 72 70 2c 20 72 65 73 75  STR(interp, resu
4580: 6c 74 4f 62 6a 2c 20 22 6e 61 6d 65 22 2c 20 6e  ltObj, "name", n
4590: 61 6d 65 2c 20 2d 31 29 3b 0a 20 20 20 20 4c 41  ame, -1);.    LA
45a0: 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
45b0: 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 64 65  , resultObj, "de
45c0: 73 63 72 69 70 74 69 6f 6e 22 2c 20 22 22 2c 20  scription", "", 
45d0: 2d 31 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44  -1);.    LAPPEND
45e0: 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 72 65 73  _STR(interp, res
45f0: 75 6c 74 4f 62 6a 2c 20 22 70 72 6f 76 69 64 65  ultObj, "provide
4600: 72 22 2c 20 22 22 2c 20 2d 31 29 3b 0a 0a 20 20  r", "", -1);..  
4610: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
4620: 6c 74 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c  lt(interp, resul
4630: 74 4f 62 6a 29 3b 0a 20 20 20 20 72 65 74 75 72  tObj);.    retur
4640: 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d  n res;.}../*. *-
4650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4690: 2d 2d 0a 20 2a 0a 20 2a 20 4d 61 63 4c 69 73 74  --. *. * MacList
46a0: 20 2d 2d 0a 20 2a 0a 20 2a 09 52 65 74 75 72 6e   --. *. *.Return
46b0: 20 61 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 4d   a list of all M
46c0: 41 43 20 61 6c 67 6f 72 69 74 68 6d 73 0a 20 2a  AC algorithms. *
46d0: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
46e0: 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 6c  A standard Tcl l
46f0: 69 73 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  ist.. *. * Side 
4700: 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65  effects:. *.None
4710: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  .. *. *---------
4720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69  ----------. */.i
4760: 6e 74 20 4d 61 63 4c 69 73 74 28 54 63 6c 5f 49  nt MacList(Tcl_I
4770: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 20 7b  nterp *interp) {
4780: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 72 65  .    Tcl_Obj *re
4790: 73 75 6c 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65  sultObj = Tcl_Ne
47a0: 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c  wListObj(0, NULL
47b0: 29 3b 0a 20 20 20 20 69 66 20 28 72 65 73 75 6c  );.    if (resul
47c0: 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  tObj == NULL) {.
47d0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
47e0: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63  R;.    }..    Tc
47f0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
4800: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72  lement(interp, r
4810: 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65  esultObj, Tcl_Ne
4820: 77 53 74 72 69 6e 67 4f 62 6a 28 22 63 6d 61 63  wStringObj("cmac
4830: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c  ", -1));.    Tcl
4840: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
4850: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 65  ement(interp, re
4860: 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77  sultObj, Tcl_New
4870: 53 74 72 69 6e 67 4f 62 6a 28 22 68 6d 61 63 22  StringObj("hmac"
4880: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f  , -1));.    Tcl_
4890: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
48a0: 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 29 3b  erp, resultObj);
48b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
48c0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  OK;.}../*. *----
48d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
48e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
48f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
4910: 20 2a 0a 20 2a 20 4d 61 63 73 4f 62 6a 43 6d 64   *. * MacsObjCmd
4920: 20 2d 2d 0a 20 2a 0a 20 2a 09 52 65 74 75 72 6e   --. *. *.Return
4930: 20 61 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 76   a list of all v
4940: 61 6c 69 64 20 6d 65 73 73 61 67 65 20 61 75 74  alid message aut
4950: 68 65 6e 74 69 63 61 74 69 6f 6e 20 63 6f 64 65  hentication code
4960: 73 20 28 4d 41 43 29 2e 0a 20 2a 0a 20 2a 20 52  s (MAC).. *. * R
4970: 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61  esults:. *.A sta
4980: 6e 64 61 72 64 20 54 63 6c 20 6c 69 73 74 2e 0a  ndard Tcl list..
4990: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
49a0: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a  ts:. *.None.. *.
49b0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
49c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
49d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
49e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
49f0: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 4d 61  -----. */.int Ma
4a00: 63 73 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44  csObjCmd(ClientD
4a10: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
4a20: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
4a30: 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63  rp, int objc, Tc
4a40: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a  l_Obj *const obj
4a50: 76 5b 5d 29 20 7b 0a 20 20 20 20 28 76 6f 69 64  v[]) {.    (void
4a60: 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20  ) clientData;.. 
4a70: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
4a80: 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6c  ed");..    /* Cl
4a90: 65 61 72 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20  ear errors */.  
4aa0: 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c    Tcl_ResetResul
4ab0: 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 45  t(interp);.    E
4ac0: 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29  RR_clear_error()
4ad0: 3b 0a 0a 20 20 20 20 2f 2a 20 56 61 6c 69 64 61  ;..    /* Valida
4ae0: 74 65 20 61 72 67 20 63 6f 75 6e 74 20 2a 2f 0a  te arg count */.
4af0: 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20      if (objc == 
4b00: 31 29 20 7b 0a 09 72 65 74 75 72 6e 20 4d 61 63  1) {..return Mac
4b10: 4c 69 73 74 28 69 6e 74 65 72 70 29 3b 0a 0a 20  List(interp);.. 
4b20: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 6f 62     } else if (ob
4b30: 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 72 65 74 75  jc == 2) {..retu
4b40: 72 6e 20 4d 61 63 49 6e 66 6f 28 69 6e 74 65 72  rn MacInfo(inter
4b50: 70 2c 20 6f 62 6a 76 5b 31 5d 29 3b 0a 0a 20 20  p, objv[1]);..  
4b60: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f    } else {..Tcl_
4b70: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
4b80: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3f  erp, 1, objv, "?
4b90: 6e 61 6d 65 3f 22 29 3b 0a 09 72 65 74 75 72 6e  name?");..return
4ba0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
4bb0: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  }.    return TCL
4bc0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  _OK;.}../*******
4bd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4be0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4bf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4c00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
4c10: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
4c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4c50: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 50 6b  -------. *. * Pk
4c60: 65 79 49 6e 66 6f 20 2d 2d 0a 20 2a 0a 20 2a 09  eyInfo --. *. *.
4c70: 52 65 74 75 72 6e 20 61 20 6c 69 73 74 20 6f 66  Return a list of
4c80: 20 70 72 6f 70 65 72 74 69 65 73 20 61 6e 64 20   properties and 
4c90: 76 61 6c 75 65 73 20 66 6f 72 20 70 6b 65 79 2e  values for pkey.
4ca0: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
4cb0: 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63   *.A standard Tc
4cc0: 6c 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 53 69  l list.. *. * Si
4cd0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e  de effects:. *.N
4ce0: 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  one.. *. *------
4cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
4d30: 2f 0a 69 6e 74 20 50 6b 65 79 49 6e 66 6f 28 54  /.int PkeyInfo(T
4d40: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
4d50: 70 2c 20 54 63 6c 5f 4f 62 6a 20 2a 6e 61 6d 65  p, Tcl_Obj *name
4d60: 4f 62 6a 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f  Obj) {.    Tcl_O
4d70: 62 6a 20 2a 72 65 73 75 6c 74 4f 62 6a 3b 0a 20  bj *resultObj;. 
4d80: 20 20 20 69 6e 74 20 72 65 73 20 3d 20 54 43 4c     int res = TCL
4d90: 5f 4f 4b 3b 0a 20 20 20 20 63 68 61 72 20 2a 6e  _OK;.    char *n
4da0: 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ame = Tcl_GetStr
4db0: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6e 61 6d 65 4f  ingFromObj(nameO
4dc0: 62 6a 2c 20 28 54 63 6c 5f 53 69 7a 65 20 2a 29  bj, (Tcl_Size *)
4dd0: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 45 56 50 5f   NULL);.    EVP_
4de0: 50 4b 45 59 20 2a 70 6b 65 79 20 3d 20 4e 55 4c  PKEY *pkey = NUL
4df0: 4c 3b 0a 0a 20 20 20 20 69 66 20 28 70 6b 65 79  L;..    if (pkey
4e00: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c   == NULL) {..Tcl
4e10: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
4e20: 74 65 72 70 2c 20 22 49 6e 76 61 6c 69 64 20 70  terp, "Invalid p
4e30: 75 62 6c 69 63 20 6b 65 79 20 6d 65 74 68 6f 64  ublic key method
4e40: 20 5c 22 22 2c 20 6e 61 6d 65 2c 20 22 5c 22 22   \"", name, "\""
4e50: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
4e60: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
4e70: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
4e80: 2f 2a 20 47 65 74 20 70 72 6f 70 65 72 74 69 65  /* Get propertie
4e90: 73 20 2a 2f 0a 20 20 20 20 72 65 73 75 6c 74 4f  s */.    resultO
4ea0: 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74  bj = Tcl_NewList
4eb0: 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20  Obj(0, NULL);.  
4ec0: 20 20 69 66 20 28 72 65 73 75 6c 74 4f 62 6a 20    if (resultObj 
4ed0: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75  == NULL) {..retu
4ee0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
4ef0: 20 20 7d 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f    }.    LAPPEND_
4f00: 53 54 52 28 69 6e 74 65 72 70 2c 20 72 65 73 75  STR(interp, resu
4f10: 6c 74 4f 62 6a 2c 20 22 6e 61 6d 65 22 2c 20 4f  ltObj, "name", O
4f20: 42 4a 5f 6e 69 64 32 6c 6e 28 45 56 50 5f 50 4b  BJ_nid2ln(EVP_PK
4f30: 45 59 5f 69 64 28 70 6b 65 79 29 29 2c 20 2d 31  EY_id(pkey)), -1
4f40: 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53  );.    LAPPEND_S
4f50: 54 52 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c  TR(interp, resul
4f60: 74 4f 62 6a 2c 20 22 64 65 73 63 72 69 70 74 69  tObj, "descripti
4f70: 6f 6e 22 2c 20 22 22 2c 20 2d 31 29 3b 0a 20 20  on", "", -1);.  
4f80: 20 20 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e    LAPPEND_INT(in
4f90: 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c  terp, resultObj,
4fa0: 20 22 73 69 7a 65 22 2c 20 45 56 50 5f 50 4b 45   "size", EVP_PKE
4fb0: 59 5f 73 69 7a 65 28 70 6b 65 79 29 29 3b 0a 20  Y_size(pkey));. 
4fc0: 20 20 20 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69     LAPPEND_INT(i
4fd0: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a  nterp, resultObj
4fe0: 2c 20 22 62 69 74 73 22 2c 20 45 56 50 5f 50 4b  , "bits", EVP_PK
4ff0: 45 59 5f 62 69 74 73 28 70 6b 65 79 29 29 3b 0a  EY_bits(pkey));.
5000: 20 20 20 20 4c 41 50 50 45 4e 44 5f 49 4e 54 28      LAPPEND_INT(
5010: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62  interp, resultOb
5020: 6a 2c 20 22 73 65 63 75 72 69 74 79 5f 62 69 74  j, "security_bit
5030: 73 22 2c 20 45 56 50 5f 50 4b 45 59 5f 73 65 63  s", EVP_PKEY_sec
5040: 75 72 69 74 79 5f 62 69 74 73 28 70 6b 65 79 29  urity_bits(pkey)
5050: 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53  );.    LAPPEND_S
5060: 54 52 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c  TR(interp, resul
5070: 74 4f 62 6a 2c 20 22 62 61 73 65 49 64 22 2c 20  tObj, "baseId", 
5080: 4f 42 4a 5f 6e 69 64 32 6c 6e 28 45 56 50 5f 50  OBJ_nid2ln(EVP_P
5090: 4b 45 59 5f 62 61 73 65 5f 69 64 28 70 6b 65 79  KEY_base_id(pkey
50a0: 29 29 2c 20 2d 31 29 3b 0a 20 20 20 20 4c 41 50  )), -1);.    LAP
50b0: 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
50c0: 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 70 72 6f   resultObj, "pro
50d0: 76 69 64 65 72 22 2c 20 22 22 2c 20 2d 31 29 3b  vider", "", -1);
50e0: 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52  .    LAPPEND_STR
50f0: 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f  (interp, resultO
5100: 62 6a 2c 20 22 74 79 70 65 22 2c 20 4f 42 4a 5f  bj, "type", OBJ_
5110: 6e 69 64 32 6c 6e 28 45 56 50 5f 50 4b 45 59 5f  nid2ln(EVP_PKEY_
5120: 74 79 70 65 28 45 56 50 5f 50 4b 45 59 5f 69 64  type(EVP_PKEY_id
5130: 28 70 6b 65 79 29 29 29 2c 20 2d 31 29 3b 0a 0a  (pkey))), -1);..
5140: 20 20 20 20 7b 0a 09 69 6e 74 20 70 6e 69 64 3b      {..int pnid;
5150: 0a 09 69 66 20 28 45 56 50 5f 50 4b 45 59 5f 67  ..if (EVP_PKEY_g
5160: 65 74 5f 64 65 66 61 75 6c 74 5f 64 69 67 65 73  et_default_diges
5170: 74 5f 6e 69 64 28 70 6b 65 79 2c 20 26 70 6e 69  t_nid(pkey, &pni
5180: 64 29 20 3e 20 30 29 20 7b 0a 09 20 20 20 20 4c  d) > 0) {..    L
5190: 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
51a0: 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 64  p, resultObj, "d
51b0: 65 66 61 75 6c 74 5f 64 69 67 65 73 74 22 2c 20  efault_digest", 
51c0: 4f 42 4a 5f 6e 69 64 32 6c 6e 28 70 6e 69 64 29  OBJ_nid2ln(pnid)
51d0: 2c 20 2d 32 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a  , -2);..}.    }.
51e0: 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  .    Tcl_SetObjR
51f0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 72 65  esult(interp, re
5200: 73 75 6c 74 4f 62 6a 29 3b 0a 20 20 20 20 72 65  sultObj);.    re
5210: 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a  turn res;.}../*.
5220: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
5230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5260: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 50 6b 65 79  -----. *. * Pkey
5270: 4c 69 73 74 20 2d 2d 0a 20 2a 0a 20 2a 09 52 65  List --. *. *.Re
5280: 74 75 72 6e 20 61 20 6c 69 73 74 20 6f 66 20 61  turn a list of a
5290: 6c 6c 20 70 75 62 6c 69 63 20 6b 65 79 20 6d 65  ll public key me
52a0: 74 68 6f 64 73 0a 20 2a 0a 20 2a 20 52 65 73 75  thods. *. * Resu
52b0: 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61  lts:. *.A standa
52c0: 72 64 20 54 63 6c 20 6c 69 73 74 2e 0a 20 2a 0a  rd Tcl list.. *.
52d0: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
52e0: 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d  . *.None.. *. *-
52f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5330: 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 50 6b 65 79 4c  --. */.int PkeyL
5340: 69 73 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ist(Tcl_Interp *
5350: 69 6e 74 65 72 70 29 20 7b 0a 20 20 20 20 54 63  interp) {.    Tc
5360: 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 4f 62 6a  l_Obj *resultObj
5370: 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62   = Tcl_NewListOb
5380: 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  j(0, NULL);.    
5390: 69 66 20 28 72 65 73 75 6c 74 4f 62 6a 20 3d 3d  if (resultObj ==
53a0: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e   NULL) {..return
53b0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
53c0: 7d 0a 0a 20 20 20 20 66 6f 72 20 28 73 69 7a 65  }..    for (size
53d0: 5f 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 45 56  _t i = 0; i < EV
53e0: 50 5f 50 4b 45 59 5f 6d 65 74 68 5f 67 65 74 5f  P_PKEY_meth_get_
53f0: 63 6f 75 6e 74 28 29 3b 20 69 2b 2b 29 20 7b 0a  count(); i++) {.
5400: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 45 56          const EV
5410: 50 5f 50 4b 45 59 5f 4d 45 54 48 4f 44 20 2a 70  P_PKEY_METHOD *p
5420: 6d 65 74 68 20 3d 20 45 56 50 5f 50 4b 45 59 5f  meth = EVP_PKEY_
5430: 6d 65 74 68 5f 67 65 74 30 28 69 29 3b 0a 20 20  meth_get0(i);.  
5440: 20 20 20 20 20 20 69 6e 74 20 70 6b 65 79 5f 69        int pkey_i
5450: 64 2c 20 70 6b 65 79 5f 66 6c 61 67 73 3b 0a 0a  d, pkey_flags;..
5460: 20 20 20 20 20 20 20 20 45 56 50 5f 50 4b 45 59          EVP_PKEY
5470: 5f 6d 65 74 68 5f 67 65 74 30 5f 69 6e 66 6f 28  _meth_get0_info(
5480: 26 70 6b 65 79 5f 69 64 2c 20 26 70 6b 65 79 5f  &pkey_id, &pkey_
5490: 66 6c 61 67 73 2c 20 70 6d 65 74 68 29 3b 0a 09  flags, pmeth);..
54a0: 2f 2a 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e  /*LAPPEND_STR(in
54b0: 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c  terp, resultObj,
54c0: 20 22 6e 61 6d 65 22 2c 20 4f 42 4a 5f 6e 69 64   "name", OBJ_nid
54d0: 32 6c 6e 28 70 6b 65 79 5f 69 64 29 2c 20 2d 31  2ln(pkey_id), -1
54e0: 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28  );..LAPPEND_STR(
54f0: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62  interp, resultOb
5500: 6a 2c 20 22 74 79 70 65 22 2c 20 70 6b 65 79 5f  j, "type", pkey_
5510: 66 6c 61 67 73 20 26 20 41 53 4e 31 5f 50 4b 45  flags & ASN1_PKE
5520: 59 5f 44 59 4e 41 4d 49 43 20 3f 20 22 45 78 74  Y_DYNAMIC ? "Ext
5530: 65 72 6e 61 6c 22 20 3a 20 22 42 75 69 6c 74 2d  ernal" : "Built-
5540: 69 6e 22 2c 20 2d 31 29 3b 2a 2f 0a 0a 09 54 63  in", -1);*/...Tc
5550: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
5560: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72  lement(interp, r
5570: 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65  esultObj, Tcl_Ne
5580: 77 53 74 72 69 6e 67 4f 62 6a 28 4f 42 4a 5f 6e  wStringObj(OBJ_n
5590: 69 64 32 6c 6e 28 70 6b 65 79 5f 69 64 29 2c 20  id2ln(pkey_id), 
55a0: 2d 31 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  -1));.    }.    
55b0: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
55c0: 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f  (interp, resultO
55d0: 62 6a 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  bj);.    return 
55e0: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  TCL_OK;.}../*. *
55f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5630: 2d 2d 2d 0a 20 2a 0a 20 2a 20 50 6b 65 79 73 4f  ---. *. * PkeysO
5640: 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 52  bjCmd --. *. *.R
5650: 65 74 75 72 6e 20 61 20 6c 69 73 74 20 6f 66 20  eturn a list of 
5660: 61 6c 6c 20 76 61 6c 69 64 20 68 61 73 68 20 61  all valid hash a
5670: 6c 67 6f 72 69 74 68 6d 73 20 6f 72 20 6d 65 73  lgorithms or mes
5680: 73 61 67 65 20 64 69 67 65 73 74 73 2e 0a 20 2a  sage digests.. *
5690: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
56a0: 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 6c  A standard Tcl l
56b0: 69 73 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  ist.. *. * Side 
56c0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65  effects:. *.None
56d0: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  .. *. *---------
56e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
56f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69  ----------. */.i
5720: 6e 74 20 50 6b 65 79 73 4f 62 6a 43 6d 64 28 43  nt PkeysObjCmd(C
5730: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
5740: 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70  Data, Tcl_Interp
5750: 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62   *interp, int ob
5760: 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e  jc, Tcl_Obj *con
5770: 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20  st objv[]) {.   
5780: 20 28 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 61   (void) clientDa
5790: 74 61 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66  ta;..    dprintf
57a0: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20  ("Called");..   
57b0: 20 2f 2a 20 43 6c 65 61 72 20 65 72 72 6f 72 73   /* Clear errors
57c0: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 52 65 73 65   */.    Tcl_Rese
57d0: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b  tResult(interp);
57e0: 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65  .    ERR_clear_e
57f0: 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 2f 2a 20  rror();..    /* 
5800: 56 61 6c 69 64 61 74 65 20 61 72 67 20 63 6f 75  Validate arg cou
5810: 6e 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f 62  nt */.    if (ob
5820: 6a 63 20 3d 3d 20 31 29 20 7b 0a 09 72 65 74 75  jc == 1) {..retu
5830: 72 6e 20 50 6b 65 79 4c 69 73 74 28 69 6e 74 65  rn PkeyList(inte
5840: 72 70 29 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65  rp);..    } else
5850: 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20   if (objc == 2) 
5860: 7b 0a 09 72 65 74 75 72 6e 20 50 6b 65 79 49 6e  {..return PkeyIn
5870: 66 6f 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  fo(interp, objv[
5880: 31 5d 29 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65  1]);..    } else
5890: 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d   {..Tcl_WrongNum
58a0: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
58b0: 6f 62 6a 76 2c 20 22 3f 6e 61 6d 65 3f 22 29 3b  objv, "?name?");
58c0: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
58d0: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  OR;.    }.    re
58e0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
58f0: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
5900: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5910: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5920: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5930: 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  ****/../*. *----
5940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
5980: 20 2a 0a 20 2a 20 50 72 6f 74 6f 63 6f 6c 73 4f   *. * ProtocolsO
5990: 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 52  bjCmd --. *. *.R
59a0: 65 74 75 72 6e 20 61 20 6c 69 73 74 20 6f 66 20  eturn a list of 
59b0: 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 72  the available or
59c0: 20 73 75 70 70 6f 72 74 65 64 20 53 53 4c 2f 54   supported SSL/T
59d0: 4c 53 20 70 72 6f 74 6f 63 6f 6c 73 2e 0a 20 2a  LS protocols.. *
59e0: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
59f0: 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 6c  A standard Tcl l
5a00: 69 73 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  ist.. *. * Side 
5a10: 65 66 66 65 63 74 73 3a 0a 20 2a 09 6e 6f 6e 65  effects:. *.none
5a20: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
5a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74  ---------. */.st
5a70: 61 74 69 63 20 69 6e 74 0a 50 72 6f 74 6f 63 6f  atic int.Protoco
5a80: 6c 73 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44  lsObjCmd(ClientD
5a90: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
5aa0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
5ab0: 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63  rp, int objc, Tc
5ac0: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a  l_Obj *const obj
5ad0: 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f  v[]) {.    Tcl_O
5ae0: 62 6a 20 2a 72 65 73 75 6c 74 4f 62 6a 3b 0a 20  bj *resultObj;. 
5af0: 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65 6e 74     (void) client
5b00: 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 72 69 6e  Data;..    dprin
5b10: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20  tf("Called");.. 
5b20: 20 20 20 2f 2a 20 43 6c 65 61 72 20 65 72 72 6f     /* Clear erro
5b30: 72 73 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 52 65  rs */.    Tcl_Re
5b40: 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  setResult(interp
5b50: 29 3b 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72  );.    ERR_clear
5b60: 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 2f  _error();..    /
5b70: 2a 20 56 61 6c 69 64 61 74 65 20 61 72 67 20 63  * Validate arg c
5b80: 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 69 66 20 28  ount */.    if (
5b90: 6f 62 6a 63 20 21 3d 20 31 29 20 7b 0a 09 54 63  objc != 1) {..Tc
5ba0: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
5bb0: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
5bc0: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54  NULL);..return T
5bd0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
5be0: 0a 20 20 20 20 2f 2a 20 4c 69 73 74 20 61 6c 6c  .    /* List all
5bf0: 20 70 72 6f 74 6f 63 6f 6c 73 20 2a 2f 0a 20 20   protocols */.  
5c00: 20 20 72 65 73 75 6c 74 4f 62 6a 20 3d 20 54 63    resultObj = Tc
5c10: 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20  l_NewListObj(0, 
5c20: 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 72  NULL);.    if (r
5c30: 65 73 75 6c 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c  esultObj == NULL
5c40: 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  ) {..return TCL_
5c50: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 23 69 66  ERROR;.    }.#if
5c60: 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e   OPENSSL_VERSION
5c70: 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30  _NUMBER < 0x1010
5c80: 30 30 30 30 4c 20 26 26 20 21 64 65 66 69 6e 65  0000L && !define
5c90: 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64  d(NO_SSL2) && !d
5ca0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
5cb0: 4f 5f 53 53 4c 32 29 0a 20 20 20 20 54 63 6c 5f  O_SSL2).    Tcl_
5cc0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
5cd0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 65 73  ment(interp, res
5ce0: 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 53  ultObj, Tcl_NewS
5cf0: 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f  tringObj(protoco
5d00: 6c 73 5b 54 4c 53 5f 53 53 4c 32 5d 2c 20 2d 31  ls[TLS_SSL2], -1
5d10: 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21  ));.#endif.#if !
5d20: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29  defined(NO_SSL3)
5d30: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
5d40: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 26 26  NSSL_NO_SSL3) &&
5d50: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
5d60: 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44  L_NO_SSL3_METHOD
5d70: 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ).    Tcl_ListOb
5d80: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
5d90: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a  nterp, resultObj
5da0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
5db0: 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53  bj(protocols[TLS
5dc0: 5f 53 53 4c 33 5d 2c 20 2d 31 29 29 3b 0a 23 65  _SSL3], -1));.#e
5dd0: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65  ndif.#if !define
5de0: 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64  d(NO_TLS1) && !d
5df0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
5e00: 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66 69  O_TLS1) && !defi
5e10: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
5e20: 4c 53 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20  LS1_METHOD).    
5e30: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
5e40: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
5e50: 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f   resultObj, Tcl_
5e60: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f  NewStringObj(pro
5e70: 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5d  tocols[TLS_TLS1]
5e80: 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23  , -1));.#endif.#
5e90: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54  if !defined(NO_T
5ea0: 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e  LS1_1) && !defin
5eb0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
5ec0: 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65  S1_1) && !define
5ed0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
5ee0: 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20  1_1_METHOD).    
5ef0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
5f00: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
5f10: 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f   resultObj, Tcl_
5f20: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f  NewStringObj(pro
5f30: 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f  tocols[TLS_TLS1_
5f40: 31 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66  1], -1));.#endif
5f50: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f  .#if !defined(NO
5f60: 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66  _TLS1_2) && !def
5f70: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
5f80: 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 69  TLS1_2) && !defi
5f90: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
5fa0: 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 20 20  LS1_2_METHOD).  
5fb0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
5fc0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
5fd0: 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63  p, resultObj, Tc
5fe0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70  l_NewStringObj(p
5ff0: 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53  rotocols[TLS_TLS
6000: 31 5f 32 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64  1_2], -1));.#end
6010: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  if.#if !defined(
6020: 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64  NO_TLS1_3) && !d
6030: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
6040: 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 54 63  O_TLS1_3).    Tc
6050: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
6060: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72  lement(interp, r
6070: 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65  esultObj, Tcl_Ne
6080: 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f  wStringObj(proto
6090: 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f 33 5d  cols[TLS_TLS1_3]
60a0: 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 20  , -1));.#endif. 
60b0: 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
60c0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 72 65 73 75  ult(interp, resu
60d0: 6c 74 4f 62 6a 29 3b 0a 20 20 20 20 72 65 74 75  ltObj);.    retu
60e0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
60f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6100: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6110: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6130: 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  **/../*. *------
6140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
6180: 0a 20 2a 20 56 65 72 73 69 6f 6e 4f 62 6a 43 6d  . * VersionObjCm
6190: 64 20 2d 2d 0a 20 2a 0a 20 2a 09 52 65 74 75 72  d --. *. *.Retur
61a0: 6e 20 61 20 73 74 72 69 6e 67 20 77 69 74 68 20  n a string with 
61b0: 74 68 65 20 4f 70 65 6e 53 53 4c 20 76 65 72 73  the OpenSSL vers
61c0: 69 6f 6e 20 69 6e 66 6f 2e 0a 20 2a 0a 20 2a 20  ion info.. *. * 
61d0: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74  Results:. *.A st
61e0: 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c  andard Tcl resul
61f0: 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  t.. *. * Side ef
6200: 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a  fects:. *.None..
6210: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
6220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 20 2a 2f 0a 73 74 61  --------. */.sta
6260: 74 69 63 20 69 6e 74 0a 56 65 72 73 69 6f 6e 4f  tic int.VersionO
6270: 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61  bjCmd(ClientData
6280: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c   clientData, Tcl
6290: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
62a0: 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f   int objc, Tcl_O
62b0: 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d  bj *const objv[]
62c0: 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  ) {.    Tcl_Obj 
62d0: 2a 72 65 73 75 6c 74 4f 62 6a 3b 0a 20 20 20 20  *resultObj;.    
62e0: 28 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 74  (void) clientDat
62f0: 61 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  a;..    dprintf(
6300: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20  "Called");..    
6310: 2f 2a 20 56 61 6c 69 64 61 74 65 20 61 72 67 20  /* Validate arg 
6320: 63 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 69 66 20  count */.    if 
6330: 28 6f 62 6a 63 20 21 3d 20 31 29 20 7b 0a 09 54  (objc != 1) {..T
6340: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
6350: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
6360: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20   NULL);..return 
6370: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
6380: 0a 0a 20 20 20 20 72 65 73 75 6c 74 4f 62 6a 20  ..    resultObj 
6390: 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  = Tcl_NewStringO
63a0: 62 6a 28 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49  bj(OPENSSL_VERSI
63b0: 4f 4e 5f 54 45 58 54 2c 20 2d 31 29 3b 0a 20 20  ON_TEXT, -1);.  
63c0: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
63d0: 6c 74 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c  lt(interp, resul
63e0: 74 4f 62 6a 29 3b 0a 20 20 20 20 72 65 74 75 72  tObj);.    retur
63f0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 2a  n TCL_OK;.}../**
6400: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6410: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6420: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6430: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6440: 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  */../*. *-------
6450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
6490: 20 2a 20 54 6c 73 5f 49 6e 66 6f 43 6f 6d 6d 61   * Tls_InfoComma
64a0: 6e 64 73 20 2d 2d 0a 20 2a 0a 20 2a 09 43 72 65  nds --. *. *.Cre
64b0: 61 74 65 20 69 6e 66 6f 20 63 6f 6d 6d 61 6e 64  ate info command
64c0: 73 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a  s. *. * Returns:
64d0: 0a 20 2a 09 54 43 4c 5f 4f 4b 20 6f 72 20 54 43  . *.TCL_OK or TC
64e0: 4c 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a 20 53 69  L_ERROR. *. * Si
64f0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43  de effects:. *.C
6500: 72 65 61 74 65 73 20 63 6f 6d 6d 61 6e 64 73 0a  reates commands.
6510: 20 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6550: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74  --------. */.int
6560: 20 54 6c 73 5f 49 6e 66 6f 43 6f 6d 6d 61 6e 64   Tls_InfoCommand
6570: 73 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  s(Tcl_Interp *in
6580: 74 65 72 70 29 20 7b 0a 0a 23 69 66 20 4f 50 45  terp) {..#if OPE
6590: 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d  NSSL_VERSION_NUM
65a0: 42 45 52 20 3c 20 30 78 31 30 31 30 30 30 30 30  BER < 0x10100000
65b0: 4c 0a 20 20 20 20 4f 70 65 6e 53 53 4c 5f 61 64  L.    OpenSSL_ad
65c0: 64 5f 61 6c 6c 5f 63 69 70 68 65 72 73 28 29 3b  d_all_ciphers();
65d0: 0a 20 20 20 20 4f 70 65 6e 53 53 4c 5f 61 64 64  .    OpenSSL_add
65e0: 5f 61 6c 6c 5f 64 69 67 65 73 74 73 28 29 3b 0a  _all_digests();.
65f0: 20 20 20 20 4f 70 65 6e 53 53 4c 5f 61 64 64 5f      OpenSSL_add_
6600: 61 6c 6c 5f 61 6c 67 6f 72 69 74 68 6d 73 28 29  all_algorithms()
6610: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 54 63  ;.#endif..    Tc
6620: 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61  l_CreateObjComma
6630: 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a  nd(interp, "tls:
6640: 3a 63 69 70 68 65 72 22 2c 20 43 69 70 68 65 72  :cipher", Cipher
6650: 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44  ObjCmd, (ClientD
6660: 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f  ata) NULL, (Tcl_
6670: 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29  CmdDeleteProc *)
6680: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f   NULL);.    Tcl_
6690: 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64  CreateObjCommand
66a0: 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 63  (interp, "tls::c
66b0: 69 70 68 65 72 73 22 2c 20 43 69 70 68 65 72 73  iphers", Ciphers
66c0: 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44  ObjCmd, (ClientD
66d0: 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f  ata) NULL, (Tcl_
66e0: 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29  CmdDeleteProc *)
66f0: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f   NULL);.    Tcl_
6700: 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64  CreateObjCommand
6710: 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 64  (interp, "tls::d
6720: 69 67 65 73 74 73 22 2c 20 44 69 67 65 73 74 73  igests", Digests
6730: 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44  ObjCmd, (ClientD
6740: 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f  ata) NULL, (Tcl_
6750: 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29  CmdDeleteProc *)
6760: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f   NULL);.    Tcl_
6770: 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64  CreateObjCommand
6780: 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 6b  (interp, "tls::k
6790: 64 66 73 22 2c 20 4b 64 66 73 4f 62 6a 43 6d 64  dfs", KdfsObjCmd
67a0: 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e  , (ClientData) N
67b0: 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c  ULL, (Tcl_CmdDel
67c0: 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29  eteProc *) NULL)
67d0: 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65  ;.    Tcl_Create
67e0: 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
67f0: 70 2c 20 22 74 6c 73 3a 3a 6d 61 63 73 22 2c 20  p, "tls::macs", 
6800: 4d 61 63 73 4f 62 6a 43 6d 64 2c 20 28 43 6c 69  MacsObjCmd, (Cli
6810: 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28  entData) NULL, (
6820: 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f  Tcl_CmdDeletePro
6830: 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  c *) NULL);.    
6840: 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d  Tcl_CreateObjCom
6850: 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c  mand(interp, "tl
6860: 73 3a 3a 70 6b 65 79 73 22 2c 20 50 6b 65 79 73  s::pkeys", Pkeys
6870: 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44  ObjCmd, (ClientD
6880: 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f  ata) NULL, (Tcl_
6890: 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29  CmdDeleteProc *)
68a0: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f   NULL);.    Tcl_
68b0: 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64  CreateObjCommand
68c0: 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 70  (interp, "tls::p
68d0: 72 6f 74 6f 63 6f 6c 73 22 2c 20 50 72 6f 74 6f  rotocols", Proto
68e0: 63 6f 6c 73 4f 62 6a 43 6d 64 2c 20 28 43 6c 69  colsObjCmd, (Cli
68f0: 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28  entData) NULL, (
6900: 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f  Tcl_CmdDeletePro
6910: 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  c *) NULL);.    
6920: 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d  Tcl_CreateObjCom
6930: 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c  mand(interp, "tl
6940: 73 3a 3a 76 65 72 73 69 6f 6e 22 2c 20 56 65 72  s::version", Ver
6950: 73 69 6f 6e 4f 62 6a 43 6d 64 2c 20 28 43 6c 69  sionObjCmd, (Cli
6960: 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28  entData) NULL, (
6970: 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f  Tcl_CmdDeletePro
6980: 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  c *) NULL);.    
6990: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
69a0: 0a 0a                                            ..