5#include "sw/device/silicon_creator/lib/boot_svc/boot_svc_header.h"
9#include "sw/device/silicon_creator/lib/drivers/hmac.h"
20static void boot_svc_header_digest_compute(
const boot_svc_header_t *header,
21 hmac_digest_t *digest) {
23 kDigestRegionOffset =
sizeof(header->
digest),
25 static_assert(offsetof(boot_svc_header_t, digest) == 0,
26 "`digest` must be the first field of `boot_svc_header_t`.");
28 hmac_sha256((
const char *)header + kDigestRegionOffset,
29 header->
length - kDigestRegionOffset, digest);
32void boot_svc_header_finalize(uint32_t type, uint32_t length,
33 boot_svc_header_t *header) {
37 boot_svc_header_digest_compute(header, &header->
digest);
59static const uint32_t kCheckShares[kHmacDigestNumWords + 3] = {
60 0xc038253c, 0xfa1ebc13, 0x608b15e1, 0x883053ed, 0x3d28e980, 0x16009f6e,
61 0xa7944bde, 0x3c096b6f, 0xe2828469, 0x2d507673, 0xefee6c10,
64rom_error_t boot_svc_header_check(
const boot_svc_header_t *header) {
65 rom_error_t error = kErrorBootSvcBadHeader;
67 boot_svc_header_digest_compute(header, &digest);
70 for (; launder32(i) < kHmacDigestNumWords; ++i) {
71 error ^= header->
digest.digest[i] ^ digest.digest[i] ^ kCheckShares[i];
76 error ^= kCheckShares[i];
82 error ^= kCheckShares[i];
85 error ^= header->
identifier ^ kCheckShares[++i];
86 if (launder32(error) == kErrorOk) {
92 return kErrorBootSvcBadHeader;