Skip to content

Commit

Permalink
Merge pull request #8 from cmazakas/feature/sha-512-256
Browse files Browse the repository at this point in the history
add sha-512/256
  • Loading branch information
pdimov authored Oct 7, 2024
2 parents c307fda + 519edc5 commit 1e6a6f5
Show file tree
Hide file tree
Showing 2 changed files with 88 additions and 0 deletions.
48 changes: 48 additions & 0 deletions include/boost/hash2/sha2.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -536,6 +536,54 @@ class sha2_512_224 : detail::sha2_512_base
}
};

class sha2_512_256 : detail::sha2_512_base
{
private:

void init()
{
state_[ 0 ] = 0x22312194fc2bf72c;
state_[ 1 ] = 0x9f555fa3c84c64c2;
state_[ 2 ] = 0x2393b86b6f53b151;
state_[ 3 ] = 0x963877195940eabd;
state_[ 4 ] = 0x96283ee2a88effe3;
state_[ 5 ] = 0xbe5e1e2553863992;
state_[ 6 ] = 0x2b0199fc2c85b8aa;
state_[ 7 ] = 0x0eb72ddc81c52ca2;
}

public:

using result_type = std::array<unsigned char, 32>;
using detail::sha2_512_base::update;

sha2_512_256()
{
init();
}

result_type result()
{
unsigned char bits[ 16 ] = { 0 };
detail::write64be( bits + 8, n_ * 8 );

std::size_t k = m_ < 112 ? 112 - m_ : 128 + 112 - m_;
unsigned char padding[ 128 ] = { 0x80 };

update( padding, k );
update( bits, 16 );
BOOST_ASSERT( m_ == 0 );

result_type digest;
for( int i = 0; i < 4; ++i )
{
detail::write64be( &digest[ i * 8 ], state_[ i ] );
}

return digest;
}
};

} // namespace hash2
} // namespace boost

Expand Down
40 changes: 40 additions & 0 deletions test/sha2.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -320,12 +320,52 @@ static void sha_512_224()
}
}

static void sha_512_256()
{
using boost::hash2::sha2_512_256;

// https://en.wikipedia.org/wiki/SHA-2#Test_vectors
BOOST_TEST_EQ( digest<sha2_512_256>( "" ), std::string( "c672b8d1ef56ed28ab87c3622c5114069bdd3ad7b8f9737498d0c01ecef0967a" ) );

// https://csrc.nist.gov/CSRC/media/Projects/Cryptographic-Standards-and-Guidelines/documents/examples/SHA512_256.pdf
BOOST_TEST_EQ( digest<sha2_512_256>( "abc" ), std::string( "53048e2681941ef99b2e29b76b4c7dabe4c2d0c634fc6d46e0e2f13107e7af23" ) );
BOOST_TEST_EQ( digest<sha2_512_256>( "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu" ), std::string( "3928e184fb8690f840da3988121d31be65cb9d3ef83ee6146feac861e19b563a" ) );

// selected samples from the download available here:
// https://csrc.nist.gov/Projects/Cryptographic-Algorithm-Validation-Program/Secure-Hashing
std::pair<char const*, char const*> inputs[] =
{
/* expected hash */ /* input message */
{ "c4ef36923c64e51e875720e550298a5ab8a3f2f875b1e1a4c9b95babf7344fef", "fa" },
{ "0c994228b8d3bd5ea5b5259157a9bba7a193118ad22817e6fbed2df1a32a4148", "74e4" },
{ "a9e2427cec314b2814aaba87039485fc8d3ade992fa1d9acbb7f6769460a7317", "6f63b4" },
{ "447044f03bc30e2caa245d26ce4c72c1454f708cfcd9a215841a88cf5ecd2095", "7dae8fc020d9" },
{ "5424b31989031809b5fc8969b7c48b5dc0c233fc34ffb5b223cd5f3a9712a8d6", "8d2782a7843aa477b8f3bca9f9f2bafb5813db4c8c43" },
{ "41c7027d16e37259645d0173c86141f38d808e9e27dc2dfeeaf335ed7c99490c", "95de55287ad3cff69efec6e97c812456e47be25e433470c3259b" },
{ "683b486861e598dabba740ac919522cf3b609c18205b6beca4ccbe6b0f6dc6db", "1b77c8dcfd2fc4b54617054fa6b14d6e9d09ce9185a34a7fd2b27923998aab99" },
{ "035d362a4265031434c3aa153ab4aef6b00d5176227197430bb62884a085c5fe", "a52dde5aea1f04399c5d91fb5c4e62da06b73a5d9bdc5a927fe85298e58e166187f154b69ac1057c01a7" },
{ "cd1040a0d94382a6446a691c0a07c4f643edc11e3103e343608603b5bd101be3", "b7ae6037d9b452994fb755aa0cf57fbc687298060a471f9b0c3d8e9d5a9ae0ad5b3b4fa7d4e3628c09d327c0259bbd76db2f" },
{ "e1470b2f44e3955d2b5496292679d9086b7c0aa94f0d516e53a142e486c6ded8", "e26e1dc893fdced833eae15ac04ed4624a07e3c89dc3d1d8205be44bfd63327782ff1bc2c8f7175c920eb22e7790d40d442b46349cff72f1e1" },
{ "00ce3b592d4e1a65f780df351fa7b2c01b49df4ea913c3fab24297f5791b18e5", "97e003903bb971a523ce0c82bda5d6733c76b90deb307559c1bddd35368743f6563b315214cd5a7ee0bccf937c9776360bc0b9786b707bfbc4fb50576155edbbbfd5ddd8e43a76faf2ec0c78fc84644f188d6b0ab68c28e5303ff031a223d9fafb3871e85408af6381e629fae67488068c68398a758f665e2c12258d9ff8effb31ec534b0c40ebffb43390e1e26fcaa28fd68ac24f7e1cafe0fa573103dc17058a77edc9b3ea1418b45aa7f5977e126d4861c778ed6332217581eee674d739622e63a529f10c11f4a9e3d8feaea848ade0905675f6458ffa132f52749af23d584438e5" },
{ "f3e524f645881c45318030624baf254fc6b3389d7bb7a22aa55ef528c2fd3cf0", "773e1098b725ab1a7465c67892a384147bf0c32714eeab05f13487a3c5f4d4561cdb98dd4c39f6a2a862fe3df854ca3a269ac61c3a704fa18827804828cb4811a704c084fc3abcf4befca10594a3766cec323df6f08183ccb59b36f5b664b71c827f3094b16e28991cfb54d94ed7b0333582cfbe1d6a6f0de05751b15606480013148f15521f5f182c27c1c00e3aa2156950257bab743dec6f247a85f0fb2344c48d8610c7938cf9554890c2bc12719cf065e63581e412f1cbca59776d897170fcb1bc8bf812d5c5fe2569e740a848503389bbf4870519a55c119592b3f95a0d2247da91cde662039187f23882444db898834cc1a51e778f8ac1d6dbab9305a2a01887272e565c3b7536d6bc6a2ea85c881d40a3c3765738bea1c65c3d9e9bb7ddec6c5703a9ebf612fabb7be1ad82c46c1d40a3c956df265e7a0b1c526443d4418a30283428" },
{ "03e58e78284c485bb6b54b36c0e12695b30bceced7bcf3ed6c435caf09875202", "2c2d86197b39c194c65a93bdadc72a9e590fa75fa8ae6b758adf9116abb2bbf0525e121a89d8884b7ea5614a29ecf1a52fcfa7a606fb4a835a7e83d5b0da9c4b4a5787a04a9d22ca1a81b9750a20ccaf3b2a13e5bd81c00ef403042640a3d4dedcbfed9207ae167b6298a5269a8a442446c9f5041367547e1e151cf1a138ed10d23f4dd70833ecc5208f2c451f53e06d185454ea51d68f3ba15cd41e1cbf6f48f37eae5995552d0f1a1156bae2a229f079723981bef5f7ad45823395f961e0f0062518fff63b60c319c42c6d2ba0a61631cbabb0a4ed163dd12c423f8045ca6fd4db93b1720f0d48e550b5464274df470708b25f49e574510f040802f994b42d2549285752f6bc06465efa2e6e485cecc5d15676f6069753c5b28dc7ab752792c016dedadf1af6650496010bf841a66b31cda0def37809a9bcded977df11aa066febbe205ea342cde69fd4c72889442e14a5977d886252bdbc2ff5f8dd8fc5f1f870ce121ab929a6b6227b484648be9b3501443cfdecf8f58d4de834ed1800bb244c18985a8232583ac6fc789aa59d1c5e87ad03994085bbf6e1ba1157d4e4ccbb28a49b6529e54b3b" },
{ "1a120db1b48a4035395b5f52e52decb1cc9c0c508b411455a9e33446f4d8a87c", "4389f52995e81550cc7ee17fc546bba08e9ed338704248f32d7b9084869419ab008e3097e815236f95b2a22ced416ba92ba627fddfbc8e08358ed24c7bca3bfede720e5d74d5b44380be18faf1eb51502bc081ee0a3dfde5242eae8a4fa1b784649d5723421111f4150b0b92d82ab5be1856aab2fbaedbb382c2eae60b03d4641a78d39058b283a9dc01439baae8de1b79cf6bf2baf87199d5b44f07b6d7dbc788694a4dc09e508a5e0887be6f0c158ed7938a564d0107c0a76ba596580514d437d9830282bfc0c02289a1a3307ea23fb90acf85beb3e5507f4fb43afa74c7b4ae314756a4fb1d73b0ea57f1f526cd57a79c042815f55270e6c8439ca20e3c8e75d75ef1303cadca91957250c4ecdefe29b1efe658ae9848633e1c635bbabb8b1535907c2d69baee4cf0ba6aa7b81c5bc8b15a6891c8fd017e1905382a608bd315b1a59fa46a8a076965f6e4a572d0970b040b56c72acac3bfc1c7c319e9f58dfdb564019c27653c715bf069c60242d97b12ca5703bc46b5af9f2aab2f3b41e256a8964b1d8795b5eb3a6e9f1350ba4a9e4361134c66bb00d519f599743fb7f9a6f203243075619b5f69392e93448012ff009633aa106fcbb998f234f1dd9efb78fb7335dbd61016555219bf4fc7db5823af335f25a2ab3fe485e725adfe400f512aae262893eb4d565cd5fa4dbf154494bafe3ec604b784dd469d13b088e35ebbe97b9e1f943a69e9ef3786" },
{ "0b09d2283b77d04185ea0d0cfde64f56e8d5e659e8c7dafdafaf1bcfa5565941", "e4d16c654f7edbf7372ed6297b135462f96051ffa70a7e3ce0cb3758fb6db5f4224585bd61fe384afe985d4709afacd433018428e42b987a87b3e521294be7fa42540c0ad2a26964b07fab4d1ff2519fa341196b13b4b8e2ee9cce76f294193ceb07e995caf2d40df6ebaa83e763ac8bf028f8105c2d483ebd8edc9e81cfb583c66504a67077e20d78e54131868a235fc3be0a5fe81faf549c92f6e3fc8422977b764584ecb8fb2bdd74589e27ef1fe5c30c359fdf1255ec31ae048b8c3cc840b1429579673d8830cea1d813f01b09e39919621a698ca2d027ecefdf587d0f4610d2dacb098fefe5f273a7d809954722eced7a16ac17fec724549d2789d25f70422dfec3f9359a0ff2f2ae359be5436a659163dcd33ad198d0edf7ab46c02087ec5be7a960b7ef797526d572ce946382ac0c07b4047e830cd5bfe5b2b8d1ba54b9657fc5659e58ea241805d6c929113468664ce567697cebd8d25086068c959c4e52ac5e31713c29a7cf24aab52cb44641a81cb9268524fd842f1e6d5979192a562a58beebb803ffa5531b36b925b381e1d95e76665ae4097edd39b0d921afc577f56a2bbcfc1434c6add3c2fe9d78aded01fa65526e22d971e48797ad0bbd3459bccaeeccc3d990b3e43396ac1c6a921028d7ce0f4c4733034df269febfad40a587604f4298b9db140022faea28f1f7f057dff9c879bce0dc1f6170f3c6e5b1035c149546001cdc900a8a35e04b75a63596f92da37ee8a8a562bbf2b5a7cf4f1a45ce0a02856a5cd0095290b70c5e6588eb0db4c8e43252061eea386bead1e1934976f49bae0c237c05625397f315fd916004d4603304a8a65cd58a3e1855311570f49c3c0368f93b06a2c6a78900" },
};

for( auto const& input : inputs )
{
BOOST_TEST_EQ( digest<sha2_512_256>( from_hex( input.second ) ), std::string( input.first ));
}
}

int main()
{
sha_256();
sha_224();
sha_512();
sha_384();
sha_512_224();
sha_512_256();
return boost::report_errors();
}

0 comments on commit 1e6a6f5

Please sign in to comment.