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 22 74 63 6c 4f 70 74 73 2e 68 22 0a 23 69 e "tclOpts.h".#i
0070: 6e 63 6c 75 64 65 20 3c 74 63 6c 2e 68 3e 0a 23 nclude <tcl.h>.#
0080: 69 6e 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 include <stdio.h
0090: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 >.#include <stri
00a0: 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c ng.h>.#include <
00b0: 6f 70 65 6e 73 73 6c 2f 65 76 70 2e 68 3e 0a 0a openssl/evp.h>..
00c0: 2f 2a 20 43 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a /* Constants */.
00d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 68 65 78 20 const char *hex
00e0: 3d 20 22 30 31 32 33 34 35 36 37 38 39 41 42 43 = "0123456789ABC
00f0: 44 45 46 22 3b 0a 23 64 65 66 69 6e 65 20 52 45 DEF";.#define RE
0100: 41 53 4f 4e 28 29 09 45 52 52 5f 72 65 61 73 6f ASON().ERR_reaso
0110: 6e 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 45 n_error_string(E
0120: 52 52 5f 67 65 74 5f 65 72 72 6f 72 28 29 29 0a RR_get_error()).
0130: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ../*************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0170: 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d ******/../*. *--
0180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
01a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
01b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
01c0: 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 46 69 -. *. * DigestFi
01d0: 6c 65 20 2d 2d 0a 20 2a 0a 20 2a 09 52 65 74 75 le --. *. *.Retu
01e0: 72 6e 20 6d 65 73 73 61 67 65 20 64 69 67 65 73 rn message diges
01f0: 74 20 66 6f 72 20 66 69 6c 65 20 75 73 69 6e 67 t for file using
0200: 20 75 73 65 72 20 73 70 65 63 69 66 69 65 64 20 user specified
0210: 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 hash function..
0220: 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a *. * Returns:. *
0230: 09 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 .TCL_OK or TCL_E
0240: 52 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 65 20 RROR. *. * Side
0250: 65 66 66 65 63 74 73 3a 0a 20 2a 09 52 65 73 75 effects:. *.Resu
0260: 6c 74 20 69 73 20 6d 65 73 73 61 67 65 20 64 69 lt is message di
0270: 67 65 73 74 20 6f 72 20 65 72 72 6f 72 20 6d 65 gest or error me
0280: 73 73 61 67 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d ssage. *. *-----
0290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
02a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
02b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
02c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
02d0: 2a 2f 0a 69 6e 74 0a 44 69 67 65 73 74 46 69 6c */.int.DigestFil
02e0: 65 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e e(Tcl_Interp *in
02f0: 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 20 2a 66 terp, Tcl_Obj *f
0300: 69 6c 65 6e 61 6d 65 2c 20 63 6f 6e 73 74 20 45 ilename, const E
0310: 56 50 5f 4d 44 20 2a 6d 64 2c 20 69 6e 74 20 66 VP_MD *md, int f
0320: 6f 72 6d 61 74 29 20 7b 0a 20 20 20 20 45 56 50 ormat) {. EVP
0330: 5f 4d 44 5f 43 54 58 20 2a 63 74 78 3b 0a 20 20 _MD_CTX *ctx;.
0340: 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 Tcl_Channel ch
0350: 61 6e 3b 0a 20 20 20 20 63 68 61 72 20 62 75 66 an;. char buf
0360: 5b 33 32 37 36 38 5d 3b 0a 20 20 20 20 75 6e 73 [32768];. uns
0370: 69 67 6e 65 64 20 63 68 61 72 20 6d 64 5f 62 75 igned char md_bu
0380: 66 5b 45 56 50 5f 4d 41 58 5f 4d 44 5f 53 49 5a f[EVP_MAX_MD_SIZ
0390: 45 5d 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 E];. unsigned
03a0: 20 69 6e 74 20 6d 64 5f 6c 65 6e 3b 0a 0a 20 20 int md_len;..
03b0: 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 63 /* Open file c
03c0: 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 hannel */. ch
03d0: 61 6e 20 3d 20 54 63 6c 5f 46 53 4f 70 65 6e 46 an = Tcl_FSOpenF
03e0: 69 6c 65 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 ileChannel(inter
03f0: 70 2c 20 66 69 6c 65 6e 61 6d 65 2c 20 22 72 62 p, filename, "rb
0400: 22 2c 20 30 34 34 34 29 3b 0a 20 20 20 20 69 66 ", 0444);. if
0410: 20 28 63 68 61 6e 20 3d 3d 20 4e 55 4c 4c 29 20 (chan == NULL)
0420: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 {..return TCL_ER
0430: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
0440: 2f 2a 20 43 6f 6e 66 69 67 75 72 65 20 63 68 61 /* Configure cha
0450: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 nnel */. if (
0460: 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 Tcl_SetChannelOp
0470: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 tion(interp, cha
0480: 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e n, "-translation
0490: 22 2c 20 22 62 69 6e 61 72 79 22 29 20 3d 3d 20 ", "binary") ==
04a0: 54 43 4c 5f 45 52 52 4f 52 20 7c 7c 0a 09 54 63 TCL_ERROR ||..Tc
04b0: 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 l_SetChannelOpti
04c0: 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c on(interp, chan,
04d0: 20 22 2d 62 75 66 66 65 72 73 69 7a 65 22 2c 20 "-buffersize",
04e0: 22 33 32 37 36 38 22 29 20 3d 3d 20 54 43 4c 5f "32768") == TCL_
04f0: 45 52 52 4f 52 29 20 7b 0a 09 54 63 6c 5f 43 6c ERROR) {..Tcl_Cl
0500: 6f 73 65 28 69 6e 74 65 72 70 2c 20 63 68 61 6e ose(interp, chan
0510: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 );..return TCL_E
0520: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
0530: 20 2f 2a 20 43 72 65 61 74 65 20 6d 65 73 73 61 /* Create messa
0540: 67 65 20 64 69 67 65 73 74 20 63 6f 6e 74 65 78 ge digest contex
0550: 74 20 2a 2f 0a 20 20 20 20 63 74 78 20 3d 20 45 t */. ctx = E
0560: 56 50 5f 4d 44 5f 43 54 58 5f 6e 65 77 28 29 3b VP_MD_CTX_new();
0570: 0a 20 20 20 20 69 66 20 28 63 74 78 20 3d 3d 20 . if (ctx ==
0580: 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 NULL) {..Tcl_App
0590: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
05a0: 2c 20 22 43 72 65 61 74 65 20 64 69 67 65 73 74 , "Create digest
05b0: 20 63 6f 6e 74 65 78 74 20 66 61 69 6c 65 64 3a context failed:
05c0: 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20 4e 55 ", REASON(), NU
05d0: 4c 4c 29 3b 0a 09 54 63 6c 5f 43 6c 6f 73 65 28 LL);..Tcl_Close(
05e0: 69 6e 74 65 72 70 2c 20 63 68 61 6e 29 3b 0a 09 interp, chan);..
05f0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
0600: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
0610: 49 6e 69 74 69 61 6c 69 7a 65 20 68 61 73 68 20 Initialize hash
0620: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 23 69 66 20 function */.#if
0630: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f OPENSSL_VERSION_
0640: 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 NUMBER < 0x30000
0650: 30 30 30 4c 0a 20 20 20 20 69 66 20 28 21 45 56 000L. if (!EV
0660: 50 5f 44 69 67 65 73 74 49 6e 69 74 5f 65 78 28 P_DigestInit_ex(
0670: 63 74 78 2c 20 6d 64 2c 20 4e 55 4c 4c 29 29 0a ctx, md, NULL)).
0680: 23 65 6c 73 65 0a 20 20 20 20 69 66 20 28 21 45 #else. if (!E
0690: 56 50 5f 44 69 67 65 73 74 49 6e 69 74 5f 65 78 VP_DigestInit_ex
06a0: 32 28 63 74 78 2c 20 6d 64 2c 20 4e 55 4c 4c 29 2(ctx, md, NULL)
06b0: 29 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a 09 ).#endif. {..
06c0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
06d0: 28 69 6e 74 65 72 70 2c 20 22 49 6e 69 74 69 61 (interp, "Initia
06e0: 6c 69 7a 65 20 64 69 67 65 73 74 20 66 61 69 6c lize digest fail
06f0: 65 64 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c ed: ", REASON(),
0700: 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 43 6c 6f NULL);..Tcl_Clo
0710: 73 65 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 29 se(interp, chan)
0720: 3b 0a 09 45 56 50 5f 4d 44 5f 43 54 58 5f 66 72 ;..EVP_MD_CTX_fr
0730: 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e ee(ctx);..return
0740: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
0750: 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 66 }.. /* Read f
0760: 69 6c 65 20 64 61 74 61 20 61 6e 64 20 75 70 64 ile data and upd
0770: 61 74 65 20 68 61 73 68 20 66 75 6e 63 74 69 6f ate hash functio
0780: 6e 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 20 28 n */. while (
0790: 21 54 63 6c 5f 45 6f 66 28 63 68 61 6e 29 29 20 !Tcl_Eof(chan))
07a0: 7b 0a 09 69 6e 74 20 6c 65 6e 20 3d 20 54 63 6c {..int len = Tcl
07b0: 5f 52 65 61 64 52 61 77 28 63 68 61 6e 2c 20 62 _ReadRaw(chan, b
07c0: 75 66 2c 20 33 32 37 36 38 29 3b 0a 09 69 66 20 uf, 32768);..if
07d0: 28 21 45 56 50 5f 44 69 67 65 73 74 55 70 64 61 (!EVP_DigestUpda
07e0: 74 65 28 63 74 78 2c 20 26 62 75 66 2c 20 28 73 te(ctx, &buf, (s
07f0: 69 7a 65 5f 74 29 20 6c 65 6e 29 29 20 7b 0a 09 ize_t) len)) {..
0800: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 Tcl_AppendRe
0810: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 55 70 sult(interp, "Up
0820: 64 61 74 65 20 64 69 67 65 73 74 20 66 61 69 6c date digest fail
0830: 65 64 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c ed: ", REASON(),
0840: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c NULL);.. Tcl
0850: 5f 43 6c 6f 73 65 28 69 6e 74 65 72 70 2c 20 63 _Close(interp, c
0860: 68 61 6e 29 3b 0a 09 20 20 20 20 45 56 50 5f 4d han);.. EVP_M
0870: 44 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b D_CTX_free(ctx);
0880: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
0890: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d _ERROR;..}. }
08a0: 0a 0a 20 20 20 20 2f 2a 20 43 6c 6f 73 65 20 63 .. /* Close c
08b0: 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 69 66 hannel */. if
08c0: 20 28 54 63 6c 5f 43 6c 6f 73 65 28 69 6e 74 65 (Tcl_Close(inte
08d0: 72 70 2c 20 63 68 61 6e 29 20 3d 3d 20 54 43 4c rp, chan) == TCL
08e0: 5f 45 52 52 4f 52 29 20 7b 0a 09 45 56 50 5f 4d _ERROR) {..EVP_M
08f0: 44 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b D_CTX_free(ctx);
0900: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
0910: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f OR;. }.. /
0920: 2a 20 46 69 6e 61 6c 69 7a 65 20 68 61 73 68 20 * Finalize hash
0930: 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 63 61 6c function and cal
0940: 63 75 6c 61 74 65 20 6d 65 73 73 61 67 65 20 64 culate message d
0950: 69 67 65 73 74 20 2a 2f 0a 20 20 20 20 69 66 20 igest */. if
0960: 28 21 45 56 50 5f 44 69 67 65 73 74 46 69 6e 61 (!EVP_DigestFina
0970: 6c 5f 65 78 28 63 74 78 2c 20 6d 64 5f 62 75 66 l_ex(ctx, md_buf
0980: 2c 20 26 6d 64 5f 6c 65 6e 29 29 20 7b 0a 09 54 , &md_len)) {..T
0990: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
09a0: 69 6e 74 65 72 70 2c 20 22 46 69 6e 61 6c 69 7a interp, "Finaliz
09b0: 65 20 64 69 67 65 73 74 20 66 61 69 6c 65 64 3a e digest failed:
09c0: 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20 4e 55 ", REASON(), NU
09d0: 4c 4c 29 3b 0a 09 45 56 50 5f 4d 44 5f 43 54 58 LL);..EVP_MD_CTX
09e0: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 _free(ctx);..ret
09f0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
0a00: 20 20 20 7d 0a 20 20 20 20 45 56 50 5f 4d 44 5f }. EVP_MD_
0a10: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 0a CTX_free(ctx);..
0a20: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 6d 65 /* Return me
0a30: 73 73 61 67 65 20 64 69 67 65 73 74 20 61 73 20 ssage digest as
0a40: 65 69 74 68 65 72 20 61 20 62 69 6e 61 72 79 20 either a binary
0a50: 6f 72 20 68 65 78 20 73 74 72 69 6e 67 20 2a 2f or hex string */
0a60: 0a 20 20 20 20 69 66 20 28 66 6f 72 6d 61 74 20 . if (format
0a70: 3d 3d 20 30 29 20 7b 0a 09 54 63 6c 5f 53 65 74 == 0) {..Tcl_Set
0a80: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 ObjResult(interp
0a90: 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 , Tcl_NewByteArr
0aa0: 61 79 4f 62 6a 28 6d 64 5f 62 75 66 2c 20 6d 64 ayObj(md_buf, md
0ab0: 5f 6c 65 6e 29 29 3b 0a 0a 20 20 20 20 7d 20 65 _len));.. } e
0ac0: 6c 73 65 20 7b 0a 09 54 63 6c 5f 4f 62 6a 20 2a lse {..Tcl_Obj *
0ad0: 72 65 73 75 6c 74 4f 62 6a 20 3d 20 54 63 6c 5f resultObj = Tcl_
0ae0: 4e 65 77 4f 62 6a 28 29 3b 0a 09 75 6e 73 69 67 NewObj();..unsig
0af0: 6e 65 64 20 63 68 61 72 20 2a 70 74 72 20 3d 20 ned char *ptr =
0b00: 54 63 6c 5f 53 65 74 42 79 74 65 41 72 72 61 79 Tcl_SetByteArray
0b10: 4c 65 6e 67 74 68 28 72 65 73 75 6c 74 4f 62 6a Length(resultObj
0b20: 2c 20 6d 64 5f 6c 65 6e 2a 32 29 3b 0a 0a 09 66 , md_len*2);...f
0b30: 6f 72 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 or (unsigned int
0b40: 20 69 20 3d 20 30 3b 20 69 20 3c 20 6d 64 5f 6c i = 0; i < md_l
0b50: 65 6e 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 en; i++) {..
0b60: 2a 70 74 72 2b 2b 20 3d 20 68 65 78 5b 28 6d 64 *ptr++ = hex[(md
0b70: 5f 62 75 66 5b 69 5d 20 3e 3e 20 34 29 20 26 20 _buf[i] >> 4) &
0b80: 30 78 30 46 5d 3b 0a 09 20 20 20 20 2a 70 74 72 0x0F];.. *ptr
0b90: 2b 2b 20 3d 20 68 65 78 5b 6d 64 5f 62 75 66 5b ++ = hex[md_buf[
0ba0: 69 5d 20 26 20 30 78 30 46 5d 3b 0a 09 7d 0a 09 i] & 0x0F];..}..
0bb0: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 Tcl_SetObjResult
0bc0: 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f (interp, resultO
0bd0: 62 6a 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 bj);. }. r
0be0: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a eturn TCL_OK;.}.
0bf0: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ./**************
0c00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0c10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0c20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0c30: 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d *****/../*. *---
0c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0c80: 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 48 61 73 . *. * DigestHas
0c90: 68 46 75 6e 63 74 69 6f 6e 20 2d 2d 0a 20 2a 0a hFunction --. *.
0ca0: 20 2a 09 20 43 61 6c 63 75 6c 61 74 65 20 6d 65 *. Calculate me
0cb0: 73 73 61 67 65 20 64 69 67 65 73 74 20 75 73 69 ssage digest usi
0cc0: 6e 67 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e ng hash function
0cd0: 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a .. *. * Returns:
0ce0: 0a 20 2a 09 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 . *.TCL_OK or TC
0cf0: 4c 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 L_ERROR. *. * Si
0d00: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 53 de effects:. *.S
0d10: 65 74 73 20 72 65 73 75 6c 74 20 74 6f 20 6d 65 ets result to me
0d20: 73 73 61 67 65 20 64 69 67 65 73 74 20 6f 72 20 ssage digest or
0d30: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 2a error message. *
0d40: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
0d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0d80: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 0a 44 ------. */.int.D
0d90: 69 67 65 73 74 48 61 73 68 46 75 6e 63 74 69 6f igestHashFunctio
0da0: 6e 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e n(Tcl_Interp *in
0db0: 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 terp, int objc,
0dc0: 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f Tcl_Obj *const o
0dd0: 62 6a 76 5b 5d 2c 20 63 6f 6e 73 74 20 45 56 50 bjv[], const EVP
0de0: 5f 4d 44 20 2a 6d 64 2c 20 69 6e 74 20 66 6f 72 _MD *md, int for
0df0: 6d 61 74 29 20 7b 0a 20 20 20 20 63 68 61 72 20 mat) {. char
0e00: 2a 64 61 74 61 3b 0a 20 20 20 20 69 6e 74 20 6c *data;. int l
0e10: 65 6e 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 en;. unsigned
0e20: 20 69 6e 74 20 6d 64 5f 6c 65 6e 3b 0a 20 20 20 int md_len;.
0e30: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6d unsigned char m
0e40: 64 5f 62 75 66 5b 45 56 50 5f 4d 41 58 5f 4d 44 d_buf[EVP_MAX_MD
0e50: 5f 53 49 5a 45 5d 3b 0a 0a 20 20 20 20 69 66 20 _SIZE];.. if
0e60: 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 (objc != 2) {..T
0e70: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 cl_WrongNumArgs(
0e80: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c interp, 1, objv,
0e90: 20 22 64 61 74 61 22 29 3b 0a 09 72 65 74 75 72 "data");..retur
0ea0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
0eb0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 64 }.. /* Get d
0ec0: 61 74 61 20 2a 2f 0a 20 20 20 20 64 61 74 61 20 ata */. data
0ed0: 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 = Tcl_GetByteArr
0ee0: 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 ayFromObj(objv[1
0ef0: 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 69 66 ], &len);. if
0f00: 20 28 64 61 74 61 20 3d 3d 20 4e 55 4c 4c 20 7c (data == NULL |
0f10: 7c 20 6c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 54 | len == 0) {..T
0f20: 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 cl_SetResult(int
0f30: 65 72 70 2c 20 22 4e 6f 20 64 61 74 61 22 2c 20 erp, "No data",
0f40: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 NULL);..return T
0f50: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
0f60: 0a 20 20 20 20 2f 2a 20 43 61 6c 63 75 6c 61 74 . /* Calculat
0f70: 65 20 68 61 73 68 20 76 61 6c 75 65 2c 20 63 72 e hash value, cr
0f80: 65 61 74 65 20 62 69 6e 2f 68 65 78 20 72 65 70 eate bin/hex rep
0f90: 72 65 73 65 6e 74 61 74 69 6f 6e 2c 20 61 6e 64 resentation, and
0fa0: 20 77 72 69 74 65 20 74 6f 20 72 65 73 75 6c 74 write to result
0fb0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 45 56 50 5f */. if (EVP_
0fc0: 44 69 67 65 73 74 28 64 61 74 61 2c 20 28 73 69 Digest(data, (si
0fd0: 7a 65 5f 74 29 20 6c 65 6e 2c 20 6d 64 5f 62 75 ze_t) len, md_bu
0fe0: 66 2c 20 26 6d 64 5f 6c 65 6e 2c 20 6d 64 2c 20 f, &md_len, md,
0ff0: 4e 55 4c 4c 29 29 20 7b 0a 09 69 66 20 28 66 6f NULL)) {..if (fo
1000: 72 6d 61 74 20 3d 3d 20 30 29 20 7b 0a 09 20 20 rmat == 0) {..
1010: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 Tcl_SetObjResu
1020: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e lt(interp, Tcl_N
1030: 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 6d ewByteArrayObj(m
1040: 64 5f 62 75 66 2c 20 6d 64 5f 6c 65 6e 29 29 3b d_buf, md_len));
1050: 0a 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 ...} else {..
1060: 20 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 Tcl_Obj *result
1070: 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a Obj = Tcl_NewObj
1080: 28 29 3b 0a 09 20 20 20 20 75 6e 73 69 67 6e 65 ();.. unsigne
1090: 64 20 63 68 61 72 20 2a 70 74 72 20 3d 20 54 63 d char *ptr = Tc
10a0: 6c 5f 53 65 74 42 79 74 65 41 72 72 61 79 4c 65 l_SetByteArrayLe
10b0: 6e 67 74 68 28 72 65 73 75 6c 74 4f 62 6a 2c 20 ngth(resultObj,
10c0: 6d 64 5f 6c 65 6e 2a 32 29 3b 0a 0a 09 20 20 20 md_len*2);...
10d0: 20 66 6f 72 20 28 75 6e 73 69 67 6e 65 64 20 69 for (unsigned i
10e0: 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 6d 64 nt i = 0; i < md
10f0: 5f 6c 65 6e 3b 20 69 2b 2b 29 20 7b 0a 09 09 2a _len; i++) {...*
1100: 70 74 72 2b 2b 20 3d 20 68 65 78 5b 28 6d 64 5f ptr++ = hex[(md_
1110: 62 75 66 5b 69 5d 20 3e 3e 20 34 29 20 26 20 30 buf[i] >> 4) & 0
1120: 78 30 46 5d 3b 0a 09 09 2a 70 74 72 2b 2b 20 3d x0F];...*ptr++ =
1130: 20 68 65 78 5b 6d 64 5f 62 75 66 5b 69 5d 20 26 hex[md_buf[i] &
1140: 20 30 78 30 46 5d 3b 0a 09 20 20 20 20 7d 0a 09 0x0F];.. }..
1150: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 Tcl_SetObjResult
1160: 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f (interp, resultO
1170: 62 6a 29 3b 0a 09 7d 0a 0a 20 20 20 20 7d 20 65 bj);..}.. } e
1180: 6c 73 65 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e lse {..Tcl_Appen
1190: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
11a0: 22 48 61 73 68 20 63 61 6c 63 75 6c 61 74 69 6f "Hash calculatio
11b0: 6e 20 65 72 72 6f 72 3a 22 2c 20 52 45 41 53 4f n error:", REASO
11c0: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 N(), (char *) NU
11d0: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c LL);..return TCL
11e0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 _ERROR;. }.
11f0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b return TCL_OK;
1200: 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d .}../*. *-------
1210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
1250: 20 2a 20 44 69 67 65 73 74 4f 62 6a 43 6d 64 20 * DigestObjCmd
1260: 2d 2d 0a 20 2a 0a 20 2a 09 52 65 74 75 72 6e 20 --. *. *.Return
1270: 6d 65 73 73 61 67 65 20 64 69 67 65 73 74 20 75 message digest u
1280: 73 69 6e 67 20 75 73 65 72 20 73 70 65 63 69 66 sing user specif
1290: 69 65 64 20 68 61 73 68 20 66 75 6e 63 74 69 6f ied hash functio
12a0: 6e 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 n.. *. * Returns
12b0: 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 6f 72 20 54 :. *.TCL_OK or T
12c0: 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a 20 53 CL_ERROR. *. * S
12d0: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
12e0: 53 65 74 73 20 72 65 73 75 6c 74 20 74 6f 20 6d Sets result to m
12f0: 65 73 73 61 67 65 20 64 69 67 65 73 74 20 6f 72 essage digest or
1300: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 error message.
1310: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
1320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1350: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 -------. */.stat
1360: 69 63 20 69 6e 74 0a 44 69 67 65 73 74 4f 62 6a ic int.DigestObj
1370: 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 Cmd(ClientData c
1380: 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 lientData, Tcl_I
1390: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 nterp *interp, i
13a0: 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a nt objc, Tcl_Obj
13b0: 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 *const objv[])
13c0: 7b 0a 20 20 20 20 69 6e 74 20 69 64 78 2c 20 6c {. int idx, l
13d0: 65 6e 2c 20 66 6f 72 6d 61 74 20 3d 20 31 2c 20 en, format = 1,
13e0: 6b 65 79 5f 6c 65 6e 20 3d 20 30 2c 20 64 61 74 key_len = 0, dat
13f0: 61 5f 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 63 a_len = 0;. c
1400: 6f 6e 73 74 20 63 68 61 72 20 2a 64 69 67 65 73 onst char *diges
1410: 74 6e 61 6d 65 3b 0a 20 20 20 20 54 63 6c 5f 4f tname;. Tcl_O
1420: 62 6a 20 2a 64 61 74 61 4f 62 6a 20 3d 20 4e 55 bj *dataObj = NU
1430: 4c 4c 2c 20 2a 66 69 6c 65 4f 62 6a 20 3d 20 4e LL, *fileObj = N
1440: 55 4c 4c 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 ULL;. unsigne
1450: 64 20 63 68 61 72 20 2a 6b 65 79 20 3d 20 4e 55 d char *key = NU
1460: 4c 4c 3b 0a 20 20 20 20 63 6f 6e 73 74 20 45 56 LL;. const EV
1470: 50 5f 4d 44 20 2a 6d 64 3b 0a 0a 20 20 20 20 54 P_MD *md;.. T
1480: 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 cl_ResetResult(i
1490: 6e 74 65 72 70 29 3b 0a 0a 20 20 20 20 69 66 20 nterp);.. if
14a0: 28 6f 62 6a 63 20 3c 20 33 20 7c 7c 20 6f 62 6a (objc < 3 || obj
14b0: 63 20 3e 20 35 29 20 7b 0a 09 54 63 6c 5f 57 72 c > 5) {..Tcl_Wr
14c0: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 ongNumArgs(inter
14d0: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 74 79 70 p, 1, objv, "typ
14e0: 65 20 3f 2d 62 69 6e 7c 2d 68 65 78 3f 20 5b 2d e ?-bin|-hex? [-
14f0: 63 68 61 6e 6e 65 6c 20 63 68 61 6e 20 7c 20 2d channel chan | -
1500: 66 69 6c 65 20 66 69 6c 65 6e 61 6d 65 20 7c 20 file filename |
1510: 3f 2d 64 61 74 61 3f 20 64 61 74 61 5d 22 29 3b ?-data? data]");
1520: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
1530: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f OR;. }.. /
1540: 2a 20 47 65 74 20 64 69 67 65 73 74 20 2a 2f 0a * Get digest */.
1550: 20 20 20 20 64 69 67 65 73 74 6e 61 6d 65 20 3d digestname =
1560: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 Tcl_GetStringFr
1570: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 26 omObj(objv[1], &
1580: 6c 65 6e 29 3b 0a 20 20 20 20 69 66 20 28 64 69 len);. if (di
1590: 67 65 73 74 6e 61 6d 65 20 3d 3d 20 4e 55 4c 4c gestname == NULL
15a0: 20 7c 7c 20 28 6d 64 20 3d 20 45 56 50 5f 67 65 || (md = EVP_ge
15b0: 74 5f 64 69 67 65 73 74 62 79 6e 61 6d 65 28 64 t_digestbyname(d
15c0: 69 67 65 73 74 6e 61 6d 65 29 29 20 3d 3d 20 4e igestname)) == N
15d0: 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 ULL) {..Tcl_Appe
15e0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
15f0: 20 22 49 6e 76 61 6c 69 64 20 64 69 67 65 73 74 "Invalid digest
1600: 20 74 79 70 65 20 5c 22 22 2c 20 64 69 67 65 73 type \"", diges
1610: 74 6e 61 6d 65 2c 20 22 5c 22 22 2c 20 4e 55 4c tname, "\"", NUL
1620: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f L);..return TCL_
1630: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
1640: 20 20 2f 2a 20 4f 70 74 69 6d 61 6c 20 63 61 73 /* Optimal cas
1650: 65 20 66 6f 72 20 62 6c 6f 62 20 6f 66 20 64 61 e for blob of da
1660: 74 61 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f 62 ta */. if (ob
1670: 6a 63 20 3d 3d 20 33 29 20 7b 0a 09 72 65 74 75 jc == 3) {..retu
1680: 72 6e 20 44 69 67 65 73 74 48 61 73 68 46 75 6e rn DigestHashFun
1690: 63 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 2d 2d ction(interp, --
16a0: 6f 62 6a 63 2c 20 2b 2b 6f 62 6a 76 2c 20 6d 64 objc, ++objv, md
16b0: 2c 20 66 6f 72 6d 61 74 29 3b 0a 20 20 20 20 7d , format);. }
16c0: 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 6f 70 74 .. /* Get opt
16d0: 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 66 6f 72 20 ions */. for
16e0: 28 69 64 78 20 3d 20 32 3b 20 69 64 78 20 3c 20 (idx = 2; idx <
16f0: 6f 62 6a 63 2d 31 3b 20 69 64 78 2b 2b 29 20 7b objc-1; idx++) {
1700: 0a 09 63 68 61 72 20 2a 6f 70 74 20 3d 20 54 63 ..char *opt = Tc
1710: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f l_GetStringFromO
1720: 62 6a 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 4e 55 bj(objv[idx], NU
1730: 4c 4c 29 3b 0a 0a 09 69 66 20 28 6f 70 74 5b 30 LL);...if (opt[0
1740: 5d 20 21 3d 20 27 2d 27 29 0a 09 20 20 20 20 62 ] != '-').. b
1750: 72 65 61 6b 3b 0a 0a 09 4f 50 54 46 4c 41 47 28 reak;...OPTFLAG(
1760: 22 2d 62 69 6e 22 2c 20 66 6f 72 6d 61 74 2c 20 "-bin", format,
1770: 30 29 3b 0a 09 4f 50 54 46 4c 41 47 28 22 2d 62 0);..OPTFLAG("-b
1780: 69 6e 61 72 79 22 2c 20 66 6f 72 6d 61 74 2c 20 inary", format,
1790: 30 29 3b 0a 09 4f 50 54 46 4c 41 47 28 22 2d 68 0);..OPTFLAG("-h
17a0: 65 78 22 2c 20 66 6f 72 6d 61 74 2c 20 31 29 3b ex", format, 1);
17b0: 0a 09 4f 50 54 46 4c 41 47 28 22 2d 68 65 78 61 ..OPTFLAG("-hexa
17c0: 64 65 63 69 6d 61 6c 22 2c 20 66 6f 72 6d 61 74 decimal", format
17d0: 2c 20 31 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d , 1);..OPTOBJ("-
17e0: 64 61 74 61 22 2c 20 64 61 74 61 4f 62 6a 29 3b data", dataObj);
17f0: 0a 09 4f 50 54 4f 42 4a 28 22 2d 66 69 6c 65 22 ..OPTOBJ("-file"
1800: 2c 20 66 69 6c 65 4f 62 6a 29 3b 0a 09 4f 50 54 , fileObj);..OPT
1810: 4f 42 4a 28 22 2d 66 69 6c 65 6e 61 6d 65 22 2c OBJ("-filename",
1820: 20 66 69 6c 65 4f 62 6a 29 3b 0a 0a 09 4f 50 54 fileObj);...OPT
1830: 42 41 44 28 22 6f 70 74 69 6f 6e 22 2c 20 22 2d BAD("option", "-
1840: 62 69 6e 2c 20 2d 64 61 74 61 2c 20 2d 66 69 6c bin, -data, -fil
1850: 65 2c 20 2d 66 69 6c 65 6e 61 6d 65 2c 20 2d 6b e, -filename, -k
1860: 65 79 2c 20 6f 72 20 2d 68 65 78 22 29 3b 0a 09 ey, or -hex");..
1870: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
1880: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
1890: 49 66 20 6e 6f 20 6f 70 74 69 6f 6e 20 66 6f 72 If no option for
18a0: 20 6c 61 73 74 20 61 72 67 2c 20 74 68 65 6e 20 last arg, then
18b0: 69 74 73 20 74 68 65 20 64 61 74 61 20 2a 2f 0a its the data */.
18c0: 20 20 20 20 69 66 20 28 69 64 78 20 3c 20 6f 62 if (idx < ob
18d0: 6a 63 29 20 7b 0a 09 64 61 74 61 4f 62 6a 20 3d jc) {..dataObj =
18e0: 20 6f 62 6a 76 5b 69 64 78 5d 3b 0a 20 20 20 20 objv[idx];.
18f0: 7d 0a 0a 20 20 20 20 2f 2a 20 43 61 6c 63 20 64 }.. /* Calc d
1900: 69 67 65 73 74 20 6f 6e 20 66 69 6c 65 20 6f 72 igest on file or
1910: 20 64 61 74 61 20 62 6c 6f 62 20 2a 2f 0a 20 20 data blob */.
1920: 20 20 69 66 20 28 66 69 6c 65 4f 62 6a 20 21 3d if (fileObj !=
1930: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e NULL) {..return
1940: 20 44 69 67 65 73 74 46 69 6c 65 28 69 6e 74 65 DigestFile(inte
1950: 72 70 2c 20 66 69 6c 65 4f 62 6a 2c 20 6d 64 2c rp, fileObj, md,
1960: 20 66 6f 72 6d 61 74 29 3b 0a 20 20 20 20 7d 20 format);. }
1970: 65 6c 73 65 20 69 66 20 28 64 61 74 61 4f 62 6a else if (dataObj
1980: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c != NULL) {..Tcl
1990: 5f 4f 62 6a 20 2a 6f 62 6a 73 5b 32 5d 3b 0a 09 _Obj *objs[2];..
19a0: 6f 62 6a 73 5b 30 5d 20 3d 20 4e 55 4c 4c 3b 0a objs[0] = NULL;.
19b0: 09 6f 62 6a 73 5b 31 5d 20 3d 20 64 61 74 61 4f .objs[1] = dataO
19c0: 62 6a 3b 0a 09 72 65 74 75 72 6e 20 44 69 67 65 bj;..return Dige
19d0: 73 74 48 61 73 68 46 75 6e 63 74 69 6f 6e 28 69 stHashFunction(i
19e0: 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 73 2c 20 nterp, 2, objs,
19f0: 6d 64 2c 20 66 6f 72 6d 61 74 29 3b 0a 20 20 20 md, format);.
1a00: 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 }.. Tcl_Appe
1a10: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
1a20: 20 22 4e 6f 20 64 61 74 61 20 73 70 65 63 69 66 "No data specif
1a30: 69 65 64 2e 22 2c 20 4e 55 4c 4c 29 3b 0a 20 20 ied.", NULL);.
1a40: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
1a50: 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d OR;.}../*. *----
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
1aa0: 20 2a 0a 20 2a 20 4d 65 73 73 61 67 65 20 44 69 *. * Message Di
1ab0: 67 65 73 74 20 43 6f 6e 76 65 6e 69 65 6e 63 65 gest Convenience
1ac0: 20 43 6f 6d 6d 61 6e 64 73 20 2d 2d 0a 20 2a 0a Commands --. *.
1ad0: 20 2a 09 43 6f 6e 76 65 6e 69 65 6e 63 65 20 63 *.Convenience c
1ae0: 6f 6d 6d 61 6e 64 73 20 66 6f 72 20 6d 65 73 73 ommands for mess
1af0: 61 67 65 20 64 69 67 65 73 74 73 2e 0a 20 2a 0a age digests.. *.
1b00: 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 * Returns:. *.T
1b10: 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 52 52 CL_OK or TCL_ERR
1b20: 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 OR. *. * Side ef
1b30: 66 65 63 74 73 3a 0a 20 2a 09 53 65 74 73 20 72 fects:. *.Sets r
1b40: 65 73 75 6c 74 20 74 6f 20 6d 65 73 73 61 67 65 esult to message
1b50: 20 64 69 67 65 73 74 20 6f 72 20 65 72 72 6f 72 digest or error
1b60: 20 6d 65 73 73 61 67 65 0a 20 2a 0a 20 2a 2d 2d message. *. *--
1b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
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 0a 20 2a 2f 0a 69 6e 74 20 44 69 67 65 73 74 -. */.int Digest
1bc0: 4d 44 34 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 MD4Cmd(ClientDat
1bd0: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 a clientData, Tc
1be0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
1bf0: 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f , int objc, Tcl_
1c00: 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b Obj *const objv[
1c10: 5d 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 ]) {. return
1c20: 44 69 67 65 73 74 48 61 73 68 46 75 6e 63 74 69 DigestHashFuncti
1c30: 6f 6e 28 69 6e 74 65 72 70 2c 20 6f 62 6a 63 2c on(interp, objc,
1c40: 20 6f 62 6a 76 2c 20 45 56 50 5f 6d 64 34 28 29 objv, EVP_md4()
1c50: 2c 20 31 29 3b 0a 7d 0a 0a 69 6e 74 20 44 69 67 , 1);.}..int Dig
1c60: 65 73 74 4d 44 35 43 6d 64 28 43 6c 69 65 6e 74 estMD5Cmd(Client
1c70: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c Data clientData,
1c80: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 Tcl_Interp *int
1c90: 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 erp, int objc, T
1ca0: 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 cl_Obj *const ob
1cb0: 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 72 65 74 75 jv[]) {. retu
1cc0: 72 6e 20 44 69 67 65 73 74 48 61 73 68 46 75 6e rn DigestHashFun
1cd0: 63 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 6f 62 ction(interp, ob
1ce0: 6a 63 2c 20 6f 62 6a 76 2c 20 45 56 50 5f 6d 64 jc, objv, EVP_md
1cf0: 35 28 29 2c 20 31 29 3b 0a 7d 0a 0a 69 6e 74 20 5(), 1);.}..int
1d00: 44 69 67 65 73 74 53 48 41 31 43 6d 64 28 43 6c DigestSHA1Cmd(Cl
1d10: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 ientData clientD
1d20: 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 ata, Tcl_Interp
1d30: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a *interp, int obj
1d40: 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 c, Tcl_Obj *cons
1d50: 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 t objv[]) {.
1d60: 72 65 74 75 72 6e 20 44 69 67 65 73 74 48 61 73 return DigestHas
1d70: 68 46 75 6e 63 74 69 6f 6e 28 69 6e 74 65 72 70 hFunction(interp
1d80: 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 2c 20 45 56 , objc, objv, EV
1d90: 50 5f 73 68 61 31 28 29 2c 20 31 29 3b 0a 7d 0a P_sha1(), 1);.}.
1da0: 0a 69 6e 74 20 44 69 67 65 73 74 53 48 41 32 35 .int DigestSHA25
1db0: 36 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 6Cmd(ClientData
1dc0: 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f clientData, Tcl_
1dd0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 Interp *interp,
1de0: 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 int objc, Tcl_Ob
1df0: 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 j *const objv[])
1e00: 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 44 69 {. return Di
1e10: 67 65 73 74 48 61 73 68 46 75 6e 63 74 69 6f 6e gestHashFunction
1e20: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 63 2c 20 6f (interp, objc, o
1e30: 62 6a 76 2c 20 45 56 50 5f 73 68 61 32 35 36 28 bjv, EVP_sha256(
1e40: 29 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d ), 1);.}../*. *-
1e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1e90: 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 44 69 67 --. *. * Tls_Dig
1ea0: 65 73 74 43 6f 6d 6d 61 6e 64 73 20 2d 2d 0a 20 estCommands --.
1eb0: 2a 0a 20 2a 09 43 72 65 61 74 65 20 64 69 67 65 *. *.Create dige
1ec0: 73 74 20 63 6f 6d 6d 61 6e 64 73 0a 20 2a 0a 20 st commands. *.
1ed0: 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 43 * Returns:. *.TC
1ee0: 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 52 52 4f L_OK or TCL_ERRO
1ef0: 52 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 R. *. * Side eff
1f00: 65 63 74 73 3a 0a 20 2a 09 43 72 65 61 74 65 73 ects:. *.Creates
1f10: 20 63 6f 6d 6d 61 6e 64 73 0a 20 2a 0a 20 2a 2d commands. *. *-
1f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1f60: 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 54 6c 73 5f 44 --. */.int Tls_D
1f70: 69 67 65 73 74 43 6f 6d 6d 61 6e 64 73 28 54 63 igestCommands(Tc
1f80: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
1f90: 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 ) {. Tcl_Crea
1fa0: 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 teObjCommand(int
1fb0: 65 72 70 2c 20 22 74 6c 73 3a 3a 64 69 67 65 73 erp, "tls::diges
1fc0: 74 22 2c 20 44 69 67 65 73 74 4f 62 6a 43 6d 64 t", DigestObjCmd
1fd0: 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 , (ClientData) 0
1fe0: 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 , (Tcl_CmdDelete
1ff0: 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 Proc *) NULL);.
2000: 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a Tcl_CreateObj
2010: 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 Command(interp,
2020: 22 74 6c 73 3a 3a 6d 64 34 22 2c 20 44 69 67 65 "tls::md4", Dige
2030: 73 74 4d 44 34 43 6d 64 2c 20 28 43 6c 69 65 6e stMD4Cmd, (Clien
2040: 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 tData) 0, (Tcl_C
2050: 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 mdDeleteProc *)
2060: 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 NULL);. Tcl_C
2070: 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 reateObjCommand(
2080: 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 6d 64 interp, "tls::md
2090: 35 22 2c 20 44 69 67 65 73 74 4d 44 35 43 6d 64 5", DigestMD5Cmd
20a0: 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 , (ClientData) 0
20b0: 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 , (Tcl_CmdDelete
20c0: 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 Proc *) NULL);.
20d0: 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a Tcl_CreateObj
20e0: 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 Command(interp,
20f0: 22 74 6c 73 3a 3a 73 68 61 31 22 2c 20 44 69 67 "tls::sha1", Dig
2100: 65 73 74 53 48 41 31 43 6d 64 2c 20 28 43 6c 69 estSHA1Cmd, (Cli
2110: 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c entData) 0, (Tcl
2120: 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a _CmdDeleteProc *
2130: 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c ) NULL);. Tcl
2140: 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e _CreateObjComman
2150: 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a d(interp, "tls::
2160: 73 68 61 32 35 36 22 2c 20 44 69 67 65 73 74 53 sha256", DigestS
2170: 48 41 32 35 36 43 6d 64 2c 20 28 43 6c 69 65 6e HA256Cmd, (Clien
2180: 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 tData) 0, (Tcl_C
2190: 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 mdDeleteProc *)
21a0: 4e 55 4c 4c 29 3b 0a 20 20 20 20 72 65 74 75 72 NULL);. retur
21b0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a n TCL_OK;.}..