| ... | @@ -533,6 +533,18 @@ const Sha512Params = Sha2Params64{ | ... | @@ -533,6 +533,18 @@ const Sha512Params = Sha2Params64{ |
| 533 | .digest_bits = 512, | 533 | .digest_bits = 512, |
| 534 | }; | 534 | }; |
| 535 | | 535 | |
| | 536 | const Sha512224Params = Sha2Params64{ |
| | 537 | .iv0 = 0x8C3D37C819544DA2, |
| | 538 | .iv1 = 0x73E1996689DCD4D6, |
| | 539 | .iv2 = 0x1DFAB7AE32FF9C82, |
| | 540 | .iv3 = 0x679DD514582F9FCF, |
| | 541 | .iv4 = 0x0F6D2B697BD44DA8, |
| | 542 | .iv5 = 0x77E36F7304C48942, |
| | 543 | .iv6 = 0x3F9D85A86A1D36C8, |
| | 544 | .iv7 = 0x1112E6AD91D692A1, |
| | 545 | .digest_bits = 224, |
| | 546 | }; |
| | 547 | |
| 536 | const Sha512256Params = Sha2Params64{ | 548 | const Sha512256Params = Sha2Params64{ |
| 537 | .iv0 = 0x22312194FC2BF72C, | 549 | .iv0 = 0x22312194FC2BF72C, |
| 538 | .iv1 = 0x9F555FA3C84C64C2, | 550 | .iv1 = 0x9F555FA3C84C64C2, |
| ... | @@ -563,6 +575,9 @@ pub const Sha384 = Sha2x64(Sha384Params); | ... | @@ -563,6 +575,9 @@ pub const Sha384 = Sha2x64(Sha384Params); |
| 563 | /// SHA-512 | 575 | /// SHA-512 |
| 564 | pub const Sha512 = Sha2x64(Sha512Params); | 576 | pub const Sha512 = Sha2x64(Sha512Params); |
| 565 | | 577 | |
| | 578 | /// SHA-512/224 |
| | 579 | pub const Sha512224 = Sha2x64(Sha512224Params); |
| | 580 | |
| 566 | /// SHA-512/256 | 581 | /// SHA-512/256 |
| 567 | pub const Sha512256 = Sha2x64(Sha512256Params); | 582 | pub const Sha512256 = Sha2x64(Sha512256Params); |
| 568 | | 583 | |
| ... | @@ -665,6 +680,14 @@ fn Sha2x64(comptime params: Sha2Params64) type { | ... | @@ -665,6 +680,14 @@ fn Sha2x64(comptime params: Sha2Params64) type { |
| 665 | for (rr, 0..) |s, j| { | 680 | for (rr, 0..) |s, j| { |
| 666 | mem.writeInt(u64, out[8 * j ..][0..8], s, .big); | 681 | mem.writeInt(u64, out[8 * j ..][0..8], s, .big); |
| 667 | } | 682 | } |
| | 683 | |
| | 684 | const bytes_left = params.digest_bits / 8 % 8; |
| | 685 | if (bytes_left > 0) { |
| | 686 | const rest = d.s[(params.digest_bits / 64)]; |
| | 687 | var buf: [8]u8 = undefined; |
| | 688 | std.mem.writeInt(u64, &buf, rest, .big); |
| | 689 | @memcpy(out[params.digest_bits / 64 * 8 ..], buf[0..bytes_left]); |
| | 690 | } |
| 668 | } | 691 | } |
| 669 | | 692 | |
| 670 | pub fn finalResult(d: *Self) [digest_length]u8 { | 693 | pub fn finalResult(d: *Self) [digest_length]u8 { |
| ... | @@ -875,3 +898,25 @@ test "sha512 aligned final" { | ... | @@ -875,3 +898,25 @@ test "sha512 aligned final" { |
| 875 | h.update(&block); | 898 | h.update(&block); |
| 876 | h.final(out[0..]); | 899 | h.final(out[0..]); |
| 877 | } | 900 | } |
| | 901 | |
| | 902 | test "sha512-224 single" { |
| | 903 | const h1 = "6ed0dd02806fa89e25de060c19d3ac86cabb87d6a0ddd05c333b84f4"; |
| | 904 | try htest.assertEqualHash(Sha512224, h1, ""); |
| | 905 | |
| | 906 | const h2 = "4634270f707b6a54daae7530460842e20e37ed265ceee9a43e8924aa"; |
| | 907 | try htest.assertEqualHash(Sha512224, h2, "abc"); |
| | 908 | |
| | 909 | const h3 = "23fec5bb94d60b23308192640b0c453335d664734fe40e7268674af9"; |
| | 910 | try htest.assertEqualHash(Sha512224, h3, "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu"); |
| | 911 | } |
| | 912 | |
| | 913 | test "sha512-256 single" { |
| | 914 | const h1 = "c672b8d1ef56ed28ab87c3622c5114069bdd3ad7b8f9737498d0c01ecef0967a"; |
| | 915 | try htest.assertEqualHash(Sha512256, h1, ""); |
| | 916 | |
| | 917 | const h2 = "53048e2681941ef99b2e29b76b4c7dabe4c2d0c634fc6d46e0e2f13107e7af23"; |
| | 918 | try htest.assertEqualHash(Sha512256, h2, "abc"); |
| | 919 | |
| | 920 | const h3 = "3928e184fb8690f840da3988121d31be65cb9d3ef83ee6146feac861e19b563a"; |
| | 921 | try htest.assertEqualHash(Sha512256, h3, "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu"); |
| | 922 | } |