Branch data Line data Source code
1 : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later 2 : : /* Copyright 2013-2016 IBM Corp. */ 3 : : 4 : : #include <skiboot.h> 5 : : #include "container.h" 6 : : 7 : 17 : bool stb_is_container(const void *buf, size_t size) 8 : : { 9 : : ROM_container_raw *c; 10 : : 11 : 17 : c = (ROM_container_raw*) buf; 12 : 17 : if (!buf || size < SECURE_BOOT_HEADERS_SIZE) 13 : 6 : return false; 14 : 11 : if (be32_to_cpu(c->magic_number) != ROM_MAGIC_NUMBER ) 15 : 10 : return false; 16 : 1 : return true; 17 : : } 18 : : 19 : 0 : uint32_t stb_payload_magic(const void *buf, size_t size) 20 : : { 21 : : uint8_t *p; 22 : 0 : if (!stb_is_container(buf, size)) 23 : 0 : return 0; 24 : 0 : p = (uint8_t*) buf; 25 : 0 : return be32_to_cpu(*(be32*)(p+SECURE_BOOT_HEADERS_SIZE)); 26 : : } 27 : : 28 : 0 : uint64_t stb_sw_payload_size(const void *buf, size_t size) 29 : : { 30 : : struct parsed_stb_container c; 31 : 0 : if (!stb_is_container(buf, size)) 32 : 0 : return 0; 33 : 0 : if (parse_stb_container(buf, size, &c) != 0) 34 : 0 : return 0; 35 : 0 : return be64_to_cpu(c.sh->payload_size); 36 : : } 37 : : 38 : 0 : int parse_stb_container(const void* data, size_t len, struct parsed_stb_container *c) 39 : : { 40 : 0 : const size_t prefix_data_min_size = 3 * (EC_COORDBYTES * 2); 41 : 0 : c->buf = data; 42 : 0 : c->bufsz = len; 43 : 0 : c->c = data; 44 : 0 : c->ph = data += sizeof(ROM_container_raw); 45 : 0 : c->pd = data += sizeof(ROM_prefix_header_raw) + (c->ph->ecid_count * ECID_SIZE); 46 : 0 : c->sh = data += prefix_data_min_size + c->ph->sw_key_count * (EC_COORDBYTES * 2); 47 : 0 : c->ssig = data += sizeof(ROM_sw_header_raw) + 48 : 0 : c->sh->ecid_count * ECID_SIZE; 49 : : 50 : 0 : return 0; 51 : : } 52 : : 53 : 0 : const uint8_t* stb_sw_payload_hash(const void *buf, size_t size) 54 : : { 55 : : struct parsed_stb_container c; 56 : : 57 : 0 : if (!stb_is_container(buf, size)) 58 : 0 : return NULL; 59 : 0 : if (parse_stb_container(buf, size, &c) != 0) 60 : 0 : return NULL; 61 : : 62 : 0 : return c.sh->payload_hash; 63 : : } 64 : : 65 : : 66 : 0 : void stb_print_data(const void* data, size_t len) 67 : : { 68 : : char hash[1+SHA512_DIGEST_LENGTH*2]; 69 : 0 : char *h = hash; 70 : 0 : char *d = (char*)data; 71 : : 72 : 0 : assert(len <= SHA512_DIGEST_LENGTH); 73 : : 74 : 0 : while(len) { 75 : 0 : snprintf(h, 3, "%02x", *d); 76 : 0 : h+=2; 77 : 0 : d++; 78 : 0 : len--; 79 : : } 80 : 0 : *h='\0'; 81 : 0 : prlog(PR_NOTICE, "%s\n", hash); 82 : 0 : }