blob: 1e8eb509388ee61d4ec92d6506f7abf7be739395 [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 <stddef.h>
#include <stdint.h>
#include <zircon/types.h>
#include <crypto/bytes.h>
#include <zxtest/zxtest.h>
#include "utils.h"
namespace crypto {
namespace testing {
namespace {
const size_t kSize = 1024;
// This test only checks that the routine basically functions; it does NOT assure anything about the
// quality of the entropy. That topic is beyond the scope of a deterministic unit test.
TEST(Bytes, Randomize) {
Bytes bytes;
ASSERT_OK(bytes.Resize(kSize));
ASSERT_TRUE(AllEqual(bytes, 0, 0, kSize));
EXPECT_OK(bytes.Randomize(kSize));
EXPECT_FALSE(AllEqual(bytes, 0, 0, kSize));
}
TEST(Bytes, Resize) {
Bytes bytes;
EXPECT_OK(bytes.Resize(kSize, 0xff));
EXPECT_EQ(bytes.len(), kSize);
EXPECT_NOT_NULL(bytes.get());
#if !__has_feature(address_sanitizer)
// The ASan allocator reports errors for unreasonable allocation sizes.
EXPECT_STATUS(bytes.Resize(size_t(-1)), ZX_ERR_NO_MEMORY);
EXPECT_EQ(bytes.len(), kSize);
EXPECT_NOT_NULL(bytes.get());
EXPECT_TRUE(AllEqual(bytes, 0xff, 0, kSize));
#endif
EXPECT_OK(bytes.Resize(kSize));
EXPECT_EQ(bytes.len(), kSize);
EXPECT_NOT_NULL(bytes.get());
EXPECT_TRUE(AllEqual(bytes, 0xff, 0, kSize));
EXPECT_OK(bytes.Resize(kSize / 2));
EXPECT_EQ(bytes.len(), kSize / 2);
EXPECT_NOT_NULL(bytes.get());
EXPECT_TRUE(AllEqual(bytes, 0xff, 0, kSize / 2));
EXPECT_OK(bytes.Resize(kSize));
EXPECT_EQ(bytes.len(), kSize);
EXPECT_NOT_NULL(bytes.get());
EXPECT_TRUE(AllEqual(bytes, 0xff, 0, kSize / 2));
EXPECT_TRUE(AllEqual(bytes, 0, kSize / 2, kSize / 2));
EXPECT_OK(bytes.Resize(0));
EXPECT_EQ(bytes.len(), 0U);
EXPECT_NULL(bytes.get());
}
TEST(Bytes, Copy) {
Bytes bytes, copy;
ASSERT_OK(bytes.Resize(kSize));
uint8_t buf[kSize];
memset(buf, 2, kSize);
EXPECT_STATUS(bytes.Copy(nullptr, kSize, kSize), ZX_ERR_INVALID_ARGS);
EXPECT_OK(bytes.Copy(buf, 0, kSize * 10));
EXPECT_EQ(bytes.len(), kSize);
EXPECT_TRUE(AllEqual(bytes, 0, 0, kSize));
EXPECT_OK(bytes.Copy(buf, kSize, kSize));
EXPECT_TRUE(AllEqual(bytes, 0, 0, kSize));
EXPECT_TRUE(AllEqual(bytes, 2, kSize, kSize));
memset(buf, 1, kSize);
EXPECT_OK(bytes.Copy(buf, kSize / 2, kSize / 2));
EXPECT_TRUE(AllEqual(bytes, 0, 0, kSize / 2));
EXPECT_TRUE(AllEqual(bytes, 1, kSize / 2, kSize / 2));
EXPECT_TRUE(AllEqual(bytes, 2, kSize, kSize));
ASSERT_OK(bytes.Resize(0));
EXPECT_OK(bytes.Copy(buf, kSize));
EXPECT_EQ(bytes.len(), kSize);
EXPECT_TRUE(AllEqual(bytes, 1, 0, kSize));
EXPECT_OK(copy.Copy(bytes));
EXPECT_TRUE(AllEqual(copy, 1, 0, kSize));
EXPECT_OK(copy.Copy(bytes, kSize));
EXPECT_TRUE(AllEqual(copy, 1, 0, kSize * 2));
}
TEST(Bytes, ArrayAccess) {
Bytes bytes;
ASSERT_OK(bytes.Resize(kSize, 1));
for (size_t i = 0; i < kSize; ++i) {
EXPECT_EQ(bytes[i], 1);
bytes[i] = 2;
}
EXPECT_TRUE(AllEqual(bytes, 2, 0, kSize));
}
TEST(Bytes, Comparison) {
Bytes bytes1, bytes2;
ASSERT_OK(bytes1.Randomize(kSize));
ASSERT_OK(bytes2.Copy(bytes1.get(), bytes1.len()));
EXPECT_TRUE(bytes1 == bytes1);
EXPECT_TRUE(bytes2 == bytes2);
EXPECT_FALSE(bytes1 != bytes1);
EXPECT_FALSE(bytes2 != bytes2);
EXPECT_TRUE(bytes1 == bytes2);
EXPECT_TRUE(bytes2 == bytes1);
EXPECT_FALSE(bytes1 != bytes2);
EXPECT_FALSE(bytes2 != bytes1);
ASSERT_OK(bytes2.Randomize(kSize));
EXPECT_TRUE(bytes1 == bytes1);
EXPECT_TRUE(bytes2 == bytes2);
EXPECT_FALSE(bytes1 != bytes1);
EXPECT_FALSE(bytes2 != bytes2);
EXPECT_FALSE(bytes1 == bytes2);
EXPECT_FALSE(bytes2 == bytes1);
EXPECT_TRUE(bytes1 != bytes2);
EXPECT_TRUE(bytes2 != bytes1);
}
} // namespace
} // namespace testing
} // namespace crypto