mirror of
https://github.com/Dasharo/skiboot.git
synced 2026-03-06 14:50:44 -08:00
49496485fe
SPDX makes it a simpler diff. I have audited the commit history of each file to ensure that they are exclusively authored by IBM and thus we have the right to relicense. The motivation behind this is twofold: 1) We want to enable experiments with coreboot, which is GPLv2 licensed 2) An upcoming firmware component wants to incorporate code from skiboot and code from the Linux kernel, which is GPLv2 licensed. I have gone through the IBM internal way of gaining approval for this. The following files are not exclusively authored by IBM, so are *not* included in this update (I will be seeking approval from contributors): core/direct-controls.c core/flash.c core/pcie-slot.c external/common/arch_flash_unknown.c external/common/rules.mk external/gard/Makefile external/gard/rules.mk external/opal-prd/Makefile external/pflash/Makefile external/xscom-utils/Makefile hdata/vpd.c hw/dts.c hw/ipmi/ipmi-watchdog.c hw/phb4.c include/cpu.h include/phb4.h include/platform.h libflash/libffs.c libstb/mbedtls/sha512.c libstb/mbedtls/sha512.h platforms/astbmc/barreleye.c platforms/astbmc/garrison.c platforms/astbmc/mihawk.c platforms/astbmc/nicole.c platforms/astbmc/p8dnu.c platforms/astbmc/p8dtu.c platforms/astbmc/p9dsu.c platforms/astbmc/vesnin.c platforms/rhesus/ec/config.h platforms/rhesus/ec/gpio.h platforms/rhesus/gpio.c platforms/rhesus/rhesus.c platforms/astbmc/talos.c platforms/astbmc/romulus.c Signed-off-by: Stewart Smith <stewart@linux.ibm.com> [oliver: fixed up the drift] Signed-off-by: Oliver O'Halloran <oohall@gmail.com>
83 lines
1.8 KiB
C
83 lines
1.8 KiB
C
// SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
|
|
/* Copyright 2013-2016 IBM Corp. */
|
|
|
|
#include <skiboot.h>
|
|
#include "container.h"
|
|
|
|
bool stb_is_container(const void *buf, size_t size)
|
|
{
|
|
ROM_container_raw *c;
|
|
|
|
c = (ROM_container_raw*) buf;
|
|
if (!buf || size < SECURE_BOOT_HEADERS_SIZE)
|
|
return false;
|
|
if (be32_to_cpu(c->magic_number) != ROM_MAGIC_NUMBER )
|
|
return false;
|
|
return true;
|
|
}
|
|
|
|
uint32_t stb_payload_magic(const void *buf, size_t size)
|
|
{
|
|
uint8_t *p;
|
|
if (!stb_is_container(buf, size))
|
|
return 0;
|
|
p = (uint8_t*) buf;
|
|
return be32_to_cpu(*(be32*)(p+SECURE_BOOT_HEADERS_SIZE));
|
|
}
|
|
|
|
uint64_t stb_sw_payload_size(const void *buf, size_t size)
|
|
{
|
|
struct parsed_stb_container c;
|
|
if (!stb_is_container(buf, size))
|
|
return 0;
|
|
if (parse_stb_container(buf, size, &c) != 0)
|
|
return 0;
|
|
return be64_to_cpu(c.sh->payload_size);
|
|
}
|
|
|
|
int parse_stb_container(const void* data, size_t len, struct parsed_stb_container *c)
|
|
{
|
|
const size_t prefix_data_min_size = 3 * (EC_COORDBYTES * 2);
|
|
c->buf = data;
|
|
c->bufsz = len;
|
|
c->c = data;
|
|
c->ph = data += sizeof(ROM_container_raw);
|
|
c->pd = data += sizeof(ROM_prefix_header_raw) + (c->ph->ecid_count * ECID_SIZE);
|
|
c->sh = data += prefix_data_min_size + c->ph->sw_key_count * (EC_COORDBYTES * 2);
|
|
c->ssig = data += sizeof(ROM_sw_header_raw) +
|
|
c->sh->ecid_count * ECID_SIZE;
|
|
|
|
return 0;
|
|
}
|
|
|
|
const uint8_t* stb_sw_payload_hash(const void *buf, size_t size)
|
|
{
|
|
struct parsed_stb_container c;
|
|
|
|
if (!stb_is_container(buf, size))
|
|
return NULL;
|
|
if (parse_stb_container(buf, size, &c) != 0)
|
|
return NULL;
|
|
|
|
return c.sh->payload_hash;
|
|
}
|
|
|
|
|
|
void stb_print_data(const void* data, size_t len)
|
|
{
|
|
char hash[1+SHA512_DIGEST_LENGTH*2];
|
|
char *h = hash;
|
|
char *d = (char*)data;
|
|
|
|
assert(len <= SHA512_DIGEST_LENGTH);
|
|
|
|
while(len) {
|
|
snprintf(h, 3, "%02x", *d);
|
|
h+=2;
|
|
d++;
|
|
len--;
|
|
}
|
|
*h='\0';
|
|
prlog(PR_NOTICE, "%s\n", hash);
|
|
}
|