| Index: src/platform/vboot_reference/tests/kernel_image_tests.c
|
| diff --git a/src/platform/vboot_reference/tests/kernel_image_tests.c b/src/platform/vboot_reference/tests/kernel_image_tests.c
|
| index d958c0fa23b6cdcdc9c7644c700763c3c5fd40c1..a56501151083502a43c76782d95ed1e5c15e6ff5 100644
|
| --- a/src/platform/vboot_reference/tests/kernel_image_tests.c
|
| +++ b/src/platform/vboot_reference/tests/kernel_image_tests.c
|
| @@ -11,143 +11,70 @@
|
| #include "file_keys.h"
|
| #include "kernel_image.h"
|
| #include "rsa_utility.h"
|
| +#include "test_common.h"
|
| #include "utility.h"
|
|
|
| -/* ANSI Color coding sequences. */
|
| -#define COL_GREEN "\e[1;32m"
|
| -#define COL_RED "\e[0;31m"
|
| -#define COL_STOP "\e[m"
|
| -
|
| -int TEST_EQ(int result, int expected_result, char* testname) {
|
| - if (result == expected_result) {
|
| - fprintf(stderr, "%s Test " COL_GREEN " PASSED\n" COL_STOP, testname);
|
| - return 1;
|
| - }
|
| - else {
|
| - fprintf(stderr, "%s Test " COL_RED " FAILED\n" COL_STOP, testname);
|
| - return 0;
|
| - }
|
| -}
|
| -
|
| -KernelImage* GenerateTestKernelImage(int firmware_sign_algorithm,
|
| - int kernel_sign_algorithm,
|
| - uint8_t* kernel_sign_key,
|
| - int kernel_key_version,
|
| - int kernel_version,
|
| - int kernel_len) {
|
| - 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);
|
| -
|
| - return image;
|
| -}
|
| -
|
| #define DEV_MODE_ENABLED 1
|
| #define DEV_MODE_DISABLED 0
|
|
|
| /* Normal Kernel Blob Verification Tests. */
|
| -int VerifyKernelTest(uint8_t* kernel_blob, uint8_t* firmware_key_blob) {
|
| - int success = 1;
|
| - if (!TEST_EQ(VerifyKernel(firmware_key_blob, kernel_blob, DEV_MODE_ENABLED),
|
| - VERIFY_KERNEL_SUCCESS,
|
| - "Normal Kernel Blob Verification (Dev Mode)"))
|
| - success = 0;
|
| -
|
| - if (!TEST_EQ(VerifyKernel(firmware_key_blob, kernel_blob, DEV_MODE_DISABLED),
|
| - VERIFY_KERNEL_SUCCESS,
|
| - "Normal Kernel Blob Verification (Trusted)"))
|
| - success = 0;
|
| - return success;
|
| +void VerifyKernelTest(uint8_t* kernel_blob, uint8_t* firmware_key_blob) {
|
| + TEST_EQ(VerifyKernel(firmware_key_blob, kernel_blob, DEV_MODE_ENABLED),
|
| + VERIFY_KERNEL_SUCCESS,
|
| + "Normal Kernel Blob Verification (Dev Mode)");
|
| +
|
| + TEST_EQ(VerifyKernel(firmware_key_blob, kernel_blob, DEV_MODE_DISABLED),
|
| + VERIFY_KERNEL_SUCCESS,
|
| + "Normal Kernel Blob Verification (Trusted)");
|
| }
|
|
|
|
|
| /* Normal KernelImage Verification Tests. */
|
| -int VerifyKernelImageTest(KernelImage* image,
|
| +void VerifyKernelImageTest(KernelImage* image,
|
| RSAPublicKey* firmware_key) {
|
| - int success = 1;
|
| - if (!TEST_EQ(VerifyKernelImage(firmware_key, image, DEV_MODE_ENABLED),
|
| - VERIFY_KERNEL_SUCCESS,
|
| - "Normal KernelImage Verification (Dev Mode)"))
|
| - success = 0;
|
| -
|
| - if (!TEST_EQ(VerifyKernelImage(firmware_key, image, DEV_MODE_DISABLED),
|
| - VERIFY_KERNEL_SUCCESS,
|
| - "Normal KernelImage Verification (Trusted)"))
|
| - success = 0;
|
| - return success;
|
| + TEST_EQ(VerifyKernelImage(firmware_key, image, DEV_MODE_ENABLED),
|
| + VERIFY_KERNEL_SUCCESS,
|
| + "Normal KernelImage Verification (Dev Mode)");
|
| + TEST_EQ(VerifyKernelImage(firmware_key, image, DEV_MODE_DISABLED),
|
| + VERIFY_KERNEL_SUCCESS,
|
| + "Normal KernelImage Verification (Trusted)");
|
| }
|
|
|
| /* Tampered KernelImage Verification Tests. */
|
| -int VerifyKernelImageTamperTest(KernelImage* image,
|
| - RSAPublicKey* firmware_key) {
|
| - int success = 1;
|
| - fprintf(stderr, "[[Tampering with kernel config....]]\n");
|
| +void VerifyKernelImageTamperTest(KernelImage* image,
|
| + RSAPublicKey* firmware_key) {
|
| image->options.kernel_load_addr = 0xFFFF;
|
| - if (!TEST_EQ(VerifyKernelImage(firmware_key, image, DEV_MODE_ENABLED),
|
| - VERIFY_KERNEL_CONFIG_SIGNATURE_FAILED,
|
| - "KernelImage Config Tamper Verification (Dev Mode)"))
|
| - success = 0;
|
| - if (!TEST_EQ(VerifyKernelImage(firmware_key, image, DEV_MODE_DISABLED),
|
| - VERIFY_KERNEL_CONFIG_SIGNATURE_FAILED,
|
| - "KernelImage Config Tamper Verification (Trusted)"))
|
| - success = 0;
|
| + TEST_EQ(VerifyKernelImage(firmware_key, image, DEV_MODE_ENABLED),
|
| + VERIFY_KERNEL_CONFIG_SIGNATURE_FAILED,
|
| + "KernelImage Config Tamper Verification (Dev Mode)");
|
| + TEST_EQ(VerifyKernelImage(firmware_key, image, DEV_MODE_DISABLED),
|
| + VERIFY_KERNEL_CONFIG_SIGNATURE_FAILED,
|
| + "KernelImage Config Tamper Verification (Trusted)");
|
| image->options.kernel_load_addr = 0;
|
|
|
| image->kernel_data[0] = 'T';
|
| - if (!TEST_EQ(VerifyKernelImage(firmware_key, image, DEV_MODE_ENABLED),
|
| - VERIFY_KERNEL_SIGNATURE_FAILED,
|
| - "KernelImage Tamper Verification (Dev Mode)"))
|
| - success = 0;
|
| - if (!TEST_EQ(VerifyKernelImage(firmware_key, image, DEV_MODE_DISABLED),
|
| - VERIFY_KERNEL_SIGNATURE_FAILED,
|
| - "KernelImage Tamper Verification (Trusted)"))
|
| - success = 0;
|
| + TEST_EQ(VerifyKernelImage(firmware_key, image, DEV_MODE_ENABLED),
|
| + VERIFY_KERNEL_SIGNATURE_FAILED,
|
| + "KernelImage Tamper Verification (Dev Mode)");
|
| + TEST_EQ(VerifyKernelImage(firmware_key, image, DEV_MODE_DISABLED),
|
| + VERIFY_KERNEL_SIGNATURE_FAILED,
|
| + "KernelImage Tamper Verification (Trusted)");
|
| image->kernel_data[0] = 'F';
|
|
|
| -
|
| - fprintf(stderr, "[[Tampering with kernel key signature...]]\n");
|
| image->kernel_key_signature[0] = 0xFF;
|
| image->kernel_key_signature[1] = 0x00;
|
| - if (!TEST_EQ(VerifyKernelImage(firmware_key, image, DEV_MODE_ENABLED),
|
| - VERIFY_KERNEL_SUCCESS,
|
| - "KernelImage Key Signature Tamper Verification (Dev Mode)"))
|
| - success = 0;
|
| - if (!TEST_EQ(VerifyKernelImage(firmware_key, image, DEV_MODE_DISABLED),
|
| - VERIFY_KERNEL_KEY_SIGNATURE_FAILED,
|
| - "KernelImage Key Signature Tamper Verification (Trusted)"))
|
| - success = 0;
|
| -
|
| - return success;
|
| + TEST_EQ(VerifyKernelImage(firmware_key, image, DEV_MODE_ENABLED),
|
| + VERIFY_KERNEL_SUCCESS,
|
| + "KernelImage Key Signature Tamper Verification (Dev Mode)");
|
| + TEST_EQ(VerifyKernelImage(firmware_key, image, DEV_MODE_DISABLED),
|
| + VERIFY_KERNEL_KEY_SIGNATURE_FAILED,
|
| + "KernelImage Key Signature Tamper Verification (Trusted)");
|
| }
|
|
|
| int main(int argc, char* argv[]) {
|
| uint64_t len;
|
| + const char* firmware_key_file = NULL;
|
| + const char* kernel_key_file = NULL;
|
| uint8_t* kernel_sign_key_buf = NULL;
|
| uint8_t* firmware_key_blob = NULL;
|
| uint8_t* kernel_blob = NULL;
|
| @@ -171,6 +98,9 @@ int main(int argc, char* argv[]) {
|
| firmware_key = RSAPublicKeyFromFile(argv[4]);
|
| firmware_key_blob = BufferFromFile(argv[4], &len);
|
| kernel_sign_key_buf = BufferFromFile(argv[6], &len);
|
| + firmware_key_file = argv[3];
|
| + kernel_key_file = argv[5];
|
| +
|
| if (!firmware_key || !kernel_sign_key_buf || !kernel_sign_key_buf) {
|
| error_code = 1;
|
| goto failure;
|
| @@ -181,35 +111,24 @@ int main(int argc, char* argv[]) {
|
| kernel_sign_key_buf,
|
| 1, /* Kernel Key Version */
|
| 1, /* Kernel Version */
|
| - 1000); /* Kernel Size */
|
| + 1000, /* Kernel Size */
|
| + firmware_key_file,
|
| + kernel_key_file);
|
| if (!image) {
|
| error_code = 1;
|
| goto failure;
|
| }
|
|
|
| - /* Generate and populate signatures. */
|
| - if (!AddKernelKeySignature(image, argv[3])) {
|
| - fprintf(stderr, "Couldn't create key signature.\n");
|
| - error_code = 1;
|
| - goto failure;
|
| - }
|
| -
|
| - if (!AddKernelSignature(image, argv[5])) {
|
| - fprintf(stderr, "Couldn't create kernel option and kernel signature.\n");
|
| - error_code = 1;
|
| - goto failure;
|
| - }
|
| -
|
| kernel_blob = GetKernelBlob(image, &kernel_blob_len);
|
|
|
| /* Test Kernel blob verify operations. */
|
| - if (!VerifyKernelTest(kernel_blob, firmware_key_blob))
|
| - error_code = 255;
|
| + VerifyKernelTest(kernel_blob, firmware_key_blob);
|
|
|
| /* Test KernelImage verify operations. */
|
| - if (!VerifyKernelImageTest(image, firmware_key))
|
| - error_code = 255;
|
| - if (!VerifyKernelImageTamperTest(image, firmware_key))
|
| + VerifyKernelImageTest(image, firmware_key);
|
| + VerifyKernelImageTamperTest(image, firmware_key);
|
| +
|
| + if (!gTestSuccess)
|
| error_code = 255;
|
|
|
| failure:
|
|
|