| Index: src/platform/vboot_reference/tests/test_common.c
|
| diff --git a/src/platform/vboot_reference/tests/test_common.c b/src/platform/vboot_reference/tests/test_common.c
|
| index 4a92f7d898c0ec25a2565e31631388cc0db44d48..5cc0805d2bb495908e95b556151f9aaeb5b70b55 100644
|
| --- a/src/platform/vboot_reference/tests/test_common.c
|
| +++ b/src/platform/vboot_reference/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;
|
| +}
|
|
|