Added result information to TPMRA workitems
On the occasion got rid of complicated functional component stuff
This commit is contained in:
@@ -767,8 +767,10 @@ METHOD(imv_agent_if_t, solicit_recommendation, TNC_Result,
|
|||||||
TNC_IMV_Action_Recommendation rec;
|
TNC_IMV_Action_Recommendation rec;
|
||||||
imv_workitem_t *workitem;
|
imv_workitem_t *workitem;
|
||||||
enumerator_t *enumerator;
|
enumerator_t *enumerator;
|
||||||
char *result_str;
|
|
||||||
int pending_file_meas = 0;
|
int pending_file_meas = 0;
|
||||||
|
char *result_str;
|
||||||
|
chunk_t result_buf;
|
||||||
|
bio_writer_t *result;
|
||||||
|
|
||||||
enumerator = session->create_workitem_enumerator(session);
|
enumerator = session->create_workitem_enumerator(session);
|
||||||
if (enumerator)
|
if (enumerator)
|
||||||
@@ -779,18 +781,25 @@ METHOD(imv_agent_if_t, solicit_recommendation, TNC_Result,
|
|||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
result = bio_writer_create(128);
|
||||||
|
|
||||||
switch (workitem->get_type(workitem))
|
switch (workitem->get_type(workitem))
|
||||||
{
|
{
|
||||||
case IMV_WORKITEM_FILE_REF_MEAS:
|
case IMV_WORKITEM_FILE_REF_MEAS:
|
||||||
case IMV_WORKITEM_FILE_MEAS:
|
case IMV_WORKITEM_FILE_MEAS:
|
||||||
case IMV_WORKITEM_DIR_REF_MEAS:
|
case IMV_WORKITEM_DIR_REF_MEAS:
|
||||||
case IMV_WORKITEM_DIR_MEAS:
|
case IMV_WORKITEM_DIR_MEAS:
|
||||||
result_str = "Pending file measurements";
|
result_str = "pending file measurements";
|
||||||
pending_file_meas++;
|
pending_file_meas++;
|
||||||
break;
|
break;
|
||||||
case IMV_WORKITEM_TPM_ATTEST:
|
case IMV_WORKITEM_TPM_ATTEST:
|
||||||
attestation_state->finalize_components(attestation_state);
|
attestation_state->finalize_components(attestation_state,
|
||||||
result_str = "Pending component evidence";
|
result);
|
||||||
|
result->write_data(result,
|
||||||
|
chunk_from_str("; Pending component evidence"));
|
||||||
|
result->write_uint8(result, '\0');
|
||||||
|
result_buf = result->get_buf(result);
|
||||||
|
result_str = result_buf.ptr;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
continue;
|
continue;
|
||||||
@@ -801,6 +810,7 @@ METHOD(imv_agent_if_t, solicit_recommendation, TNC_Result,
|
|||||||
state->update_recommendation(state, rec, eval);
|
state->update_recommendation(state, rec, eval);
|
||||||
imcv_db->finalize_workitem(imcv_db, workitem);
|
imcv_db->finalize_workitem(imcv_db, workitem);
|
||||||
workitem->destroy(workitem);
|
workitem->destroy(workitem);
|
||||||
|
result->destroy(result);
|
||||||
}
|
}
|
||||||
enumerator->destroy(enumerator);
|
enumerator->destroy(enumerator);
|
||||||
|
|
||||||
|
|||||||
@@ -419,10 +419,12 @@ bool imv_attestation_process(pa_tnc_attr_t *attr, imv_msg_t *out_msg,
|
|||||||
uint8_t flags;
|
uint8_t flags;
|
||||||
pts_meas_algorithms_t comp_hash_algorithm;
|
pts_meas_algorithms_t comp_hash_algorithm;
|
||||||
chunk_t pcr_comp, tpm_quote_sig, evid_sig;
|
chunk_t pcr_comp, tpm_quote_sig, evid_sig;
|
||||||
chunk_t pcr_composite, quote_info;
|
chunk_t pcr_composite, quote_info, result_buf;
|
||||||
imv_workitem_t *workitem;
|
imv_workitem_t *workitem;
|
||||||
|
imv_reason_string_t *reason_string;
|
||||||
enumerator_t *enumerator;
|
enumerator_t *enumerator;
|
||||||
bool use_quote2, use_ver_info;
|
bool use_quote2, use_ver_info;
|
||||||
|
bio_writer_t *result;
|
||||||
|
|
||||||
attr_cast = (tcg_pts_attr_simple_evid_final_t*)attr;
|
attr_cast = (tcg_pts_attr_simple_evid_final_t*)attr;
|
||||||
flags = attr_cast->get_quote_info(attr_cast, &comp_hash_algorithm,
|
flags = attr_cast->get_quote_info(attr_cast, &comp_hash_algorithm,
|
||||||
@@ -468,7 +470,9 @@ quote_error:
|
|||||||
* Finalize any pending measurement registrations and check
|
* Finalize any pending measurement registrations and check
|
||||||
* if all expected component measurements were received
|
* if all expected component measurements were received
|
||||||
*/
|
*/
|
||||||
attestation_state->finalize_components(attestation_state);
|
result = bio_writer_create(128);
|
||||||
|
attestation_state->finalize_components(attestation_state,
|
||||||
|
result);
|
||||||
|
|
||||||
enumerator = session->create_workitem_enumerator(session);
|
enumerator = session->create_workitem_enumerator(session);
|
||||||
while (enumerator->enumerate(enumerator, &workitem))
|
while (enumerator->enumerate(enumerator, &workitem))
|
||||||
@@ -477,7 +481,6 @@ quote_error:
|
|||||||
{
|
{
|
||||||
TNC_IMV_Action_Recommendation rec;
|
TNC_IMV_Action_Recommendation rec;
|
||||||
TNC_IMV_Evaluation_Result eval;
|
TNC_IMV_Evaluation_Result eval;
|
||||||
char *result_str;
|
|
||||||
uint32_t error;
|
uint32_t error;
|
||||||
|
|
||||||
error = attestation_state->get_measurement_error(
|
error = attestation_state->get_measurement_error(
|
||||||
@@ -486,32 +489,33 @@ quote_error:
|
|||||||
IMV_ATTESTATION_ERROR_COMP_EVID_PEND |
|
IMV_ATTESTATION_ERROR_COMP_EVID_PEND |
|
||||||
IMV_ATTESTATION_ERROR_TPM_QUOTE_FAIL))
|
IMV_ATTESTATION_ERROR_TPM_QUOTE_FAIL))
|
||||||
{
|
{
|
||||||
imv_reason_string_t *reason_string;
|
|
||||||
chunk_t result;
|
|
||||||
|
|
||||||
reason_string = imv_reason_string_create("en", ", ");
|
reason_string = imv_reason_string_create("en", ", ");
|
||||||
attestation_state->add_comp_evid_reasons(
|
attestation_state->add_comp_evid_reasons(
|
||||||
attestation_state, reason_string);
|
attestation_state, reason_string);
|
||||||
result = reason_string->get_encoding(reason_string);
|
result->write_data(result, chunk_from_str("; "));
|
||||||
result_str = strndup(result.ptr, result.len);
|
result->write_data(result,
|
||||||
|
reason_string->get_encoding(reason_string));
|
||||||
reason_string->destroy(reason_string);
|
reason_string->destroy(reason_string);
|
||||||
eval = TNC_IMV_EVALUATION_RESULT_NONCOMPLIANT_MINOR;
|
eval = TNC_IMV_EVALUATION_RESULT_NONCOMPLIANT_MINOR;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
result_str = strdup("attestation successful");
|
|
||||||
eval = TNC_IMV_EVALUATION_RESULT_COMPLIANT;
|
eval = TNC_IMV_EVALUATION_RESULT_COMPLIANT;
|
||||||
}
|
}
|
||||||
session->remove_workitem(session, enumerator);
|
session->remove_workitem(session, enumerator);
|
||||||
rec = workitem->set_result(workitem, result_str, eval);
|
|
||||||
|
result->write_uint8(result, '\0');
|
||||||
|
result_buf = result->get_buf(result);
|
||||||
|
rec = workitem->set_result(workitem, result_buf.ptr,
|
||||||
|
eval);
|
||||||
state->update_recommendation(state, rec, eval);
|
state->update_recommendation(state, rec, eval);
|
||||||
imcv_db->finalize_workitem(imcv_db, workitem);
|
imcv_db->finalize_workitem(imcv_db, workitem);
|
||||||
workitem->destroy(workitem);
|
workitem->destroy(workitem);
|
||||||
free(result_str);
|
|
||||||
attestation_state->set_handshake_state(attestation_state,
|
attestation_state->set_handshake_state(attestation_state,
|
||||||
IMV_ATTESTATION_STATE_END);
|
IMV_ATTESTATION_STATE_END);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
result->destroy(result);
|
||||||
}
|
}
|
||||||
enumerator->destroy(enumerator);
|
enumerator->destroy(enumerator);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -467,15 +467,25 @@ METHOD(imv_attestation_state_t, set_measurement_error, void,
|
|||||||
}
|
}
|
||||||
|
|
||||||
METHOD(imv_attestation_state_t, finalize_components, void,
|
METHOD(imv_attestation_state_t, finalize_components, void,
|
||||||
private_imv_attestation_state_t *this)
|
private_imv_attestation_state_t *this, bio_writer_t *result)
|
||||||
{
|
{
|
||||||
func_comp_t *entry;
|
func_comp_t *entry;
|
||||||
|
bool first = TRUE;
|
||||||
|
|
||||||
while (this->components->remove_last(this->components,
|
while (this->components->remove_last(this->components,
|
||||||
(void**)&entry) == SUCCESS)
|
(void**)&entry) == SUCCESS)
|
||||||
{
|
{
|
||||||
|
if (first)
|
||||||
|
{
|
||||||
|
first = FALSE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result->write_data(result, chunk_from_str("; "));
|
||||||
|
}
|
||||||
if (!entry->comp->finalize(entry->comp,
|
if (!entry->comp->finalize(entry->comp,
|
||||||
entry->name->get_qualifier(entry->name)))
|
entry->name->get_qualifier(entry->name),
|
||||||
|
result))
|
||||||
{
|
{
|
||||||
set_measurement_error(this, IMV_ATTESTATION_ERROR_COMP_EVID_PEND);
|
set_measurement_error(this, IMV_ATTESTATION_ERROR_COMP_EVID_PEND);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -29,7 +29,9 @@
|
|||||||
#include <pts/pts.h>
|
#include <pts/pts.h>
|
||||||
#include <pts/pts_database.h>
|
#include <pts/pts_database.h>
|
||||||
#include <pts/components/pts_component.h>
|
#include <pts/components/pts_component.h>
|
||||||
|
|
||||||
#include <library.h>
|
#include <library.h>
|
||||||
|
#include <bio/bio_writer.h>
|
||||||
|
|
||||||
typedef struct imv_attestation_state_t imv_attestation_state_t;
|
typedef struct imv_attestation_state_t imv_attestation_state_t;
|
||||||
typedef enum imv_attestation_flag_t imv_attestation_flag_t;
|
typedef enum imv_attestation_flag_t imv_attestation_flag_t;
|
||||||
@@ -140,8 +142,11 @@ struct imv_attestation_state_t {
|
|||||||
/**
|
/**
|
||||||
* Tell the Functional Components to finalize any measurement registrations
|
* Tell the Functional Components to finalize any measurement registrations
|
||||||
* and to check if all expected measurements were received
|
* and to check if all expected measurements were received
|
||||||
|
*
|
||||||
|
* @param result Writer appending component measurement results
|
||||||
*/
|
*/
|
||||||
void (*finalize_components)(imv_attestation_state_t *this);
|
void (*finalize_components)(imv_attestation_state_t *this,
|
||||||
|
bio_writer_t *result);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Indicates the types of measurement errors that occurred
|
* Indicates the types of measurement errors that occurred
|
||||||
|
|||||||
@@ -798,16 +798,12 @@ METHOD(pts_component_t, verify, status_t,
|
|||||||
}
|
}
|
||||||
|
|
||||||
METHOD(pts_component_t, finalize, bool,
|
METHOD(pts_component_t, finalize, bool,
|
||||||
pts_ita_comp_ima_t *this, u_int8_t qualifier)
|
pts_ita_comp_ima_t *this, u_int8_t qualifier, bio_writer_t *result)
|
||||||
{
|
{
|
||||||
u_int32_t vid, name;
|
char result_buf[BUF_LEN];
|
||||||
enum_name_t *names;
|
|
||||||
bool success = TRUE;
|
bool success = TRUE;
|
||||||
|
|
||||||
this->name->set_qualifier(this->name, qualifier);
|
this->name->set_qualifier(this->name, qualifier);
|
||||||
vid = this->name->get_vendor_id(this->name);
|
|
||||||
name = this->name->get_name(this->name);
|
|
||||||
names = pts_components->get_comp_func_names(pts_components, vid);
|
|
||||||
|
|
||||||
if (qualifier == (PTS_ITA_QUALIFIER_FLAG_KERNEL |
|
if (qualifier == (PTS_ITA_QUALIFIER_FLAG_KERNEL |
|
||||||
PTS_ITA_QUALIFIER_TYPE_TRUSTED))
|
PTS_ITA_QUALIFIER_TYPE_TRUSTED))
|
||||||
@@ -818,16 +814,21 @@ METHOD(pts_component_t, finalize, bool,
|
|||||||
/* close registration */
|
/* close registration */
|
||||||
this->is_bios_registering = FALSE;
|
this->is_bios_registering = FALSE;
|
||||||
|
|
||||||
DBG1(DBG_PTS, "registered %d %N '%N' BIOS evidence measurements",
|
snprintf(result_buf, BUF_LEN, "registered %d BIOS evidence "
|
||||||
this->seq_no, pen_names, vid, names, name);
|
"measurements", this->seq_no);
|
||||||
}
|
}
|
||||||
else if (this->seq_no < this->bios_count)
|
else if (this->seq_no < this->bios_count)
|
||||||
{
|
{
|
||||||
DBG1(DBG_PTS, "%d of %d %N '%N' BIOS evidence measurements missing",
|
snprintf(result_buf, BUF_LEN, "%d of %d BIOS evidence "
|
||||||
this->bios_count - this->seq_no, this->bios_count,
|
"measurements missing", this->bios_count - this->seq_no,
|
||||||
pen_names, vid, names, name);
|
this->bios_count);
|
||||||
success = FALSE;
|
success = FALSE;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
snprintf(result_buf, BUF_LEN, "%d BIOS evidence "
|
||||||
|
"measurements are ok", this->bios_count);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (qualifier == (PTS_ITA_QUALIFIER_FLAG_KERNEL |
|
else if (qualifier == (PTS_ITA_QUALIFIER_FLAG_KERNEL |
|
||||||
PTS_ITA_QUALIFIER_TYPE_OS))
|
PTS_ITA_QUALIFIER_TYPE_OS))
|
||||||
@@ -838,26 +839,29 @@ METHOD(pts_component_t, finalize, bool,
|
|||||||
/* close registration */
|
/* close registration */
|
||||||
this->is_ima_registering = FALSE;
|
this->is_ima_registering = FALSE;
|
||||||
|
|
||||||
DBG1(DBG_PTS, "registered %N '%N' boot aggregate evidence "
|
snprintf(result_buf, BUF_LEN, "registered boot aggregate "
|
||||||
"measurement", pen_names, vid, names, name);
|
"evidence measurement");
|
||||||
}
|
}
|
||||||
if (this->count)
|
else if (this->count)
|
||||||
{
|
{
|
||||||
DBG1(DBG_PTS, "processed %d %N '%N' file evidence measurements: "
|
snprintf(result_buf, BUF_LEN, "processed %d file evidence "
|
||||||
"%d ok, %d unknown, %d differ, %d failed",
|
"measurements: %d ok, %d unknown, %d differ, %d failed",
|
||||||
this->count, pen_names, vid, names, name,
|
this->count, this->count_ok, this->count_unknown,
|
||||||
this->count_ok, this->count_unknown,
|
this->count_differ, this->count_failed);
|
||||||
this->count_differ, this->count_failed);
|
|
||||||
success = !this->count_differ && !this->count_failed;
|
success = !this->count_differ && !this->count_failed;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
DBG1(DBG_PTS, "unsupported functional component name qualifier");
|
snprintf(result_buf, BUF_LEN, "unsupported functional component name "
|
||||||
|
"qualifier");
|
||||||
success = FALSE;
|
success = FALSE;
|
||||||
}
|
}
|
||||||
this->name->set_qualifier(this->name, PTS_QUALIFIER_UNKNOWN);
|
this->name->set_qualifier(this->name, PTS_QUALIFIER_UNKNOWN);
|
||||||
|
|
||||||
|
DBG1(DBG_PTS, "%s", result_buf);
|
||||||
|
result->write_data(result, chunk_from_str(result_buf));
|
||||||
|
|
||||||
return success;
|
return success;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -872,34 +876,30 @@ METHOD(pts_component_t, destroy, void,
|
|||||||
pts_ita_comp_ima_t *this)
|
pts_ita_comp_ima_t *this)
|
||||||
{
|
{
|
||||||
int count;
|
int count;
|
||||||
u_int32_t vid, name;
|
|
||||||
enum_name_t *names;
|
|
||||||
|
|
||||||
if (ref_put(&this->ref))
|
if (ref_put(&this->ref))
|
||||||
{
|
{
|
||||||
vid = this->name->get_vendor_id(this->name);
|
|
||||||
name = this->name->get_name(this->name);
|
|
||||||
names = pts_components->get_comp_func_names(pts_components, vid);
|
|
||||||
|
|
||||||
if (this->is_bios_registering)
|
if (this->is_bios_registering)
|
||||||
{
|
{
|
||||||
count = this->pts_db->delete_comp_measurements(this->pts_db,
|
count = this->pts_db->delete_comp_measurements(this->pts_db,
|
||||||
this->bios_cid, this->aik_id);
|
this->bios_cid, this->aik_id);
|
||||||
DBG1(DBG_PTS, "deleted %d registered %N '%N' BIOS evidence "
|
DBG1(DBG_PTS, "deleted %d registered BIOS evidence measurements",
|
||||||
"measurements", count, pen_names, vid, names, name);
|
count);
|
||||||
}
|
}
|
||||||
if (this->is_ima_registering)
|
if (this->is_ima_registering)
|
||||||
{
|
{
|
||||||
count = this->pts_db->delete_comp_measurements(this->pts_db,
|
count = this->pts_db->delete_comp_measurements(this->pts_db,
|
||||||
this->ima_cid, this->aik_id);
|
this->ima_cid, this->aik_id);
|
||||||
DBG1(DBG_PTS, "deleted registered %N '%N' boot aggregate evidence "
|
DBG1(DBG_PTS, "deleted registered boot aggregate evidence "
|
||||||
"measurement", pen_names, vid, names, name);
|
"measurement");
|
||||||
}
|
}
|
||||||
this->bios_list->destroy_function(this->bios_list,
|
this->bios_list->destroy_function(this->bios_list,
|
||||||
(void *)free_bios_entry);
|
(void *)free_bios_entry);
|
||||||
this->ima_list->destroy_function(this->ima_list,
|
this->ima_list->destroy_function(this->ima_list,
|
||||||
(void *)free_ima_entry);
|
(void *)free_ima_entry);
|
||||||
this->name->destroy(this->name);
|
this->name->destroy(this->name);
|
||||||
|
|
||||||
free(this);
|
free(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -269,30 +269,31 @@ METHOD(pts_component_t, verify, status_t,
|
|||||||
}
|
}
|
||||||
|
|
||||||
METHOD(pts_component_t, finalize, bool,
|
METHOD(pts_component_t, finalize, bool,
|
||||||
pts_ita_comp_tboot_t *this, u_int8_t qualifier)
|
pts_ita_comp_tboot_t *this, u_int8_t qualifier, bio_writer_t *result)
|
||||||
{
|
{
|
||||||
u_int32_t vid, name;
|
char result_buf[BUF_LEN];
|
||||||
enum_name_t *names;
|
|
||||||
|
|
||||||
vid = this->name->get_vendor_id(this->name);
|
|
||||||
name = this->name->get_name(this->name);
|
|
||||||
names = pts_components->get_comp_func_names(pts_components, vid);
|
|
||||||
|
|
||||||
if (this->is_registering)
|
if (this->is_registering)
|
||||||
{
|
{
|
||||||
/* close registration */
|
/* close registration */
|
||||||
this->is_registering = FALSE;
|
this->is_registering = FALSE;
|
||||||
|
|
||||||
DBG1(DBG_PTS, "registered %d %N '%N' functional component evidence "
|
snprintf(result_buf, BUF_LEN, "registered %d evidence measurements",
|
||||||
"measurements", this->seq_no, pen_names, vid, names, name);
|
this->seq_no);
|
||||||
}
|
}
|
||||||
else if (this->seq_no < this->count)
|
else if (this->seq_no < this->count)
|
||||||
{
|
{
|
||||||
DBG1(DBG_PTS, "%d of %d %N '%N' functional component evidence "
|
snprintf(result_buf, BUF_LEN, "%d of %d evidence measurements "
|
||||||
"measurements missing", this->count - this->seq_no,
|
"missing", this->count - this->seq_no, this->count);
|
||||||
this->count, pen_names, vid, names, name);
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
snprintf(result_buf, BUF_LEN, "%d evidence measurements are ok",
|
||||||
|
this->count);
|
||||||
|
}
|
||||||
|
DBG1(DBG_PTS, "%s", result_buf);
|
||||||
|
result->write_data(result, chunk_from_str(result_buf));
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -49,7 +49,6 @@ struct pts_ita_comp_tgrub_t {
|
|||||||
*/
|
*/
|
||||||
pts_database_t *pts_db;
|
pts_database_t *pts_db;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Reference count
|
* Reference count
|
||||||
*/
|
*/
|
||||||
@@ -155,7 +154,7 @@ METHOD(pts_component_t, verify, status_t,
|
|||||||
}
|
}
|
||||||
|
|
||||||
METHOD(pts_component_t, finalize, bool,
|
METHOD(pts_component_t, finalize, bool,
|
||||||
pts_ita_comp_tgrub_t *this, u_int8_t qualifier)
|
pts_ita_comp_tgrub_t *this, u_int8_t qualifier, bio_writer_t *result)
|
||||||
{
|
{
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ typedef struct pts_component_t pts_component_t;
|
|||||||
#include "pts/components/pts_comp_evidence.h"
|
#include "pts/components/pts_comp_evidence.h"
|
||||||
|
|
||||||
#include <library.h>
|
#include <library.h>
|
||||||
|
#include <bio/bio_writer.h>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* PTS Functional Component Interface
|
* PTS Functional Component Interface
|
||||||
@@ -85,9 +86,11 @@ struct pts_component_t {
|
|||||||
* and check for missing measurements
|
* and check for missing measurements
|
||||||
*
|
*
|
||||||
* @param qualifier PTS Component Functional Name Qualifier
|
* @param qualifier PTS Component Functional Name Qualifier
|
||||||
|
* @param result writer appending concise measurement result
|
||||||
* @return TRUE if finalization successful
|
* @return TRUE if finalization successful
|
||||||
*/
|
*/
|
||||||
bool (*finalize)(pts_component_t *this, u_int8_t qualifier);
|
bool (*finalize)(pts_component_t *this, u_int8_t qualifier,
|
||||||
|
bio_writer_t *result);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get a new reference to the PTS Functional Component
|
* Get a new reference to the PTS Functional Component
|
||||||
|
|||||||
Reference in New Issue
Block a user