| ... | ... | @@ -33,6 +33,7 @@ fn roundParam(a: usize, b: usize, c: usize, d: usize, x: usize, y: usize) RoundP |
| 33 | 33 | // Blake2s |
| 34 | 34 | |
| 35 | 35 | pub const Blake2s128 = Blake2s(128); |
| 36 | pub const Blake2s160 = Blake2s(160); |
| 36 | 37 | pub const Blake2s224 = Blake2s(224); |
| 37 | 38 | pub const Blake2s256 = Blake2s(256); |
| 38 | 39 | |
| ... | ... | @@ -191,6 +192,89 @@ pub fn Blake2s(comptime out_bits: usize) type { |
| 191 | 192 | }; |
| 192 | 193 | } |
| 193 | 194 | |
| 195 | test "blake2s160 single" { |
| 196 | const h1 = "354c9c33f735962418bdacb9479873429c34916f"; |
| 197 | htest.assertEqualHash(Blake2s160, h1, ""); |
| 198 | |
| 199 | const h2 = "5ae3b99be29b01834c3b508521ede60438f8de17"; |
| 200 | htest.assertEqualHash(Blake2s160, h2, "abc"); |
| 201 | |
| 202 | const h3 = "5a604fec9713c369e84b0ed68daed7d7504ef240"; |
| 203 | htest.assertEqualHash(Blake2s160, h3, "The quick brown fox jumps over the lazy dog"); |
| 204 | |
| 205 | const h4 = "b60c4dc60e2681e58fbc24e77f07e02c69e72ed0"; |
| 206 | htest.assertEqualHash(Blake2s160, h4, "a" ** 32 ++ "b" ** 32); |
| 207 | } |
| 208 | |
| 209 | test "blake2s160 streaming" { |
| 210 | var h = Blake2s160.init(.{}); |
| 211 | var out: [20]u8 = undefined; |
| 212 | |
| 213 | const h1 = "354c9c33f735962418bdacb9479873429c34916f"; |
| 214 | |
| 215 | h.final(out[0..]); |
| 216 | htest.assertEqual(h1, out[0..]); |
| 217 | |
| 218 | const h2 = "5ae3b99be29b01834c3b508521ede60438f8de17"; |
| 219 | |
| 220 | h = Blake2s160.init(.{}); |
| 221 | h.update("abc"); |
| 222 | h.final(out[0..]); |
| 223 | htest.assertEqual(h2, out[0..]); |
| 224 | |
| 225 | h = Blake2s160.init(.{}); |
| 226 | h.update("a"); |
| 227 | h.update("b"); |
| 228 | h.update("c"); |
| 229 | h.final(out[0..]); |
| 230 | htest.assertEqual(h2, out[0..]); |
| 231 | |
| 232 | const h3 = "b60c4dc60e2681e58fbc24e77f07e02c69e72ed0"; |
| 233 | |
| 234 | h = Blake2s160.init(.{}); |
| 235 | h.update("a" ** 32); |
| 236 | h.update("b" ** 32); |
| 237 | h.final(out[0..]); |
| 238 | htest.assertEqual(h3, out[0..]); |
| 239 | |
| 240 | h = Blake2s160.init(.{}); |
| 241 | h.update("a" ** 32 ++ "b" ** 32); |
| 242 | h.final(out[0..]); |
| 243 | htest.assertEqual(h3, out[0..]); |
| 244 | |
| 245 | const h4 = "4667fd60791a7fe41f939bca646b4529e296bd68"; |
| 246 | |
| 247 | h = Blake2s160.init(.{ .context = [_]u8{0x69} ** 8, .salt = [_]u8{0x42} ** 8 }); |
| 248 | h.update("a" ** 32); |
| 249 | h.update("b" ** 32); |
| 250 | h.final(out[0..]); |
| 251 | htest.assertEqual(h4, out[0..]); |
| 252 | |
| 253 | h = Blake2s160.init(.{ .context = [_]u8{0x69} ** 8, .salt = [_]u8{0x42} ** 8 }); |
| 254 | h.update("a" ** 32 ++ "b" ** 32); |
| 255 | h.final(out[0..]); |
| 256 | htest.assertEqual(h4, out[0..]); |
| 257 | } |
| 258 | |
| 259 | test "comptime blake2s160" { |
| 260 | //comptime |
| 261 | { |
| 262 | @setEvalBranchQuota(10000); |
| 263 | var block = [_]u8{0} ** Blake2s160.block_length; |
| 264 | var out: [Blake2s160.digest_length]u8 = undefined; |
| 265 | |
| 266 | const h1 = "2c56ad9d0b2c8b474aafa93ab307db2f0940105f"; |
| 267 | |
| 268 | htest.assertEqualHash(Blake2s160, h1, block[0..]); |
| 269 | |
| 270 | var h = Blake2s160.init(.{}); |
| 271 | h.update(&block); |
| 272 | h.final(out[0..]); |
| 273 | |
| 274 | htest.assertEqual(h1, out[0..]); |
| 275 | } |
| 276 | } |
| 277 | |
| 194 | 278 | test "blake2s224 single" { |
| 195 | 279 | const h1 = "1fa1291e65248b37b3433475b2a0dd63d54a11ecc4e3e034e7bc1ef4"; |
| 196 | 280 | htest.assertEqualHash(Blake2s224, h1, ""); |
| ... | ... | @@ -369,6 +453,7 @@ test "comptime blake2s256" { |
| 369 | 453 | // Blake2b |
| 370 | 454 | |
| 371 | 455 | pub const Blake2b128 = Blake2b(128); |
| 456 | pub const Blake2b160 = Blake2b(160); |
| 372 | 457 | pub const Blake2b256 = Blake2b(256); |
| 373 | 458 | pub const Blake2b384 = Blake2b(384); |
| 374 | 459 | pub const Blake2b512 = Blake2b(512); |
| ... | ... | @@ -530,6 +615,95 @@ pub fn Blake2b(comptime out_bits: usize) type { |
| 530 | 615 | }; |
| 531 | 616 | } |
| 532 | 617 | |
| 618 | test "blake2b160 single" { |
| 619 | const h1 = "3345524abf6bbe1809449224b5972c41790b6cf2"; |
| 620 | htest.assertEqualHash(Blake2b160, h1, ""); |
| 621 | |
| 622 | const h2 = "384264f676f39536840523f284921cdc68b6846b"; |
| 623 | htest.assertEqualHash(Blake2b160, h2, "abc"); |
| 624 | |
| 625 | const h3 = "3c523ed102ab45a37d54f5610d5a983162fde84f"; |
| 626 | htest.assertEqualHash(Blake2b160, h3, "The quick brown fox jumps over the lazy dog"); |
| 627 | |
| 628 | const h4 = "43758f5de1740f651f1ae39de92260fe8bd5a11f"; |
| 629 | htest.assertEqualHash(Blake2b160, h4, "a" ** 64 ++ "b" ** 64); |
| 630 | } |
| 631 | |
| 632 | test "blake2b160 streaming" { |
| 633 | var h = Blake2b160.init(.{}); |
| 634 | var out: [20]u8 = undefined; |
| 635 | |
| 636 | const h1 = "3345524abf6bbe1809449224b5972c41790b6cf2"; |
| 637 | |
| 638 | h.final(out[0..]); |
| 639 | htest.assertEqual(h1, out[0..]); |
| 640 | |
| 641 | const h2 = "384264f676f39536840523f284921cdc68b6846b"; |
| 642 | |
| 643 | h = Blake2b160.init(.{}); |
| 644 | h.update("abc"); |
| 645 | h.final(out[0..]); |
| 646 | htest.assertEqual(h2, out[0..]); |
| 647 | |
| 648 | h = Blake2b160.init(.{}); |
| 649 | h.update("a"); |
| 650 | h.update("b"); |
| 651 | h.update("c"); |
| 652 | h.final(out[0..]); |
| 653 | htest.assertEqual(h2, out[0..]); |
| 654 | |
| 655 | const h3 = "43758f5de1740f651f1ae39de92260fe8bd5a11f"; |
| 656 | |
| 657 | h = Blake2b160.init(.{}); |
| 658 | h.update("a" ** 64 ++ "b" ** 64); |
| 659 | h.final(out[0..]); |
| 660 | htest.assertEqual(h3, out[0..]); |
| 661 | |
| 662 | h = Blake2b160.init(.{}); |
| 663 | h.update("a" ** 64); |
| 664 | h.update("b" ** 64); |
| 665 | h.final(out[0..]); |
| 666 | htest.assertEqual(h3, out[0..]); |
| 667 | |
| 668 | h = Blake2b160.init(.{}); |
| 669 | h.update("a" ** 64); |
| 670 | h.update("b" ** 64); |
| 671 | h.final(out[0..]); |
| 672 | htest.assertEqual(h3, out[0..]); |
| 673 | |
| 674 | const h4 = "72328f8a8200663752fc302d372b5dd9b49dd8dc"; |
| 675 | |
| 676 | h = Blake2b160.init(.{ .context = [_]u8{0x69} ** 16, .salt = [_]u8{0x42} ** 16 }); |
| 677 | h.update("a" ** 64); |
| 678 | h.update("b" ** 64); |
| 679 | h.final(out[0..]); |
| 680 | htest.assertEqual(h4, out[0..]); |
| 681 | |
| 682 | h = Blake2b160.init(.{ .context = [_]u8{0x69} ** 16, .salt = [_]u8{0x42} ** 16 }); |
| 683 | h.update("a" ** 64); |
| 684 | h.update("b" ** 64); |
| 685 | h.final(out[0..]); |
| 686 | htest.assertEqual(h4, out[0..]); |
| 687 | } |
| 688 | |
| 689 | test "comptime blake2b160" { |
| 690 | comptime { |
| 691 | @setEvalBranchQuota(10000); |
| 692 | var block = [_]u8{0} ** Blake2b160.block_length; |
| 693 | var out: [Blake2b160.digest_length]u8 = undefined; |
| 694 | |
| 695 | const h1 = "8d26f158f564e3293b42f5e3d34263cb173aa9c9"; |
| 696 | |
| 697 | htest.assertEqualHash(Blake2b160, h1, block[0..]); |
| 698 | |
| 699 | var h = Blake2b160.init(.{}); |
| 700 | h.update(&block); |
| 701 | h.final(out[0..]); |
| 702 | |
| 703 | htest.assertEqual(h1, out[0..]); |
| 704 | } |
| 705 | } |
| 706 | |
| 533 | 707 | test "blake2b384 single" { |
| 534 | 708 | const h1 = "b32811423377f52d7862286ee1a72ee540524380fda1724a6f25d7978c6fd3244a6caf0498812673c5e05ef583825100"; |
| 535 | 709 | htest.assertEqualHash(Blake2b384, h1, ""); |