authorgravatar for hello@nektro.netMeghan Denny <hello@nektro.net> 2024-04-19 07:50:46-07:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2024-04-19 14:50:46+00:00
logf03829a2da1699343de1e1980a43810dfcff201e
treec5bb1a6ad3fabb26ac24d58c730f7ef15b7010c9
parent3adfaf91f738d6f7fcf863201f34ef5ea5a9973a
signaturebadge-check Signed by PGP key B5690EEEBB952194

define std.crypto.sha2.Sha512224 (#19697)

* define std.crypto.sha2.Sha512224 * rename blunder * add sha512-224 and sha512-256 tests * fix Sha2x64 for variations that aren't a multiple of 64 bits

1 files changed, 45 insertions(+), 0 deletions(-)

lib/std/crypto/sha2.zig+45
...@@ -533,6 +533,18 @@ const Sha512Params = Sha2Params64{...@@ -533,6 +533,18 @@ const Sha512Params = Sha2Params64{
533 .digest_bits = 512,533 .digest_bits = 512,
534};534};
535535
536const 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
536const Sha512256Params = Sha2Params64{548const 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-512575/// SHA-512
564pub const Sha512 = Sha2x64(Sha512Params);576pub const Sha512 = Sha2x64(Sha512Params);
565577
578/// SHA-512/224
579pub const Sha512224 = Sha2x64(Sha512224Params);
580
566/// SHA-512/256581/// SHA-512/256
567pub const Sha512256 = Sha2x64(Sha512256Params);582pub const Sha512256 = Sha2x64(Sha512256Params);
568583
...@@ -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 }
669692
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
902test "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
913test "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}