Hex Artifact Content

Artifact e53726131af7b3cafca912372d79e4299abe69859580856405033178636b5988:


0000: 2f 2a 0a 20 2a 20 44 69 67 65 73 74 20 43 6f 6d  /*. * Digest Com
0010: 6d 61 6e 64 73 0a 20 2a 0a 20 2a 20 43 6f 70 79  mands. *. * Copy
0020: 72 69 67 68 74 20 28 43 29 20 32 30 32 33 20 42  right (C) 2023 B
0030: 72 69 61 6e 20 4f 27 48 61 67 61 6e 0a 20 2a 0a  rian O'Hagan. *.
0040: 20 2a 2f 0a 0a 23 69 6e 63 6c 75 64 65 20 22 74   */..#include "t
0050: 6c 73 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64  lsInt.h".#includ
0060: 65 20 3c 74 63 6c 2e 68 3e 0a 23 69 6e 63 6c 75  e <tcl.h>.#inclu
0070: 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 6e  de <stdio.h>.#in
0080: 63 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e  clude <string.h>
0090: 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73  .#include <opens
00a0: 73 6c 2f 65 76 70 2e 68 3e 0a 0a 2f 2a 20 43 6f  sl/evp.h>../* Co
00b0: 6e 73 74 61 6e 74 73 20 2a 2f 0a 63 6f 6e 73 74  nstants */.const
00c0: 20 63 68 61 72 20 2a 68 65 78 20 3d 20 22 30 31   char *hex = "01
00d0: 32 33 34 35 36 37 38 39 41 42 43 44 45 46 22 3b  23456789ABCDEF";
00e0: 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .../************
00f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0100: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0110: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0120: 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d  *******/../*. *-
0130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0170: 2d 2d 0a 20 2a 0a 20 2a 20 48 61 73 68 20 43 61  --. *. * Hash Ca
0180: 6c 63 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 63  lc --. *. *.Calc
0190: 75 6c 61 74 65 20 6d 65 73 73 61 67 65 20 64 69  ulate message di
01a0: 67 65 73 74 20 6f 66 20 64 61 74 61 20 75 73 69  gest of data usi
01b0: 6e 67 20 74 79 70 65 20 68 61 73 68 20 61 6c 67  ng type hash alg
01c0: 6f 72 69 74 68 6d 2e 0a 20 2a 0a 20 2a 20 52 65  orithm.. *. * Re
01d0: 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e  sults:. *.A stan
01e0: 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e  dard Tcl result.
01f0: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
0200: 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a  cts:. *.None.. *
0210: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
0220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0250: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 0a 48  ------. */.int.H
0260: 61 73 68 43 61 6c 63 28 54 63 6c 5f 49 6e 74 65  ashCalc(Tcl_Inte
0270: 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20  rp *interp, int 
0280: 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63  objc, Tcl_Obj *c
0290: 6f 6e 73 74 20 6f 62 6a 76 5b 5d 2c 20 63 6f 6e  onst objv[], con
02a0: 73 74 20 45 56 50 5f 4d 44 20 2a 74 79 70 65 29  st EVP_MD *type)
02b0: 20 7b 0a 20 20 20 20 63 68 61 72 20 2a 64 61 74   {.    char *dat
02c0: 61 3b 0a 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a  a;.    int len;.
02d0: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74      unsigned int
02e0: 20 6d 64 6c 65 6e 3b 0a 20 20 20 20 75 6e 73 69   mdlen;.    unsi
02f0: 67 6e 65 64 20 63 68 61 72 20 6d 64 62 75 66 5b  gned char mdbuf[
0300: 45 56 50 5f 4d 41 58 5f 4d 44 5f 53 49 5a 45 5d  EVP_MAX_MD_SIZE]
0310: 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20  ;..    if (objc 
0320: 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f  != 2) {..Tcl_Wro
0330: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
0340: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 64 61 74 61  , 1, objv, "data
0350: 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  ");..return TCL_
0360: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
0370: 20 20 2f 2a 20 47 65 74 20 64 61 74 61 20 2a 2f    /* Get data */
0380: 0a 20 20 20 20 64 61 74 61 20 3d 20 54 63 6c 5f  .    data = Tcl_
0390: 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d  GetByteArrayFrom
03a0: 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 26 6c 65  Obj(objv[1], &le
03b0: 6e 29 3b 0a 20 20 20 20 69 66 20 28 64 61 74 61  n);.    if (data
03c0: 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 6c 65 6e 20   == NULL || len 
03d0: 3d 3d 20 30 29 20 7b 0a 09 54 63 6c 5f 53 65 74  == 0) {..Tcl_Set
03e0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
03f0: 4e 6f 20 64 61 74 61 22 2c 20 4e 55 4c 4c 29 3b  No data", NULL);
0400: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
0410: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  OR;.    }..    /
0420: 2a 20 43 61 6c 63 75 6c 61 74 65 20 68 61 73 68  * Calculate hash
0430: 20 76 61 6c 75 65 2c 20 63 72 65 61 74 65 20 68   value, create h
0440: 65 78 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ex representatio
0450: 6e 2c 20 61 6e 64 20 77 72 69 74 65 20 74 6f 20  n, and write to 
0460: 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20 69 66  result */.    if
0470: 20 28 45 56 50 5f 44 69 67 65 73 74 28 64 61 74   (EVP_Digest(dat
0480: 61 2c 20 28 73 69 7a 65 5f 74 29 20 6c 65 6e 2c  a, (size_t) len,
0490: 20 6d 64 62 75 66 2c 20 26 6d 64 6c 65 6e 2c 20   mdbuf, &mdlen, 
04a0: 74 79 70 65 2c 20 4e 55 4c 4c 29 29 20 7b 0a 09  type, NULL)) {..
04b0: 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 4f  Tcl_Obj *resultO
04c0: 62 6a 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68  bj;..unsigned ch
04d0: 61 72 20 2a 70 74 72 3b 0a 09 72 65 73 75 6c 74  ar *ptr;..result
04e0: 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a  Obj = Tcl_NewObj
04f0: 28 29 3b 0a 09 70 74 72 20 3d 20 54 63 6c 5f 53  ();..ptr = Tcl_S
0500: 65 74 42 79 74 65 41 72 72 61 79 4c 65 6e 67 74  etByteArrayLengt
0510: 68 28 72 65 73 75 6c 74 4f 62 6a 2c 20 6d 64 6c  h(resultObj, mdl
0520: 65 6e 2a 32 29 3b 0a 0a 09 66 6f 72 20 28 75 6e  en*2);...for (un
0530: 73 69 67 6e 65 64 20 69 6e 74 20 69 20 3d 20 30  signed int i = 0
0540: 3b 20 69 20 3c 20 6d 64 6c 65 6e 3b 20 69 2b 2b  ; i < mdlen; i++
0550: 29 20 7b 0a 09 20 20 20 20 2a 70 74 72 2b 2b 20  ) {..    *ptr++ 
0560: 3d 20 68 65 78 5b 28 6d 64 62 75 66 5b 69 5d 20  = hex[(mdbuf[i] 
0570: 3e 3e 20 34 29 20 26 20 30 78 30 46 5d 3b 0a 09  >> 4) & 0x0F];..
0580: 20 20 20 20 2a 70 74 72 2b 2b 20 3d 20 68 65 78      *ptr++ = hex
0590: 5b 6d 64 62 75 66 5b 69 5d 20 26 20 30 78 30 46  [mdbuf[i] & 0x0F
05a0: 5d 3b 0a 09 7d 0a 09 54 63 6c 5f 53 65 74 4f 62  ];..}..Tcl_SetOb
05b0: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
05c0: 72 65 73 75 6c 74 4f 62 6a 29 3b 0a 20 20 20 20  resultObj);.    
05d0: 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 53 65  } else {..Tcl_Se
05e0: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
05f0: 22 48 61 73 68 20 63 61 6c 63 75 6c 61 74 69 6f  "Hash calculatio
0600: 6e 20 65 72 72 6f 72 22 2c 20 4e 55 4c 4c 29 3b  n error", NULL);
0610: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
0620: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  OR;.    }.    re
0630: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
0640: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
0650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0680: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 48  --------. *. * H
0690: 61 73 68 20 43 6f 6d 6d 61 6e 64 73 20 2d 2d 0a  ash Commands --.
06a0: 20 2a 0a 20 2a 09 52 65 74 75 72 6e 20 74 68 65   *. *.Return the
06b0: 20 64 69 67 65 73 74 20 61 73 20 61 20 68 65 78   digest as a hex
06c0: 20 73 74 72 69 6e 67 20 66 6f 72 20 64 61 74 61   string for data
06d0: 20 75 73 69 6e 67 20 74 79 70 65 20 6d 65 73 73   using type mess
06e0: 61 67 65 20 64 69 67 65 73 74 2e 0a 20 2a 0a 20  age digest.. *. 
06f0: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20  * Results:. *.A 
0700: 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73  standard Tcl res
0710: 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  ult.. *. * Side 
0720: 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65  effects:. *.None
0730: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  .. *. *---------
0740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 44  ----------. */.D
0780: 69 67 65 73 74 4f 62 6a 43 6d 64 28 43 6c 69 65  igestObjCmd(Clie
0790: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
07a0: 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  a, Tcl_Interp *i
07b0: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c  nterp, int objc,
07c0: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20   Tcl_Obj *const 
07d0: 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 69 6e  objv[]) {.    in
07e0: 74 20 6c 65 6e 3b 0a 20 20 20 20 63 6f 6e 73 74  t len;.    const
07f0: 20 63 68 61 72 20 2a 6e 61 6d 65 3b 0a 20 20 20   char *name;.   
0800: 20 63 6f 6e 73 74 20 45 56 50 5f 4d 44 20 2a 74   const EVP_MD *t
0810: 79 70 65 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62  ype;..    if (ob
0820: 6a 63 20 21 3d 20 33 29 20 7b 0a 09 54 63 6c 5f  jc != 3) {..Tcl_
0830: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
0840: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 74  erp, 1, objv, "t
0850: 79 70 65 20 64 61 74 61 22 29 3b 0a 09 72 65 74  ype data");..ret
0860: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
0870: 20 20 20 7d 0a 0a 20 20 20 20 6e 61 6d 65 20 3d     }..    name =
0880: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
0890: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 26 6c  omObj(objv[1],&l
08a0: 65 6e 29 3b 0a 20 20 20 20 69 66 20 28 6e 61 6d  en);.    if (nam
08b0: 65 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 28 74 79  e == NULL || (ty
08c0: 70 65 20 3d 20 45 56 50 5f 67 65 74 5f 64 69 67  pe = EVP_get_dig
08d0: 65 73 74 62 79 6e 61 6d 65 28 6e 61 6d 65 29 29  estbyname(name))
08e0: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c   == NULL) {..Tcl
08f0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
0900: 74 65 72 70 2c 20 22 49 6e 76 61 6c 69 64 20 64  terp, "Invalid d
0910: 69 67 65 73 74 20 74 79 70 65 20 5c 22 22 2c 20  igest type \"", 
0920: 6e 61 6d 65 2c 20 22 5c 22 22 2c 20 4e 55 4c 4c  name, "\"", NULL
0930: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  );..return TCL_E
0940: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
0950: 6f 62 6a 63 2d 2d 3b 0a 20 20 20 20 6f 62 6a 76  objc--;.    objv
0960: 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 48  ++;.    return H
0970: 61 73 68 43 61 6c 63 28 69 6e 74 65 72 70 2c 20  ashCalc(interp, 
0980: 6f 62 6a 63 2c 20 6f 62 6a 76 2c 20 74 79 70 65  objc, objv, type
0990: 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 43 6f 6d 6d  );.}../*. * Comm
09a0: 61 6e 64 20 74 6f 20 43 61 6c 63 75 6c 61 74 65  and to Calculate
09b0: 20 4d 44 34 20 4d 65 73 73 61 67 65 20 44 69 67   MD4 Message Dig
09c0: 65 73 74 0a 20 2a 2f 0a 69 6e 74 0a 44 69 67 65  est. */.int.Dige
09d0: 73 74 4d 44 34 43 6d 64 28 43 6c 69 65 6e 74 44  stMD4Cmd(ClientD
09e0: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
09f0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
0a00: 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63  rp, int objc, Tc
0a10: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a  l_Obj *const obj
0a20: 76 5b 5d 29 20 7b 0a 20 20 20 20 72 65 74 75 72  v[]) {.    retur
0a30: 6e 20 48 61 73 68 43 61 6c 63 28 69 6e 74 65 72  n HashCalc(inter
0a40: 70 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 2c 20 45  p, objc, objv, E
0a50: 56 50 5f 6d 64 34 28 29 29 3b 0a 7d 0a 0a 2f 2a  VP_md4());.}../*
0a60: 0a 20 2a 20 43 6f 6d 6d 61 6e 64 20 74 6f 20 43  . * Command to C
0a70: 61 6c 63 75 6c 61 74 65 20 4d 44 35 20 4d 65 73  alculate MD5 Mes
0a80: 73 61 67 65 20 44 69 67 65 73 74 0a 20 2a 2f 0a  sage Digest. */.
0a90: 69 6e 74 0a 44 69 67 65 73 74 4d 44 35 43 6d 64  int.DigestMD5Cmd
0aa0: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65  (ClientData clie
0ab0: 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65  ntData, Tcl_Inte
0ac0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20  rp *interp, int 
0ad0: 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63  objc, Tcl_Obj *c
0ae0: 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20  onst objv[]) {. 
0af0: 20 20 20 72 65 74 75 72 6e 20 48 61 73 68 43 61     return HashCa
0b00: 6c 63 28 69 6e 74 65 72 70 2c 20 6f 62 6a 63 2c  lc(interp, objc,
0b10: 20 6f 62 6a 76 2c 20 45 56 50 5f 6d 64 35 28 29   objv, EVP_md5()
0b20: 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 43 6f 6d 6d  );.}../*. * Comm
0b30: 61 6e 64 20 74 6f 20 43 61 6c 63 75 6c 61 74 65  and to Calculate
0b40: 20 53 48 41 2d 31 20 48 61 73 68 0a 20 2a 2f 0a   SHA-1 Hash. */.
0b50: 69 6e 74 0a 44 69 67 65 73 74 53 48 41 31 43 6d  int.DigestSHA1Cm
0b60: 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69  d(ClientData cli
0b70: 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74  entData, Tcl_Int
0b80: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74  erp *interp, int
0b90: 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a   objc, Tcl_Obj *
0ba0: 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a  const objv[]) {.
0bb0: 20 20 20 20 72 65 74 75 72 6e 20 48 61 73 68 43      return HashC
0bc0: 61 6c 63 28 69 6e 74 65 72 70 2c 20 6f 62 6a 63  alc(interp, objc
0bd0: 2c 20 6f 62 6a 76 2c 20 45 56 50 5f 73 68 61 31  , objv, EVP_sha1
0be0: 28 29 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 43 6f  ());.}../*. * Co
0bf0: 6d 6d 61 6e 64 20 74 6f 20 43 61 6c 63 75 6c 61  mmand to Calcula
0c00: 74 65 20 53 48 41 32 20 53 48 41 2d 32 35 36 20  te SHA2 SHA-256 
0c10: 48 61 73 68 0a 20 2a 2f 0a 69 6e 74 0a 44 69 67  Hash. */.int.Dig
0c20: 65 73 74 53 48 41 32 35 36 43 6d 64 28 43 6c 69  estSHA256Cmd(Cli
0c30: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
0c40: 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ta, Tcl_Interp *
0c50: 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63  interp, int objc
0c60: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74  , Tcl_Obj *const
0c70: 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 72   objv[]) {.    r
0c80: 65 74 75 72 6e 20 48 61 73 68 43 61 6c 63 28 69  eturn HashCalc(i
0c90: 6e 74 65 72 70 2c 20 6f 62 6a 63 2c 20 6f 62 6a  nterp, objc, obj
0ca0: 76 2c 20 45 56 50 5f 73 68 61 32 35 36 28 29 29  v, EVP_sha256())
0cb0: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  ;.}../*. *------
0cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
0d00: 0a 20 2a 20 54 6c 73 5f 44 69 67 65 73 74 43 6f  . * Tls_DigestCo
0d10: 6d 6d 61 6e 64 73 20 2d 2d 0a 20 2a 0a 20 2a 09  mmands --. *. *.
0d20: 43 72 65 61 74 65 20 64 69 67 65 73 74 20 63 6f  Create digest co
0d30: 6d 6d 61 6e 64 73 0a 20 2a 0a 20 2a 20 52 65 74  mmands. *. * Ret
0d40: 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20  urns:. *.TCL_OK 
0d50: 6f 72 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a  or TCL_ERROR. *.
0d60: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
0d70: 0a 20 2a 09 43 72 65 61 74 65 73 20 63 6f 6d 6d  . *.Creates comm
0d80: 61 6e 64 73 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  ands. *. *------
0d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
0dd0: 2f 0a 69 6e 74 20 54 6c 73 5f 44 69 67 65 73 74  /.int Tls_Digest
0de0: 43 6f 6d 6d 61 6e 64 73 28 54 63 6c 5f 49 6e 74  Commands(Tcl_Int
0df0: 65 72 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20  erp *interp) {. 
0e00: 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a     Tcl_CreateObj
0e10: 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
0e20: 22 74 6c 73 3a 3a 64 69 67 65 73 74 22 2c 20 44  "tls::digest", D
0e30: 69 67 65 73 74 4f 62 6a 43 6d 64 2c 20 28 43 6c  igestObjCmd, (Cl
0e40: 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63  ientData) 0, (Tc
0e50: 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20  l_CmdDeleteProc 
0e60: 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63  *) NULL);.    Tc
0e70: 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61  l_CreateObjComma
0e80: 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a  nd(interp, "tls:
0e90: 3a 6d 64 34 22 2c 20 44 69 67 65 73 74 4d 44 34  :md4", DigestMD4
0ea0: 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61  Cmd, (ClientData
0eb0: 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c  ) 0, (Tcl_CmdDel
0ec0: 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29  eteProc *) NULL)
0ed0: 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65  ;.    Tcl_Create
0ee0: 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
0ef0: 70 2c 20 22 74 6c 73 3a 3a 6d 64 35 22 2c 20 44  p, "tls::md5", D
0f00: 69 67 65 73 74 4d 44 35 43 6d 64 2c 20 28 43 6c  igestMD5Cmd, (Cl
0f10: 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63  ientData) 0, (Tc
0f20: 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20  l_CmdDeleteProc 
0f30: 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63  *) NULL);.    Tc
0f40: 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61  l_CreateObjComma
0f50: 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a  nd(interp, "tls:
0f60: 3a 73 68 61 31 22 2c 20 44 69 67 65 73 74 53 48  :sha1", DigestSH
0f70: 41 31 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61  A1Cmd, (ClientDa
0f80: 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44  ta) 0, (Tcl_CmdD
0f90: 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c  eleteProc *) NUL
0fa0: 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61  L);.    Tcl_Crea
0fb0: 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74  teObjCommand(int
0fc0: 65 72 70 2c 20 22 74 6c 73 3a 3a 73 68 61 32 35  erp, "tls::sha25
0fd0: 36 22 2c 20 44 69 67 65 73 74 53 48 41 32 35 36  6", DigestSHA256
0fe0: 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61  Cmd, (ClientData
0ff0: 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c  ) 0, (Tcl_CmdDel
1000: 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29  eteProc *) NULL)
1010: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1020: 5f 4f 4b 3b 0a 7d 0a 0a                          _OK;.}..