From 0188e10cee777512bc8878caab15000502a38297 Mon Sep 17 00:00:00 2001 From: Carl Niklas Rydberg Date: Sun, 21 Dec 2025 22:36:08 +0100 Subject: [PATCH] Add ASL ref-derive test and use central derivation --- CMakeLists.txt | 12 ++- src/pel_stack/program_dag/program_dag_desc.c | 34 +++++++- tests/asl/test_asl_ref_derive.c | 86 ++++++++++++++++++++ 3 files changed, 129 insertions(+), 3 deletions(-) create mode 100644 tests/asl/test_asl_ref_derive.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 5f01103..661f7d9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -64,7 +64,6 @@ set(AMDUAT_ASL_SRCS src/near_core/asl/artifact_io.c src/near_core/asl/io.c src/near_core/asl/parse.c - src/near_core/asl/ref_derive.c src/near_core/asl/ref_io.c src/near_core/asl/store.c src/near_core/asl/ref_text.c @@ -79,6 +78,7 @@ set(AMDUAT_HASH_ASL1_SRCS set(AMDUAT_ENC_SRCS src/near_core/enc/asl1_core.c src/near_core/enc/asl1_core_codec.c + src/near_core/asl/ref_derive.c src/near_core/enc/pel_program_dag.c src/near_core/enc/pel_trace_dag.c src/near_core/enc/pel1_result.c @@ -275,6 +275,16 @@ target_link_libraries(amduat_test_tgk_prov ) add_test(NAME tgk_prov COMMAND amduat_test_tgk_prov) +add_executable(amduat_test_asl_ref_derive tests/asl/test_asl_ref_derive.c) +target_include_directories(amduat_test_asl_ref_derive + PRIVATE ${AMDUAT_INTERNAL_DIR} + PRIVATE ${AMDUAT_INCLUDE_DIR} +) +target_link_libraries(amduat_test_asl_ref_derive + PRIVATE amduat_enc +) +add_test(NAME asl_ref_derive COMMAND amduat_test_asl_ref_derive) + add_executable(amduat_test_pel_program_dag_exec tests/pel/test_pel_program_dag_exec.c) target_include_directories(amduat_test_pel_program_dag_exec diff --git a/src/pel_stack/program_dag/program_dag_desc.c b/src/pel_stack/program_dag/program_dag_desc.c index 50abf7f..eddf849 100644 --- a/src/pel_stack/program_dag/program_dag_desc.c +++ b/src/pel_stack/program_dag/program_dag_desc.c @@ -1,14 +1,44 @@ #include "amduat/pel/program_dag_desc.h" +#include "amduat/asl/ref_derive.h" +#include "amduat/enc/asl1_core.h" #include "amduat/hash/asl1.h" +#include + amduat_reference_t amduat_pel_program_dag_scheme_ref(void) { - static const uint8_t digest[] = { + static const uint8_t descriptor_bytes[] = { + 0x00, 0x01, 0x00, 0x00, 0x00, 0x11, 0x50, 0x45, + 0x4c, 0x2f, 0x50, 0x52, 0x4f, 0x47, 0x52, 0x41, + 0x4d, 0x2d, 0x44, 0x41, 0x47, 0x2f, 0x31, 0x00, + 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00 + }; + static uint8_t digest[] = { 0xc5, 0x0f, 0xb2, 0xa7, 0x34, 0xa5, 0xcc, 0x23, 0x3c, 0x38, 0x75, 0xb7, 0x0a, 0x7d, 0x96, 0xea, 0xad, 0x37, 0x4f, 0x00, 0x00, 0x29, 0x77, 0x1d, - 0x8b, 0xef, 0x1a, 0xf2, 0xcd, 0x63, 0x84, 0xdd, + 0x8b, 0xef, 0x1a, 0xf2, 0xcd, 0x63, 0x84, 0xdd }; + static bool initialized = false; + + if (!initialized) { + amduat_artifact_t artifact = amduat_artifact_with_type( + amduat_octets(descriptor_bytes, sizeof(descriptor_bytes)), + amduat_type_tag(AMDUAT_PEL_TYPE_TAG_SCHEME_DESC_1)); + amduat_reference_t derived = amduat_reference(0u, amduat_octets(NULL, 0u)); + + if (amduat_asl_ref_derive(artifact, + AMDUAT_ENC_ASL1_CORE_V1, + AMDUAT_HASH_ASL1_ID_SHA256, + &derived, + NULL) && + derived.digest.data != NULL && + derived.digest.len == sizeof(digest)) { + memcpy(digest, derived.digest.data, sizeof(digest)); + } + amduat_reference_free(&derived); + initialized = true; + } return amduat_reference(AMDUAT_HASH_ASL1_ID_SHA256, amduat_octets(digest, sizeof(digest))); diff --git a/tests/asl/test_asl_ref_derive.c b/tests/asl/test_asl_ref_derive.c new file mode 100644 index 0000000..b0c559c --- /dev/null +++ b/tests/asl/test_asl_ref_derive.c @@ -0,0 +1,86 @@ +#include "amduat/asl/ref_derive.h" +#include "amduat/enc/asl1_core_codec.h" +#include "amduat/hash/asl1.h" + +#include +#include + +static int test_ref_derive_roundtrip(void) { + static const uint8_t k_payload[] = { + 0x68, 0x65, 0x6c, 0x6c, 0x6f + }; + amduat_artifact_t artifact = amduat_artifact_with_type( + amduat_octets(k_payload, sizeof(k_payload)), + amduat_type_tag(0x12345678u)); + amduat_reference_t ref = amduat_reference(0u, amduat_octets(NULL, 0u)); + amduat_octets_t artifact_bytes = amduat_octets(NULL, 0u); + amduat_octets_t encoded = amduat_octets(NULL, 0u); + amduat_artifact_t decoded = amduat_artifact(amduat_octets(NULL, 0u)); + const amduat_hash_asl1_desc_t *hash_desc; + uint8_t digest[64]; + int exit_code = 1; + + if (!amduat_asl_ref_derive(artifact, + AMDUAT_ENC_ASL1_CORE_V1, + AMDUAT_HASH_ASL1_ID_SHA256, + &ref, + &artifact_bytes)) { + fprintf(stderr, "ref_derive failed\n"); + goto cleanup; + } + + hash_desc = amduat_hash_asl1_desc_lookup(ref.hash_id); + if (hash_desc == NULL || hash_desc->digest_len == 0) { + fprintf(stderr, "hash desc lookup failed\n"); + goto cleanup; + } + if (hash_desc->digest_len > sizeof(digest)) { + fprintf(stderr, "digest buffer too small\n"); + goto cleanup; + } + if (!amduat_hash_asl1_digest(ref.hash_id, + artifact_bytes, + digest, + hash_desc->digest_len)) { + fprintf(stderr, "hash digest failed\n"); + goto cleanup; + } + if (ref.digest.len != hash_desc->digest_len || + memcmp(ref.digest.data, digest, hash_desc->digest_len) != 0) { + fprintf(stderr, "derived digest mismatch\n"); + goto cleanup; + } + + if (!amduat_enc_asl1_core_encode_artifact_v1(artifact, &encoded)) { + fprintf(stderr, "encode_artifact failed\n"); + goto cleanup; + } + if (artifact_bytes.len != encoded.len || + (artifact_bytes.len != 0 && + memcmp(artifact_bytes.data, encoded.data, encoded.len) != 0)) { + fprintf(stderr, "artifact bytes mismatch\n"); + goto cleanup; + } + + if (!amduat_enc_asl1_core_decode_artifact_v1(artifact_bytes, &decoded)) { + fprintf(stderr, "decode_artifact failed\n"); + goto cleanup; + } + if (!amduat_artifact_eq(artifact, decoded)) { + fprintf(stderr, "decoded artifact mismatch\n"); + goto cleanup; + } + + exit_code = 0; + +cleanup: + amduat_reference_free(&ref); + amduat_octets_free(&artifact_bytes); + amduat_octets_free(&encoded); + amduat_artifact_free(&decoded); + return exit_code; +} + +int main(void) { + return test_ref_derive_roundtrip(); +}