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:
1 parent
a10a99cc81
commit
cd98d4709d
12 files changed
+515
-32
No files matched your search
+8
-3
@@ -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
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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.*"),)
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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};
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
}
|
||||
Reference in new issue
Block a user