diff options
author | Gaurav Shah <gauravsh@chromium.org> | 2010-03-25 13:04:45 -0700 |
---|---|---|
committer | Gaurav Shah <gauravsh@chromium.org> | 2010-03-25 13:04:45 -0700 |
commit | 3199eed3d37fa028c1a5e32d6b61aea00d35bc0c (patch) | |
tree | c6b889a514d282dcd26b0e9ae98c5917acb45f28 /tests/test_common.c | |
parent | 785397136260359e47de94b16881fbab06a96b36 (diff) | |
download | vboot-3199eed3d37fa028c1a5e32d6b61aea00d35bc0c.tar.gz |
Move test utility functions to a common place.
Also removes the dev_mode flag from Firmware Image verification as key signature for the firmware should be checked whether or not dev mode is enabled.
BUG=670
TEST=All tests still pass.
Merge remote branch 'refs/remotes/origin/master' into fixtests
Fix tests, remove dev mode. Move common code.
Review URL: http://codereview.chromium.org/1280002
Diffstat (limited to 'tests/test_common.c')
-rw-r--r-- | tests/test_common.c | 187 |
1 files changed, 186 insertions, 1 deletions
diff --git a/tests/test_common.c b/tests/test_common.c index 4a92f7d8..5cc0805d 100644 --- a/tests/test_common.c +++ b/tests/test_common.c @@ -9,9 +9,13 @@ #include <stdio.h> +#include "file_keys.h" +#include "rsa_utility.h" +#include "utility.h" + /* ANSI Color coding sequences. */ #define COL_GREEN "\e[1;32m" -#define COL_RED "\e[0;31m]" +#define COL_RED "\e[0;31m" #define COL_STOP "\e[m" /* Global test success flag. */ @@ -28,3 +32,184 @@ int TEST_EQ(int result, int expected_result, char* testname) { return 0; } } + +FirmwareImage* GenerateTestFirmwareImage(int algorithm, + const uint8_t* firmware_sign_key, + int firmware_key_version, + int firmware_version, + int firmware_len, + const char* root_key_file, + const char* firmware_key_file) { + FirmwareImage* image = FirmwareImageNew(); + + Memcpy(image->magic, FIRMWARE_MAGIC, FIRMWARE_MAGIC_SIZE); + image->firmware_sign_algorithm = algorithm; + image->firmware_sign_key = (uint8_t*) Malloc( + RSAProcessedKeySize(image->firmware_sign_algorithm)); + Memcpy(image->firmware_sign_key, firmware_sign_key, + RSAProcessedKeySize(image->firmware_sign_algorithm)); + image->firmware_key_version = firmware_key_version; + + /* Update correct header length. */ + image->header_len = GetFirmwareHeaderLen(image); + + /* Calculate SHA-512 digest on header and populate header_checksum. */ + CalculateFirmwareHeaderChecksum(image, image->header_checksum); + + /* Populate firmware and preamble with dummy data. */ + image->firmware_version = firmware_version; + image->firmware_len = firmware_len; + image->preamble_signature = image->firmware_signature = NULL; + Memset(image->preamble, 'P', FIRMWARE_PREAMBLE_SIZE); + image->firmware_data = Malloc(image->firmware_len); + Memset(image->firmware_data, 'F', image->firmware_len); + + /* Generate and populate signatures. */ + if (!AddFirmwareKeySignature(image, root_key_file)) { + fprintf(stderr, "Couldn't create key signature.\n"); + FirmwareImageFree(image); + return NULL; + } + + if (!AddFirmwareSignature(image, firmware_key_file)) { + fprintf(stderr, "Couldn't create firmware and preamble signature.\n"); + FirmwareImageFree(image); + return NULL; + } + return image; +} + +uint8_t* GenerateTestFirmwareBlob(int algorithm, + const uint8_t* firmware_sign_key, + int firmware_key_version, + int firmware_version, + int firmware_len, + const char* root_key_file, + const char* firmware_key_file) { + FirmwareImage* image = NULL; + uint8_t* firmware_blob = NULL; + uint64_t firmware_blob_len = 0; + + image = GenerateTestFirmwareImage(algorithm, + firmware_sign_key, + firmware_key_version, + firmware_version, + firmware_len, + root_key_file, + firmware_key_file); + firmware_blob = GetFirmwareBlob(image, &firmware_blob_len); + FirmwareImageFree(image); + return firmware_blob; +} + +uint8_t* GenerateRollbackTestImage(int firmware_key_version, + int firmware_version, + int is_corrupt) { + FirmwareImage* image = NULL; + uint64_t len; + uint8_t* firmware_blob = NULL; + uint8_t* firmware_sign_key = NULL; + + firmware_sign_key = BufferFromFile("testkeys/key_rsa1024.keyb", + &len); + if (!firmware_sign_key) + return NULL; + image = GenerateTestFirmwareImage(0, /* RSA1024/SHA1 */ + firmware_sign_key, + firmware_key_version, + firmware_version, + 1, /* Firmware length. */ + "testkeys/key_rsa8192.pem", + "testkeys/key_rsa1024.pem"); + if (!image) + return NULL; + if (is_corrupt) { + /* Invalidate image. */ + Memset(image->firmware_data, 'X', image->firmware_len); + } + + firmware_blob = GetFirmwareBlob(image, &len); + FirmwareImageFree(image); + return firmware_blob; +} + + +KernelImage* GenerateTestKernelImage(int firmware_sign_algorithm, + int kernel_sign_algorithm, + const uint8_t* kernel_sign_key, + int kernel_key_version, + int kernel_version, + int kernel_len, + const char* firmware_key_file, + const char* kernel_key_file) { + KernelImage* image = KernelImageNew(); + + Memcpy(image->magic, KERNEL_MAGIC, KERNEL_MAGIC_SIZE); + image->header_version = 1; + image->firmware_sign_algorithm = firmware_sign_algorithm; + image->kernel_sign_algorithm = kernel_sign_algorithm; + image->kernel_key_version = kernel_key_version; + image->kernel_sign_key = (uint8_t*) Malloc( + RSAProcessedKeySize(image->kernel_sign_algorithm)); + Memcpy(image->kernel_sign_key, kernel_sign_key, + RSAProcessedKeySize(image->kernel_sign_algorithm)); + + /* Update correct header length. */ + image->header_len = GetKernelHeaderLen(image); + + /* Calculate SHA-512 digest on header and populate header_checksum. */ + CalculateKernelHeaderChecksum(image, image->header_checksum); + + /* Populate kernel options and data with dummy data. */ + image->kernel_version = kernel_version; + image->options.version[0] = 1; + image->options.version[1] = 0; + Memset(image->options.cmd_line, 0, sizeof(image->options.cmd_line)); + image->options.kernel_len = kernel_len; + image->options.kernel_load_addr = 0; + image->options.kernel_entry_addr = 0; + image->kernel_key_signature = image->kernel_signature = NULL; + image->kernel_data = Malloc(kernel_len); + Memset(image->kernel_data, 'F', kernel_len); + + /* Generate and populate signatures. */ + if (!AddKernelKeySignature(image, firmware_key_file)) { + fprintf(stderr, "Couldn't create key signature.\n"); + KernelImageFree(image); + return NULL; + } + + if (!AddKernelSignature(image, kernel_key_file)) { + fprintf(stderr, "Couldn't create kernel option and kernel signature.\n"); + KernelImageFree(image); + return NULL; + } + + return image; +} + +uint8_t* GenerateTestKernelBlob(int firmware_sign_algorithm, + int kernel_sign_algorithm, + const uint8_t* kernel_sign_key, + int kernel_key_version, + int kernel_version, + int kernel_len, + const char* firmware_key_file, + const char* kernel_key_file) { + KernelImage* image = NULL; + uint8_t* kernel_blob = NULL; + uint64_t kernel_blob_len = 0; + + image = GenerateTestKernelImage(firmware_sign_algorithm, + kernel_sign_algorithm, + kernel_sign_key, + kernel_key_version, + kernel_version, + kernel_len, + firmware_key_file, + kernel_key_file); + + kernel_blob = GetKernelBlob(image, &kernel_blob_len); + KernelImageFree(image); + return kernel_blob; +} |