summaryrefslogtreecommitdiff
path: root/nix/libutil/hash.cc
diff options
context:
space:
mode:
authorEelco Dolstra <eelco.dolstra@logicblox.com>2015-11-04 16:31:06 +0100
committerLudovic Courtès <ludo@gnu.org>2015-12-02 19:37:59 +0200
commit29d3242e5c428d3b0e8dc9db1c81cd4053e5271c (patch)
tree9265c393bba91ada32e17f33b0725f5aee5cddd8 /nix/libutil/hash.cc
parent79aa1a83054af1600ba235ddf305337b5df78271 (diff)
downloadpatches-29d3242e5c428d3b0e8dc9db1c81cd4053e5271c.tar
patches-29d3242e5c428d3b0e8dc9db1c81cd4053e5271c.tar.gz
daemon: 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). Co-authored-by: Ludovic Courtès <ludo@gnu.org>
Diffstat (limited to 'nix/libutil/hash.cc')
-rw-r--r--nix/libutil/hash.cc8
1 files changed, 8 insertions, 0 deletions
diff --git a/nix/libutil/hash.cc b/nix/libutil/hash.cc
index 2da00a53de..ea69aa64f9 100644
--- a/nix/libutil/hash.cc
+++ b/nix/libutil/hash.cc
@@ -11,6 +11,7 @@ extern "C" {
#include "md5.h"
#include "sha1.h"
#include "sha256.h"
+#include "sha512.h"
}
#endif
@@ -40,6 +41,7 @@ Hash::Hash(HashType type)
if (type == htMD5) hashSize = md5HashSize;
else if (type == htSHA1) hashSize = sha1HashSize;
else if (type == htSHA256) hashSize = sha256HashSize;
+ else if (type == htSHA512) hashSize = sha512HashSize;
else throw Error("unknown hash type");
assert(hashSize <= maxHashSize);
memset(hash, 0, maxHashSize);
@@ -199,6 +201,7 @@ struct Ctx
MD5_CTX md5;
SHA_CTX sha1;
SHA256_CTX sha256;
+ SHA512_CTX sha512;
};
@@ -207,6 +210,7 @@ static void start(HashType ht, Ctx & ctx)
if (ht == htMD5) MD5_Init(&ctx.md5);
else if (ht == htSHA1) SHA1_Init(&ctx.sha1);
else if (ht == htSHA256) SHA256_Init(&ctx.sha256);
+ else if (ht == htSHA512) SHA512_Init(&ctx.sha512);
}
@@ -216,6 +220,7 @@ static void update(HashType ht, Ctx & ctx,
if (ht == htMD5) MD5_Update(&ctx.md5, 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 == htSHA512) SHA512_Update(&ctx.sha512, bytes, len);
}
@@ -224,6 +229,7 @@ static void finish(HashType ht, Ctx & ctx, unsigned char * hash)
if (ht == htMD5) MD5_Final(hash, &ctx.md5);
else if (ht == htSHA1) SHA1_Final(hash, &ctx.sha1);
else if (ht == htSHA256) SHA256_Final(hash, &ctx.sha256);
+ else if (ht == htSHA512) SHA512_Final(hash, &ctx.sha512);
}
@@ -321,6 +327,7 @@ HashType parseHashType(const string & s)
if (s == "md5") return htMD5;
else if (s == "sha1") return htSHA1;
else if (s == "sha256") return htSHA256;
+ else if (s == "sha512") return htSHA512;
else return htUnknown;
}
@@ -330,6 +337,7 @@ string printHashType(HashType ht)
if (ht == htMD5) return "md5";
else if (ht == htSHA1) return "sha1";
else if (ht == htSHA256) return "sha256";
+ else if (ht == htSHA512) return "sha512";
else throw Error("cannot print unknown hash type");
}