blob: 7d0769275817708cee6f68f512bbd6024b8011b0 [file] [log] [blame]
// Copyright 2017 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <digest/digest.h>
#include <stdlib.h>
#include <zircon/status.h>
#include <unittest/unittest.h>
// These unit tests are for the Digest object in ulib/digest.
namespace {
////////////////
// Test support.
using digest::Digest;
// echo -n | sha256sum
const char* kZeroDigest =
"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855";
// echo -n | sha256sum | cut -c1-64 | tr -d '\n' | xxd -p -r | sha256sum
const char* kDoubleZeroDigest =
"5df6e0e2761359d30a8275058e299fcc0381534545f55cf43e41983f5d4c9456";
////////////////
// Test cases
bool DigestStrings(void) {
BEGIN_TEST;
Digest actual;
zx_status_t rc = actual.Parse(kZeroDigest, strlen(kZeroDigest));
char buf[(Digest::kLength * 2) + 1];
rc = actual.ToString(buf, sizeof(buf));
ASSERT_EQ(rc, ZX_OK, zx_status_get_string(rc));
ASSERT_EQ(strncmp(kZeroDigest, buf, sizeof(buf)), 0, __FUNCTION__);
END_TEST;
}
bool DigestZero(void) {
BEGIN_TEST;
Digest actual, expected;
zx_status_t rc = expected.Parse(kZeroDigest, strlen(kZeroDigest));
ASSERT_EQ(rc, ZX_OK, zx_status_get_string(rc));
actual.Hash(nullptr, 0);
ASSERT_TRUE(actual == expected, __FUNCTION__);
END_TEST;
}
bool DigestSelf(void) {
BEGIN_TEST;
Digest actual, expected;
zx_status_t rc =
expected.Parse(kDoubleZeroDigest, strlen(kDoubleZeroDigest));
ASSERT_EQ(rc, ZX_OK, zx_status_get_string(rc));
rc = actual.Parse(kZeroDigest, strlen(kZeroDigest));
ASSERT_EQ(rc, ZX_OK, zx_status_get_string(rc));
uint8_t buf[Digest::kLength];
rc = actual.CopyTo(buf, sizeof(buf));
ASSERT_EQ(rc, ZX_OK, zx_status_get_string(rc));
actual.Hash(buf, Digest::kLength);
ASSERT_TRUE(actual == expected, __FUNCTION__);
END_TEST;
}
bool DigestSplit(void) {
BEGIN_TEST;
Digest actual, expected;
actual.Init();
size_t n = strlen(kZeroDigest);
expected.Hash(kZeroDigest, n);
for (size_t i = 1; i < n; ++i) {
actual.Init();
actual.Update(kZeroDigest, i);
actual.Update(kZeroDigest + i, n - i);
actual.Final();
ASSERT_TRUE(actual == expected, __FUNCTION__);
}
END_TEST;
}
bool DigestCWrappers(void) {
BEGIN_TEST;
uint8_t buf[Digest::kLength];
zx_status_t rc = digest_hash(nullptr, 0, buf, sizeof(buf) - 1);
ASSERT_EQ(rc, ZX_ERR_BUFFER_TOO_SMALL, "Small buffer should be rejected");
rc = digest_hash(nullptr, 0, buf, sizeof(buf));
ASSERT_EQ(rc, ZX_OK, zx_status_get_string(rc));
Digest expected;
rc = expected.Parse(kZeroDigest, strlen(kZeroDigest));
ASSERT_EQ(rc, ZX_OK, zx_status_get_string(rc));
ASSERT_TRUE(expected == buf, __FUNCTION__);
digest_t* digest = nullptr;
rc = digest_init(&digest);
ASSERT_EQ(rc, ZX_OK, zx_status_get_string(rc));
expected.Hash(buf, sizeof(buf));
digest_update(digest, buf, sizeof(buf));
rc = digest_final(digest, buf, sizeof(buf));
ASSERT_EQ(rc, ZX_OK, zx_status_get_string(rc));
ASSERT_TRUE(expected == buf, __FUNCTION__);
END_TEST;
}
bool DigestEquality(void) {
BEGIN_TEST;
Digest actual, expected;
zx_status_t rc = expected.Parse(kZeroDigest, strlen(kZeroDigest));
ASSERT_EQ(rc, ZX_OK, zx_status_get_string(rc));
rc = actual.Parse(kZeroDigest, strlen(kZeroDigest));
ASSERT_EQ(rc, ZX_OK, zx_status_get_string(rc));
ASSERT_FALSE(actual == nullptr, "Does not equal NULL");
ASSERT_TRUE(actual == actual, "Equals self");
const uint8_t* actual_bytes = actual.AcquireBytes();
const uint8_t* expected_bytes = expected.AcquireBytes();
ASSERT_TRUE(actual == actual_bytes, "Equals self.bytes_");
ASSERT_TRUE(actual == expected, "Equals expected");
ASSERT_TRUE(actual == expected_bytes, "Equals expected.bytes_");
ASSERT_TRUE(actual != nullptr, "Doesn't equal NULL");
ASSERT_FALSE(actual != actual, "Doesn't not equal self");
ASSERT_FALSE(actual != actual_bytes, "Doesn't not equal self.bytes_");
ASSERT_FALSE(actual != expected, "Doesn't not equal expected");
ASSERT_FALSE(actual != expected_bytes, "Doesn't not equal expected.bytes_");
expected.ReleaseBytes();
actual.ReleaseBytes();
END_TEST;
}
} // namespace
BEGIN_TEST_CASE(DigestTests)
RUN_TEST(DigestStrings)
RUN_TEST(DigestZero)
RUN_TEST(DigestSelf)
RUN_TEST(DigestSplit)
RUN_TEST(DigestCWrappers)
RUN_TEST(DigestEquality)
END_TEST_CASE(DigestTests)