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;
69 return kErrorBootSvcBadHeader;
72 error ^= kCheckShares[i++];
75 return kErrorBootSvcBadHeader;
78 error ^= kCheckShares[i++];
80 boot_svc_header_digest_compute(header, &digest);
81 for (
size_t j = 0; launder32(j) < kHmacDigestNumWords; ++i, ++j) {
82 error ^= header->
digest.digest[j] ^ digest.digest[j] ^ kCheckShares[i];
86 if (launder32(error) == kErrorOk) {
92 return kErrorBootSvcBadHeader;