Skip to content

Commit d433b50

Browse files
committed
Check snapshot digest
1 parent df31a7f commit d433b50

File tree

1 file changed

+25
-0
lines changed

1 file changed

+25
-0
lines changed

src/node/snapshot_serdes.h

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,31 @@ namespace ccf
7676
auto contents = ccf::cose::parse_cose_receipt(segments.receipt);
7777
LOG_DEBUG_FMT("COSE receipt KID (node ID): {}", contents.kid);
7878

79+
if (contents.proofs.empty())
80+
{
81+
throw std::logic_error("No Merkle proofs found in COSE receipt");
82+
}
83+
84+
auto snapshot_digest = ccf::crypto::Sha256Hash(
85+
{segments.header_and_body.data(), segments.header_and_body.size()});
86+
auto& claims_digest_bytes = contents.proofs[0].claims_digest;
87+
if (claims_digest_bytes.size() != ccf::crypto::Sha256Hash::SIZE)
88+
{
89+
throw std::logic_error(fmt::format(
90+
"Unsupported claims digest size: {}", claims_digest_bytes.size()));
91+
}
92+
ccf::crypto::Sha256Hash snapshot_digest_claim =
93+
ccf::crypto::Sha256Hash::from_span(
94+
std::span<const uint8_t, ccf::crypto::Sha256Hash::SIZE>{
95+
claims_digest_bytes.data(), ccf::crypto::Sha256Hash::SIZE});
96+
if (snapshot_digest != snapshot_digest_claim)
97+
{
98+
throw std::logic_error(fmt::format(
99+
"Snapshot digest ({}) does not match COSE receipt claim ({})",
100+
snapshot_digest,
101+
snapshot_digest_claim));
102+
}
103+
79104
auto merkle_root = ccf::cose::verify_merkle_root(contents.proofs);
80105
LOG_DEBUG_FMT(
81106
"COSE snapshot receipt Merkle root verified for node {}", contents.kid);

0 commit comments

Comments
 (0)