blob: 12e197d0a72a13bf44f89b0dfcf04ffeb7b48623 [file] [log] [blame]
// Copyright 2020 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 "src/firmware/paver/validation.h"
#include <lib/zbi-format/zbi.h>
#include <zircon/errors.h>
#include <span>
#include <phys/zbi.h>
#include <zxtest/zxtest.h>
#include "src/firmware/paver/device-partitioner.h"
#include "src/firmware/paver/test/test-utils.h"
namespace paver {
namespace {
TEST(IsValidKernelZbi, EmptyData) {
ASSERT_FALSE(IsValidKernelZbi(Arch::kX64, std::span<uint8_t>()));
}
TEST(IsValidKernelZbi, MinimalValid) {
std::span<uint8_t> data;
ZbiKernelImage* header;
auto array = CreateZbiHeader(Arch::kX64, 0, &header, &data);
ASSERT_TRUE(IsValidKernelZbi(Arch::kX64, data));
}
TEST(IsValidKernelZbi, DataTooSmall) {
std::span<uint8_t> data;
ZbiKernelImage* header;
auto array = CreateZbiHeader(Arch::kX64, 1024, &header, &data);
header->hdr_file.length += 1;
ASSERT_FALSE(IsValidKernelZbi(Arch::kX64, data));
}
TEST(IsValidKernelZbi, DataTooBig) {
std::span<uint8_t> data;
ZbiKernelImage* header;
auto array = CreateZbiHeader(Arch::kX64, 1024, &header, &data);
header->hdr_file.length = 0xffff'ffffu;
ASSERT_FALSE(IsValidKernelZbi(Arch::kX64, data));
}
TEST(IsValidKernelZbi, KernelDataTooSmall) {
std::span<uint8_t> data;
ZbiKernelImage* header;
auto array = CreateZbiHeader(Arch::kX64, 1024, &header, &data);
header->hdr_kernel.length += 1;
ASSERT_FALSE(IsValidKernelZbi(Arch::kX64, data));
}
TEST(IsValidKernelZbi, ValidWithPayload) {
std::span<uint8_t> data;
ZbiKernelImage* header;
auto array = CreateZbiHeader(Arch::kX64, 1024, &header, &data);
ASSERT_TRUE(IsValidKernelZbi(Arch::kX64, data));
}
TEST(IsValidKernelZbi, InvalidArch) {
std::span<uint8_t> data;
ZbiKernelImage* header;
auto array = CreateZbiHeader(Arch::kX64, 0, &header, &data);
ASSERT_FALSE(IsValidKernelZbi(Arch::kArm64, data));
}
TEST(IsValidKernelZbi, InvalidMagic) {
std::span<uint8_t> data;
ZbiKernelImage* header;
auto array = CreateZbiHeader(Arch::kX64, 0, &header, &data);
header->hdr_file.magic = 0;
ASSERT_FALSE(IsValidKernelZbi(Arch::kX64, data));
}
TEST(IsValidKernelZbi, ValidCrc) {
std::span<uint8_t> data;
ZbiKernelImage* header;
auto array = CreateZbiHeader(Arch::kX64, 0, &header, &data);
header->hdr_kernel.flags |= ZBI_FLAGS_CRC32;
header->data_kernel.entry = 0x1122334455667788;
header->data_kernel.reserve_memory_size = 0xaabbccdd12345678;
header->hdr_kernel.crc32 = 0x8b8e6cfc; // == crc32({header->data_kernel})
ASSERT_TRUE(IsValidKernelZbi(Arch::kX64, data));
}
TEST(IsValidKernelZbi, InvalidCrc) {
std::span<uint8_t> data;
ZbiKernelImage* header;
auto array = CreateZbiHeader(Arch::kX64, 0, &header, &data);
header->hdr_kernel.flags |= ZBI_FLAGS_CRC32;
header->data_kernel.entry = 0x1122334455667788;
header->data_kernel.reserve_memory_size = 0xaabbccdd12345678;
header->hdr_kernel.crc32 = 0xffffffff;
ASSERT_FALSE(IsValidKernelZbi(Arch::kX64, data));
}
static std::span<const uint8_t> StringToSpan(const std::string& data) {
return std::span<const uint8_t>(reinterpret_cast<const uint8_t*>(data.data()), data.size());
}
TEST(IsValidChromeOsKernel, TooSmall) {
EXPECT_FALSE(IsValidChromeOsKernel(StringToSpan("")));
EXPECT_FALSE(IsValidChromeOsKernel(StringToSpan("C")));
EXPECT_FALSE(IsValidChromeOsKernel(StringToSpan("CHROMEO")));
}
TEST(IsValidChromeOsKernel, IncorrectMagic) {
EXPECT_FALSE(IsValidChromeOsKernel(StringToSpan("CHROMEOX")));
}
TEST(IsValidChromeOsKernel, MinimalValid) {
EXPECT_TRUE(IsValidChromeOsKernel(StringToSpan("CHROMEOS")));
}
TEST(IsValidChromeOsKernel, ExcessData) {
EXPECT_TRUE(IsValidChromeOsKernel(StringToSpan("CHROMEOS-1234")));
}
TEST(IsValidAndroidKernel, Validity) {
EXPECT_TRUE(IsValidAndroidKernel(StringToSpan("ANDROID!")));
EXPECT_FALSE(IsValidAndroidKernel(StringToSpan("VNDRBOOT")));
}
TEST(IsValidAndroidVendorKernel, Validity) {
EXPECT_TRUE(IsValidAndroidVendorKernel(StringToSpan("VNDRBOOT")));
EXPECT_FALSE(IsValidAndroidVendorKernel(StringToSpan("ANDROID!")));
}
} // namespace
} // namespace paver