ref: 9fad45aff9fc15f02817fdf6044b9f02abd69e53
parent: 4df44dba70a276f1df43882423a05fb734999f09
author: Lennart Augustsson <lennart@augustsson.net>
date: Thu Dec 21 10:48:38 EST 2023
MD5 of a byte array
--- a/lib/System/IO/MD5.hs
+++ b/lib/System/IO/MD5.hs
@@ -1,6 +1,6 @@
-- Copyright 2023 Lennart Augustsson
-- See LICENSE file for full license.
-module System.IO.MD5(MD5CheckSum, md5File, md5Handle, md5String) where
+module System.IO.MD5(MD5CheckSum, md5File, md5Handle, md5String, md5Combine) where
import Primitives(primPerformIO)
import Prelude
import Data.Word
@@ -9,8 +9,9 @@
import Foreign.Marshal.Array
import Foreign.Ptr
-foreign import ccall "md5File" c_md5File :: Handle -> Ptr Word -> IO ()
-foreign import ccall "md5String" c_md5String :: CString -> Ptr Word -> IO ()
+foreign import ccall "md5File" c_md5File :: Handle -> Ptr Word -> IO ()
+foreign import ccall "md5String" c_md5String :: CString -> Ptr Word -> IO ()
+foreign import ccall "md5Array" c_md5Array :: Ptr Word -> Ptr Word -> Int -> IO ()
newtype MD5CheckSum = MD5 [Word] -- either 2*64 bits or 4*32 bits
@@ -52,3 +53,10 @@
cs <- md5Handle h
hClose h
return (Just cs)
+
+md5Combine :: [MD5CheckSum] -> MD5CheckSum
+md5Combine [] = error "md5Combine: empty"
+md5Combine [m] = m
+md5Combine ms = primPerformIO $
+ withArrray [ w | MD5 ws <- ms, w <- ws ] $ \ a ->
+ chksum $ \ w -> c_md5Array a w (length ms * md5Len)
--- a/src/runtime/eval.c
+++ b/src/runtime/eval.c
@@ -1134,6 +1134,8 @@
#if WANT_MD5
{ "md5File", (funptr_t)md5File, FFI_PPV },+ { "md5String",(funptr_t)md5String, FFI_PPV },+ { "md5Array", (funptr_t)md5Array, FFI_PPzV },#endif
{ "iswindows",(funptr_t)iswindows, FFI_I },@@ -2457,7 +2459,7 @@
case FFI_PPP: FFI (2); xp = PTRARG(1);yp = PTRARG(2); rp = (*(void* (*)(void*, void* ))f)(xp,yp); n = mkPtr(rp); RETIO(n);
case FFI_IPI: FFI (2); xi = INTARG(1);yp = PTRARG(2); ri = (*(value_t (*)(value_t, void* ))f)(xi,yp); n = mkInt(ri); RETIO(n);
case FFI_iPi: FFI (2); xi = INTARG(1);yp = PTRARG(2); ri = (*(int (*)(int, void* ))f)(xi,yp); n = mkInt(ri); RETIO(n);
- case FFI_PPzV:FFI (3); xp = PTRARG(1);yp = PTRARG(2); zi = INTARG(3); (*(void (*)(void*, void*, size_t))f)(xp,yp,zi); RETIO(combUnit);
+ case FFI_PPzV:FFI (3); xp = PTRARG(1);yp = PTRARG(2); zi = INTARG(3); (*(void (*)(void*, void*, size_t))f)(xp,yp,zi); RETIO(combUnit);
case FFI_PIIPI:FFI (4);xp = PTRARG(1);yi = INTARG(2); zi = INTARG(3); wp = PTRARG(4);
ri = (*(int (*)(void*, int, int, void* ))f)(xp,yi,zi,wp); n = mkInt(ri); RETIO(n);
default: ERR("T_IO_CCALL");--- a/src/runtime/md5.c
+++ b/src/runtime/md5.c
@@ -222,6 +222,15 @@
memcpy(result, ctx.digest, 16);
}
+void md5Array(uint8_t *input, uint8_t *result, size_t inputlen){+ MD5Context ctx;
+ md5Init(&ctx);
+ md5Update(&ctx, input, inputlen);
+ md5Finalize(&ctx);
+
+ memcpy(result, ctx.digest, 16);
+}
+
void md5File(FILE *file, uint8_t *result){char *input_buffer = malloc(1024);
size_t input_size = 0;
--- a/src/runtime/md5.h
+++ b/src/runtime/md5.h
@@ -1,4 +1,5 @@
/* Code from https://github.com/Zunawe/md5-c */
void md5String(char *input, uint8_t *result);
+void md5Array(uint8_t *input, uint8_t *result, size_t inputlen);
void md5File(FILE *file, uint8_t *result);
--
⑨