diff options
| author | Eelco Dolstra <eelco.dolstra@logicblox.com> | 2015-11-04 16:31:06 +0100 |
|---|---|---|
| committer | Ludovic Courtès <ludo@gnu.org> | 2015-12-02 19:37:59 +0200 |
| commit | 29d3242e5c428d3b0e8dc9db1c81cd4053e5271c (patch) | |
| tree | 9265c393bba91ada32e17f33b0725f5aee5cddd8 /nix/libutil/hash.cc | |
| parent | 79aa1a83054af1600ba235ddf305337b5df78271 (diff) | |
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.cc | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/nix/libutil/hash.cc b/nix/libutil/hash.cc index 2da00a53de0..ea69aa64f91 100644 --- a/nix/libutil/hash.cc +++ b/nix/libutil/hash.cc | |||
| @@ -11,6 +11,7 @@ extern "C" { | |||
| 11 | #include "md5.h" | 11 | #include "md5.h" |
| 12 | #include "sha1.h" | 12 | #include "sha1.h" |
| 13 | #include "sha256.h" | 13 | #include "sha256.h" |
| 14 | #include "sha512.h" | ||
| 14 | } | 15 | } |
| 15 | #endif | 16 | #endif |
| 16 | 17 | ||
| @@ -40,6 +41,7 @@ Hash::Hash(HashType type) | |||
| 40 | if (type == htMD5) hashSize = md5HashSize; | 41 | if (type == htMD5) hashSize = md5HashSize; |
| 41 | else if (type == htSHA1) hashSize = sha1HashSize; | 42 | else if (type == htSHA1) hashSize = sha1HashSize; |
| 42 | else if (type == htSHA256) hashSize = sha256HashSize; | 43 | else if (type == htSHA256) hashSize = sha256HashSize; |
| 44 | else if (type == htSHA512) hashSize = sha512HashSize; | ||
| 43 | else throw Error("unknown hash type"); | 45 | else throw Error("unknown hash type"); |
| 44 | assert(hashSize <= maxHashSize); | 46 | assert(hashSize <= maxHashSize); |
| 45 | memset(hash, 0, maxHashSize); | 47 | memset(hash, 0, maxHashSize); |
| @@ -199,6 +201,7 @@ struct Ctx | |||
| 199 | MD5_CTX md5; | 201 | MD5_CTX md5; |
| 200 | SHA_CTX sha1; | 202 | SHA_CTX sha1; |
| 201 | SHA256_CTX sha256; | 203 | SHA256_CTX sha256; |
| 204 | SHA512_CTX sha512; | ||
| 202 | }; | 205 | }; |
| 203 | 206 | ||
| 204 | 207 | ||
| @@ -207,6 +210,7 @@ static void start(HashType ht, Ctx & ctx) | |||
| 207 | if (ht == htMD5) MD5_Init(&ctx.md5); | 210 | if (ht == htMD5) MD5_Init(&ctx.md5); |
| 208 | else if (ht == htSHA1) SHA1_Init(&ctx.sha1); | 211 | else if (ht == htSHA1) SHA1_Init(&ctx.sha1); |
| 209 | else if (ht == htSHA256) SHA256_Init(&ctx.sha256); | 212 | else if (ht == htSHA256) SHA256_Init(&ctx.sha256); |
| 213 | else if (ht == htSHA512) SHA512_Init(&ctx.sha512); | ||
| 210 | } | 214 | } |
| 211 | 215 | ||
| 212 | 216 | ||
| @@ -216,6 +220,7 @@ static void update(HashType ht, Ctx & ctx, | |||
| 216 | if (ht == htMD5) MD5_Update(&ctx.md5, bytes, len); | 220 | if (ht == htMD5) MD5_Update(&ctx.md5, bytes, len); |
| 217 | else if (ht == htSHA1) SHA1_Update(&ctx.sha1, bytes, len); | 221 | else if (ht == htSHA1) SHA1_Update(&ctx.sha1, bytes, len); |
| 218 | else if (ht == htSHA256) SHA256_Update(&ctx.sha256, bytes, len); | 222 | else if (ht == htSHA256) SHA256_Update(&ctx.sha256, bytes, len); |
| 223 | else if (ht == htSHA512) SHA512_Update(&ctx.sha512, bytes, len); | ||
| 219 | } | 224 | } |
| 220 | 225 | ||
| 221 | 226 | ||
| @@ -224,6 +229,7 @@ static void finish(HashType ht, Ctx & ctx, unsigned char * hash) | |||
| 224 | if (ht == htMD5) MD5_Final(hash, &ctx.md5); | 229 | if (ht == htMD5) MD5_Final(hash, &ctx.md5); |
| 225 | else if (ht == htSHA1) SHA1_Final(hash, &ctx.sha1); | 230 | else if (ht == htSHA1) SHA1_Final(hash, &ctx.sha1); |
| 226 | else if (ht == htSHA256) SHA256_Final(hash, &ctx.sha256); | 231 | else if (ht == htSHA256) SHA256_Final(hash, &ctx.sha256); |
| 232 | else if (ht == htSHA512) SHA512_Final(hash, &ctx.sha512); | ||
| 227 | } | 233 | } |
| 228 | 234 | ||
| 229 | 235 | ||
| @@ -321,6 +327,7 @@ HashType parseHashType(const string & s) | |||
| 321 | if (s == "md5") return htMD5; | 327 | if (s == "md5") return htMD5; |
| 322 | else if (s == "sha1") return htSHA1; | 328 | else if (s == "sha1") return htSHA1; |
| 323 | else if (s == "sha256") return htSHA256; | 329 | else if (s == "sha256") return htSHA256; |
| 330 | else if (s == "sha512") return htSHA512; | ||
| 324 | else return htUnknown; | 331 | else return htUnknown; |
| 325 | } | 332 | } |
| 326 | 333 | ||
| @@ -330,6 +337,7 @@ string printHashType(HashType ht) | |||
| 330 | if (ht == htMD5) return "md5"; | 337 | if (ht == htMD5) return "md5"; |
| 331 | else if (ht == htSHA1) return "sha1"; | 338 | else if (ht == htSHA1) return "sha1"; |
| 332 | else if (ht == htSHA256) return "sha256"; | 339 | else if (ht == htSHA256) return "sha256"; |
| 340 | else if (ht == htSHA512) return "sha512"; | ||
| 333 | else throw Error("cannot print unknown hash type"); | 341 | else throw Error("cannot print unknown hash type"); |
| 334 | } | 342 | } |
| 335 | 343 | ||
