| Index: src/platform/vboot_reference/vkernel/kernel_image.c
|
| diff --git a/src/platform/vboot_reference/vkernel/kernel_image.c b/src/platform/vboot_reference/vkernel/kernel_image.c
|
| index 6833ef64bd96019883455b0453f057142383a006..fc71f35bc0ad972f476ff4f1418ff3930fcb6007 100644
|
| --- a/src/platform/vboot_reference/vkernel/kernel_image.c
|
| +++ b/src/platform/vboot_reference/vkernel/kernel_image.c
|
| @@ -29,10 +29,7 @@ KernelImage* KernelImageNew(void) {
|
| if (image) {
|
| image->kernel_sign_key = NULL;
|
| image->kernel_key_signature = NULL;
|
| - Memset(image->kernel_config,
|
| - 0,
|
| - sizeof(image->kernel_config));
|
| - image->config_signature = NULL;
|
| + image->preamble_signature = NULL;
|
| image->kernel_signature = NULL;
|
| image->kernel_data = NULL;
|
| }
|
| @@ -43,7 +40,7 @@ void KernelImageFree(KernelImage* image) {
|
| if (image) {
|
| Free(image->kernel_sign_key);
|
| Free(image->kernel_key_signature);
|
| - Free(image->config_signature);
|
| + Free(image->preamble_signature);
|
| Free(image->kernel_signature);
|
| Free(image->kernel_data);
|
| Free(image);
|
| @@ -136,18 +133,21 @@ KernelImage* ReadKernelImage(const char* input_file) {
|
| StatefulMemcpy(&st, image->kernel_key_signature,
|
| kernel_key_signature_len);
|
|
|
| - /* Read the kernel config. */
|
| + /* Read the kernel preamble. */
|
| StatefulMemcpy(&st, &image->kernel_version, FIELD_LEN(kernel_version));
|
| StatefulMemcpy(&st, &image->kernel_len, FIELD_LEN(kernel_len));
|
| + StatefulMemcpy(&st, &image->bootloader_offset, FIELD_LEN(bootloader_offset));
|
| + StatefulMemcpy(&st, &image->bootloader_size, FIELD_LEN(bootloader_size));
|
| + StatefulMemcpy(&st, &image->padded_header_size,
|
| + FIELD_LEN(padded_header_size));
|
|
|
| /* Read config and kernel signatures. */
|
| - image->config_signature = (uint8_t*) Malloc(kernel_signature_len);
|
| - StatefulMemcpy(&st, image->config_signature, kernel_signature_len);
|
| + image->preamble_signature = (uint8_t*) Malloc(kernel_signature_len);
|
| + StatefulMemcpy(&st, image->preamble_signature, kernel_signature_len);
|
| image->kernel_signature = (uint8_t*) Malloc(kernel_signature_len);
|
| StatefulMemcpy(&st, image->kernel_signature, kernel_signature_len);
|
|
|
| - /* Read kernel config command line and kernel image data. */
|
| - StatefulMemcpy(&st, image->kernel_config, FIELD_LEN(kernel_config));
|
| + /* Read kernel image data. */
|
| image->kernel_data = (uint8_t*) Malloc(image->kernel_len);
|
| StatefulMemcpy(&st, image->kernel_data, image->kernel_len);
|
|
|
| @@ -218,30 +218,27 @@ uint8_t* GetKernelHeaderBlob(const KernelImage* image) {
|
| return header_blob;
|
| }
|
|
|
| -int GetKernelConfigLen(const KernelImage* image) {
|
| - return (FIELD_LEN(kernel_version) +
|
| - FIELD_LEN(kernel_len) +
|
| - FIELD_LEN(kernel_config));
|
| -}
|
| -
|
| -uint8_t* GetKernelConfigBlob(const KernelImage* image) {
|
| - uint8_t* config_blob = NULL;
|
| +uint8_t* GetKernelPreambleBlob(const KernelImage* image) {
|
| + uint8_t* preamble_blob = NULL;
|
| MemcpyState st;
|
|
|
| - config_blob = (uint8_t*) Malloc(GetKernelConfigLen(image));
|
| - st.remaining_len = GetKernelConfigLen(image);
|
| - st.remaining_buf = config_blob;
|
| + preamble_blob = (uint8_t*) Malloc(GetKernelPreambleLen());
|
| + st.remaining_len = GetKernelPreambleLen();
|
| + st.remaining_buf = preamble_blob;
|
| st.overrun = 0;
|
|
|
| StatefulMemcpy_r(&st, &image->kernel_version, FIELD_LEN(kernel_version));
|
| StatefulMemcpy_r(&st, &image->kernel_len, FIELD_LEN(kernel_len));
|
| - StatefulMemcpy_r(&st, image->kernel_config, FIELD_LEN(kernel_config));
|
| + StatefulMemcpy_r(&st, &image->bootloader_offset, FIELD_LEN(bootloader_offset));
|
| + StatefulMemcpy_r(&st, &image->bootloader_size, FIELD_LEN(bootloader_size));
|
| + StatefulMemcpy_r(&st, &image->padded_header_size,
|
| + FIELD_LEN(padded_header_size));
|
|
|
| if (st.overrun || st.remaining_len != 0) { /* Overrun or Underrun. */
|
| - Free(config_blob);
|
| + Free(preamble_blob);
|
| return NULL;
|
| }
|
| - return config_blob;
|
| + return preamble_blob;
|
| }
|
|
|
| uint8_t* GetKernelBlob(const KernelImage* image, uint64_t* blob_len) {
|
| @@ -258,7 +255,7 @@ uint8_t* GetKernelBlob(const KernelImage* image, uint64_t* blob_len) {
|
| *blob_len = (FIELD_LEN(magic) +
|
| GetKernelHeaderLen(image) +
|
| kernel_key_signature_len +
|
| - GetKernelConfigLen(image) +
|
| + GetKernelPreambleLen() +
|
| 2 * kernel_signature_len +
|
| image->kernel_len);
|
| kernel_blob = (uint8_t*) Malloc(*blob_len);
|
| @@ -271,12 +268,16 @@ uint8_t* GetKernelBlob(const KernelImage* image, uint64_t* blob_len) {
|
| StatefulMemcpy_r(&st, image->magic, FIELD_LEN(magic));
|
| StatefulMemcpy_r(&st, header_blob, GetKernelHeaderLen(image));
|
| StatefulMemcpy_r(&st, image->kernel_key_signature, kernel_key_signature_len);
|
| - /* Copy over kernel config blob (including signatures.) */
|
| + /* Copy over kernel preamble blob (including signatures.) */
|
| StatefulMemcpy_r(&st, &image->kernel_version, FIELD_LEN(kernel_version));
|
| StatefulMemcpy_r(&st, &image->kernel_len, FIELD_LEN(kernel_len));
|
| - StatefulMemcpy_r(&st, image->config_signature, kernel_signature_len);
|
| + StatefulMemcpy_r(&st, &image->bootloader_offset,
|
| + FIELD_LEN(bootloader_offset));
|
| + StatefulMemcpy_r(&st, &image->bootloader_size, FIELD_LEN(bootloader_size));
|
| + StatefulMemcpy_r(&st, &image->padded_header_size,
|
| + FIELD_LEN(padded_header_size));
|
| + StatefulMemcpy_r(&st, image->preamble_signature, kernel_signature_len);
|
| StatefulMemcpy_r(&st, image->kernel_signature, kernel_signature_len);
|
| - StatefulMemcpy_r(&st, image->kernel_config, FIELD_LEN(kernel_config));
|
| StatefulMemcpy_r(&st, image->kernel_data, image->kernel_len);
|
|
|
| Free(header_blob);
|
| @@ -315,9 +316,8 @@ int WriteKernelImage(const char* input_file,
|
| success = 0;
|
| }
|
| } else {
|
| - /* Exclude kernel_config and kernel_data. */
|
| - int vblock_len = blob_len - (image->kernel_len +
|
| - sizeof(image->kernel_config));
|
| + /* Exclude kernel_data. */
|
| + int vblock_len = blob_len - (image->kernel_len);
|
| if (vblock_len != write(fd, kernel_blob, vblock_len)) {
|
| debug("Couldn't write Kernel Image Verification block to file: %s\n",
|
| input_file);
|
| @@ -347,11 +347,15 @@ void PrintKernelImage(const KernelImage* image) {
|
| /* TODO(gauravsh): Output hash and key signature here? */
|
| /* Print preamble. */
|
| printf("Kernel Version = %d\n"
|
| - "Kernel Config command line = \"%s\"\n"
|
| - "kernel Length = %" PRId64 "\n",
|
| + "kernel Length = %" PRId64 "\n"
|
| + "Bootloader Offset = %" PRId64 "\n"
|
| + "Bootloader Size = %" PRId64 "\n"
|
| + "Padded Header Size = %" PRId64 "\n",
|
| image->kernel_version,
|
| - image->kernel_config,
|
| - image->kernel_len);
|
| + image->kernel_len,
|
| + image->bootloader_offset,
|
| + image->bootloader_size,
|
| + image->padded_header_size);
|
| /* TODO(gauravsh): Output kernel signature here? */
|
| }
|
|
|
| @@ -361,7 +365,7 @@ int VerifyKernelImage(const RSAPublicKey* firmware_key,
|
| const int dev_mode) {
|
| RSAPublicKey* kernel_sign_key = NULL;
|
| uint8_t* header_digest = NULL;
|
| - uint8_t* config_digest = NULL;
|
| + uint8_t* preamble_digest = NULL;
|
| uint8_t* kernel_digest = NULL;
|
| int kernel_sign_key_size;
|
| int kernel_signature_size;
|
| @@ -417,19 +421,23 @@ int VerifyKernelImage(const RSAPublicKey* firmware_key,
|
| kernel_sign_key_size);
|
| kernel_signature_size = siglen_map[image->kernel_sign_algorithm];
|
|
|
| - /* Verify kernel config signature. */
|
| + /* Verify kernel preamble signature. */
|
| DigestInit(&ctx, image->kernel_sign_algorithm);
|
| DigestUpdate(&ctx, (uint8_t*) &image->kernel_version,
|
| FIELD_LEN(kernel_version));
|
| DigestUpdate(&ctx, (uint8_t*) &image->kernel_len,
|
| FIELD_LEN(kernel_len));
|
| - DigestUpdate(&ctx, (uint8_t*) image->kernel_config,
|
| - FIELD_LEN(kernel_config));
|
| - config_digest = DigestFinal(&ctx);
|
| - if (!RSAVerify(kernel_sign_key, image->config_signature,
|
| + DigestUpdate(&ctx, (uint8_t*) &image->bootloader_offset,
|
| + FIELD_LEN(bootloader_offset));
|
| + DigestUpdate(&ctx, (uint8_t*) &image->bootloader_size,
|
| + FIELD_LEN(bootloader_size));
|
| + DigestUpdate(&ctx, (uint8_t*) &image->padded_header_size,
|
| + FIELD_LEN(padded_header_size));
|
| + preamble_digest = DigestFinal(&ctx);
|
| + if (!RSAVerify(kernel_sign_key, image->preamble_signature,
|
| kernel_signature_size, image->kernel_sign_algorithm,
|
| - config_digest)) {
|
| - error_code = VERIFY_KERNEL_CONFIG_SIGNATURE_FAILED;
|
| + preamble_digest)) {
|
| + error_code = VERIFY_KERNEL_PREAMBLE_SIGNATURE_FAILED;
|
| goto verify_failure;
|
| }
|
|
|
| @@ -440,9 +448,14 @@ int VerifyKernelImage(const RSAPublicKey* firmware_key,
|
| FIELD_LEN(kernel_version));
|
| DigestUpdate(&kernel_ctx, (uint8_t*) &image->kernel_len,
|
| FIELD_LEN(kernel_len));
|
| - DigestUpdate(&kernel_ctx, (uint8_t*) image->kernel_config,
|
| - FIELD_LEN(kernel_config));
|
| - DigestUpdate(&kernel_ctx, image->kernel_data, image->kernel_len);
|
| + DigestUpdate(&kernel_ctx, (uint8_t*) &image->bootloader_offset,
|
| + FIELD_LEN(bootloader_offset));
|
| + DigestUpdate(&kernel_ctx, (uint8_t*) &image->bootloader_size,
|
| + FIELD_LEN(bootloader_size));
|
| + DigestUpdate(&kernel_ctx, (uint8_t*) &image->padded_header_size,
|
| + FIELD_LEN(padded_header_size));
|
| + DigestUpdate(&kernel_ctx, (uint8_t*) image->kernel_data,
|
| + image->kernel_len);
|
| kernel_digest = DigestFinal(&kernel_ctx);
|
| if (!RSAVerify(kernel_sign_key, image->kernel_signature,
|
| kernel_signature_size, image->kernel_sign_algorithm,
|
| @@ -454,7 +467,7 @@ int VerifyKernelImage(const RSAPublicKey* firmware_key,
|
| verify_failure:
|
| RSAPublicKeyFree(kernel_sign_key);
|
| Free(kernel_digest);
|
| - Free(config_digest);
|
| + Free(preamble_digest);
|
| Free(header_digest);
|
| return error_code;
|
| }
|
| @@ -488,38 +501,38 @@ int AddKernelKeySignature(KernelImage* image, const char* firmware_key_file) {
|
|
|
| int AddKernelSignature(KernelImage* image,
|
| const char* kernel_signing_key_file) {
|
| - uint8_t* config_blob = NULL;
|
| - uint8_t* config_signature = NULL;
|
| + uint8_t* preamble_blob = NULL;
|
| + uint8_t* preamble_signature = NULL;
|
| uint8_t* kernel_signature = NULL;
|
| uint8_t* kernel_buf;
|
| int signature_len = siglen_map[image->kernel_sign_algorithm];
|
|
|
| - config_blob = GetKernelConfigBlob(image);
|
| - if (!(config_signature = SignatureBuf(config_blob,
|
| - GetKernelConfigLen(image),
|
| - kernel_signing_key_file,
|
| - image->kernel_sign_algorithm))) {
|
| - debug("Could not compute signature on the kernel config.\n");
|
| - Free(config_blob);
|
| + preamble_blob = GetKernelPreambleBlob(image);
|
| + if (!(preamble_signature = SignatureBuf(preamble_blob,
|
| + GetKernelPreambleLen(),
|
| + kernel_signing_key_file,
|
| + image->kernel_sign_algorithm))) {
|
| + debug("Could not compute signature on the kernel preamble.\n");
|
| + Free(preamble_blob);
|
| return 0;
|
| }
|
|
|
| - image->config_signature = (uint8_t*) Malloc(signature_len);
|
| - Memcpy(image->config_signature, config_signature, signature_len);
|
| - Free(config_signature);
|
| + image->preamble_signature = (uint8_t*) Malloc(signature_len);
|
| + Memcpy(image->preamble_signature, preamble_signature, signature_len);
|
| + Free(preamble_signature);
|
| /* Kernel signature muse be calculated on the kernel version, options and
|
| * kernel data to avoid splicing attacks. */
|
| - kernel_buf = (uint8_t*) Malloc(GetKernelConfigLen(image) +
|
| + kernel_buf = (uint8_t*) Malloc(GetKernelPreambleLen() +
|
| image->kernel_len);
|
| - Memcpy(kernel_buf, config_blob, GetKernelConfigLen(image));
|
| - Memcpy(kernel_buf + GetKernelConfigLen(image), image->kernel_data,
|
| + Memcpy(kernel_buf, preamble_blob, GetKernelPreambleLen());
|
| + Memcpy(kernel_buf + GetKernelPreambleLen(), image->kernel_data,
|
| image->kernel_len);
|
| if (!(kernel_signature = SignatureBuf(kernel_buf,
|
| - GetKernelConfigLen(image) +
|
| + GetKernelPreambleLen() +
|
| image->kernel_len,
|
| kernel_signing_key_file,
|
| image->kernel_sign_algorithm))) {
|
| - Free(config_blob);
|
| + Free(preamble_blob);
|
| Free(kernel_buf);
|
| debug("Could not compute signature on the kernel.\n");
|
| return 0;
|
| @@ -528,7 +541,7 @@ int AddKernelSignature(KernelImage* image,
|
| Memcpy(image->kernel_signature, kernel_signature, signature_len);
|
| Free(kernel_signature);
|
| Free(kernel_buf);
|
| - Free(config_blob);
|
| + Free(preamble_blob);
|
| return 1;
|
| }
|
|
|
|
|