1*024c4948STamas Ban /* 2*024c4948STamas Ban * Copyright (c) 2022-2023, Arm Limited. All rights reserved. 3*024c4948STamas Ban * 4*024c4948STamas Ban * SPDX-License-Identifier: BSD-3-Clause 5*024c4948STamas Ban */ 6*024c4948STamas Ban #include <assert.h> 7*024c4948STamas Ban #include <stdint.h> 8*024c4948STamas Ban #include <string.h> 9*024c4948STamas Ban 10*024c4948STamas Ban #include <common/debug.h> 11*024c4948STamas Ban #include <drivers/auth/crypto_mod.h> 12*024c4948STamas Ban #include <drivers/measured_boot/rss/rss_measured_boot.h> 13*024c4948STamas Ban #include <lib/psa/measured_boot.h> 14*024c4948STamas Ban #include <psa/crypto_types.h> 15*024c4948STamas Ban #include <psa/crypto_values.h> 16*024c4948STamas Ban #include <psa/error.h> 17*024c4948STamas Ban 18*024c4948STamas Ban #define MBOOT_ALG_SHA512 0 19*024c4948STamas Ban #define MBOOT_ALG_SHA384 1 20*024c4948STamas Ban #define MBOOT_ALG_SHA256 2 21*024c4948STamas Ban 22*024c4948STamas Ban #if MBOOT_ALG_ID == MBOOT_ALG_SHA512 23*024c4948STamas Ban #define CRYPTO_MD_ID CRYPTO_MD_SHA512 24*024c4948STamas Ban #define PSA_CRYPTO_MD_ID PSA_ALG_SHA_512 25*024c4948STamas Ban #elif MBOOT_ALG_ID == MBOOT_ALG_SHA384 26*024c4948STamas Ban #define CRYPTO_MD_ID CRYPTO_MD_SHA384 27*024c4948STamas Ban #define PSA_CRYPTO_MD_ID PSA_ALG_SHA_384 28*024c4948STamas Ban #elif MBOOT_ALG_ID == MBOOT_ALG_SHA256 29*024c4948STamas Ban #define CRYPTO_MD_ID CRYPTO_MD_SHA256 30*024c4948STamas Ban #define PSA_CRYPTO_MD_ID PSA_ALG_SHA_256 31*024c4948STamas Ban #else 32*024c4948STamas Ban # error Invalid Measured Boot algorithm. 33*024c4948STamas Ban #endif /* MBOOT_ALG_ID */ 34*024c4948STamas Ban 35*024c4948STamas Ban #if ENABLE_ASSERTIONS 36*024c4948STamas Ban static bool null_arr(const uint8_t *signer_id, size_t signer_id_size) 37*024c4948STamas Ban { 38*024c4948STamas Ban for (size_t i = 0U; i < signer_id_size; i++) { 39*024c4948STamas Ban if (signer_id[i] != 0U) { 40*024c4948STamas Ban return false; 41*024c4948STamas Ban } 42*024c4948STamas Ban } 43*024c4948STamas Ban 44*024c4948STamas Ban return true; 45*024c4948STamas Ban } 46*024c4948STamas Ban #endif /* ENABLE_ASSERTIONS */ 47*024c4948STamas Ban 48*024c4948STamas Ban /* Functions' declarations */ 49*024c4948STamas Ban void rss_measured_boot_init(struct rss_mboot_metadata *metadata_ptr) 50*024c4948STamas Ban { 51*024c4948STamas Ban assert(metadata_ptr != NULL); 52*024c4948STamas Ban 53*024c4948STamas Ban /* Init the non-const members of the metadata structure */ 54*024c4948STamas Ban while (metadata_ptr->id != RSS_MBOOT_INVALID_ID) { 55*024c4948STamas Ban assert(null_arr(metadata_ptr->signer_id, MBOOT_DIGEST_SIZE)); 56*024c4948STamas Ban metadata_ptr->sw_type_size = 57*024c4948STamas Ban strlen((const char *)&metadata_ptr->sw_type) + 1; 58*024c4948STamas Ban metadata_ptr++; 59*024c4948STamas Ban } 60*024c4948STamas Ban } 61*024c4948STamas Ban 62*024c4948STamas Ban int rss_mboot_measure_and_record(struct rss_mboot_metadata *metadata_ptr, 63*024c4948STamas Ban uintptr_t data_base, uint32_t data_size, 64*024c4948STamas Ban uint32_t data_id) 65*024c4948STamas Ban { 66*024c4948STamas Ban unsigned char hash_data[CRYPTO_MD_MAX_SIZE]; 67*024c4948STamas Ban int rc; 68*024c4948STamas Ban psa_status_t ret; 69*024c4948STamas Ban 70*024c4948STamas Ban assert(metadata_ptr != NULL); 71*024c4948STamas Ban 72*024c4948STamas Ban /* Get the metadata associated with this image. */ 73*024c4948STamas Ban while ((metadata_ptr->id != RSS_MBOOT_INVALID_ID) && 74*024c4948STamas Ban (metadata_ptr->id != data_id)) { 75*024c4948STamas Ban metadata_ptr++; 76*024c4948STamas Ban } 77*024c4948STamas Ban 78*024c4948STamas Ban /* If image is not present in metadata array then skip */ 79*024c4948STamas Ban if (metadata_ptr->id == RSS_MBOOT_INVALID_ID) { 80*024c4948STamas Ban return 0; 81*024c4948STamas Ban } 82*024c4948STamas Ban 83*024c4948STamas Ban /* Calculate hash */ 84*024c4948STamas Ban rc = crypto_mod_calc_hash(CRYPTO_MD_ID, 85*024c4948STamas Ban (void *)data_base, data_size, hash_data); 86*024c4948STamas Ban if (rc != 0) { 87*024c4948STamas Ban return rc; 88*024c4948STamas Ban } 89*024c4948STamas Ban 90*024c4948STamas Ban ret = rss_measured_boot_extend_measurement( 91*024c4948STamas Ban metadata_ptr->slot, 92*024c4948STamas Ban metadata_ptr->signer_id, 93*024c4948STamas Ban metadata_ptr->signer_id_size, 94*024c4948STamas Ban metadata_ptr->version, 95*024c4948STamas Ban metadata_ptr->version_size, 96*024c4948STamas Ban PSA_CRYPTO_MD_ID, 97*024c4948STamas Ban metadata_ptr->sw_type, 98*024c4948STamas Ban metadata_ptr->sw_type_size, 99*024c4948STamas Ban hash_data, 100*024c4948STamas Ban MBOOT_DIGEST_SIZE, 101*024c4948STamas Ban metadata_ptr->lock_measurement); 102*024c4948STamas Ban if (ret != PSA_SUCCESS) { 103*024c4948STamas Ban return ret; 104*024c4948STamas Ban } 105*024c4948STamas Ban 106*024c4948STamas Ban return 0; 107*024c4948STamas Ban } 108*024c4948STamas Ban 109*024c4948STamas Ban int rss_mboot_set_signer_id(struct rss_mboot_metadata *metadata_ptr, 110*024c4948STamas Ban const void *pk_oid, 111*024c4948STamas Ban const void *pk_ptr, 112*024c4948STamas Ban size_t pk_len) 113*024c4948STamas Ban { 114*024c4948STamas Ban unsigned char hash_data[CRYPTO_MD_MAX_SIZE]; 115*024c4948STamas Ban int rc; 116*024c4948STamas Ban bool hash_calc_done = false; 117*024c4948STamas Ban 118*024c4948STamas Ban assert(metadata_ptr != NULL); 119*024c4948STamas Ban 120*024c4948STamas Ban /* 121*024c4948STamas Ban * Do an exhaustive search over the platform metadata to find 122*024c4948STamas Ban * all images whose key OID matches the one passed in argument. 123*024c4948STamas Ban * 124*024c4948STamas Ban * Note that it is not an error if do not get any matches. 125*024c4948STamas Ban * The platform may decide not to measure all of the images 126*024c4948STamas Ban * in the system. 127*024c4948STamas Ban */ 128*024c4948STamas Ban while (metadata_ptr->id != RSS_MBOOT_INVALID_ID) { 129*024c4948STamas Ban /* Get the metadata associated with this key-oid */ 130*024c4948STamas Ban if (metadata_ptr->pk_oid == pk_oid) { 131*024c4948STamas Ban if (hash_calc_done == false) { 132*024c4948STamas Ban /* Calculate public key hash */ 133*024c4948STamas Ban rc = crypto_mod_calc_hash(CRYPTO_MD_ID, 134*024c4948STamas Ban (void *)pk_ptr, 135*024c4948STamas Ban pk_len, hash_data); 136*024c4948STamas Ban if (rc != 0) { 137*024c4948STamas Ban return rc; 138*024c4948STamas Ban } 139*024c4948STamas Ban 140*024c4948STamas Ban hash_calc_done = true; 141*024c4948STamas Ban } 142*024c4948STamas Ban 143*024c4948STamas Ban /* 144*024c4948STamas Ban * Fill the signer-ID field with the newly/already 145*024c4948STamas Ban * computed hash of the public key and update its 146*024c4948STamas Ban * signer ID size field with compile-time decided 147*024c4948STamas Ban * digest size. 148*024c4948STamas Ban */ 149*024c4948STamas Ban (void)memcpy(metadata_ptr->signer_id, 150*024c4948STamas Ban hash_data, 151*024c4948STamas Ban MBOOT_DIGEST_SIZE); 152*024c4948STamas Ban metadata_ptr->signer_id_size = MBOOT_DIGEST_SIZE; 153*024c4948STamas Ban } 154*024c4948STamas Ban 155*024c4948STamas Ban metadata_ptr++; 156*024c4948STamas Ban } 157*024c4948STamas Ban 158*024c4948STamas Ban return 0; 159*024c4948STamas Ban } 160