/* * Copyright (C) 2016 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include "bvb_util.h" TEST(UtilTest, BootImageHeaderByteswap) { BvbBootImageHeader h; BvbBootImageHeader s; uint32_t n32; uint64_t n64; n32 = 0x11223344; n64 = 0x1122334455667788; h.header_version_major = htobe32(n32); n32++; h.header_version_minor = htobe32(n32); n32++; h.authentication_data_block_size = htobe64(n64); n64++; h.auxilary_data_block_size = htobe64(n64); n64++; h.payload_data_block_size = htobe64(n64); n64++; h.algorithm_type = htobe32(n32); n32++; h.hash_offset = htobe64(n64); n64++; h.hash_size = htobe64(n64); n64++; h.signature_offset = htobe64(n64); n64++; h.signature_size = htobe64(n64); n64++; h.public_key_offset = htobe64(n64); n64++; h.public_key_size = htobe64(n64); n64++; h.properties_offset = htobe64(n64); n64++; h.properties_size = htobe64(n64); n64++; h.rollback_index = htobe64(n64); n64++; h.kernel_offset = htobe64(n64); n64++; h.kernel_size = htobe64(n64); n64++; h.initrd_offset = htobe64(n64); n64++; h.initrd_size = htobe64(n64); n64++; h.kernel_addr = htobe64(n64); n64++; h.initrd_addr = htobe64(n64); n64++; bvb_boot_image_header_to_host_byte_order(&h, &s); n32 = 0x11223344; n64 = 0x1122334455667788; EXPECT_EQ(n32, s.header_version_major); n32++; EXPECT_EQ(n32, s.header_version_minor); n32++; EXPECT_EQ(n64, s.authentication_data_block_size); n64++; EXPECT_EQ(n64, s.auxilary_data_block_size); n64++; EXPECT_EQ(n64, s.payload_data_block_size); n64++; EXPECT_EQ(n32, s.algorithm_type); n32++; EXPECT_EQ(n64, s.hash_offset); n64++; EXPECT_EQ(n64, s.hash_size); n64++; EXPECT_EQ(n64, s.signature_offset); n64++; EXPECT_EQ(n64, s.signature_size); n64++; EXPECT_EQ(n64, s.public_key_offset); n64++; EXPECT_EQ(n64, s.public_key_size); n64++; EXPECT_EQ(n64, s.properties_offset); n64++; EXPECT_EQ(n64, s.properties_size); n64++; EXPECT_EQ(n64, s.rollback_index); n64++; EXPECT_EQ(n64, s.kernel_offset); n64++; EXPECT_EQ(n64, s.kernel_size); n64++; EXPECT_EQ(n64, s.initrd_offset); n64++; EXPECT_EQ(n64, s.initrd_size); n64++; EXPECT_EQ(n64, s.kernel_addr); n64++; EXPECT_EQ(n64, s.initrd_addr); n64++; // If new fields are added, the following will fail. This is to // remind that byteswapping code (in bvb_util.c) and unittests for // this should be updated. static_assert(offsetof(BvbBootImageHeader, reserved) == 4256, "Remember to unittest byteswapping of newly added fields"); } TEST(UtilTest, RSAPublicKeyHeaderByteswap) { BvbRSAPublicKeyHeader h; BvbRSAPublicKeyHeader s; uint32_t n32; uint64_t n64; n32 = 0x11223344; n64 = 0x1122334455667788; h.key_num_bits = htobe32(n32); n32++; h.n0inv = htobe32(n32); n32++; bvb_rsa_public_key_header_to_host_byte_order(&h, &s); n32 = 0x11223344; n64 = 0x1122334455667788; EXPECT_EQ(n32, s.key_num_bits); n32++; EXPECT_EQ(n32, s.n0inv); n32++; } TEST(UtilTest, SafeAddition) { uint64_t value; uint64_t pow2_60 = 1ULL << 60; value = 2; EXPECT_NE(0, bvb_safe_add_to(&value, 5)); EXPECT_EQ(7UL, value); /* These should not overflow */ value = 1*pow2_60; EXPECT_NE(0, bvb_safe_add_to(&value, 2*pow2_60)); EXPECT_EQ(3*pow2_60, value); value = 7*pow2_60; EXPECT_NE(0, bvb_safe_add_to(&value, 8*pow2_60)); EXPECT_EQ(15*pow2_60, value); value = 9*pow2_60; EXPECT_NE(0, bvb_safe_add_to(&value, 3*pow2_60)); EXPECT_EQ(12*pow2_60, value); value = 0xfffffffffffffffcUL; EXPECT_NE(0, bvb_safe_add_to(&value, 2)); EXPECT_EQ(0xfffffffffffffffeUL, value); /* These should overflow. */ value = 8*pow2_60; EXPECT_EQ(0, bvb_safe_add_to(&value, 8*pow2_60)); value = 0xfffffffffffffffcUL; EXPECT_EQ(0, bvb_safe_add_to(&value, 4)); }