Updated the ReferenceBytes codec to be spec‑true: it now treats the digest as “remaining bytes” and only enforces digest length when the registry provides a non‑zero expected length. This keeps strictness where hashing/verification happens while allowing unknown hash IDs for pure transport/framing. Changes are in asl1_core_codec.c.

This commit is contained in:
Carl Niklas Rydberg 2025-12-21 23:46:07 +01:00
parent 9754582ae7
commit ab36856833

View file

@ -179,6 +179,7 @@ bool amduat_enc_asl1_core_encode_reference_v1(
amduat_reference_t reference,
amduat_octets_t *out_bytes) {
const amduat_hash_asl1_desc_t *hash_desc;
size_t digest_len;
size_t total_len;
uint8_t *buffer;
@ -192,18 +193,17 @@ bool amduat_enc_asl1_core_encode_reference_v1(
return false;
}
digest_len = reference.digest.len;
hash_desc = amduat_hash_asl1_desc_lookup(reference.hash_id);
if (hash_desc == NULL || hash_desc->digest_len == 0) {
if (hash_desc != NULL && hash_desc->digest_len != 0 &&
digest_len != hash_desc->digest_len) {
return false;
}
if (reference.digest.len != hash_desc->digest_len) {
return false;
}
if (hash_desc->digest_len > SIZE_MAX - AMDUAT_ENC_ASL1_CORE_REF_HASH_LEN) {
if (digest_len > SIZE_MAX - AMDUAT_ENC_ASL1_CORE_REF_HASH_LEN) {
return false;
}
total_len = AMDUAT_ENC_ASL1_CORE_REF_HASH_LEN + hash_desc->digest_len;
total_len = AMDUAT_ENC_ASL1_CORE_REF_HASH_LEN + digest_len;
buffer = (uint8_t *)malloc(total_len);
if (buffer == NULL) {
return false;
@ -212,7 +212,7 @@ bool amduat_enc_asl1_core_encode_reference_v1(
amduat_enc_asl1_core_store_u16_be(buffer, reference.hash_id);
memcpy(buffer + AMDUAT_ENC_ASL1_CORE_REF_HASH_LEN,
reference.digest.data,
hash_desc->digest_len);
digest_len);
out_bytes->data = buffer;
out_bytes->len = total_len;
@ -238,12 +238,10 @@ bool amduat_enc_asl1_core_decode_reference_v1(
}
hash_id = (amduat_hash_id_t)amduat_enc_asl1_core_load_u16_be(bytes.data);
digest_len = bytes.len - AMDUAT_ENC_ASL1_CORE_REF_HASH_LEN;
hash_desc = amduat_hash_asl1_desc_lookup(hash_id);
if (hash_desc == NULL || hash_desc->digest_len == 0) {
return false;
}
digest_len = hash_desc->digest_len;
if (bytes.len - AMDUAT_ENC_ASL1_CORE_REF_HASH_LEN != digest_len) {
if (hash_desc != NULL && hash_desc->digest_len != 0 &&
digest_len != hash_desc->digest_len) {
return false;
}