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;.}..