32#ifdef RA8_ENABLE_ROOT_OF_TRUST
47static const char*
s_tag =
"ROT";
77 0x04U, 0xC8U, 0xDCU, 0xA2U, 0xF2U, 0x02U, 0x50U, 0x15U, 0xF2U, 0xFEU, 0x39U, 0xD1U, 0xBDU,
78 0x9AU, 0xB9U, 0xAFU, 0x14U, 0x6AU, 0x76U, 0xA6U, 0x26U, 0x67U, 0x1DU, 0xE7U, 0xFDU, 0xDAU,
79 0x53U, 0x11U, 0xF6U, 0xEAU, 0xC5U, 0x85U, 0xE6U, 0x8EU, 0x53U, 0x0DU, 0x1EU, 0x52U, 0x45U,
80 0xBBU, 0x37U, 0x96U, 0xA4U, 0xF1U, 0x8CU, 0xFAU, 0x83U, 0x22U, 0x43U, 0x0BU, 0xAEU, 0x74U,
81 0xD4U, 0xB5U, 0x53U, 0xE5U, 0xCDU, 0xC7U, 0x94U, 0xBAU, 0x57U, 0x49U, 0x22U, 0x94U, 0xDDU,
108RA8_INTERNAL static bool internal_ct_equal(
const uint8_t* a,
const uint8_t* b, uint32_t len)
110 if ((a ==
nullptr) || (b ==
nullptr)) {
119 for (uint32_t i = 0U; i < len; ++i) {
120 diff |= (uint8_t)(a[i] ^ b[i]);
151internal_compute_digest(
const uint8_t* body, uint32_t body_len, uint8_t* digest)
157 size_t produced = 0U;
178typedef enum : uint8_t {
179 k_rot_octet_bits = 8U,
211internal_bind_version(uint32_t img_version,
const uint8_t* digest, uint8_t* out)
217 for (uint8_t i = 0U; i < (uint8_t)
sizeof(uint32_t); ++i) {
218 combined[i] = (uint8_t)(img_version >> ((uint32_t)i * (uint32_t)k_rot_octet_bits));
221 combined[(size_t)
sizeof(uint32_t) + (size_t)i] = digest[i];
223 return internal_compute_digest(combined, (uint32_t)
sizeof(combined), out);
254internal_verify_sig(
const uint8_t* digest,
const uint8_t* sig, uint32_t sig_len)
266 ra8_psa_key_import(&key, &attr, s_rot_root_pubkey, (
size_t)
sizeof(s_rot_root_pubkey));
317 const ra8_err_t hash_err = internal_compute_digest(body, body_len, digest);
331 const ra8_err_t bind_err = internal_bind_version(trailer->
img_version, digest, signed_material);
335 const ra8_err_t sig_err = internal_verify_sig(signed_material, trailer->
sig, trailer->
sig_len);
343 if (image_base ==
nullptr) {
349 const uint8_t* base = (
const uint8_t*)image_base;
360 *out_key = s_rot_root_pubkey;
361 *out_len = (uint32_t)
sizeof(s_rot_root_pubkey);
static const char * s_tag
Logging / check tag.
#define RA8_INTERNAL
Marker that a function is intended to be static (file-local).
Validation and Error-Checking Macros for ra8-firmware.
#define RA8_RETURN_ON_ERROR(err, tag, message)
Early return on error, propagating the code upward.
#define RA8_CHECK_NULL_PTR(ptr, tag, message)
Reject nullptr pointer, returning k_ra8_err_null_ptr.
@ k_ra8_err_checksum_mismatch
Stored / transmitted checksum does not match computed value.
@ k_ra8_err_exists
Item already exists – cannot create again.
@ k_ra8_err_validation_failed
Validation rule failed (caller-supplied invariant not satisfied).
@ k_ra8_ok
Success – operation completed with all postconditions satisfied.
@ k_ra8_err_invalid_size
Invalid size parameter (too large, too small, or misaligned).
ra8_err_codes_t ra8_err_t
Canonical error-return type used by every ra8-firmware API.
#define ra8_log_error(tag, message)
RA8 log error.
Application-level PSA Crypto facade over tf-psa-crypto.
@ k_ra8_psa_usage_verify
Allow ra8_psa_verify_hash.
ra8_err_t ra8_psa_hash_compute(ra8_psa_alg_t alg, const uint8_t *input, size_t input_len, uint8_t *out, size_t out_cap, size_t *out_len)
Compute a one-shot SHA-256 digest.
ra8_err_t ra8_psa_key_destroy(ra8_psa_key_t handle)
Destroy a previously-imported key.
ra8_err_t ra8_psa_crypto_init(void)
One-shot facade initialisation.
ra8_err_t ra8_psa_key_import(ra8_psa_key_t *out_handle, const ra8_psa_key_attr_t *attr, const uint8_t *data, size_t data_len)
Import a raw-byte key into the static pool.
struct ra8_psa_key_handle * ra8_psa_key_t
Opaque PSA key handle (typed pointer into the static pool).
ra8_err_t ra8_psa_verify_hash(ra8_psa_key_t handle, ra8_psa_alg_t alg, const uint8_t *hash, size_t hash_len, const uint8_t *sig, size_t sig_len)
Verify an ECDSA signature over a pre-computed hash.
@ k_ra8_psa_key_type_ecc_p256_pub
ECDSA P-256 public key (uncompressed).
@ k_ra8_psa_alg_ecdsa_sha_256
ECDSA over SHA-256 (FIPS 186-4).
@ k_ra8_psa_alg_sha_256
SHA-256 hash (FIPS 180-4).
Root-of-trust signed-image verifier (SHA-256 + ECDSA-P256, default-deny).
@ k_ra8_rot_trailer_magic
ASCII "ROT1" – signed-image marker.
@ k_ra8_rot_body_max
Max signable body length (1 MiB cap).
@ k_ra8_rot_version
Trailer format version.
@ k_ra8_rot_pubkey_bytes
Uncompressed P-256 public key (0x04||X||Y).
@ k_ra8_rot_sig_bytes
ECDSA-P256 raw r||s signature length.
@ k_ra8_rot_digest_bytes
SHA-256 digest length (FIPS 180-4).
ra8_err_t ra8_rot_verify_image(const uint8_t *body, uint32_t body_len, const ra8_rot_trailer_t *trailer)
Authenticate a signed image: SHA-256 + ECDSA-P256, default-deny.
const ra8_rot_trailer_t * ra8_rot_trailer_after(const void *image_base, uint32_t body_len)
Locate the trailer that immediately follows a signed image body.
ra8_err_t ra8_rot_root_public_key(const uint8_t **out_key, uint32_t *out_len)
Expose the provisioned root public key (host / test only).
Renesas Secure IP (RSIP-E50D) HAL – core lifecycle / TRNG / hash API.
ra8_err_t ra8_rsip_sha256(const uint8_t *msg, uint32_t msg_len, uint8_t *digest)
Compute SHA-256 of an in-memory buffer.
Attributes describing a key being imported.
Authenticity trailer appended after a signed image body.
uint32_t sig_len
Active signature length, bytes.
uint32_t body_len
Body length the digest covers.
uint32_t img_version
Monotonic anti-rollback image ver.
uint8_t sig[k_ra8_rot_sig_bytes]
ECDSA-P256 raw r||s over the digest.
uint32_t version
k_ra8_rot_version (trailer format).
uint32_t magic
k_ra8_rot_trailer_magic.
uint8_t digest[k_ra8_rot_digest_bytes]
SHA-256 of the body (pre-check).