azure-sdk-for-cpp/sdk/storage/test/common/crypt_functions_test.cpp
JinmingHu 86a22901e9
[Storage Blobs Service] Transactional MD5 and CRC64 (#456)
* MD5

* Crc64

* crc64 concatenate
2020-08-16 00:30:49 +08:00

128 lines
3.8 KiB
C++

// Copyright (c) Microsoft Corporation. All rights reserved.
// SPDX-License-Identifier: MIT
#include "common/crypt.hpp"
#include "test_base.hpp"
namespace Azure { namespace Storage { namespace Test {
TEST(CryptFunctionsTest, Base64)
{
for (std::size_t len : {0, 10, 100, 1000, 10000})
{
std::string data;
data.resize(len);
RandomBuffer(&data[0], data.length());
EXPECT_EQ(Base64Decode(Base64Encode(data)), data);
}
}
TEST(CryptFunctionsTest, Sha256)
{
EXPECT_EQ(Base64Encode(Details::Sha256("")), "47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=");
EXPECT_EQ(
Base64Encode(Details::Sha256("Hello Azure!")),
"Mjzwx2mqGHb9FSgjm33ShNmXYndkgvwA6tQmEiskOHg=");
}
TEST(CryptFunctionsTest, HmacSha256)
{
std::string key = "8CwtGFF1mGR4bPEP9eZ0x1fxKiQ3Ca5N";
EXPECT_EQ(
Base64Encode(Details::HmacSha256("", key)), "fFy2T+EuCvAgouw/vB/RAJ75z7jwTj+uiURebkFKF5M=");
EXPECT_EQ(
Base64Encode(Details::HmacSha256("Hello Azure!", key)),
"+SBESxQVhI53mSEdZJcCBpdBkaqwzfPaVYZMAf5LP3c=");
}
TEST(CryptFunctionsTest, Md5)
{
EXPECT_EQ(Base64Encode(Md5::Hash("")), "1B2M2Y8AsgTpgAmY7PhCfg==");
EXPECT_EQ(Base64Encode(Md5::Hash("Hello Azure!")), "Pz8543xut4RVSbb2g52Mww==");
auto data = RandomBuffer(static_cast<std::size_t>(16_MB));
Md5 md5Instance;
std::size_t length = 0;
while (length < data.size())
{
std::size_t s = static_cast<std::size_t>(RandomInt(0, 4_MB));
s = std::min(s, data.size() - length);
md5Instance.Update(&data[length], s);
md5Instance.Update(&data[length], 0);
length += s;
}
EXPECT_EQ(md5Instance.Digest(), Md5::Hash(data.data(), data.size()));
}
TEST(CryptFunctionsTest, Crc64)
{
EXPECT_EQ(Base64Encode(Crc64::Hash("")), "AAAAAAAAAAA=");
EXPECT_EQ(Base64Encode(Crc64::Hash("Hello Azure!")), "DtjZpL9/o8c=");
auto data = RandomBuffer(static_cast<std::size_t>(16_MB));
Crc64 crc64Instance;
std::size_t length = 0;
while (length < data.size())
{
std::size_t s = static_cast<std::size_t>(RandomInt(0, 4_MB));
s = std::min(s, data.size() - length);
crc64Instance.Update(&data[length], s);
crc64Instance.Update(&data[length], 0);
length += s;
}
EXPECT_EQ(crc64Instance.Digest(), Crc64::Hash(data.data(), data.size()));
// Test concatenate
crc64Instance = Crc64();
std::string allData;
while (allData.length() < 16_MB)
{
{
Crc64 instance2;
for (auto i = RandomInt(0, 5); i > 0; --i)
{
std::size_t s = static_cast<std::size_t>(RandomInt(0, 512_KB));
std::string data2;
data2.resize(s);
RandomBuffer(&data2[0], s);
instance2.Update(reinterpret_cast<const uint8_t*>(data2.data()), data2.length());
allData += data2;
}
crc64Instance.Concatenate(instance2);
}
switch (RandomInt(0, 2))
{
case 0: {
std::string data2;
crc64Instance.Update(reinterpret_cast<const uint8_t*>(data2.data()), data2.length());
break;
}
case 1: {
Crc64 instance2;
crc64Instance.Concatenate(instance2);
break;
}
case 2: {
std::size_t s = static_cast<std::size_t>(RandomInt(0, 512_KB));
std::string data2;
data2.resize(s);
RandomBuffer(&data2[0], s);
crc64Instance.Update(reinterpret_cast<const uint8_t*>(data2.data()), data2.length());
allData += data2;
break;
}
default:
break;
}
}
EXPECT_EQ(
crc64Instance.Digest(),
Crc64::Hash(reinterpret_cast<const uint8_t*>(allData.data()), allData.size()));
}
}}} // namespace Azure::Storage::Test