forked from lix-project/lix
Support SHA-512 hashes
Fixes #679. Note: on x86_64, SHA-512 is considerably faster than SHA-256 (198 MB/s versus 131 MB/s).
This commit is contained in:
parent
a6ca68a70c
commit
6f1743b1a5
|
@ -32,6 +32,7 @@ Hash::Hash(HashType type)
|
||||||
if (type == htMD5) hashSize = md5HashSize;
|
if (type == htMD5) hashSize = md5HashSize;
|
||||||
else if (type == htSHA1) hashSize = sha1HashSize;
|
else if (type == htSHA1) hashSize = sha1HashSize;
|
||||||
else if (type == htSHA256) hashSize = sha256HashSize;
|
else if (type == htSHA256) hashSize = sha256HashSize;
|
||||||
|
else if (type == htSHA512) hashSize = sha512HashSize;
|
||||||
else throw Error("unknown hash type");
|
else throw Error("unknown hash type");
|
||||||
assert(hashSize <= maxHashSize);
|
assert(hashSize <= maxHashSize);
|
||||||
memset(hash, 0, maxHashSize);
|
memset(hash, 0, maxHashSize);
|
||||||
|
@ -190,6 +191,7 @@ union Ctx
|
||||||
MD5_CTX md5;
|
MD5_CTX md5;
|
||||||
SHA_CTX sha1;
|
SHA_CTX sha1;
|
||||||
SHA256_CTX sha256;
|
SHA256_CTX sha256;
|
||||||
|
SHA512_CTX sha512;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -198,6 +200,7 @@ static void start(HashType ht, Ctx & ctx)
|
||||||
if (ht == htMD5) MD5_Init(&ctx.md5);
|
if (ht == htMD5) MD5_Init(&ctx.md5);
|
||||||
else if (ht == htSHA1) SHA1_Init(&ctx.sha1);
|
else if (ht == htSHA1) SHA1_Init(&ctx.sha1);
|
||||||
else if (ht == htSHA256) SHA256_Init(&ctx.sha256);
|
else if (ht == htSHA256) SHA256_Init(&ctx.sha256);
|
||||||
|
else if (ht == htSHA512) SHA512_Init(&ctx.sha512);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -207,6 +210,7 @@ static void update(HashType ht, Ctx & ctx,
|
||||||
if (ht == htMD5) MD5_Update(&ctx.md5, bytes, len);
|
if (ht == htMD5) MD5_Update(&ctx.md5, bytes, len);
|
||||||
else if (ht == htSHA1) SHA1_Update(&ctx.sha1, bytes, len);
|
else if (ht == htSHA1) SHA1_Update(&ctx.sha1, bytes, len);
|
||||||
else if (ht == htSHA256) SHA256_Update(&ctx.sha256, bytes, len);
|
else if (ht == htSHA256) SHA256_Update(&ctx.sha256, bytes, len);
|
||||||
|
else if (ht == htSHA512) SHA512_Update(&ctx.sha512, bytes, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -215,6 +219,7 @@ static void finish(HashType ht, Ctx & ctx, unsigned char * hash)
|
||||||
if (ht == htMD5) MD5_Final(hash, &ctx.md5);
|
if (ht == htMD5) MD5_Final(hash, &ctx.md5);
|
||||||
else if (ht == htSHA1) SHA1_Final(hash, &ctx.sha1);
|
else if (ht == htSHA1) SHA1_Final(hash, &ctx.sha1);
|
||||||
else if (ht == htSHA256) SHA256_Final(hash, &ctx.sha256);
|
else if (ht == htSHA256) SHA256_Final(hash, &ctx.sha256);
|
||||||
|
else if (ht == htSHA512) SHA512_Final(hash, &ctx.sha512);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -312,6 +317,7 @@ HashType parseHashType(const string & s)
|
||||||
if (s == "md5") return htMD5;
|
if (s == "md5") return htMD5;
|
||||||
else if (s == "sha1") return htSHA1;
|
else if (s == "sha1") return htSHA1;
|
||||||
else if (s == "sha256") return htSHA256;
|
else if (s == "sha256") return htSHA256;
|
||||||
|
else if (s == "sha512") return htSHA512;
|
||||||
else return htUnknown;
|
else return htUnknown;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -321,6 +327,7 @@ string printHashType(HashType ht)
|
||||||
if (ht == htMD5) return "md5";
|
if (ht == htMD5) return "md5";
|
||||||
else if (ht == htSHA1) return "sha1";
|
else if (ht == htSHA1) return "sha1";
|
||||||
else if (ht == htSHA256) return "sha256";
|
else if (ht == htSHA256) return "sha256";
|
||||||
|
else if (ht == htSHA512) return "sha512";
|
||||||
else throw Error("cannot print unknown hash type");
|
else throw Error("cannot print unknown hash type");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -7,19 +7,20 @@
|
||||||
namespace nix {
|
namespace nix {
|
||||||
|
|
||||||
|
|
||||||
typedef enum { htUnknown, htMD5, htSHA1, htSHA256 } HashType;
|
typedef enum { htUnknown, htMD5, htSHA1, htSHA256, htSHA512 } HashType;
|
||||||
|
|
||||||
|
|
||||||
const int md5HashSize = 16;
|
const int md5HashSize = 16;
|
||||||
const int sha1HashSize = 20;
|
const int sha1HashSize = 20;
|
||||||
const int sha256HashSize = 32;
|
const int sha256HashSize = 32;
|
||||||
|
const int sha512HashSize = 64;
|
||||||
|
|
||||||
extern const string base32Chars;
|
extern const string base32Chars;
|
||||||
|
|
||||||
|
|
||||||
struct Hash
|
struct Hash
|
||||||
{
|
{
|
||||||
static const unsigned int maxHashSize = 32;
|
static const unsigned int maxHashSize = 64;
|
||||||
unsigned int hashSize;
|
unsigned int hashSize;
|
||||||
unsigned char hash[maxHashSize];
|
unsigned char hash[maxHashSize];
|
||||||
|
|
||||||
|
|
|
@ -40,13 +40,10 @@ echo "Hello World!" > $TEST_ROOT/fixed/foo
|
||||||
ln -s foo $TEST_ROOT/fixed/bar
|
ln -s foo $TEST_ROOT/fixed/bar
|
||||||
|
|
||||||
out2=$(nix-store --add $TEST_ROOT/fixed)
|
out2=$(nix-store --add $TEST_ROOT/fixed)
|
||||||
echo $out2
|
[ "$out" = "$out2" ]
|
||||||
test "$out" = "$out2" || exit 1
|
|
||||||
|
|
||||||
out3=$(nix-store --add-fixed --recursive sha256 $TEST_ROOT/fixed)
|
out3=$(nix-store --add-fixed --recursive sha256 $TEST_ROOT/fixed)
|
||||||
echo $out3
|
[ "$out" = "$out3" ]
|
||||||
test "$out" = "$out3" || exit 1
|
|
||||||
|
|
||||||
out4=$(nix-store --print-fixed-path --recursive sha256 "1ixr6yd3297ciyp9im522dfxpqbkhcw0pylkb2aab915278fqaik" fixed)
|
out4=$(nix-store --print-fixed-path --recursive sha256 "1ixr6yd3297ciyp9im522dfxpqbkhcw0pylkb2aab915278fqaik" fixed)
|
||||||
echo $out4
|
[ "$out" = "$out4" ]
|
||||||
test "$out" = "$out4" || exit 1
|
|
||||||
|
|
|
@ -17,12 +17,18 @@ try md5 "abcdefghijklmnopqrstuvwxyz" "c3fcd3d76192e4007dfb496cca67e13b"
|
||||||
try md5 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" "d174ab98d277d9f5a5611c2c9f419d9f"
|
try md5 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" "d174ab98d277d9f5a5611c2c9f419d9f"
|
||||||
try md5 "12345678901234567890123456789012345678901234567890123456789012345678901234567890" "57edf4a22be3c955ac49da2e2107b67a"
|
try md5 "12345678901234567890123456789012345678901234567890123456789012345678901234567890" "57edf4a22be3c955ac49da2e2107b67a"
|
||||||
|
|
||||||
|
try sha1 "" "da39a3ee5e6b4b0d3255bfef95601890afd80709"
|
||||||
try sha1 "abc" "a9993e364706816aba3e25717850c26c9cd0d89d"
|
try sha1 "abc" "a9993e364706816aba3e25717850c26c9cd0d89d"
|
||||||
try sha1 "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" "84983e441c3bd26ebaae4aa1f95129e5e54670f1"
|
try sha1 "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" "84983e441c3bd26ebaae4aa1f95129e5e54670f1"
|
||||||
|
|
||||||
|
try sha256 "" "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
|
||||||
try sha256 "abc" "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad"
|
try sha256 "abc" "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad"
|
||||||
try sha256 "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" "248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1"
|
try sha256 "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" "248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1"
|
||||||
|
|
||||||
|
try sha512 "" "cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e"
|
||||||
|
try sha512 "abc" "ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f"
|
||||||
|
try sha512 "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" "204a8fc6dda82f0a0ced7beb8e08a41657c16ef468b228a8279be331a703c33596fd15c13b1b07f9aa1d3bea57789ca031ad85c7a71dd70354ec631238ca3445"
|
||||||
|
|
||||||
EXTRA=--base32
|
EXTRA=--base32
|
||||||
try sha256 "abc" "1b8m03r63zqhnjf7l5wnldhh7c134ap5vpj0850ymkq1iyzicy5s"
|
try sha256 "abc" "1b8m03r63zqhnjf7l5wnldhh7c134ap5vpj0850ymkq1iyzicy5s"
|
||||||
EXTRA=
|
EXTRA=
|
||||||
|
@ -56,7 +62,12 @@ ln -s x $TEST_ROOT/hash-path/hello
|
||||||
try2 md5 "f78b733a68f5edbdf9413899339eaa4a"
|
try2 md5 "f78b733a68f5edbdf9413899339eaa4a"
|
||||||
|
|
||||||
# Conversion.
|
# Conversion.
|
||||||
test $(nix-hash --type sha256 --to-base32 "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad") = "1b8m03r63zqhnjf7l5wnldhh7c134ap5vpj0850ymkq1iyzicy5s"
|
try3() {
|
||||||
test $(nix-hash --type sha256 --to-base16 "1b8m03r63zqhnjf7l5wnldhh7c134ap5vpj0850ymkq1iyzicy5s") = "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad"
|
h32=$(nix-hash --type "$1" --to-base32 "$2")
|
||||||
test $(nix-hash --type sha1 --to-base32 "800d59cfcd3c05e900cb4e214be48f6b886a08df") = "vw46m23bizj4n8afrc0fj19wrp7mj3c0"
|
[ "$h32" = "$3" ]
|
||||||
test $(nix-hash --type sha1 --to-base16 "vw46m23bizj4n8afrc0fj19wrp7mj3c0") = "800d59cfcd3c05e900cb4e214be48f6b886a08df"
|
h16=$(nix-hash --type "$1" --to-base16 "$h32")
|
||||||
|
[ "$h16" = "$2" ]
|
||||||
|
}
|
||||||
|
try3 sha1 "800d59cfcd3c05e900cb4e214be48f6b886a08df" "vw46m23bizj4n8afrc0fj19wrp7mj3c0"
|
||||||
|
try3 sha256 "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad" "1b8m03r63zqhnjf7l5wnldhh7c134ap5vpj0850ymkq1iyzicy5s"
|
||||||
|
try3 sha512 "204a8fc6dda82f0a0ced7beb8e08a41657c16ef468b228a8279be331a703c33596fd15c13b1b07f9aa1d3bea57789ca031ad85c7a71dd70354ec631238ca3445" "12k9jiq29iyqm03swfsgiw5mlqs173qazm3n7daz43infy12pyrcdf30fkk3qwv4yl2ick8yipc2mqnlh48xsvvxl60lbx8vp38yji0"
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
[ "d41d8cd98f00b204e9800998ecf8427e" "6c69ee7f211c640419d5366cc076ae46" "bb3438fbabd460ea6dbd27d153e2233b" "da39a3ee5e6b4b0d3255bfef95601890afd80709" "cd54e8568c1b37cf1e5badb0779bcbf382212189" "6d12e10b1d331dad210e47fd25d4f260802b7e77" "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" "900a4469df00ccbfd0c145c6d1e4b7953dd0afafadd7534e3a4019e8d38fc663" "ad0387b3bd8652f730ca46d25f9c170af0fd589f42e7f23f5a9e6412d97d7e56" ]
|
[ "d41d8cd98f00b204e9800998ecf8427e" "6c69ee7f211c640419d5366cc076ae46" "bb3438fbabd460ea6dbd27d153e2233b" "da39a3ee5e6b4b0d3255bfef95601890afd80709" "cd54e8568c1b37cf1e5badb0779bcbf382212189" "6d12e10b1d331dad210e47fd25d4f260802b7e77" "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" "900a4469df00ccbfd0c145c6d1e4b7953dd0afafadd7534e3a4019e8d38fc663" "ad0387b3bd8652f730ca46d25f9c170af0fd589f42e7f23f5a9e6412d97d7e56" "cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e" "9d0886f8c6b389398a16257bc79780fab9831c7fc11c8ab07fa732cb7b348feade382f92617c9c5305fefba0af02ab5fd39a587d330997ff5bd0db19f7666653" "21644b72aa259e5a588cd3afbafb1d4310f4889680f6c83b9d531596a5a284f34dbebff409d23bcc86aee6bad10c891606f075c6f4755cb536da27db5693f3a7" ]
|
||||||
|
|
|
@ -1,7 +1,4 @@
|
||||||
let
|
let
|
||||||
md5 = builtins.hashString "md5";
|
|
||||||
sha1 = builtins.hashString "sha1";
|
|
||||||
sha256 = builtins.hashString "sha256";
|
|
||||||
strings = [ "" "text 1" "text 2" ];
|
strings = [ "" "text 1" "text 2" ];
|
||||||
in
|
in
|
||||||
(builtins.map md5 strings) ++ (builtins.map sha1 strings) ++ (builtins.map sha256 strings)
|
builtins.concatLists (map (hash: map (builtins.hashString hash) strings) ["md5" "sha1" "sha256" "sha512"])
|
||||||
|
|
Loading…
Reference in a new issue