5 #include "sw/device/silicon_creator/lib/boot_svc/boot_svc_header.h"
9 #include "sw/device/silicon_creator/lib/drivers/hmac.h"
23 kDigestRegionOffset =
sizeof(header->
digest),
26 "`digest` must be the first field of `boot_svc_header_t`.");
28 hmac_sha256((
const char *)header + kDigestRegionOffset,
29 header->
length - kDigestRegionOffset, digest);
32 void boot_svc_header_finalize(uint32_t type, uint32_t length,
37 boot_svc_header_digest_compute(header, &header->
digest);
59 static const uint32_t kCheckShares[kHmacDigestNumWords + 3] = {
60 0xc038253c, 0xfa1ebc13, 0x608b15e1, 0x883053ed, 0x3d28e980, 0x16009f6e,
61 0xa7944bde, 0x3c096b6f, 0xe2828469, 0x2d507673, 0xefee6c10,
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;