diff options
author | danibw <danibw@yandex-team.com> | 2023-11-29 18:32:06 +0300 |
---|---|---|
committer | danibw <danibw@yandex-team.com> | 2023-11-29 19:34:00 +0300 |
commit | 71a7f96673789844090ddb61182238c6ed4d8013 (patch) | |
tree | 16a954cef67f97167bc471903b1034be43f77337 /library/cpp/openssl | |
parent | 2f8c2d284cb97bd7537b4c717f0d24cf289afe20 (diff) | |
download | ydb-71a7f96673789844090ddb61182238c6ed4d8013.tar.gz |
Add SHA224 to library/cpp/openssl/crypto
Add SHA224 to library/cpp/openssl/crypto
Diffstat (limited to 'library/cpp/openssl')
-rw-r--r-- | library/cpp/openssl/crypto/sha.cpp | 27 | ||||
-rw-r--r-- | library/cpp/openssl/crypto/sha.h | 34 | ||||
-rw-r--r-- | library/cpp/openssl/crypto/sha_ut.cpp | 14 |
3 files changed, 75 insertions, 0 deletions
diff --git a/library/cpp/openssl/crypto/sha.cpp b/library/cpp/openssl/crypto/sha.cpp index c142b6635e..ffd999a238 100644 --- a/library/cpp/openssl/crypto/sha.cpp +++ b/library/cpp/openssl/crypto/sha.cpp @@ -59,4 +59,31 @@ namespace NOpenSsl { return digest; } } + namespace NSha224 { + static_assert(DIGEST_LENGTH == SHA224_DIGEST_LENGTH); + + TDigest Calc(const void* data, size_t dataSize) { + TDigest digest; + Y_ENSURE(SHA224(static_cast<const ui8*>(data), dataSize, digest.data()) != nullptr); + return digest; + } + + TCalcer::TCalcer() + : Context{new SHA256state_st} { + Y_ENSURE(SHA224_Init(Context.Get()) == 1); + } + + TCalcer::~TCalcer() { + } + + void TCalcer::Update(const void* data, size_t dataSize) { + Y_ENSURE(SHA224_Update(Context.Get(), data, dataSize) == 1); + } + + TDigest TCalcer::Final() { + TDigest digest; + Y_ENSURE(SHA224_Final(digest.data(), Context.Get()) == 1); + return digest; + } + } } diff --git a/library/cpp/openssl/crypto/sha.h b/library/cpp/openssl/crypto/sha.h index dbc2dfa526..49ec8bd009 100644 --- a/library/cpp/openssl/crypto/sha.h +++ b/library/cpp/openssl/crypto/sha.h @@ -76,3 +76,37 @@ namespace NOpenSsl::NSha256 { THolder<SHA256state_st> Context; }; } + +namespace NOpenSsl::NSha224 { + constexpr size_t DIGEST_LENGTH = 28; + using TDigest = std::array<ui8, DIGEST_LENGTH>; + + // not fragmented input + TDigest Calc(const void* data, size_t dataSize); + + inline TDigest Calc(TStringBuf s) { + return Calc(s.data(), s.length()); + } + + // fragmented input + class TCalcer { + public: + TCalcer(); + ~TCalcer(); + void Update(const void* data, size_t dataSize); + + void Update(TStringBuf s) { + Update(s.data(), s.length()); + } + + template <typename T> + void UpdateWithPodValue(const T& value) { + Update(&value, sizeof(value)); + } + + TDigest Final(); + + private: + THolder<SHA256state_st> Context; + }; +} diff --git a/library/cpp/openssl/crypto/sha_ut.cpp b/library/cpp/openssl/crypto/sha_ut.cpp index d79fa7daad..e0fc81a931 100644 --- a/library/cpp/openssl/crypto/sha_ut.cpp +++ b/library/cpp/openssl/crypto/sha_ut.cpp @@ -36,6 +36,20 @@ Y_UNIT_TEST_SUITE(SHA){ UNIT_ASSERT_VALUES_EQUAL(memcmp(precalculatedDigest.data(), digest.data(), digest.size()), 0); } + Y_UNIT_TEST(Sha224Value) { + // bash$ echo -n $SomeAlignedShaTestData | sha224sum + const TStringBuf precalculatedDigest = + "\xD4\x8B\x12\xA8\x0B\x29\x01\x92" + "\xC1\xF9\x2A\x71\x17\x99\x9C\x83" + "\xDB\xC5\xBB\x7B\xBE\xC1\xF1\xD9" + "\x97\x75\x38\xCB"sv; + + auto digest = NOpenSsl::NSha224::Calc(SomeAlignedShaTestData.data(), SomeAlignedShaTestData.size()); + + UNIT_ASSERT_VALUES_EQUAL(precalculatedDigest.size(), digest.size()); + UNIT_ASSERT_VALUES_EQUAL(memcmp(precalculatedDigest.data(), digest.data(), digest.size()), 0); + } + Y_UNIT_TEST(FragmentedEqualNotFragmented) { const char* head = SomeAlignedShaTestData.data(); const char* current = head; |