| /* |
| * 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 <string.h> |
| |
| #include <gtest/gtest.h> |
| |
| #include "bvb_refimpl.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)); |
| } |