diff --git a/Crypto/Hash/MD5.hs b/Crypto/Hash/MD5.hs index 17a09ef..5574a79 100644 --- a/Crypto/Hash/MD5.hs +++ b/Crypto/Hash/MD5.hs @@ -34,6 +34,9 @@ instance HashAlgorithm MD5 where hashInternalUpdate = c_md5_update hashInternalFinalize = c_md5_finalize +instance HashAlgorithmPrefix MD5 where + hashInternalFinalizePrefix = c_md5_finalize_prefix + foreign import ccall unsafe "cryptonite_md5_init" c_md5_init :: Ptr (Context a)-> IO () @@ -42,3 +45,6 @@ foreign import ccall "cryptonite_md5_update" foreign import ccall unsafe "cryptonite_md5_finalize" c_md5_finalize :: Ptr (Context a) -> Ptr (Digest a) -> IO () + +foreign import ccall "cryptonite_md5_finalize_prefix" + c_md5_finalize_prefix :: Ptr (Context a) -> Ptr Word8 -> Word32 -> Word32 -> Ptr (Digest a) -> IO () diff --git a/Crypto/Hash/SHA1.hs b/Crypto/Hash/SHA1.hs index 87e44a3..4f60739 100644 --- a/Crypto/Hash/SHA1.hs +++ b/Crypto/Hash/SHA1.hs @@ -34,6 +34,9 @@ instance HashAlgorithm SHA1 where hashInternalUpdate = c_sha1_update hashInternalFinalize = c_sha1_finalize +instance HashAlgorithmPrefix SHA1 where + hashInternalFinalizePrefix = c_sha1_finalize_prefix + foreign import ccall unsafe "cryptonite_sha1_init" c_sha1_init :: Ptr (Context a)-> IO () @@ -42,3 +45,6 @@ foreign import ccall "cryptonite_sha1_update" foreign import ccall unsafe "cryptonite_sha1_finalize" c_sha1_finalize :: Ptr (Context a) -> Ptr (Digest a) -> IO () + +foreign import ccall "cryptonite_sha1_finalize_prefix" + c_sha1_finalize_prefix :: Ptr (Context a) -> Ptr Word8 -> Word32 -> Word32 -> Ptr (Digest a) -> IO () diff --git a/Crypto/Hash/SHA224.hs b/Crypto/Hash/SHA224.hs index a609d57..5d0569f 100644 --- a/Crypto/Hash/SHA224.hs +++ b/Crypto/Hash/SHA224.hs @@ -34,6 +34,9 @@ instance HashAlgorithm SHA224 where hashInternalUpdate = c_sha224_update hashInternalFinalize = c_sha224_finalize +instance HashAlgorithmPrefix SHA224 where + hashInternalFinalizePrefix = c_sha224_finalize_prefix + foreign import ccall unsafe "cryptonite_sha224_init" c_sha224_init :: Ptr (Context a)-> IO () @@ -42,3 +45,6 @@ foreign import ccall "cryptonite_sha224_update" foreign import ccall unsafe "cryptonite_sha224_finalize" c_sha224_finalize :: Ptr (Context a) -> Ptr (Digest a) -> IO () + +foreign import ccall "cryptonite_sha224_finalize_prefix" + c_sha224_finalize_prefix :: Ptr (Context a) -> Ptr Word8 -> Word32 -> Word32 -> Ptr (Digest a) -> IO () diff --git a/Crypto/Hash/SHA256.hs b/Crypto/Hash/SHA256.hs index eacd502..18211f3 100644 --- a/Crypto/Hash/SHA256.hs +++ b/Crypto/Hash/SHA256.hs @@ -34,6 +34,9 @@ instance HashAlgorithm SHA256 where hashInternalUpdate = c_sha256_update hashInternalFinalize = c_sha256_finalize +instance HashAlgorithmPrefix SHA256 where + hashInternalFinalizePrefix = c_sha256_finalize_prefix + foreign import ccall unsafe "cryptonite_sha256_init" c_sha256_init :: Ptr (Context a)-> IO () @@ -42,3 +45,6 @@ foreign import ccall "cryptonite_sha256_update" foreign import ccall unsafe "cryptonite_sha256_finalize" c_sha256_finalize :: Ptr (Context a) -> Ptr (Digest a) -> IO () + +foreign import ccall "cryptonite_sha256_finalize_prefix" + c_sha256_finalize_prefix :: Ptr (Context a) -> Ptr Word8 -> Word32 -> Word32 -> Ptr (Digest a) -> IO () diff --git a/Crypto/Hash/SHA384.hs b/Crypto/Hash/SHA384.hs index 2b19f52..22fc595 100644 --- a/Crypto/Hash/SHA384.hs +++ b/Crypto/Hash/SHA384.hs @@ -34,6 +34,9 @@ instance HashAlgorithm SHA384 where hashInternalUpdate = c_sha384_update hashInternalFinalize = c_sha384_finalize +instance HashAlgorithmPrefix SHA384 where + hashInternalFinalizePrefix = c_sha384_finalize_prefix + foreign import ccall unsafe "cryptonite_sha384_init" c_sha384_init :: Ptr (Context a)-> IO () @@ -42,3 +45,6 @@ foreign import ccall "cryptonite_sha384_update" foreign import ccall unsafe "cryptonite_sha384_finalize" c_sha384_finalize :: Ptr (Context a) -> Ptr (Digest a) -> IO () + +foreign import ccall "cryptonite_sha384_finalize_prefix" + c_sha384_finalize_prefix :: Ptr (Context a) -> Ptr Word8 -> Word32 -> Word32 -> Ptr (Digest a) -> IO () diff --git a/Crypto/Hash/SHA512.hs b/Crypto/Hash/SHA512.hs index 20449b3..9a66df9 100644 --- a/Crypto/Hash/SHA512.hs +++ b/Crypto/Hash/SHA512.hs @@ -34,6 +34,9 @@ instance HashAlgorithm SHA512 where hashInternalUpdate = c_sha512_update hashInternalFinalize = c_sha512_finalize +instance HashAlgorithmPrefix SHA512 where + hashInternalFinalizePrefix = c_sha512_finalize_prefix + foreign import ccall unsafe "cryptonite_sha512_init" c_sha512_init :: Ptr (Context a)-> IO () @@ -42,3 +45,6 @@ foreign import ccall "cryptonite_sha512_update" foreign import ccall unsafe "cryptonite_sha512_finalize" c_sha512_finalize :: Ptr (Context a) -> Ptr (Digest a) -> IO () + +foreign import ccall "cryptonite_sha512_finalize_prefix" + c_sha512_finalize_prefix :: Ptr (Context a) -> Ptr Word8 -> Word32 -> Word32 -> Ptr (Digest a) -> IO () diff --git a/gen/Gen.hs b/gen/Gen.hs index c2e43ad..2bf81d6 100644 --- a/gen/Gen.hs +++ b/gen/Gen.hs @@ -54,6 +54,7 @@ data Prop = data HashCustom = HashSimple Bits -- digest size in bits Bytes -- block length in bytes + Bool -- has HashAlgorithmPrefix instance? | HashMulti [Prop] [(Bits, Bytes)] -- list of (digest output size in *bits*, block size in bytes) hashModules = @@ -62,22 +63,22 @@ hashModules = , GenHashModule "Blake2sp" "blake2.h" "blake2sp" 1752 (HashMulti [] [(224,64), (256,64)]) , GenHashModule "Blake2b" "blake2.h" "blake2b" 248 (HashMulti [] [(160, 128), (224, 128), (256, 128), (384, 128), (512,128)]) , GenHashModule "Blake2bp" "blake2.h" "blake2bp" 1768 (HashMulti [] [(512,128)]) - , GenHashModule "MD2" "md2.h" "md2" 96 (HashSimple 128 16) - , GenHashModule "MD4" "md4.h" "md4" 96 (HashSimple 128 64) - , GenHashModule "MD5" "md5.h" "md5" 96 (HashSimple 128 64) - , GenHashModule "SHA1" "sha1.h" "sha1" 96 (HashSimple 160 64) - , GenHashModule "SHA224" "sha256.h" "sha224" 192 (HashSimple 224 64) - , GenHashModule "SHA256" "sha256.h" "sha256" 192 (HashSimple 256 64) - , GenHashModule "SHA384" "sha512.h" "sha384" 256 (HashSimple 384 128) - , GenHashModule "SHA512" "sha512.h" "sha512" 256 (HashSimple 512 128) + , GenHashModule "MD2" "md2.h" "md2" 96 (HashSimple 128 16 False) + , GenHashModule "MD4" "md4.h" "md4" 96 (HashSimple 128 64 False) + , GenHashModule "MD5" "md5.h" "md5" 96 (HashSimple 128 64 True) + , GenHashModule "SHA1" "sha1.h" "sha1" 96 (HashSimple 160 64 True) + , GenHashModule "SHA224" "sha256.h" "sha224" 192 (HashSimple 224 64 True) + , GenHashModule "SHA256" "sha256.h" "sha256" 192 (HashSimple 256 64 True) + , GenHashModule "SHA384" "sha512.h" "sha384" 256 (HashSimple 384 128 True) + , GenHashModule "SHA512" "sha512.h" "sha512" 256 (HashSimple 512 128 True) , GenHashModule "SHA512t" "sha512.h" "sha512t" 256 (HashMulti [] [(224,128),(256,128)]) , GenHashModule "Keccak" "keccak.h" "keccak" 352 (HashMulti [VarCtx sha3CtxSize] [(224,144),(256,136),(384,104),(512,72)]) , GenHashModule "SHA3" "sha3.h" "sha3" 352 (HashMulti [VarCtx sha3CtxSize] [(224,144),(256,136),(384,104),(512,72)]) - , GenHashModule "RIPEMD160" "ripemd.h" "ripemd160" 128 (HashSimple 160 64) + , GenHashModule "RIPEMD160" "ripemd.h" "ripemd160" 128 (HashSimple 160 64 False) , GenHashModule "Skein256" "skein256.h" "skein256" 96 (HashMulti [] [(224,32),(256,32)]) , GenHashModule "Skein512" "skein512.h" "skein512" 160 (HashMulti [] [(224,64),(256,64),(384,64),(512,64)]) - , GenHashModule "Tiger" "tiger.h" "tiger" 96 (HashSimple 192 64) - , GenHashModule "Whirlpool" "whirlpool.h" "whirlpool" 168 (HashSimple 512 64) + , GenHashModule "Tiger" "tiger.h" "tiger" 96 (HashSimple 192 64 False) + , GenHashModule "Whirlpool" "whirlpool.h" "whirlpool" 168 (HashSimple 512 64 False) ] sha3CtxSize :: Bits -> Bytes @@ -105,13 +106,16 @@ renderHashModules genOpts = do let (tpl, addVars, multiVars) = case ghmCustomizable ghm of - HashSimple digestSize blockLength -> + HashSimple digestSize blockLength hasPrefixInstance -> (hashTemplate, [ ("DIGEST_SIZE_BITS" , showBits digestSize) , ("DIGEST_SIZE_BYTES", showBytes digestSize) , ("BLOCK_SIZE_BYTES" , showBytes blockLength) + ], + [ ("HASPREFIXINSTANCE", + [[] | hasPrefixInstance] + ) ] - , [] ) HashMulti props customSizes -> let customCtxSize = diff --git a/gen/Template.hs b/gen/Template.hs index 2cfff18..43984e6 100644 --- a/gen/Template.hs +++ b/gen/Template.hs @@ -45,7 +45,7 @@ renderTemplate template attrs multiAttrs = renderAtom (Tpl n t) = case lookup n multiAttrs of Nothing -> error ("cannot find inner template attributes for: " ++ n) - Just [] -> error ("empty multiattrs for: " ++ n) + Just [] -> "" Just (i:is) -> renderTemplate t (i ++ attrs) [] ++ concatMap (\inAttrs -> renderTemplate t (inAttrs ++ attrs ++ [("COMMA", ",")]) []) is diff --git a/gen/template/hash.hs b/gen/template/hash.hs index 4748054..9682180 100644 --- a/gen/template/hash.hs +++ b/gen/template/hash.hs @@ -32,7 +32,10 @@ instance HashAlgorithm %%MODULENAME%% where hashInternalContextSize _ = %%CTX_SIZE_BYTES%% hashInternalInit = c_%%HASHNAME%%_init hashInternalUpdate = c_%%HASHNAME%%_update - hashInternalFinalize = c_%%HASHNAME%%_finalize + hashInternalFinalize = c_%%HASHNAME%%_finalize%{HASPREFIXINSTANCE%} + +instance HashAlgorithmPrefix %%MODULENAME%% where + hashInternalFinalizePrefix = c_%%HASHNAME%%_finalize_prefix%{HASPREFIXINSTANCE%} foreign import ccall unsafe "cryptonite_%%HASHNAME%%_init" c_%%HASHNAME%%_init :: Ptr (Context a)-> IO () @@ -41,4 +44,7 @@ foreign import ccall "cryptonite_%%HASHNAME%%_update" c_%%HASHNAME%%_update :: Ptr (Context a) -> Ptr Word8 -> Word32 -> IO () foreign import ccall unsafe "cryptonite_%%HASHNAME%%_finalize" - c_%%HASHNAME%%_finalize :: Ptr (Context a) -> Ptr (Digest a) -> IO () + c_%%HASHNAME%%_finalize :: Ptr (Context a) -> Ptr (Digest a) -> IO ()%{HASPREFIXINSTANCE%} + +foreign import ccall "cryptonite_%%HASHNAME%%_finalize_prefix" + c_%%HASHNAME%%_finalize_prefix :: Ptr (Context a) -> Ptr Word8 -> Word32 -> Word32 -> Ptr (Digest a) -> IO ()%{HASPREFIXINSTANCE%}