| ... | ... | @@ -1,8 +1,7 @@ |
| 1 | 1 | const mem = @import("../mem.zig"); |
| 2 | | const math = @import("../math.zig"); |
| 3 | | const endian = @import("../endian.zig"); |
| 4 | | const debug = @import("../debug.zig"); |
| 5 | 2 | const builtin = @import("builtin"); |
| 3 | const debug = @import("../debug.zig"); |
| 4 | const math = @import("../math.zig"); |
| 6 | 5 | const htest = @import("test.zig"); |
| 7 | 6 | |
| 8 | 7 | const RoundParam = struct { |
| ... | ... | @@ -67,10 +66,17 @@ pub fn Blake2s(comptime out_len: usize) type { |
| 67 | 66 | buf: [64]u8, |
| 68 | 67 | buf_len: u8, |
| 69 | 68 | |
| 69 | key: []const u8, |
| 70 | |
| 70 | 71 | pub fn init() Self { |
| 72 | return init_keyed(""); |
| 73 | } |
| 74 | |
| 75 | pub fn init_keyed(key: []const u8) Self { |
| 71 | 76 | debug.assert(8 <= out_len and out_len <= 512); |
| 72 | 77 | |
| 73 | 78 | var s: Self = undefined; |
| 79 | s.key = key; |
| 74 | 80 | s.reset(); |
| 75 | 81 | return s; |
| 76 | 82 | } |
| ... | ... | @@ -78,14 +84,24 @@ pub fn Blake2s(comptime out_len: usize) type { |
| 78 | 84 | pub fn reset(d: *Self) void { |
| 79 | 85 | mem.copy(u32, d.h[0..], iv[0..]); |
| 80 | 86 | |
| 81 | | // No key plus default parameters |
| 82 | | d.h[0] ^= 0x01010000 ^ @intCast(u32, out_len >> 3); |
| 87 | // default parameters |
| 88 | d.h[0] ^= 0x01010000 ^ @truncate(u32, d.key.len << 8) ^ @intCast(u32, out_len >> 3); |
| 83 | 89 | d.t = 0; |
| 84 | 90 | d.buf_len = 0; |
| 91 | |
| 92 | if (d.key.len > 0) { |
| 93 | mem.set(u8, d.buf[d.key.len..], 0); |
| 94 | d.update(d.key); |
| 95 | d.buf_len = 64; |
| 96 | } |
| 85 | 97 | } |
| 86 | 98 | |
| 87 | 99 | pub fn hash(b: []const u8, out: []u8) void { |
| 88 | | var d = Self.init(); |
| 100 | Self.hash_keyed("", b, out); |
| 101 | } |
| 102 | |
| 103 | pub fn hash_keyed(key: []const u8, b: []const u8, out: []u8) void { |
| 104 | var d = Self.init_keyed(key); |
| 89 | 105 | d.update(b); |
| 90 | 106 | d.final(out); |
| 91 | 107 | } |
| ... | ... | @@ -230,19 +246,22 @@ test "blake2s224 streaming" { |
| 230 | 246 | htest.assertEqual(h3, out[0..]); |
| 231 | 247 | } |
| 232 | 248 | |
| 233 | | test "blake2s224 aligned final" { |
| 234 | | var block = [_]u8{0} ** Blake2s224.block_length; |
| 235 | | var out: [Blake2s224.digest_length]u8 = undefined; |
| 249 | test "comptime blake2s224" { |
| 250 | comptime { |
| 251 | @setEvalBranchQuota(6000); |
| 252 | var block = [_]u8{0} ** Blake2s224.block_length; |
| 253 | var out: [Blake2s224.digest_length]u8 = undefined; |
| 236 | 254 | |
| 237 | | const h1 = "86b7611563293f8c73627df7a6d6ba25ca0548c2a6481f7d116ee576"; |
| 255 | const h1 = "86b7611563293f8c73627df7a6d6ba25ca0548c2a6481f7d116ee576"; |
| 238 | 256 | |
| 239 | | htest.assertEqualHash(Blake2s224, h1, block[0..]); |
| 257 | htest.assertEqualHash(Blake2s224, h1, block[0..]); |
| 240 | 258 | |
| 241 | | var h = Blake2s224.init(); |
| 242 | | h.update(&block); |
| 243 | | h.final(out[0..]); |
| 259 | var h = Blake2s224.init(); |
| 260 | h.update(&block); |
| 261 | h.final(out[0..]); |
| 244 | 262 | |
| 245 | | htest.assertEqual(h1, out[0..]); |
| 263 | htest.assertEqual(h1, out[0..]); |
| 264 | } |
| 246 | 265 | } |
| 247 | 266 | |
| 248 | 267 | test "blake2s256 single" { |
| ... | ... | @@ -296,9 +315,32 @@ test "blake2s256 streaming" { |
| 296 | 315 | htest.assertEqual(h3, out[0..]); |
| 297 | 316 | } |
| 298 | 317 | |
| 318 | test "blake2s256 keyed" { |
| 319 | var out: [32]u8 = undefined; |
| 320 | |
| 321 | const h1 = "10f918da4d74fab3302e48a5d67d03804b1ec95372a62a0f33b7c9fa28ba1ae6"; |
| 322 | const key = "secret_key"; |
| 323 | |
| 324 | Blake2s256.hash_keyed(key, "a" ** 64 ++ "b" ** 64, &out); |
| 325 | htest.assertEqual(h1, out[0..]); |
| 326 | |
| 327 | var h = Blake2s256.init_keyed(key); |
| 328 | h.update("a" ** 64 ++ "b" ** 64); |
| 329 | h.final(out[0..]); |
| 330 | |
| 331 | htest.assertEqual(h1, out[0..]); |
| 332 | |
| 333 | h.reset(); |
| 334 | h.update("a" ** 64); |
| 335 | h.update("b" ** 64); |
| 336 | h.final(out[0..]); |
| 337 | |
| 338 | htest.assertEqual(h1, out[0..]); |
| 339 | } |
| 340 | |
| 299 | 341 | test "comptime blake2s256" { |
| 300 | 342 | comptime { |
| 301 | | @setEvalBranchQuota(8000); |
| 343 | @setEvalBranchQuota(6000); |
| 302 | 344 | var block = [_]u8{0} ** Blake2s256.block_length; |
| 303 | 345 | var out: [Blake2s256.digest_length]u8 = undefined; |
| 304 | 346 | |
| ... | ... | @@ -358,10 +400,17 @@ pub fn Blake2b(comptime out_len: usize) type { |
| 358 | 400 | buf: [128]u8, |
| 359 | 401 | buf_len: u8, |
| 360 | 402 | |
| 403 | key: []const u8, |
| 404 | |
| 361 | 405 | pub fn init() Self { |
| 406 | return init_keyed(""); |
| 407 | } |
| 408 | |
| 409 | pub fn init_keyed(key: []const u8) Self { |
| 362 | 410 | debug.assert(8 <= out_len and out_len <= 512); |
| 363 | 411 | |
| 364 | 412 | var s: Self = undefined; |
| 413 | s.key = key; |
| 365 | 414 | s.reset(); |
| 366 | 415 | return s; |
| 367 | 416 | } |
| ... | ... | @@ -369,14 +418,24 @@ pub fn Blake2b(comptime out_len: usize) type { |
| 369 | 418 | pub fn reset(d: *Self) void { |
| 370 | 419 | mem.copy(u64, d.h[0..], iv[0..]); |
| 371 | 420 | |
| 372 | | // No key plus default parameters |
| 373 | | d.h[0] ^= 0x01010000 ^ (out_len >> 3); |
| 421 | // default parameters |
| 422 | d.h[0] ^= 0x01010000 ^ @truncate(u32, d.key.len << 8) ^ @intCast(u32, out_len >> 3); |
| 374 | 423 | d.t = 0; |
| 375 | 424 | d.buf_len = 0; |
| 425 | |
| 426 | if (d.key.len > 0) { |
| 427 | mem.set(u8, d.buf[d.key.len..], 0); |
| 428 | d.update(d.key); |
| 429 | d.buf_len = 128; |
| 430 | } |
| 376 | 431 | } |
| 377 | 432 | |
| 378 | 433 | pub fn hash(b: []const u8, out: []u8) void { |
| 379 | | var d = Self.init(); |
| 434 | Self.hash_keyed("", b, out); |
| 435 | } |
| 436 | |
| 437 | pub fn hash_keyed(key: []const u8, b: []const u8, out: []u8) void { |
| 438 | var d = Self.init_keyed(key); |
| 380 | 439 | d.update(b); |
| 381 | 440 | d.final(out); |
| 382 | 441 | } |
| ... | ... | @@ -519,19 +578,22 @@ test "blake2b384 streaming" { |
| 519 | 578 | htest.assertEqual(h3, out[0..]); |
| 520 | 579 | } |
| 521 | 580 | |
| 522 | | test "blake2b384 aligned final" { |
| 523 | | var block = [_]u8{0} ** Blake2b384.block_length; |
| 524 | | var out: [Blake2b384.digest_length]u8 = undefined; |
| 581 | test "comptime blake2b384" { |
| 582 | comptime { |
| 583 | @setEvalBranchQuota(7000); |
| 584 | var block = [_]u8{0} ** Blake2b384.block_length; |
| 585 | var out: [Blake2b384.digest_length]u8 = undefined; |
| 525 | 586 | |
| 526 | | const h1 = "e8aa1931ea0422e4446fecdd25c16cf35c240b10cb4659dd5c776eddcaa4d922397a589404b46eb2e53d78132d05fd7d"; |
| 587 | const h1 = "e8aa1931ea0422e4446fecdd25c16cf35c240b10cb4659dd5c776eddcaa4d922397a589404b46eb2e53d78132d05fd7d"; |
| 527 | 588 | |
| 528 | | htest.assertEqualHash(Blake2b384, h1, block[0..]); |
| 589 | htest.assertEqualHash(Blake2b384, h1, block[0..]); |
| 529 | 590 | |
| 530 | | var h = Blake2b384.init(); |
| 531 | | h.update(&block); |
| 532 | | h.final(out[0..]); |
| 591 | var h = Blake2b384.init(); |
| 592 | h.update(&block); |
| 593 | h.final(out[0..]); |
| 533 | 594 | |
| 534 | | htest.assertEqual(h1, out[0..]); |
| 595 | htest.assertEqual(h1, out[0..]); |
| 596 | } |
| 535 | 597 | } |
| 536 | 598 | |
| 537 | 599 | test "blake2b512 single" { |
| ... | ... | @@ -585,6 +647,29 @@ test "blake2b512 streaming" { |
| 585 | 647 | htest.assertEqual(h3, out[0..]); |
| 586 | 648 | } |
| 587 | 649 | |
| 650 | test "blake2b512 keyed" { |
| 651 | var out: [64]u8 = undefined; |
| 652 | |
| 653 | const h1 = "8a978060ccaf582f388f37454363071ac9a67e3a704585fd879fb8a419a447e389c7c6de790faa20a7a7dccf197de736bc5b40b98a930b36df5bee7555750c4d"; |
| 654 | const key = "secret_key"; |
| 655 | |
| 656 | Blake2b512.hash_keyed(key, "a" ** 64 ++ "b" ** 64, &out); |
| 657 | htest.assertEqual(h1, out[0..]); |
| 658 | |
| 659 | var h = Blake2b512.init_keyed(key); |
| 660 | h.update("a" ** 64 ++ "b" ** 64); |
| 661 | h.final(out[0..]); |
| 662 | |
| 663 | htest.assertEqual(h1, out[0..]); |
| 664 | |
| 665 | h.reset(); |
| 666 | h.update("a" ** 64); |
| 667 | h.update("b" ** 64); |
| 668 | h.final(out[0..]); |
| 669 | |
| 670 | htest.assertEqual(h1, out[0..]); |
| 671 | } |
| 672 | |
| 588 | 673 | test "comptime blake2b512" { |
| 589 | 674 | comptime { |
| 590 | 675 | @setEvalBranchQuota(8000); |