8 #include "sw/device/silicon_creator/lib/sigverify/sphincsplus/address.h"
11 #include "sw/device/silicon_creator/lib/sigverify/sphincsplus/params.h"
13 static_assert(kSpxTreeHeight * (kSpxD - 1) <= 64,
14 "Subtree addressing is currently limited to at most 2^64 trees.");
25 static void spx_addr_set_byte(
spx_addr_t *addr,
size_t offset,
26 unsigned char value) {
27 unsigned char *buf = (
unsigned char *)addr->addr;
31 void spx_addr_layer_set(
spx_addr_t *addr, uint8_t layer) {
32 spx_addr_set_byte(addr, kSpxOffsetLayer, layer);
35 void spx_addr_tree_set(
spx_addr_t *addr, uint64_t tree) {
36 unsigned char *buf = (
unsigned char *)addr->addr;
38 uint64_t tree_be = __builtin_bswap64(tree);
39 memcpy(buf + kSpxOffsetTree, &tree_be,
sizeof(uint64_t));
42 void spx_addr_type_set(
spx_addr_t *addr, spx_addr_type_t type) {
43 spx_addr_set_byte(addr, kSpxOffsetType, (
unsigned char)type);
47 unsigned char *in_buf = (
unsigned char *)in->addr;
48 unsigned char *out_buf = (
unsigned char *)out->addr;
52 size_t layer_field_offset =
53 (kSpxOffsetLayer /
sizeof(uint32_t)) *
sizeof(uint32_t);
54 memcpy(out_buf + layer_field_offset, in_buf + layer_field_offset,
58 memcpy(out_buf + kSpxOffsetTree, in_buf + kSpxOffsetTree,
sizeof(uint64_t));
61 void spx_addr_keypair_set(
spx_addr_t *addr, uint32_t keypair) {
62 unsigned char *buf = (
unsigned char *)addr->addr;
64 uint32_t keypair_be = __builtin_bswap32(keypair);
65 memcpy(buf + kSpxOffsetKpAddr, &keypair_be,
sizeof(uint32_t));
69 spx_addr_subtree_copy(out, in);
70 unsigned char *in_buf = (
unsigned char *)in->addr;
71 unsigned char *out_buf = (
unsigned char *)out->addr;
72 memcpy(out_buf + kSpxOffsetKpAddr, in_buf + kSpxOffsetKpAddr,
76 void spx_addr_chain_set(
spx_addr_t *addr, uint8_t chain) {
77 spx_addr_set_byte(addr, kSpxOffsetChainAddr, chain);
80 void spx_addr_hash_set(
spx_addr_t *addr, uint8_t hash) {
81 spx_addr_set_byte(addr, kSpxOffsetHashAddr, hash);
84 void spx_addr_tree_height_set(
spx_addr_t *addr, uint8_t tree_height) {
85 spx_addr_set_byte(addr, kSpxOffsetTreeHeight, tree_height);
88 void spx_addr_tree_index_set(
spx_addr_t *addr, uint32_t tree_index) {
89 unsigned char *buf = (
unsigned char *)addr->addr;
91 uint32_t index_be = __builtin_bswap32(tree_index);
92 memcpy(buf + kSpxOffsetTreeIndex, &index_be,
sizeof(uint32_t));