Add ASL ref-derive test and use central derivation

This commit is contained in:
Carl Niklas Rydberg 2025-12-21 22:36:08 +01:00
parent 5a002b2a1d
commit 0188e10cee
3 changed files with 129 additions and 3 deletions

View file

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

View file

@ -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 <string.h>
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)));

View file

@ -0,0 +1,86 @@
#include "amduat/asl/ref_derive.h"
#include "amduat/enc/asl1_core_codec.h"
#include "amduat/hash/asl1.h"
#include <stdio.h>
#include <string.h>
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();
}