@@ -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