198 lines
6.1 KiB
C
198 lines
6.1 KiB
C
#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;
|
|
}
|