[HASH] re-enable SHA512t
This commit is contained in:
parent
6ba517e945
commit
81e335cfff
@ -18,6 +18,8 @@ module Crypto.Hash.Algorithms
|
|||||||
, SHA256(..)
|
, SHA256(..)
|
||||||
, SHA384(..)
|
, SHA384(..)
|
||||||
, SHA512(..)
|
, SHA512(..)
|
||||||
|
, SHA512t_224(..)
|
||||||
|
, SHA512t_256(..)
|
||||||
, RIPEMD160(..)
|
, RIPEMD160(..)
|
||||||
, Tiger(..)
|
, Tiger(..)
|
||||||
, Kekkak_224(..)
|
, Kekkak_224(..)
|
||||||
@ -46,6 +48,7 @@ import Crypto.Hash.SHA224
|
|||||||
import Crypto.Hash.SHA256
|
import Crypto.Hash.SHA256
|
||||||
import Crypto.Hash.SHA384
|
import Crypto.Hash.SHA384
|
||||||
import Crypto.Hash.SHA512
|
import Crypto.Hash.SHA512
|
||||||
|
import Crypto.Hash.SHA512t
|
||||||
import Crypto.Hash.SHA3
|
import Crypto.Hash.SHA3
|
||||||
import Crypto.Hash.Kekkak
|
import Crypto.Hash.Kekkak
|
||||||
import Crypto.Hash.RIPEMD160
|
import Crypto.Hash.RIPEMD160
|
||||||
|
|||||||
@ -5,55 +5,47 @@
|
|||||||
-- Stability : experimental
|
-- Stability : experimental
|
||||||
-- Portability : unknown
|
-- Portability : unknown
|
||||||
--
|
--
|
||||||
-- A module containing SHA512/t
|
-- module containing the binding functions to work with the
|
||||||
|
-- SHA512t cryptographic hash.
|
||||||
--
|
--
|
||||||
|
{-# LANGUAGE ForeignFunctionInterface #-}
|
||||||
module Crypto.Hash.SHA512t
|
module Crypto.Hash.SHA512t
|
||||||
(-- Ctx(..)
|
( SHA512t_224 (..), SHA512t_256 (..)
|
||||||
|
|
||||||
-- * Incremental hashing Functions
|
|
||||||
init -- :: Ctx
|
|
||||||
, update -- :: Ctx -> ByteString -> Ctx
|
|
||||||
, finalize -- :: Ctx -> ByteString
|
|
||||||
|
|
||||||
-- * Single Pass hashing
|
|
||||||
--, hash -- :: ByteString -> ByteString
|
|
||||||
--, hashlazy -- :: ByteString -> ByteString
|
|
||||||
) where
|
) where
|
||||||
|
|
||||||
import Prelude hiding (init, take)
|
import Crypto.Hash.Types
|
||||||
import Data.List (foldl')
|
import Foreign.Ptr (Ptr)
|
||||||
import qualified Data.ByteString.Lazy as L
|
import Data.Word (Word8, Word32)
|
||||||
|
|
||||||
import qualified Crypto.Hash.SHA512 as SHA512
|
|
||||||
import Crypto.Internal.Compat
|
|
||||||
import Crypto.Internal.ByteArray (ByteArray, ByteArrayAccess, take)
|
|
||||||
--import qualified Crypto.Hash.Internal.SHA512t as SHA512t
|
|
||||||
--import Crypto.Hash.Internal.SHA512 (withCtxNew)
|
|
||||||
|
|
||||||
init = undefined
|
data SHA512t_224 = SHA512t_224
|
||||||
update = undefined
|
deriving (Show)
|
||||||
finalize = undefined
|
|
||||||
{-
|
|
||||||
-- | SHA512 Context with variable size output
|
|
||||||
data Ctx = Ctx !Int !SHA512.Ctx
|
|
||||||
|
|
||||||
-- | init a context
|
instance HashAlgorithm SHA512t_224 where
|
||||||
init :: Int -> Ctx
|
hashBlockSize _ = 128
|
||||||
init t = Ctx t $ unsafeDoIO $ withCtxNew $ \ptr -> SHA512t.internalInitAt t ptr
|
hashDigestSize _ = 28
|
||||||
|
hashInternalContextSize _ = 264
|
||||||
|
hashInternalInit p = c_sha512t_init p 224
|
||||||
|
hashInternalUpdate = c_sha512t_update
|
||||||
|
hashInternalFinalize = c_sha512t_finalize
|
||||||
|
|
||||||
-- | update a context with a bytestring
|
data SHA512t_256 = SHA512t_256
|
||||||
update :: ByteArrayAccess ba => Ctx -> ba -> Ctx
|
deriving (Show)
|
||||||
update (Ctx t ctx) d = Ctx t (SHA512.update ctx d)
|
|
||||||
|
|
||||||
-- | finalize the context into a digest bytestring
|
instance HashAlgorithm SHA512t_256 where
|
||||||
finalize :: ByteArray digest => Ctx -> digest
|
hashBlockSize _ = 128
|
||||||
finalize (Ctx sz ctx) = take (sz `div` 8) (SHA512.finalize ctx)
|
hashDigestSize _ = 32
|
||||||
|
hashInternalContextSize _ = 264
|
||||||
|
hashInternalInit p = c_sha512t_init p 256
|
||||||
|
hashInternalUpdate = c_sha512t_update
|
||||||
|
hashInternalFinalize = c_sha512t_finalize
|
||||||
|
|
||||||
-- | hash a strict bytestring into a digest bytestring
|
|
||||||
hash :: (ByteArrayAccess ba, ByteArray digest) => Int -> ba -> digest
|
|
||||||
hash t = finalize . update (init t)
|
|
||||||
|
|
||||||
-- | hash a lazy bytestring into a digest bytestring
|
foreign import ccall unsafe "cryptonite_sha512t_init"
|
||||||
hashlazy :: ByteArray digest => Int -> L.ByteString -> digest
|
c_sha512t_init :: Ptr (Context a) -> Word32 -> IO ()
|
||||||
hashlazy t = finalize . foldl' update (init t) . L.toChunks
|
|
||||||
-}
|
foreign import ccall "cryptonite_sha512t_update"
|
||||||
|
c_sha512t_update :: Ptr (Context a) -> Ptr Word8 -> Word32 -> IO ()
|
||||||
|
|
||||||
|
foreign import ccall unsafe "cryptonite_sha512t_finalize"
|
||||||
|
c_sha512t_finalize :: Ptr (Context a) -> Ptr (Digest a) -> IO ()
|
||||||
|
|||||||
@ -196,11 +196,13 @@ void cryptonite_sha512_finalize(struct sha512_ctx *ctx, uint8_t *out)
|
|||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
void cryptonite_sha512_init_t(struct sha512_ctx *ctx, int t)
|
void cryptonite_sha512t_init(struct sha512t_ctx *tctx, int t)
|
||||||
{
|
{
|
||||||
|
struct sha512_ctx *ctx = &tctx->ctx;
|
||||||
memset(ctx, 0, sizeof(*ctx));
|
memset(ctx, 0, sizeof(*ctx));
|
||||||
if (t >= 512)
|
if (t >= 512)
|
||||||
return;
|
return;
|
||||||
|
tctx->t = t;
|
||||||
|
|
||||||
switch (t) {
|
switch (t) {
|
||||||
case 224:
|
case 224:
|
||||||
@ -243,3 +245,17 @@ void cryptonite_sha512_init_t(struct sha512_ctx *ctx, int t)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void cryptonite_sha512t_update(struct sha512t_ctx *ctx, const uint8_t *data, uint32_t len)
|
||||||
|
{
|
||||||
|
return cryptonite_sha512_update(&ctx->ctx, data, len);
|
||||||
|
}
|
||||||
|
|
||||||
|
void cryptonite_sha512t_finalize(struct sha512t_ctx *ctx, uint8_t *out)
|
||||||
|
{
|
||||||
|
uint8_t intermediate[SHA512_DIGEST_SIZE];
|
||||||
|
|
||||||
|
cryptonite_sha512_finalize(&ctx->ctx, intermediate);
|
||||||
|
memcpy(out, intermediate, ctx->t / 8);
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
@ -33,6 +33,12 @@ struct sha512_ctx
|
|||||||
uint64_t h[8];
|
uint64_t h[8];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct sha512t_ctx
|
||||||
|
{
|
||||||
|
struct sha512_ctx ctx;
|
||||||
|
uint64_t t; /* the custom t (e.g. 224 for SHA512/224) */
|
||||||
|
};
|
||||||
|
|
||||||
#define sha384_ctx sha512_ctx
|
#define sha384_ctx sha512_ctx
|
||||||
|
|
||||||
#define SHA384_DIGEST_SIZE 64
|
#define SHA384_DIGEST_SIZE 64
|
||||||
@ -41,6 +47,8 @@ struct sha512_ctx
|
|||||||
#define SHA512_DIGEST_SIZE 64
|
#define SHA512_DIGEST_SIZE 64
|
||||||
#define SHA512_CTX_SIZE sizeof(struct sha512_ctx)
|
#define SHA512_CTX_SIZE sizeof(struct sha512_ctx)
|
||||||
|
|
||||||
|
#define SHA512t_CTX_SIZE sizeof(struct sha512t_ctx)
|
||||||
|
|
||||||
void cryptonite_sha384_init(struct sha384_ctx *ctx);
|
void cryptonite_sha384_init(struct sha384_ctx *ctx);
|
||||||
void cryptonite_sha384_update(struct sha384_ctx *ctx, const uint8_t *data, uint32_t len);
|
void cryptonite_sha384_update(struct sha384_ctx *ctx, const uint8_t *data, uint32_t len);
|
||||||
void cryptonite_sha384_finalize(struct sha384_ctx *ctx, uint8_t *out);
|
void cryptonite_sha384_finalize(struct sha384_ctx *ctx, uint8_t *out);
|
||||||
@ -49,6 +57,9 @@ void cryptonite_sha512_init(struct sha512_ctx *ctx);
|
|||||||
void cryptonite_sha512_update(struct sha512_ctx *ctx, const uint8_t *data, uint32_t len);
|
void cryptonite_sha512_update(struct sha512_ctx *ctx, const uint8_t *data, uint32_t len);
|
||||||
void cryptonite_sha512_finalize(struct sha512_ctx *ctx, uint8_t *out);
|
void cryptonite_sha512_finalize(struct sha512_ctx *ctx, uint8_t *out);
|
||||||
|
|
||||||
void cryptonite_sha512_init_t(struct sha512_ctx *ctx, int t);
|
/* only multiples of 8 are supported as valid t values */
|
||||||
|
void cryptonite_sha512t_init(struct sha512t_ctx *ctx, int t);
|
||||||
|
void cryptonite_sha512t_update(struct sha512t_ctx *ctx, const uint8_t *data, uint32_t len);
|
||||||
|
void cryptonite_sha512t_finalize(struct sha512t_ctx *ctx, uint8_t *out);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@ -29,6 +29,7 @@ hashModules =
|
|||||||
, GenHashModule "SHA256" "sha256.h" "sha256" 192 32 64 []
|
, GenHashModule "SHA256" "sha256.h" "sha256" 192 32 64 []
|
||||||
, GenHashModule "SHA384" "sha512.h" "sha384" 256 48 128 []
|
, GenHashModule "SHA384" "sha512.h" "sha384" 256 48 128 []
|
||||||
, GenHashModule "SHA512" "sha512.h" "sha512" 256 64 128 []
|
, GenHashModule "SHA512" "sha512.h" "sha512" 256 64 128 []
|
||||||
|
, GenHashModule "SHA512t" "sha512.h" "sha512t" 264 64 128 [(224,128),(256,128)]
|
||||||
, GenHashModule "Kekkak" "kekkak.h" "kekkak" 360 64 64 [(224,144),(256,136),(384,104),(512,72)]
|
, GenHashModule "Kekkak" "kekkak.h" "kekkak" 360 64 64 [(224,144),(256,136),(384,104),(512,72)]
|
||||||
, GenHashModule "SHA3" "sha3.h" "sha3" 360 64 64 [(224,144),(256,136),(384,104),(512,72)]
|
, GenHashModule "SHA3" "sha3.h" "sha3" 360 64 64 [(224,144),(256,136),(384,104),(512,72)]
|
||||||
, GenHashModule "RIPEMD160" "ripemd.h" "ripemd160" 128 20 64 []
|
, GenHashModule "RIPEMD160" "ripemd.h" "ripemd160" 128 20 64 []
|
||||||
|
|||||||
@ -56,16 +56,14 @@ expected = [
|
|||||||
"cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e",
|
"cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e",
|
||||||
"07e547d9586f6a73f73fbac0435ed76951218fb7d0c8d788a309d785436bbb642e93a252a954f23912547d1e8a3b5ed6e1bfd7097821233fa0538f3db854fee6",
|
"07e547d9586f6a73f73fbac0435ed76951218fb7d0c8d788a309d785436bbb642e93a252a954f23912547d1e8a3b5ed6e1bfd7097821233fa0538f3db854fee6",
|
||||||
"3eeee1d0e11733ef152a6c29503b3ae20c4f1f3cda4cb26f1bc1a41f91c7fe4ab3bd86494049e201c4bd5155f31ecb7a3c8606843c4cc8dfcab7da11c8ae5045" ]),
|
"3eeee1d0e11733ef152a6c29503b3ae20c4f1f3cda4cb26f1bc1a41f91c7fe4ab3bd86494049e201c4bd5155f31ecb7a3c8606843c4cc8dfcab7da11c8ae5045" ]),
|
||||||
{-
|
("SHA512/224", HashAlg SHA512t_224, [
|
||||||
("SHA512/224", sha512_224Hash, [
|
|
||||||
"6ed0dd02806fa89e25de060c19d3ac86cabb87d6a0ddd05c333b84f4",
|
"6ed0dd02806fa89e25de060c19d3ac86cabb87d6a0ddd05c333b84f4",
|
||||||
"944cd2847fb54558d4775db0485a50003111c8e5daa63fe722c6aa37",
|
"944cd2847fb54558d4775db0485a50003111c8e5daa63fe722c6aa37",
|
||||||
"2b9d6565a7e40f780ba8ab7c8dcf41e3ed3b77997f4c55aa987eede5" ]),
|
"2b9d6565a7e40f780ba8ab7c8dcf41e3ed3b77997f4c55aa987eede5" ]),
|
||||||
("SHA512/256", sha512_256Hash, [
|
("SHA512/256", HashAlg SHA512t_256, [
|
||||||
"c672b8d1ef56ed28ab87c3622c5114069bdd3ad7b8f9737498d0c01ecef0967a",
|
"c672b8d1ef56ed28ab87c3622c5114069bdd3ad7b8f9737498d0c01ecef0967a",
|
||||||
"dd9d67b371519c339ed8dbd25af90e976a1eeefd4ad3d889005e532fc5bef04d",
|
"dd9d67b371519c339ed8dbd25af90e976a1eeefd4ad3d889005e532fc5bef04d",
|
||||||
"cc8d255a7f2f38fd50388fd1f65ea7910835c5c1e73da46fba01ea50d5dd76fb" ]),
|
"cc8d255a7f2f38fd50388fd1f65ea7910835c5c1e73da46fba01ea50d5dd76fb" ]),
|
||||||
-}
|
|
||||||
("RIPEMD160", HashAlg RIPEMD160, [
|
("RIPEMD160", HashAlg RIPEMD160, [
|
||||||
"9c1185a5c5e9fc54612808977ee8f548b2258d31",
|
"9c1185a5c5e9fc54612808977ee8f548b2258d31",
|
||||||
"37f332f68db77bd9d7edd4969571ad671cf9dd3b",
|
"37f332f68db77bd9d7edd4969571ad671cf9dd3b",
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user