amduatd: optionally index pel derivations
This commit is contained in:
parent
ebdd37cfcd
commit
5ecb28c84c
|
|
@ -26,7 +26,7 @@ target_link_libraries(amduat_federation
|
||||||
|
|
||||||
set(amduatd_sources src/amduatd.c src/amduatd_http.c src/amduatd_caps.c
|
set(amduatd_sources src/amduatd.c src/amduatd_http.c src/amduatd_caps.c
|
||||||
src/amduatd_space.c src/amduatd_concepts.c
|
src/amduatd_space.c src/amduatd_concepts.c
|
||||||
src/amduatd_store.c)
|
src/amduatd_store.c src/amduatd_derivation_index.c)
|
||||||
if(AMDUATD_ENABLE_UI)
|
if(AMDUATD_ENABLE_UI)
|
||||||
list(APPEND amduatd_sources src/amduatd_ui.c)
|
list(APPEND amduatd_sources src/amduatd_ui.c)
|
||||||
endif()
|
endif()
|
||||||
|
|
@ -44,8 +44,9 @@ target_compile_definitions(amduatd
|
||||||
|
|
||||||
target_link_libraries(amduatd
|
target_link_libraries(amduatd
|
||||||
PRIVATE amduat_tgk amduat_pel amduat_format amduat_asl_store_fs
|
PRIVATE amduat_tgk amduat_pel amduat_format amduat_asl_store_fs
|
||||||
amduat_asl_store_index_fs amduat_asl amduat_enc amduat_hash_asl1
|
amduat_asl_store_index_fs amduat_asl_derivation_index_fs
|
||||||
amduat_util amduat_federation
|
amduat_asl amduat_enc amduat_hash_asl1 amduat_util
|
||||||
|
amduat_federation
|
||||||
)
|
)
|
||||||
|
|
||||||
add_executable(amduat_pel_gc
|
add_executable(amduat_pel_gc
|
||||||
|
|
@ -82,3 +83,20 @@ target_link_libraries(amduatd_test_store_backend
|
||||||
)
|
)
|
||||||
|
|
||||||
add_test(NAME amduatd_store_backend COMMAND amduatd_test_store_backend)
|
add_test(NAME amduatd_store_backend COMMAND amduatd_test_store_backend)
|
||||||
|
|
||||||
|
add_executable(amduatd_test_derivation_index
|
||||||
|
tests/test_amduatd_derivation_index.c
|
||||||
|
src/amduatd_derivation_index.c
|
||||||
|
)
|
||||||
|
|
||||||
|
target_include_directories(amduatd_test_derivation_index
|
||||||
|
PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
|
||||||
|
PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src
|
||||||
|
PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/vendor/amduat/include
|
||||||
|
)
|
||||||
|
|
||||||
|
target_link_libraries(amduatd_test_derivation_index
|
||||||
|
PRIVATE amduat_asl_derivation_index_fs amduat_pel amduat_asl amduat_util
|
||||||
|
)
|
||||||
|
|
||||||
|
add_test(NAME amduatd_derivation_index COMMAND amduatd_test_derivation_index)
|
||||||
|
|
|
||||||
15
README.md
15
README.md
|
|
@ -47,6 +47,18 @@ Run the daemon with the index-backed store:
|
||||||
|
|
||||||
Note: `/v1/fed/records` requires the index backend.
|
Note: `/v1/fed/records` requires the index backend.
|
||||||
|
|
||||||
|
Run the daemon with derivation indexing enabled:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
./build/amduatd --root .amduat-asl --sock amduatd.sock --enable-derivation-index
|
||||||
|
```
|
||||||
|
|
||||||
|
To fail `/v1/pel/run` if the derivation index write fails:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
./build/amduatd --root .amduat-asl --sock amduatd.sock --derivation-index-strict
|
||||||
|
```
|
||||||
|
|
||||||
Dev loop (build + restart):
|
Dev loop (build + restart):
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
|
|
@ -108,6 +120,9 @@ curl --unix-socket amduatd.sock -X POST http://localhost/v1/pel/run \
|
||||||
-d '{"program_ref":"<program_ref>","input_refs":["<input_ref_0>"],"params_ref":"<params_ref>"}'
|
-d '{"program_ref":"<program_ref>","input_refs":["<input_ref_0>"],"params_ref":"<params_ref>"}'
|
||||||
```
|
```
|
||||||
|
|
||||||
|
When derivation indexing is enabled, successful PEL runs record derivations under
|
||||||
|
`<root>/index/derivations/by_artifact/` keyed by output refs (plus result/trace/receipt refs).
|
||||||
|
|
||||||
Define a PEL/PROGRAM-DAG/1 program (store-backed):
|
Define a PEL/PROGRAM-DAG/1 program (store-backed):
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
|
|
|
||||||
|
|
@ -39,6 +39,7 @@
|
||||||
#include "amduatd_caps.h"
|
#include "amduatd_caps.h"
|
||||||
#include "amduatd_space.h"
|
#include "amduatd_space.h"
|
||||||
#include "amduatd_store.h"
|
#include "amduatd_store.h"
|
||||||
|
#include "amduatd_derivation_index.h"
|
||||||
|
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
|
|
@ -1367,6 +1368,7 @@ static bool amduatd_handle_post_pel_run(int fd,
|
||||||
const amduat_asl_store_fs_config_t *cfg,
|
const amduat_asl_store_fs_config_t *cfg,
|
||||||
const amduatd_concepts_t *concepts,
|
const amduatd_concepts_t *concepts,
|
||||||
const amduatd_cfg_t *dcfg,
|
const amduatd_cfg_t *dcfg,
|
||||||
|
const char *root_path,
|
||||||
const amduatd_http_req_t *req) {
|
const amduatd_http_req_t *req) {
|
||||||
uint8_t *body = NULL;
|
uint8_t *body = NULL;
|
||||||
const char *p = NULL;
|
const char *p = NULL;
|
||||||
|
|
@ -2393,6 +2395,30 @@ static bool amduatd_handle_post_pel_run(int fd,
|
||||||
receipt_emitted = true;
|
receipt_emitted = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (dcfg != NULL && dcfg->derivation_index_enabled) {
|
||||||
|
amduat_asl_store_error_t idx_err = AMDUAT_ASL_STORE_OK;
|
||||||
|
if (!amduatd_derivation_index_pel_run(root_path,
|
||||||
|
true,
|
||||||
|
program_ref,
|
||||||
|
input_refs,
|
||||||
|
input_refs_len,
|
||||||
|
has_params_ref,
|
||||||
|
params_ref,
|
||||||
|
&run_result,
|
||||||
|
receipt_emitted,
|
||||||
|
receipt_ref,
|
||||||
|
&idx_err)) {
|
||||||
|
if (dcfg->derivation_index_strict) {
|
||||||
|
ok = amduatd_send_json_error(fd, 500, "Internal Server Error",
|
||||||
|
"derivation index failed");
|
||||||
|
goto pel_run_cleanup;
|
||||||
|
}
|
||||||
|
amduat_log(AMDUAT_LOG_WARN,
|
||||||
|
"pel run derivation index failed: %d",
|
||||||
|
(int)idx_err);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
amduatd_strbuf_t resp;
|
amduatd_strbuf_t resp;
|
||||||
char *result_hex = NULL;
|
char *result_hex = NULL;
|
||||||
|
|
@ -3950,7 +3976,8 @@ static bool amduatd_handle_conn(int fd,
|
||||||
goto conn_cleanup;
|
goto conn_cleanup;
|
||||||
}
|
}
|
||||||
if (strcmp(req.method, "POST") == 0 && strcmp(no_query, "/v1/pel/run") == 0) {
|
if (strcmp(req.method, "POST") == 0 && strcmp(no_query, "/v1/pel/run") == 0) {
|
||||||
ok = amduatd_handle_post_pel_run(fd, store, cfg, concepts, dcfg, &req);
|
ok = amduatd_handle_post_pel_run(fd, store, cfg, concepts, dcfg,
|
||||||
|
root_path, &req);
|
||||||
goto conn_cleanup;
|
goto conn_cleanup;
|
||||||
}
|
}
|
||||||
if (strcmp(req.method, "POST") == 0 &&
|
if (strcmp(req.method, "POST") == 0 &&
|
||||||
|
|
@ -4035,6 +4062,8 @@ static void amduatd_print_usage(FILE *stream) {
|
||||||
" [--store-backend fs|index]\n"
|
" [--store-backend fs|index]\n"
|
||||||
" [--allow-uid UID] [--allow-user NAME]\n"
|
" [--allow-uid UID] [--allow-user NAME]\n"
|
||||||
" [--enable-cap-reads]\n"
|
" [--enable-cap-reads]\n"
|
||||||
|
" [--enable-derivation-index]\n"
|
||||||
|
" [--derivation-index-strict]\n"
|
||||||
"\n"
|
"\n"
|
||||||
"defaults:\n"
|
"defaults:\n"
|
||||||
" --root %s\n"
|
" --root %s\n"
|
||||||
|
|
@ -4154,6 +4183,11 @@ int main(int argc, char **argv) {
|
||||||
}
|
}
|
||||||
} else if (strcmp(argv[i], "--enable-cap-reads") == 0) {
|
} else if (strcmp(argv[i], "--enable-cap-reads") == 0) {
|
||||||
enable_cap_reads = true;
|
enable_cap_reads = true;
|
||||||
|
} else if (strcmp(argv[i], "--enable-derivation-index") == 0) {
|
||||||
|
dcfg.derivation_index_enabled = true;
|
||||||
|
} else if (strcmp(argv[i], "--derivation-index-strict") == 0) {
|
||||||
|
dcfg.derivation_index_enabled = true;
|
||||||
|
dcfg.derivation_index_strict = true;
|
||||||
} else if (strcmp(argv[i], "--help") == 0 || strcmp(argv[i], "-h") == 0) {
|
} else if (strcmp(argv[i], "--help") == 0 || strcmp(argv[i], "-h") == 0) {
|
||||||
amduatd_print_usage(stdout);
|
amduatd_print_usage(stdout);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
@ -4175,6 +4209,10 @@ int main(int argc, char **argv) {
|
||||||
amduat_log(AMDUAT_LOG_INFO,
|
amduat_log(AMDUAT_LOG_INFO,
|
||||||
"store backend=%s",
|
"store backend=%s",
|
||||||
amduatd_store_backend_name(store_backend));
|
amduatd_store_backend_name(store_backend));
|
||||||
|
amduat_log(AMDUAT_LOG_INFO,
|
||||||
|
"derivation index=%s strict=%s",
|
||||||
|
dcfg.derivation_index_enabled ? "on" : "off",
|
||||||
|
dcfg.derivation_index_strict ? "on" : "off");
|
||||||
if (!amduatd_caps_init(&caps, &dcfg, root)) {
|
if (!amduatd_caps_init(&caps, &dcfg, root)) {
|
||||||
amduat_log(AMDUAT_LOG_WARN, "capabilities unavailable");
|
amduat_log(AMDUAT_LOG_WARN, "capabilities unavailable");
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -15,6 +15,8 @@ extern "C" {
|
||||||
typedef struct amduatd_cfg_t {
|
typedef struct amduatd_cfg_t {
|
||||||
amduatd_space_t space;
|
amduatd_space_t space;
|
||||||
uint64_t edges_refresh_ms;
|
uint64_t edges_refresh_ms;
|
||||||
|
bool derivation_index_enabled;
|
||||||
|
bool derivation_index_strict;
|
||||||
} amduatd_cfg_t;
|
} amduatd_cfg_t;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
|
|
|
||||||
197
src/amduatd_derivation_index.c
Normal file
197
src/amduatd_derivation_index.c
Normal file
|
|
@ -0,0 +1,197 @@
|
||||||
|
#include "amduatd_derivation_index.h"
|
||||||
|
|
||||||
|
#include "amduat/asl/asl_derivation_index_fs.h"
|
||||||
|
#include "amduat/pel/core.h"
|
||||||
|
#include "amduat/pel/derivation_sid.h"
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
/* Reserve output_index values for non-output artifacts (result/trace/receipt). */
|
||||||
|
enum {
|
||||||
|
AMDUATD_DERIVATION_OUTPUT_INDEX_RESULT = UINT32_MAX,
|
||||||
|
AMDUATD_DERIVATION_OUTPUT_INDEX_TRACE = UINT32_MAX - 1u,
|
||||||
|
AMDUATD_DERIVATION_OUTPUT_INDEX_RECEIPT = UINT32_MAX - 2u
|
||||||
|
};
|
||||||
|
|
||||||
|
static bool amduatd_derivation_index_add_record(
|
||||||
|
amduat_asl_derivation_index_fs_t *index,
|
||||||
|
amduat_octets_t sid,
|
||||||
|
amduat_reference_t program_ref,
|
||||||
|
const amduat_reference_t *input_refs,
|
||||||
|
size_t input_refs_len,
|
||||||
|
bool has_params_ref,
|
||||||
|
amduat_reference_t params_ref,
|
||||||
|
amduat_reference_t artifact_ref,
|
||||||
|
uint32_t output_index,
|
||||||
|
amduat_asl_store_error_t *out_err) {
|
||||||
|
amduat_asl_derivation_record_t record;
|
||||||
|
amduat_octets_t record_sid = amduat_octets(NULL, 0u);
|
||||||
|
amduat_asl_store_error_t err;
|
||||||
|
|
||||||
|
if (!amduat_octets_clone(sid, &record_sid)) {
|
||||||
|
if (out_err != NULL) {
|
||||||
|
*out_err = AMDUAT_ASL_STORE_ERR_INTEGRITY;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
memset(&record, 0, sizeof(record));
|
||||||
|
record.sid = record_sid;
|
||||||
|
record.program_ref = program_ref;
|
||||||
|
record.output_index = output_index;
|
||||||
|
record.input_refs = (amduat_reference_t *)input_refs;
|
||||||
|
record.input_refs_len = input_refs_len;
|
||||||
|
record.has_params_ref = has_params_ref;
|
||||||
|
if (has_params_ref) {
|
||||||
|
record.params_ref = params_ref;
|
||||||
|
}
|
||||||
|
record.has_exec_profile = false;
|
||||||
|
record.exec_profile = amduat_octets(NULL, 0u);
|
||||||
|
|
||||||
|
err = amduat_asl_derivation_index_fs_add(index, artifact_ref, &record);
|
||||||
|
amduat_octets_free(&record.sid);
|
||||||
|
if (err != AMDUAT_ASL_STORE_OK) {
|
||||||
|
if (out_err != NULL) {
|
||||||
|
*out_err = err;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool amduatd_derivation_index_pel_run(const char *root_path,
|
||||||
|
bool enabled,
|
||||||
|
amduat_reference_t program_ref,
|
||||||
|
const amduat_reference_t *input_refs,
|
||||||
|
size_t input_refs_len,
|
||||||
|
bool has_params_ref,
|
||||||
|
amduat_reference_t params_ref,
|
||||||
|
const amduat_pel_run_result_t *run_result,
|
||||||
|
bool has_receipt_ref,
|
||||||
|
amduat_reference_t receipt_ref,
|
||||||
|
amduat_asl_store_error_t *out_err) {
|
||||||
|
amduat_asl_derivation_index_fs_t index;
|
||||||
|
amduat_pel_derivation_sid_input_t sid_input;
|
||||||
|
amduat_octets_t sid = amduat_octets(NULL, 0u);
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
if (out_err != NULL) {
|
||||||
|
*out_err = AMDUAT_ASL_STORE_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!enabled) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (root_path == NULL || root_path[0] == '\0' || run_result == NULL) {
|
||||||
|
if (out_err != NULL) {
|
||||||
|
*out_err = AMDUAT_ASL_STORE_ERR_INTEGRITY;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (!run_result->has_result_value) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (run_result->result_value.has_store_failure) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (run_result->result_value.core_result.status != AMDUAT_PEL_EXEC_STATUS_OK) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (run_result->output_refs_len > UINT32_MAX) {
|
||||||
|
if (out_err != NULL) {
|
||||||
|
*out_err = AMDUAT_ASL_STORE_ERR_INTEGRITY;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (!amduat_asl_derivation_index_fs_init(&index, root_path)) {
|
||||||
|
if (out_err != NULL) {
|
||||||
|
*out_err = AMDUAT_ASL_STORE_ERR_IO;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
memset(&sid_input, 0, sizeof(sid_input));
|
||||||
|
sid_input.program_ref = program_ref;
|
||||||
|
sid_input.input_refs = input_refs;
|
||||||
|
sid_input.input_refs_len = input_refs_len;
|
||||||
|
sid_input.has_params_ref = has_params_ref;
|
||||||
|
if (has_params_ref) {
|
||||||
|
sid_input.params_ref = params_ref;
|
||||||
|
}
|
||||||
|
sid_input.has_exec_profile = false;
|
||||||
|
sid_input.exec_profile = amduat_octets(NULL, 0u);
|
||||||
|
|
||||||
|
if (!amduat_pel_derivation_sid_compute(&sid_input, &sid)) {
|
||||||
|
if (out_err != NULL) {
|
||||||
|
*out_err = AMDUAT_ASL_STORE_ERR_INTEGRITY;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0u; i < run_result->output_refs_len; ++i) {
|
||||||
|
if (!amduatd_derivation_index_add_record(&index,
|
||||||
|
sid,
|
||||||
|
program_ref,
|
||||||
|
input_refs,
|
||||||
|
input_refs_len,
|
||||||
|
has_params_ref,
|
||||||
|
params_ref,
|
||||||
|
run_result->output_refs[i],
|
||||||
|
(uint32_t)i,
|
||||||
|
out_err)) {
|
||||||
|
amduat_octets_free(&sid);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!amduatd_derivation_index_add_record(&index,
|
||||||
|
sid,
|
||||||
|
program_ref,
|
||||||
|
input_refs,
|
||||||
|
input_refs_len,
|
||||||
|
has_params_ref,
|
||||||
|
params_ref,
|
||||||
|
run_result->result_ref,
|
||||||
|
AMDUATD_DERIVATION_OUTPUT_INDEX_RESULT,
|
||||||
|
out_err)) {
|
||||||
|
amduat_octets_free(&sid);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (run_result->result_value.has_trace_ref) {
|
||||||
|
if (!amduatd_derivation_index_add_record(
|
||||||
|
&index,
|
||||||
|
sid,
|
||||||
|
program_ref,
|
||||||
|
input_refs,
|
||||||
|
input_refs_len,
|
||||||
|
has_params_ref,
|
||||||
|
params_ref,
|
||||||
|
run_result->result_value.trace_ref,
|
||||||
|
AMDUATD_DERIVATION_OUTPUT_INDEX_TRACE,
|
||||||
|
out_err)) {
|
||||||
|
amduat_octets_free(&sid);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (has_receipt_ref) {
|
||||||
|
if (!amduatd_derivation_index_add_record(
|
||||||
|
&index,
|
||||||
|
sid,
|
||||||
|
program_ref,
|
||||||
|
input_refs,
|
||||||
|
input_refs_len,
|
||||||
|
has_params_ref,
|
||||||
|
params_ref,
|
||||||
|
receipt_ref,
|
||||||
|
AMDUATD_DERIVATION_OUTPUT_INDEX_RECEIPT,
|
||||||
|
out_err)) {
|
||||||
|
amduat_octets_free(&sid);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
amduat_octets_free(&sid);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
32
src/amduatd_derivation_index.h
Normal file
32
src/amduatd_derivation_index.h
Normal file
|
|
@ -0,0 +1,32 @@
|
||||||
|
#ifndef AMDUATD_DERIVATION_INDEX_H
|
||||||
|
#define AMDUATD_DERIVATION_INDEX_H
|
||||||
|
|
||||||
|
#include "amduat/asl/core.h"
|
||||||
|
#include "amduat/asl/store.h"
|
||||||
|
#include "amduat/pel/run.h"
|
||||||
|
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
bool amduatd_derivation_index_pel_run(const char *root_path,
|
||||||
|
bool enabled,
|
||||||
|
amduat_reference_t program_ref,
|
||||||
|
const amduat_reference_t *input_refs,
|
||||||
|
size_t input_refs_len,
|
||||||
|
bool has_params_ref,
|
||||||
|
amduat_reference_t params_ref,
|
||||||
|
const amduat_pel_run_result_t *run_result,
|
||||||
|
bool has_receipt_ref,
|
||||||
|
amduat_reference_t receipt_ref,
|
||||||
|
amduat_asl_store_error_t *out_err);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
} /* extern "C" */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* AMDUATD_DERIVATION_INDEX_H */
|
||||||
199
tests/test_amduatd_derivation_index.c
Normal file
199
tests/test_amduatd_derivation_index.c
Normal file
|
|
@ -0,0 +1,199 @@
|
||||||
|
#ifndef _POSIX_C_SOURCE
|
||||||
|
#define _POSIX_C_SOURCE 200809L
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "amduatd_derivation_index.h"
|
||||||
|
|
||||||
|
#include "amduat/asl/asl_derivation_index_fs.h"
|
||||||
|
#include "amduat/hash/asl1.h"
|
||||||
|
#include "amduat/pel/derivation_sid.h"
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
static char *amduatd_test_make_temp_dir(void) {
|
||||||
|
char tmpl[] = "/tmp/amduatd-deriv-XXXXXX";
|
||||||
|
char *dir = mkdtemp(tmpl);
|
||||||
|
size_t len;
|
||||||
|
char *copy;
|
||||||
|
if (dir == NULL) {
|
||||||
|
perror("mkdtemp");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
len = strlen(dir);
|
||||||
|
copy = (char *)malloc(len + 1u);
|
||||||
|
if (copy == NULL) {
|
||||||
|
fprintf(stderr, "failed to allocate temp dir copy\n");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
memcpy(copy, dir, len + 1u);
|
||||||
|
return copy;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool amduatd_test_make_ref(uint8_t seed, amduat_reference_t *out_ref) {
|
||||||
|
uint8_t *digest;
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
if (out_ref == NULL) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
digest = (uint8_t *)malloc(32u);
|
||||||
|
if (digest == NULL) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
for (i = 0u; i < 32u; ++i) {
|
||||||
|
digest[i] = (uint8_t)(seed + i);
|
||||||
|
}
|
||||||
|
*out_ref = amduat_reference(AMDUAT_HASH_ASL1_ID_SHA256,
|
||||||
|
amduat_octets(digest, 32u));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(void) {
|
||||||
|
char *root = amduatd_test_make_temp_dir();
|
||||||
|
amduat_asl_derivation_index_fs_t index;
|
||||||
|
amduat_reference_t program_ref;
|
||||||
|
amduat_reference_t input_ref;
|
||||||
|
amduat_reference_t output_ref;
|
||||||
|
amduat_reference_t result_ref;
|
||||||
|
amduat_reference_t params_ref;
|
||||||
|
amduat_reference_t input_refs[1];
|
||||||
|
amduat_reference_t output_refs[1];
|
||||||
|
amduat_pel_run_result_t run_result;
|
||||||
|
amduat_asl_derivation_record_t *records = NULL;
|
||||||
|
size_t record_count = 0u;
|
||||||
|
amduat_asl_store_error_t err;
|
||||||
|
|
||||||
|
if (root == NULL) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!amduatd_test_make_ref(1u, &program_ref) ||
|
||||||
|
!amduatd_test_make_ref(2u, &input_ref) ||
|
||||||
|
!amduatd_test_make_ref(3u, &output_ref) ||
|
||||||
|
!amduatd_test_make_ref(4u, &result_ref)) {
|
||||||
|
fprintf(stderr, "failed to build refs\n");
|
||||||
|
free(root);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
input_refs[0] = input_ref;
|
||||||
|
output_refs[0] = output_ref;
|
||||||
|
memset(¶ms_ref, 0, sizeof(params_ref));
|
||||||
|
memset(&run_result, 0, sizeof(run_result));
|
||||||
|
run_result.has_result_value = true;
|
||||||
|
run_result.result_value.core_result.status = AMDUAT_PEL_EXEC_STATUS_OK;
|
||||||
|
run_result.result_value.has_store_failure = false;
|
||||||
|
run_result.output_refs = output_refs;
|
||||||
|
run_result.output_refs_len = 1u;
|
||||||
|
run_result.result_ref = result_ref;
|
||||||
|
|
||||||
|
err = AMDUAT_ASL_STORE_OK;
|
||||||
|
if (!amduatd_derivation_index_pel_run(root,
|
||||||
|
false,
|
||||||
|
program_ref,
|
||||||
|
input_refs,
|
||||||
|
1u,
|
||||||
|
false,
|
||||||
|
params_ref,
|
||||||
|
&run_result,
|
||||||
|
false,
|
||||||
|
params_ref,
|
||||||
|
&err)) {
|
||||||
|
fprintf(stderr, "unexpected derivation index failure when disabled\n");
|
||||||
|
free(root);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!amduat_asl_derivation_index_fs_init(&index, root)) {
|
||||||
|
fprintf(stderr, "failed to init derivation index\n");
|
||||||
|
free(root);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
err = amduat_asl_derivation_index_fs_list(&index, output_ref,
|
||||||
|
&records, &record_count);
|
||||||
|
if (err != AMDUAT_ASL_STORE_ERR_NOT_FOUND) {
|
||||||
|
fprintf(stderr, "expected no records when disabled, got %d\n", (int)err);
|
||||||
|
free(root);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
err = AMDUAT_ASL_STORE_OK;
|
||||||
|
if (!amduatd_derivation_index_pel_run(root,
|
||||||
|
true,
|
||||||
|
program_ref,
|
||||||
|
input_refs,
|
||||||
|
1u,
|
||||||
|
false,
|
||||||
|
params_ref,
|
||||||
|
&run_result,
|
||||||
|
false,
|
||||||
|
params_ref,
|
||||||
|
&err)) {
|
||||||
|
fprintf(stderr, "expected derivation index to succeed\n");
|
||||||
|
free(root);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
err = amduat_asl_derivation_index_fs_list(&index, output_ref,
|
||||||
|
&records, &record_count);
|
||||||
|
if (err != AMDUAT_ASL_STORE_OK || record_count != 1u) {
|
||||||
|
fprintf(stderr, "expected one derivation record, got %d count=%zu\n",
|
||||||
|
(int)err, record_count);
|
||||||
|
free(root);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
amduat_pel_derivation_sid_input_t sid_input;
|
||||||
|
amduat_octets_t sid = amduat_octets(NULL, 0u);
|
||||||
|
|
||||||
|
memset(&sid_input, 0, sizeof(sid_input));
|
||||||
|
sid_input.program_ref = program_ref;
|
||||||
|
sid_input.input_refs = input_refs;
|
||||||
|
sid_input.input_refs_len = 1u;
|
||||||
|
sid_input.has_params_ref = false;
|
||||||
|
sid_input.has_exec_profile = false;
|
||||||
|
sid_input.exec_profile = amduat_octets(NULL, 0u);
|
||||||
|
|
||||||
|
if (!amduat_pel_derivation_sid_compute(&sid_input, &sid)) {
|
||||||
|
fprintf(stderr, "failed to compute expected sid\n");
|
||||||
|
amduat_asl_derivation_records_free(records, record_count);
|
||||||
|
free(root);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!amduat_octets_eq(records[0].sid, sid)) {
|
||||||
|
fprintf(stderr, "sid mismatch\n");
|
||||||
|
amduat_octets_free(&sid);
|
||||||
|
amduat_asl_derivation_records_free(records, record_count);
|
||||||
|
free(root);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if (!amduat_reference_eq(records[0].program_ref, program_ref)) {
|
||||||
|
fprintf(stderr, "program_ref mismatch\n");
|
||||||
|
amduat_octets_free(&sid);
|
||||||
|
amduat_asl_derivation_records_free(records, record_count);
|
||||||
|
free(root);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if (records[0].output_index != 0u) {
|
||||||
|
fprintf(stderr, "output_index mismatch\n");
|
||||||
|
amduat_octets_free(&sid);
|
||||||
|
amduat_asl_derivation_records_free(records, record_count);
|
||||||
|
free(root);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
amduat_octets_free(&sid);
|
||||||
|
}
|
||||||
|
|
||||||
|
amduat_asl_derivation_records_free(records, record_count);
|
||||||
|
amduat_reference_free(&program_ref);
|
||||||
|
amduat_reference_free(&input_ref);
|
||||||
|
amduat_reference_free(&output_ref);
|
||||||
|
amduat_reference_free(&result_ref);
|
||||||
|
free(root);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
Loading…
Reference in a new issue