summaryrefslogtreecommitdiffstats
path: root/src/usr/secureboot/base
diff options
context:
space:
mode:
authorStephen Cprek <smcprek@us.ibm.com>2017-04-10 16:32:00 -0500
committerWilliam G. Hoffa <wghoffa@us.ibm.com>2017-05-01 17:53:46 -0400
commit863b78e70f9b11e9948c380e1d5cd5790d8d9962 (patch)
tree37e0685a747c34d2bc4e58018eb2ac7f1910072a /src/usr/secureboot/base
parent142a25c1a3453d0cc5bac4a93a2765e60a281d2d (diff)
downloadtalos-hostboot-863b78e70f9b11e9948c380e1d5cd5790d8d9962.tar.gz
talos-hostboot-863b78e70f9b11e9948c380e1d5cd5790d8d9962.zip
Port P8 HBI page verification functionality
Verify HBI pages via its securely signed hash page table Change-Id: I86d29ee393c19aa0d9c5270b0b6c561a9fc4ab51 RTC: 167668 Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/39071 Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com> Reviewed-by: Nicholas E. Bofferding <bofferdn@us.ibm.com> Tested-by: Jenkins OP Build CI <op-jenkins+hostboot@us.ibm.com> Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com> Reviewed-by: Michael Baiocchi <mbaiocch@us.ibm.com> Reviewed-by: William G. Hoffa <wghoffa@us.ibm.com>
Diffstat (limited to 'src/usr/secureboot/base')
-rw-r--r--src/usr/secureboot/base/test/makefile3
-rw-r--r--src/usr/secureboot/base/test/securerommgrtest.H232
2 files changed, 228 insertions, 7 deletions
diff --git a/src/usr/secureboot/base/test/makefile b/src/usr/secureboot/base/test/makefile
index 293daed2e..3e2f54266 100644
--- a/src/usr/secureboot/base/test/makefile
+++ b/src/usr/secureboot/base/test/makefile
@@ -5,7 +5,7 @@
#
# OpenPOWER HostBoot Project
#
-# Contributors Listed Below - COPYRIGHT 2013,2016
+# Contributors Listed Below - COPYRIGHT 2013,2017
# [+] International Business Machines Corp.
#
#
@@ -28,6 +28,7 @@ MODULE = testsecureboot
TESTS = *.H
BINARY_FILES = $(IMGDIR)/secureboot_signed_container:7cff7a85f0db014016a61eac856c3775cd266240
+BINARY_FILES += $(IMGDIR)/secureboot_hash_page_table_container:16ccaff1e3c94cf17c2858e3a917dd9d64528848
include ${ROOTPATH}/config.mk
diff --git a/src/usr/secureboot/base/test/securerommgrtest.H b/src/usr/secureboot/base/test/securerommgrtest.H
index 4ef0db2a6..a10bd853c 100644
--- a/src/usr/secureboot/base/test/securerommgrtest.H
+++ b/src/usr/secureboot/base/test/securerommgrtest.H
@@ -40,6 +40,11 @@
#include "../../common/securetrace.H"
+#include <secureboot/containerheader.H>
+#include "../../../vfs/vfsrp.H"
+#include <sys/vfs.h>
+#include <kernel/console.H>
+
// Quick change for unit testing
//#define TRACUCOMP(args...) TRACFCOMP(args)
#define TRACUCOMP(args...)
@@ -76,6 +81,23 @@ const sha2_hash_t hw_key_hash =
0xfb,0x70,0x85,0x35,0x1d,0x01,0xd6,0xd1
};
+
+// secureboot_signed_container payload text size
+size_t payload_text_size = 0x200;
+
+// secureboot_signed_container payload text hash
+const SHA512_t payload_text_hash =
+{
+ 0xff,0xc3,0x93,0xb7,0x71,0xc4,0x09,0xd4,
+ 0x4d,0x8f,0xef,0xfa,0xcf,0xeb,0x7a,0x09,
+ 0x11,0x7c,0x75,0x3f,0x62,0x27,0x34,0x70,
+ 0xc2,0x93,0x24,0x04,0xea,0xd1,0x51,0xd5,
+ 0xba,0xe5,0x2e,0xbd,0x49,0x30,0x10,0x61,
+ 0xee,0x53,0x7b,0x7f,0xd9,0x64,0xac,0x84,
+ 0x97,0x21,0x64,0xa3,0x09,0x6c,0x87,0xc4,
+ 0x65,0x3e,0x8e,0xcb,0xfe,0x8f,0x4a,0xc5
+};
+
/**********************************************************************/
/* End of UTILITY FUNCTIONS */
/**********************************************************************/
@@ -91,7 +113,7 @@ class SecureRomManagerTest : public CxxTest::TestSuite
{
TRACUCOMP(g_trac_secure,ENTER_MRK"SecureRomManagerTest::test_verify>");
- errlHndl_t l_errl = NULL;
+ errlHndl_t l_errl = nullptr;
/*******************************************************************/
/* Load "secureboot_signed_container" from PNOR to use for verification */
@@ -99,7 +121,7 @@ class SecureRomManagerTest : public CxxTest::TestSuite
// Signed file variables
const char * signedFile_name = "secureboot_signed_container";
- void * signedFile_pageAddr = NULL;
+ void * signedFile_pageAddr = nullptr;
size_t signedFile_size = 0;
uint64_t signedFile_vaddr = 0;
@@ -134,7 +156,7 @@ class SecureRomManagerTest : public CxxTest::TestSuite
/*******************************************************************/
/* Unload "secureboot_signed_container" from memory */
/*******************************************************************/
- if ( signedFile_pageAddr != NULL )
+ if ( signedFile_pageAddr != nullptr )
{
unloadSignedFile( signedFile_pageAddr, signedFile_size);
}
@@ -177,6 +199,204 @@ class SecureRomManagerTest : public CxxTest::TestSuite
TRACUCOMP(g_trac_secure,EXIT_MRK"SecureRomManagerTest::test_sha512");
}
+
+ /**
+ * @brief Secure ROM Test - Parse a Signed Container and check if the values
+ * match what's expected for secureboot_signed_container
+ */
+ void test_parse_container_header(void)
+ {
+ TRACFCOMP(g_trac_secure,ENTER_MRK"SecureRomManagerTest::test_parse_container_header>");
+
+ errlHndl_t l_errl = nullptr;
+
+ /*******************************************************************/
+ /* Load "secureboot_signed_container" from PNOR to use for verification */
+ /*******************************************************************/
+
+ // Signed file variables
+ const char * signedFile_name = "secureboot_signed_container";
+ void * signedFile_pageAddr = nullptr;
+ size_t signedFile_size = 0;
+ uint64_t signedFile_vaddr = 0;
+
+ do{
+
+ // Call utility function
+ l_errl = loadSignedFile( signedFile_name,
+ signedFile_pageAddr,
+ signedFile_size,
+ signedFile_vaddr);
+
+ if (l_errl)
+ {
+ TS_FAIL("SecureRomManagerTest::test_parse_container_header: loadSignedFile() Failed");
+ errlCommit(l_errl, SECURE_COMP_ID);
+ break;
+ }
+
+ TRACUCOMP(g_trac_secure, "SecureRomManagerTest::test_parse_container_header: "
+ "signedFile info: addr = %p, size=0x%x",
+ signedFile_pageAddr, signedFile_size);
+
+ /*******************************************************************/
+ /* Parse Secure Container Header */
+ /*******************************************************************/
+ SECUREBOOT::ContainerHeader l_conHdr(signedFile_pageAddr);
+
+ // Check if container header seems valid
+ if (!l_conHdr.iv_isValid)
+ {
+ TS_FAIL("SecureRomManagerTest::test_parse_container_header: Header is not valid");
+ break;
+ }
+ // Check a few of the values that are parsed out.
+ if(l_conHdr.payloadTextSize() != payload_text_size)
+ {
+ TS_FAIL("SecureRomManagerTest::test_parse_container_header: Incorrect payload text size");
+ break;
+ }
+
+ if (memcmp(l_conHdr.payloadTextHash(), payload_text_hash,
+ sizeof(SHA512_t) != 0))
+ {
+ TS_FAIL("SecureRomManagerTest::test_parse_container_header: Incorrect payload text hash");
+ break;
+ }
+
+ } while(0);
+ /*******************************************************************/
+ /* Unload "secureboot_signed_container" from memory */
+ /*******************************************************************/
+ if ( signedFile_pageAddr != nullptr )
+ {
+ unloadSignedFile( signedFile_pageAddr, signedFile_size);
+ }
+
+ TRACFCOMP(g_trac_secure,EXIT_MRK"SecureRomManagerTest::test_parse_container_header");
+ }
+
+ /**
+ * @brief Secure ROM Test - Verification of pages via a hash page table at
+ * the beginning of a payload text section.
+ */
+ void test_hash_page_table_verify(void)
+ {
+ TRACFCOMP(g_trac_secure,ENTER_MRK"SecureRomManagerTest::test_hash_page_table_verify>");
+
+ errlHndl_t l_errl = nullptr;
+ // secureboot_hash_page_table_container has 5 pages of data
+ const uint64_t TEST_PAGE_NUM = 2;
+
+ // Signed file variables
+ const char * signedFile_name = "secureboot_hash_page_table_container";
+ void * signedFile_pageAddr = nullptr;
+ size_t signedFile_size = 0;
+ uint64_t signedFile_vaddr = 0;
+
+ uint8_t* l_originPage = new uint8_t[PAGESIZE]();
+
+ do{
+
+ // Call utility function
+ l_errl = loadSignedFile( signedFile_name,
+ signedFile_pageAddr,
+ signedFile_size,
+ signedFile_vaddr);
+
+ if (l_errl)
+ {
+ TS_FAIL("SecureRomManagerTest::test_hash_page_table_verify: loadSignedFile() Failed");
+ errlCommit(l_errl, SECURE_COMP_ID);
+ break;
+ }
+
+ TRACUCOMP(g_trac_secure, "SecureRomManagerTest::test_hash_page_table_verify: "
+ "signedFile info: addr = %p, size=0x%x",
+ signedFile_pageAddr, signedFile_size);
+
+ /*******************************************************************/
+ /* Parse Secure Container Header */
+ /*******************************************************************/
+
+ SECUREBOOT::ContainerHeader l_conHdr(signedFile_pageAddr);
+ size_t l_payloadTextSize = l_conHdr.payloadTextSize();
+ TRACUCOMP(g_trac_secure, "SecureRomManagerTest::test_hash_page_table_verify ContainerHeader payload_size = 0x%X",
+ l_payloadTextSize);
+
+ /*******************************************************************/
+ /* Test Verifying a correct page */
+ /*******************************************************************/
+
+ // Get base offset of test container with respect to the HBI section
+ signedFile_vaddr-=VFS_EXTENDED_MODULE_VADDR;
+ uint64_t l_hashPageTableOffset = signedFile_vaddr + PAGE_SIZE;
+ uint64_t l_baseOffset = signedFile_vaddr
+ + PAGE_SIZE
+ + l_payloadTextSize;
+
+ // Get offset of TEST_PAGE_NUM
+ uint64_t l_vaddr = l_baseOffset
+ + (TEST_PAGE_NUM * PAGESIZE);
+
+ // Verify a page
+ TRACUCOMP(g_trac_secure, "SecureRomManagerTest::test_hash_page_table_verify vaddr = 0x%X, base offset = 0x%X, hash page table offset = 0x%X",
+ l_vaddr, l_baseOffset, l_hashPageTableOffset);
+ l_errl = VFS::VfsRp::getInstance().verify_page(l_vaddr,
+ l_baseOffset,
+ l_hashPageTableOffset);
+ // Failed to pass secureboot verification
+ if (l_errl)
+ {
+ TS_FAIL("SecureRomManagerTest::test_hash_page_table_verify failed");
+ errlCommit(l_errl, SECURE_COMP_ID);
+ break;
+ }
+
+ /*******************************************************************/
+ /* Test verifying a corrupt page */
+ /*******************************************************************/
+
+ // Calculate pnor vaddr and read original page so we can run test case
+ // in both secure and unsecure mode.
+ uint64_t l_pnorVaddr = VFS::VfsRp::getInstance().iv_pnor_vaddr
+ + l_vaddr;
+ memcpy(l_originPage, reinterpret_cast<uint8_t*>(l_pnorVaddr), PAGESIZE);
+
+ // Corrupt page
+ uint8_t l_corruptByte = 0xFF;
+ memcpy(reinterpret_cast<uint8_t*>(l_pnorVaddr), &l_corruptByte, sizeof(uint8_t));
+ l_errl = VFS::VfsRp::getInstance().verify_page(l_vaddr,
+ l_baseOffset,
+ l_hashPageTableOffset);
+
+ // Fix page back up
+ memcpy(reinterpret_cast<uint8_t*>(l_pnorVaddr), l_originPage, PAGESIZE);
+
+ // Failed to catch secureboot verification failure
+ if (!l_errl)
+ {
+ TS_FAIL("SecureRomManagerTest::test_hash_page_table_verify did not catch verification error");
+ break;
+ }
+ delete l_errl;
+ l_errl = nullptr;
+
+ } while(0);
+
+ if ( signedFile_pageAddr != nullptr )
+ {
+ unloadSignedFile( signedFile_pageAddr, signedFile_size);
+ }
+ if (l_originPage != nullptr)
+ {
+ delete [] l_originPage;
+ l_originPage = nullptr;
+ }
+
+ TRACFCOMP(g_trac_secure,EXIT_MRK"SecureRomManagerTest::test_hash_page_table_verify");
+ }
+
};
/**********************************************************************/
@@ -190,8 +410,8 @@ errlHndl_t loadSignedFile( const char * i_signedFile_name,
uint64_t & o_signedFile_virtAddr)
{
- errlHndl_t l_errl = NULL;
- const char * l_signedFile_virtAddr = NULL;
+ errlHndl_t l_errl = nullptr;
+ const char * l_signedFile_virtAddr = nullptr;
/*******************************************************************/
/* Load file from PNOR to use for verification */
@@ -251,7 +471,7 @@ void unloadSignedFile( void * & io_signedFile_pageAddr,
PageManager::freePage(io_signedFile_pageAddr, l_num_pages);
// Reset pageAddr pointer
- io_signedFile_pageAddr = NULL;
+ io_signedFile_pageAddr = nullptr;
TRACUCOMP(g_trac_secure, "unloadSignedFile()> "
"Info: sF_pA=%p, size=0x%x (pages=%d)",
OpenPOWER on IntegriCloud