8 #include "sw/device/silicon_creator/lib/sigverify/sphincsplus/utils.h"
11 #include "sw/device/silicon_creator/lib/drivers/hmac.h"
12 #include "sw/device/silicon_creator/lib/error.h"
13 #include "sw/device/silicon_creator/lib/sigverify/sphincsplus/address.h"
14 #include "sw/device/silicon_creator/lib/sigverify/sphincsplus/params.h"
15 #include "sw/device/silicon_creator/lib/sigverify/sphincsplus/thash.h"
17 uint64_t spx_utils_bytes_to_u64(
const uint8_t *in,
size_t inlen) {
19 for (
size_t i = 0; i < inlen; i++) {
26 size_t offset = 8 * (inlen - 1 - i);
28 retval |= ((uint32_t)in[i]) << offset;
30 retval |= ((uint64_t)(((uint32_t)in[i]) << (offset - 32))) << 32;
36 void spx_utils_compute_root(
const uint32_t *leaf, uint32_t leaf_idx,
37 uint32_t idx_offset,
const uint32_t *auth_path,
38 uint8_t tree_height,
const spx_ctx_t *ctx,
41 uint32_t buffer[2 * kSpxNWords];
43 uint32_t *buffer_second = &buffer[kSpxNWords];
48 memcpy(buffer_second, leaf, kSpxN);
49 memcpy(buffer, auth_path, kSpxN);
51 memcpy(buffer, leaf, kSpxN);
52 memcpy(buffer_second, auth_path, kSpxN);
54 auth_path += kSpxNWords;
56 for (uint8_t i = 0; i < tree_height - 1; i++) {
60 spx_addr_tree_height_set(addr, i + 1);
61 spx_addr_tree_index_set(addr, leaf_idx + idx_offset);
64 uint32_t *hash_dst = (leaf_idx & 1) ? buffer_second : buffer;
65 uint32_t *auth_dst = (leaf_idx & 1) ? buffer : buffer_second;
67 thash(buffer, 2, ctx, addr, hash_dst);
68 memcpy(auth_dst, auth_path, kSpxN);
69 auth_path += kSpxNWords;
75 spx_addr_tree_height_set(addr, tree_height);
76 spx_addr_tree_index_set(addr, leaf_idx + idx_offset);
77 thash(buffer, 2, ctx, addr, root);