shithub: MicroHs

Download patch

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);
--