openssl/lk: Enable signed boot img check

This uses openssl to check the boot image prior
to jumping to kernel to see if it is a signed
kernel image.

Change-Id: I92927fd9317a0f701dab395cc6d39929c64340c1
This commit is contained in:
Shashank Mittal authored and Linux Build Service Account committed 2011-08-22 14:00:27 -06:00
1 parent a10a99cc81
commit cd98d4709d
12 files changed
+515 -32

No files matched your search

+8 -3
View File
@@ -29,6 +29,11 @@ ifeq ($(TARGET_USERIMAGES_USE_EXT4),true)
TARGET_EMMC := 1
endif
ifeq ($(TARGET_BOOTIMG_SIGNED),true)
SIGNED_KERNEL := SIGNED_KERNEL=1
else
SIGNED_KERNEL := SIGNED_KERNEL=0
endif
ifeq ($(TARGET_EMMC),1)
TARGET_BOOTLOADER_EMMC := $(PRODUCT_OUT)/EMMCBOOT.MBN
@@ -42,13 +47,13 @@ $(BOOTLOADER_EMMC_OUT):
mkdir -p $(BOOTLOADER_EMMC_OUT)
$(TARGET_BOOTLOADER): appsbootldr_clean emmc_appsbootldr_clean $(BOOTLOADER_OUT) $(BOOTLOADER_EMMC_OUT)
$(MAKE) -C bootable/bootloader/lk TOOLCHAIN_PREFIX=$(CROSS_TOOL) BOOTLOADER_OUT=../../../$(BOOTLOADER_OUT) $(TARGET_PRODUCT)
$(MAKE) -C bootable/bootloader/lk TOOLCHAIN_PREFIX=$(CROSS_TOOL) BOOTLOADER_OUT=../../../$(BOOTLOADER_EMMC_OUT) $(TARGET_PRODUCT) EMMC_BOOT=1
$(MAKE) -C bootable/bootloader/lk TOOLCHAIN_PREFIX=$(CROSS_TOOL) BOOTLOADER_OUT=../../../$(BOOTLOADER_OUT) $(TARGET_PRODUCT) $(SIGNED_KERNEL)
$(MAKE) -C bootable/bootloader/lk TOOLCHAIN_PREFIX=$(CROSS_TOOL) BOOTLOADER_OUT=../../../$(BOOTLOADER_EMMC_OUT) $(TARGET_PRODUCT) EMMC_BOOT=1 $(SIGNED_KERNEL)
else
$(TARGET_BOOTLOADER): appsbootldr_clean $(BOOTLOADER_OUT)
$(MAKE) -C bootable/bootloader/lk TOOLCHAIN_PREFIX=$(CROSS_TOOL) BOOTLOADER_OUT=../../../$(BOOTLOADER_OUT) $(TARGET_PRODUCT)
$(MAKE) -C bootable/bootloader/lk TOOLCHAIN_PREFIX=$(CROSS_TOOL) BOOTLOADER_OUT=../../../$(BOOTLOADER_OUT) $(TARGET_PRODUCT) $(SIGNED_KERNEL)
endif
+128 -26
View File
@@ -47,7 +47,9 @@
#include <mmc.h>
#include <partition_parser.h>
#include <platform.h>
#include <crypto_hash.h>
#include "image_verify.h"
#include "recovery.h"
#include "bootimg.h"
#include "fastboot.h"
@@ -72,12 +74,16 @@
static const char *emmc_cmdline = " androidboot.emmc=true";
static const char *usb_sn_cmdline = " androidboot.serialno=";
static const char *battchg_pause = " androidboot.battchg_pause=true";
static const char *auth_kernel = " androidboot.authorized_kernel=true";
static const char *baseband_apq = " androidboot.baseband=apq";
static const char *baseband_msm = " androidboot.baseband=msm";
static const char *baseband_csfb = " androidboot.baseband=csfb";
static const char *baseband_svlte2a = " androidboot.baseband=svlte2a";
/* Assuming unauthorized kernel image by default */
static int auth_kernel_img = 0;
static struct udc_device surf_udc_device = {
.vendor_id = 0x18d1,
.product_id = 0xD00D,
@@ -175,6 +181,10 @@ void boot_linux(void *kernel, unsigned *tags,
cmdline_len += strlen(battchg_pause);
}
if(target_use_signed_kernel() && auth_kernel_img) {
cmdline_len += strlen(auth_kernel);
}
/* Determine correct androidboot.baseband to use */
switch(target_baseband())
{
@@ -230,6 +240,12 @@ void boot_linux(void *kernel, unsigned *tags,
while ((*dst++ = *src++));
}
if(target_use_signed_kernel() && auth_kernel_img) {
src = auth_kernel;
if (have_cmdline) --dst;
while ((*dst++ = *src++));
}
switch(target_baseband())
{
case BASEBAND_APQ:
@@ -293,6 +309,11 @@ int boot_linux_from_mmc(void)
const char *cmdline;
int index = INVALID_PTN;
unsigned char *image_addr = 0;
unsigned kernel_actual;
unsigned ramdisk_actual;
unsigned imagesize_actual;
uhdr = (struct boot_img_hdr *)EMMC_BOOT_IMG_HEADER_ADDR;
if (!memcmp(uhdr->magic, BOOT_MAGIC, BOOT_MAGIC_SIZE)) {
dprintf(INFO, "Unified boot method!\n");
@@ -330,24 +351,62 @@ int boot_linux_from_mmc(void)
page_size = hdr->page_size;
page_mask = page_size - 1;
}
offset += page_size;
n = ROUND_TO_PAGE(hdr->kernel_size, page_mask);
if (mmc_read(ptn + offset, (void *)hdr->kernel_addr, n)) {
dprintf(CRITICAL, "ERROR: Cannot read kernel image\n");
return -1;
}
offset += n;
n = ROUND_TO_PAGE(hdr->ramdisk_size, page_mask);
if(n != 0)
/* Authenticate Kernel */
if(target_use_signed_kernel())
{
if (mmc_read(ptn + offset, (void *)hdr->ramdisk_addr, n)) {
dprintf(CRITICAL, "ERROR: Cannot read ramdisk image\n");
return -1;
image_addr = (unsigned char *)target_get_scratch_address();
kernel_actual = ROUND_TO_PAGE(hdr->kernel_size, page_mask);
ramdisk_actual = ROUND_TO_PAGE(hdr->ramdisk_size, page_mask);
imagesize_actual = (page_size + kernel_actual + ramdisk_actual);
offset = 0;
/* Read image without signature */
if (mmc_read(ptn + offset, (void *)image_addr, imagesize_actual))
{
dprintf(CRITICAL, "ERROR: Cannot read boot image\n");
return -1;
}
offset = imagesize_actual;
/* Read signature */
if(mmc_read(ptn + offset, (void *)(image_addr + offset), page_size))
{
dprintf(CRITICAL, "ERROR: Cannot read boot image signature\n");
}
else
{
auth_kernel_img = image_verify((unsigned char *)image_addr,
(unsigned char *)(image_addr + imagesize_actual),
imagesize_actual,
CRYPTO_AUTH_ALG_SHA256);
}
/* Move kernel and ramdisk to correct address */
memmove((void*) hdr->kernel_addr, (char *)(image_addr + page_size), hdr->kernel_size);
memmove((void*) hdr->ramdisk_addr, (char *)(image_addr + page_size + kernel_actual), hdr->ramdisk_size);
}
else
{
offset += page_size;
n = ROUND_TO_PAGE(hdr->kernel_size, page_mask);
if (mmc_read(ptn + offset, (void *)hdr->kernel_addr, n)) {
dprintf(CRITICAL, "ERROR: Cannot read kernel image\n");
return -1;
}
offset += n;
n = ROUND_TO_PAGE(hdr->ramdisk_size, page_mask);
if(n != 0)
{
if (mmc_read(ptn + offset, (void *)hdr->ramdisk_addr, n)) {
dprintf(CRITICAL, "ERROR: Cannot read ramdisk image\n");
return -1;
}
}
offset += n;
}
offset += n;
unified_boot:
dprintf(INFO, "\nkernel @ %x (%d bytes)\n", hdr->kernel_addr,
@@ -379,6 +438,11 @@ int boot_linux_from_flash(void)
unsigned offset = 0;
const char *cmdline;
unsigned char *image_addr = 0;
unsigned kernel_actual;
unsigned ramdisk_actual;
unsigned imagesize_actual;
if (target_is_emmc_boot()) {
hdr = (struct boot_img_hdr *)EMMC_BOOT_IMG_HEADER_ADDR;
if (memcmp(hdr->magic, BOOT_MAGIC, BOOT_MAGIC_SIZE)) {
@@ -427,20 +491,58 @@ int boot_linux_from_flash(void)
return -1;
}
n = ROUND_TO_PAGE(hdr->kernel_size, page_mask);
if (flash_read(ptn, offset, (void *)hdr->kernel_addr, n)) {
dprintf(CRITICAL, "ERROR: Cannot read kernel image\n");
return -1;
}
offset += n;
/* Authenticate Kernel */
if(target_use_signed_kernel())
{
image_addr = (unsigned char *)target_get_scratch_address();
kernel_actual = ROUND_TO_PAGE(hdr->kernel_size, page_mask);
ramdisk_actual = ROUND_TO_PAGE(hdr->ramdisk_size, page_mask);
imagesize_actual = (page_size + kernel_actual + ramdisk_actual);
n = ROUND_TO_PAGE(hdr->ramdisk_size, page_mask);
if (flash_read(ptn, offset, (void *)hdr->ramdisk_addr, n)) {
dprintf(CRITICAL, "ERROR: Cannot read ramdisk image\n");
return -1;
}
offset += n;
offset = 0;
/* Read image without signature */
if (flash_read(ptn, offset, (void *)image_addr, imagesize_actual))
{
dprintf(CRITICAL, "ERROR: Cannot read boot image\n");
return -1;
}
offset = imagesize_actual;
/* Read signature */
if (flash_read(ptn, offset, (void *)(image_addr + offset), page_size))
{
dprintf(CRITICAL, "ERROR: Cannot read boot image signature\n");
}
else
{
/* Verify signature */
auth_kernel_img = image_verify((unsigned char *)image_addr,
(unsigned char *)(image_addr + imagesize_actual),
imagesize_actual,
CRYPTO_AUTH_ALG_SHA256);
}
/* Move kernel and ramdisk to correct address */
memmove((void*) hdr->kernel_addr, (char *)(image_addr + page_size), hdr->kernel_size);
memmove((void*) hdr->ramdisk_addr, (char *)(image_addr + page_size + kernel_actual), hdr->ramdisk_size);
}
else
{
n = ROUND_TO_PAGE(hdr->kernel_size, page_mask);
if (flash_read(ptn, offset, (void *)hdr->kernel_addr, n)) {
dprintf(CRITICAL, "ERROR: Cannot read kernel image\n");
return -1;
}
offset += n;
n = ROUND_TO_PAGE(hdr->ramdisk_size, page_mask);
if (flash_read(ptn, offset, (void *)hdr->ramdisk_addr, n)) {
dprintf(CRITICAL, "ERROR: Cannot read ramdisk image\n");
return -1;
}
offset += n;
}
continue_boot:
dprintf(INFO, "\nkernel @ %x (%d bytes)\n", hdr->kernel_addr,
hdr->kernel_size);
+3
View File
@@ -18,6 +18,9 @@ CFLAGS += -DLK_NO_TIME -DLK_NO_QSORT -DLK_NO_BIO -DLK_NO_HMAC -DLK_NO_ENCODE \
-DLK_NO_STDERR -DLK_NO_ABORT -DLK_NO_PEM -DLK_NO_OAEP -DLK_NO_SSLV23 \
-DLK_NO_RAND -DLK_NO_UNISTD
# TODO: Memory leak using openssl ERR_STATEs need to find root cause
CFLAGS += -DLK_NO_ERR_STATE
# TODO: Should be able to classify these ones
CFLAGS += -DOPENSSL_LK
+17
View File
@@ -708,6 +708,14 @@ void ERR_put_error(int lib, int func, int reason, const char *file,
{
ERR_STATE *es;
/* Stubbing out ERR_get_state due to memleak with
* ERR_remove_thread_state. We don't check these ERR_STATE
* anyways for now.
*/
#ifdef LK_NO_ERR_STATE
return
#endif
#ifdef _OSD_POSIX
/* In the BS2000-OSD POSIX subsystem, the compiler generates
* path names in the form "*POSIX(/etc/passwd)".
@@ -751,6 +759,7 @@ void ERR_clear_error(void)
err_clear(es,i);
}
es->top=es->bottom=0;
ERR_STATE_free(es);
}
@@ -1004,6 +1013,14 @@ void ERR_remove_state(unsigned long pid)
ERR_STATE *ERR_get_state(void)
{
static ERR_STATE fallback;
/* TODO: ERR_remove_thread_state does not clean up
* therefore when using ERR_states the malloc here
* will never get freed and there is a memleak only
* in the case where it fails decryption.
*/
#ifdef LK_NO_ERR_STATE
return NULL;
#endif
ERR_STATE *ret,tmp,*tmpp=NULL;
int i;
CRYPTO_THREADID tid;
+5
View File
@@ -53,6 +53,11 @@ CFLAGS := -O2 -g -fno-builtin -finline -W -Wall -Wno-multichar -Wno-unused-param
ifeq ($(EMMC_BOOT),1)
CFLAGS += -D_EMMC_BOOT=1
endif
ifeq ($(SIGNED_KERNEL),1)
CFLAGS += -D_SIGNED_KERNEL=1
endif
# When the host arch is ARM, ensure stack protection code is not emitted since
# it's not supported by the bootloader's libc
ifneq ($(shell uname -m | grep "arm.*"),)
+8
View File
@@ -60,3 +60,11 @@ __WEAK void uart_clock_init(void)
__WEAK void platform_uninit(void)
{
}
__WEAK int image_verify(unsigned char * image_ptr,
unsigned char * signature_ptr,
unsigned int image_size,
unsigned hash_type)
{
return 0;
}
+122
View File
@@ -0,0 +1,122 @@
/* Copyright (c) 2011, Code Aurora Forum. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
* * Neither the name of Code Aurora Forum, Inc. nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*/
#include <certificate.h>
const char certBuffer [CERTIFICATE_SIZE] ={
0x30, 0x82, 0x02, 0xd0, 0x30, 0x82, 0x01, 0xb8, 0x02, 0x01, 0x05, 0x30, 0x0d,
0x06, 0x09, 0x2a,
0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x2f, 0x31,
0x0b, 0x30, 0x09,
0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x0b, 0x30, 0x09,
0x06, 0x03, 0x55,
0x04, 0x08, 0x0c, 0x02, 0x43, 0x41, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55,
0x04, 0x0a, 0x0c,
0x0a, 0x41, 0x6e, 0x64, 0x72, 0x6f, 0x69, 0x64, 0x20, 0x4c, 0x4b, 0x30, 0x1e,
0x17, 0x0d, 0x31,
0x31, 0x30, 0x38, 0x30, 0x31, 0x31, 0x34, 0x35, 0x35, 0x33, 0x35, 0x5a, 0x17,
0x0d, 0x33, 0x32,
0x30, 0x32, 0x31, 0x32, 0x31, 0x34, 0x35, 0x35, 0x33, 0x35, 0x5a, 0x30, 0x2f,
0x31, 0x0b, 0x30,
0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x0b, 0x30,
0x09, 0x06, 0x03,
0x55, 0x04, 0x08, 0x0c, 0x02, 0x43, 0x41, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03,
0x55, 0x04, 0x0a,
0x0c, 0x0a, 0x41, 0x6e, 0x64, 0x72, 0x6f, 0x69, 0x64, 0x20, 0x4c, 0x4b, 0x30,
0x82, 0x01, 0x20,
0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01,
0x05, 0x00, 0x03,
0x82, 0x01, 0x0d, 0x00, 0x30, 0x82, 0x01, 0x08, 0x02, 0x82, 0x01, 0x01, 0x00,
0xc8, 0x82, 0x09,
0x43, 0x84, 0x33, 0x91, 0xfa, 0xca, 0xa1, 0x43, 0xc1, 0x92, 0xa9, 0x26, 0x0c,
0xe2, 0x15, 0xab,
0x71, 0xfa, 0x85, 0x97, 0x5f, 0xf0, 0xcd, 0x66, 0xeb, 0x7f, 0x0b, 0xc1, 0x01,
0x8e, 0x8e, 0x1b,
0xfa, 0xaa, 0x82, 0x21, 0xd3, 0x1d, 0x3b, 0x0a, 0x91, 0x0e, 0xcd, 0x85, 0xa0,
0x4d, 0xd7, 0xed,
0x27, 0x72, 0xa6, 0xb1, 0x26, 0x8e, 0xe9, 0x5f, 0x57, 0x77, 0x3d, 0x93, 0x79,
0x38, 0xde, 0xac,
0xa1, 0xc9, 0xd1, 0xcc, 0x42, 0x04, 0x53, 0x88, 0x64, 0xac, 0xaa, 0xab, 0xfc,
0xb7, 0xf0, 0x32,
0x2d, 0xb0, 0xf4, 0xe1, 0x35, 0x58, 0xdf, 0x5e, 0x8a, 0x47, 0x28, 0x2b, 0xa9,
0xda, 0x54, 0xd3,
0xbc, 0x0a, 0x12, 0x5f, 0x76, 0x5e, 0x16, 0xab, 0xf5, 0x9d, 0x11, 0x8f, 0x36,
0x99, 0x3a, 0x1c,
0x76, 0x95, 0x31, 0xa9, 0x92, 0x86, 0x81, 0xcc, 0x56, 0x56, 0x52, 0xe2, 0x70,
0xf4, 0xb3, 0x99,
0xe7, 0x2e, 0xdd, 0x9d, 0x33, 0xad, 0x22, 0x8a, 0x10, 0x17, 0x53, 0xf2, 0x6a,
0x85, 0x80, 0xad,
0x14, 0xd3, 0xa2, 0xd3, 0xe2, 0x37, 0x8a, 0x4c, 0xdd, 0xa2, 0xdb, 0x46, 0x32,
0xa9, 0x23, 0x46,
0x1a, 0xd5, 0x86, 0xec, 0x39, 0x98, 0x06, 0xd0, 0x4f, 0xe8, 0x6f, 0x02, 0x90,
0x05, 0x76, 0x3b,
0x8b, 0xfc, 0x86, 0x8d, 0xa1, 0x3d, 0x58, 0x80, 0xc7, 0x9e, 0x53, 0xd0, 0xa2,
0xb8, 0xbb, 0xc7,
0x13, 0x35, 0xcd, 0x6f, 0xc2, 0x07, 0xad, 0xa2, 0xe1, 0x82, 0x12, 0xf1, 0xbc,
0x4f, 0x19, 0x00,
0x0f, 0x9d, 0x9f, 0x9d, 0x01, 0x43, 0x24, 0xac, 0xe6, 0x30, 0x11, 0x38, 0xae,
0xa6, 0xb7, 0x47,
0xb3, 0x71, 0x8b, 0x79, 0x46, 0xd4, 0x3b, 0x7d, 0xf0, 0x6c, 0x84, 0xa2, 0x58,
0xb4, 0xe3, 0x86,
0x8f, 0xb8, 0xfc, 0xf9, 0xcb, 0x1c, 0x30, 0x17, 0x1e, 0x34, 0xc3, 0x98, 0xa3,
0x02, 0x01, 0x03,
0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05,
0x05, 0x00, 0x03,
0x82, 0x01, 0x01, 0x00, 0x21, 0xe0, 0x4c, 0x79, 0x9c, 0x54, 0x81, 0x0b, 0x76,
0xe6, 0x0d, 0x6d,
0x14, 0xba, 0x47, 0x2f, 0xb1, 0x3d, 0xdf, 0x00, 0xbe, 0xa6, 0x0b, 0xb2, 0x6e,
0x7e, 0x1c, 0x8b,
0x4d, 0x77, 0xd3, 0xdb, 0x48, 0x1e, 0xa0, 0x6a, 0x3d, 0x01, 0x63, 0x97, 0xde,
0xfa, 0xdd, 0xc1,
0xf9, 0x4d, 0x22, 0xdf, 0xcf, 0xb1, 0x7c, 0x30, 0x32, 0xd5, 0xe9, 0xb3, 0x72,
0x9f, 0xfe, 0x1d,
0x9a, 0x71, 0x6d, 0x24, 0x54, 0x39, 0xaf, 0xf1, 0x6c, 0x24, 0x0f, 0xfd, 0x08,
0x88, 0x84, 0x4d,
0x2e, 0x7b, 0x11, 0xc2, 0x4d, 0xfd, 0x9b, 0x00, 0x3e, 0x02, 0x9f, 0x23, 0x76,
0x3d, 0xef, 0x6a,
0x66, 0x64, 0x34, 0x3e, 0x3b, 0xa6, 0x31, 0x5f, 0x69, 0xeb, 0xf0, 0xcd, 0x89,
0xc1, 0xe9, 0x1c,
0xe0, 0x8d, 0xed, 0x05, 0x68, 0x5b, 0xc1, 0xe7, 0x79, 0xac, 0x83, 0x29, 0xc9,
0x60, 0x13, 0xe6,
0x66, 0x36, 0xb1, 0xf0, 0x04, 0x0d, 0x88, 0x7c, 0x89, 0xb1, 0xf4, 0xc1, 0xca,
0x5a, 0x25, 0x13,
0xc1, 0xaf, 0x8c, 0x45, 0x1b, 0x59, 0xbe, 0x35, 0xe0, 0xbe, 0x9c, 0x4c, 0xc6,
0xb0, 0x59, 0x27,
0xd9, 0xac, 0x6e, 0xf8, 0x35, 0x0c, 0xf7, 0x8a, 0xcc, 0xba, 0x39, 0x48, 0x6e,
0x04, 0xd9, 0x6d,
0x41, 0x4a, 0x81, 0x32, 0x96, 0x29, 0xc6, 0xe2, 0x20, 0xca, 0xed, 0xc0, 0x44,
0x6c, 0xd3, 0xe9,
0xea, 0x52, 0xa8, 0x1d, 0x5b, 0x9f, 0x84, 0xe8, 0x57, 0xd7, 0x21, 0xa9, 0xa8,
0x0d, 0x9d, 0x05,
0xa4, 0xd2, 0xb2, 0x54, 0xec, 0x07, 0x22, 0x3c, 0x64, 0x54, 0xa4, 0xfd, 0xb0,
0x8d, 0xe4, 0xf7,
0x40, 0xe1, 0x41, 0xdc, 0xf7, 0x98, 0x65, 0x3d, 0x9f, 0xd1, 0x28, 0x23, 0x03,
0x91, 0x6b, 0xab,
0x52, 0x04, 0x3b, 0xe1, 0x4e, 0x64, 0xea, 0x3b, 0xea, 0x6f, 0x30, 0xad, 0x2c,
0x4a, 0x0e, 0xe2,
0x79, 0x9c, 0xd3, 0x83};
+134
View File
@@ -0,0 +1,134 @@
/*
* Copyright (c) 2011, Code Aurora Forum. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
#include <x509.h>
#include <certificate.h>
#include <crypto_hash.h>
#include "image_verify.h"
/*
* Returns -1 if decryption failed otherwise size of plain_text in bytes
*/
static int image_decrypt_signature(unsigned char * signature_ptr,
unsigned char * plain_text){
/*
* Extract Public Key and Decrypt Signature
*/
int ret = -1;
X509 *x509_certificate = NULL;
unsigned char *cert_ptr = certBuffer;
unsigned int cert_size = sizeof(certBuffer);
EVP_PKEY *pub_key = NULL;
RSA* rsa_key = NULL;
/*
* Get Pubkey and Convert the internal EVP_PKEY to RSA internal struct
*/
if ((x509_certificate = d2i_X509(NULL, &cert_ptr, cert_size)) == NULL){
dprintf(CRITICAL,
"ERROR: Image Invalid, X509_Certificate is NULL!\n");
goto cleanup;
}
pub_key = X509_get_pubkey(x509_certificate);
rsa_key = EVP_PKEY_get1_RSA(pub_key);
if (rsa_key == NULL){
dprintf(CRITICAL,
"ERROR: Boot Invalid, RSA_KEY is NULL!\n");
goto cleanup;
}
ret = RSA_public_decrypt(SIGNATURE_SIZE, signature_ptr, plain_text,
rsa_key, RSA_PKCS1_PADDING);
dprintf(SPEW,
"DEBUG openssl: Return of RSA_public_decrypt = %d\n", ret);
cleanup:
if (rsa_key != NULL)
RSA_free(rsa_key);
if (x509_certificate != NULL)
X509_free(x509_certificate);
if (pub_key != NULL)
EVP_PKEY_free(pub_key);
return ret;
}
/*
* Returns 1 when image is signed and authorized.
* Returns 0 when image is unauthorized.
* Expects a pointer to the start of image and pointer to start of sig
*/
int image_verify(unsigned char * image_ptr,
unsigned char * signature_ptr,
unsigned int image_size,
unsigned hash_type){
int ret = -1;
int auth = 0;
unsigned char * plain_text = NULL;
unsigned int digest[8];
unsigned int hash_size;
plain_text = (unsigned char*) calloc(sizeof(char), SIGNATURE_SIZE);
if (plain_text == NULL){
dprintf(CRITICAL, "ERROR: Calloc failed during verification\n");
goto cleanup;
}
ret = image_decrypt_signature(signature_ptr, plain_text);
if (ret == -1){
dprintf(CRITICAL, "ERROR: Image Invalid! Decryption failed!\n");
goto cleanup;
}
/*
* Calculate hash of image for comparison
*/
hash_size = (hash_type == CRYPTO_AUTH_ALG_SHA256) ?
SHA256_SIZE : SHA1_SIZE;
hash_find(image_ptr, image_size,
(unsigned char*)&digest, hash_type);
if(memcmp(plain_text, digest, hash_size) != 0)
{
dprintf(CRITICAL,
"ERROR: Image Invalid! Please use another image!\n");
ret = -1;
goto cleanup;
}
else
{
/* Authorized image */
auth = 1;
}
/* Cleanup after complete usage of openssl - cached data and objects */
cleanup:
if (plain_text != NULL)
free(plain_text);
EVP_cleanup();
CRYPTO_cleanup_all_ex_data();
ERR_remove_thread_state(NULL);
return auth;
}
+31
View File
@@ -0,0 +1,31 @@
/* Copyright (c) 2011, Code Aurora Forum. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
* * Neither the name of Code Aurora Forum, Inc. nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*/
#define CERTIFICATE_SIZE 724
extern const char certBuffer [CERTIFICATE_SIZE];
@@ -0,0 +1,41 @@
/*
* Copyright (c) 2011, Code Aurora Forum. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
#ifndef __IMAGE_VERIFY_H
#define __IMAGE_VERIFY_H
#define SHA1_SIZE 16
#define SHA256_SIZE 32
/* For keys of length 2048 bits */
#define SIGNATURE_SIZE 256
static int image_decrypt_signature(unsigned char * signature_ptr,
unsigned char * plain_text);
int image_verify(unsigned char * image_ptr,
unsigned char * signature_ptr,
unsigned int image_size,
unsigned hash_type);
#endif
+9 -3
View File
@@ -28,7 +28,9 @@ ifeq ($(PLATFORM),msm8x60)
$(LOCAL_DIR)/lcdc.o \
$(LOCAL_DIR)/mddi.o \
$(LOCAL_DIR)/qgic.o \
$(LOCAL_DIR)/mdp4.o
$(LOCAL_DIR)/mdp4.o \
$(LOCAL_DIR)/certificate.o \
$(LOCAL_DIR)/image_verify.o
endif
ifeq ($(PLATFORM),apq8064)
@@ -43,7 +45,9 @@ ifeq ($(PLATFORM),msm8960)
$(LOCAL_DIR)/qgic.o \
$(LOCAL_DIR)/mdp4.o \
$(LOCAL_DIR)/crypto4_eng.o \
$(LOCAL_DIR)/crypto_hash.o
$(LOCAL_DIR)/crypto_hash.o \
$(LOCAL_DIR)/certificate.o \
$(LOCAL_DIR)/image_verify.o
endif
ifeq ($(PLATFORM),msm7x27a)
@@ -67,5 +71,7 @@ ifeq ($(PLATFORM),msm7x30)
$(LOCAL_DIR)/uart.o \
$(LOCAL_DIR)/proc_comm.o \
$(LOCAL_DIR)/lcdc.o \
$(LOCAL_DIR)/mddi.o
$(LOCAL_DIR)/mddi.o \
$(LOCAL_DIR)/certificate.o \
$(LOCAL_DIR)/image_verify.o
endif
+9
View File
@@ -91,3 +91,12 @@ __WEAK int emmc_recovery_init(void)
{
return 0;
}
__WEAK bool target_use_signed_kernel(void)
{
#if _SIGNED_KERNEL
return 1;
#else
return 0;
#endif
}