5 #include "sw/device/silicon_creator/lib/ownership/ownership_key.h"
9 #include "sw/device/silicon_creator/lib/drivers/flash_ctrl.h"
10 #include "sw/device/silicon_creator/lib/drivers/keymgr.h"
11 #include "sw/device/silicon_creator/lib/drivers/kmac.h"
12 #include "sw/device/silicon_creator/lib/ownership/ecdsa.h"
19 hardened_bool_t ownership_key_validate(
size_t page, ownership_key_t key,
21 const void *message,
size_t len) {
22 if ((key & kOwnershipKeyUnlock) == kOwnershipKeyUnlock) {
23 if (ecdsa_verify_message(&owner_page[page].unlock_key.ecdsa,
24 &signature->
ecdsa, message,
29 if ((key & kOwnershipKeyActivate) == kOwnershipKeyActivate) {
30 if (ecdsa_verify_message(&owner_page[page].activate_key.ecdsa,
31 &signature->
ecdsa, message,
36 if (kNoOwnerRecoveryKey &&
37 (key & kOwnershipKeyRecovery) == kOwnershipKeyRecovery) {
38 if (ecdsa_verify_message(&kNoOwnerRecoveryKey->
ecdsa, &signature->
ecdsa,
44 &signature->
ecdsa, message, len);
47 rom_error_t ownership_seal_init(
void) {
49 .
salt = {4004, 8008, 8080, 1802, 6800, 6502, 6809, 8088},
52 HARDENED_RETURN_IF_ERROR(sc_keymgr_generate_key(
53 kScKeymgrDestKmac, kScKeymgrKeyTypeSealing, diversifier));
54 HARDENED_RETURN_IF_ERROR(kmac_kmac256_hw_configure());
55 kmac_kmac256_set_prefix(
"Ownership", 9);
59 static rom_error_t seal_generate(
const owner_block_t *page, uint32_t *seal) {
61 HARDENED_RETURN_IF_ERROR(kmac_kmac256_start());
62 kmac_kmac256_absorb(page, sealed_len);
66 rom_error_t ownership_seal_page(
size_t page) {
68 return seal_generate(data, data->
seal);
71 rom_error_t ownership_seal_check(
size_t page) {
74 HARDENED_RETURN_IF_ERROR(seal_generate(data, check));
80 return (rom_error_t)result;
82 return kErrorOwnershipInvalidInfoPage;
85 static void reverse(
void *buf,
size_t len) {
86 char *x = (
char *)buf;
87 char *y = x + len - 1;
88 for (; x < y; ++x, --y) {
95 static void secret_page_enable(multi_bit_bool_t read, multi_bit_bool_t write) {
101 flash_ctrl_info_perms_set(&kFlashCtrlInfoPageOwnerSecret, perm);
104 rom_error_t ownership_secret_new(
void) {
107 secret_page_enable(kMultiBitBool4True, kMultiBitBool4True);
109 flash_ctrl_info_read(&kFlashCtrlInfoPageOwnerSecret, 0,
110 sizeof(secret) /
sizeof(uint32_t), &secret);
111 if (error != kErrorOk) {
112 HARDENED_CHECK_NE(error, kErrorOk);
117 error = flash_ctrl_info_erase(&kFlashCtrlInfoPageOwnerSecret,
118 kFlashCtrlEraseTypePage);
119 memset(&secret, 0xFF,
sizeof(secret));
121 if (error != kErrorOk)
128 size_t keysz =
sizeof(owner_page[0].
owner_key);
129 switch (owner_page[0].ownership_key_alg) {
130 case kOwnershipKeyAlgEcdsaP256:
135 hmac_sha256_update(&owner_page[0].
owner_key, keysz);
136 hmac_sha256_process();
149 hmac_sha256_update(&owner_page[0].
owner_key, keysz);
150 hmac_sha256_process();
153 error = flash_ctrl_info_erase(&kFlashCtrlInfoPageOwnerSecret,
154 kFlashCtrlEraseTypePage);
155 if (error != kErrorOk)
157 error = flash_ctrl_info_write(&kFlashCtrlInfoPageOwnerSecret, 0,
158 sizeof(secret) /
sizeof(uint32_t), &secret);
161 secret_page_enable(kMultiBitBool4False,
162 kMultiBitBool4False);
167 secret_page_enable(kMultiBitBool4True,
168 kMultiBitBool4False);
170 flash_ctrl_info_read(&kFlashCtrlInfoPageOwnerSecret,
172 sizeof(*history) /
sizeof(uint32_t), history);
173 secret_page_enable(kMultiBitBool4False,
174 kMultiBitBool4False);