static TNC_Result receive_message(imc_android_state_t *state, imc_msg_t *in_msg) { imc_msg_t *out_msg; enumerator_t *enumerator; pa_tnc_attr_t *attr; pen_type_t attr_type; TNC_Result result; bool fatal_error = FALSE; out_msg = imc_msg_create_as_reply(in_msg); /* parse received PA-TNC message and handle local and remote errors */ result = in_msg->receive(in_msg, out_msg, &fatal_error); if (result != TNC_RESULT_SUCCESS) { out_msg->destroy(out_msg); return result; } /* analyze PA-TNC attributes */ enumerator = in_msg->create_attribute_enumerator(in_msg); while (enumerator->enumerate(enumerator, &attr)) { attr_type = attr->get_type(attr); switch (attr_type.vendor_id) { case PEN_IETF: handle_ietf_attribute(attr_type, attr, out_msg); continue; case PEN_ITA: handle_ita_attribute(attr_type, attr, out_msg); continue; case PEN_TCG: handle_tcg_attribute(state, attr_type, attr, out_msg); continue; default: continue; } } enumerator->destroy(enumerator); if (fatal_error) { result = TNC_RESULT_FATAL; } else { result = out_msg->send(out_msg, TRUE); } out_msg->destroy(out_msg); return result; }
static TNC_Result receive_message(imc_msg_t *in_msg) { imc_msg_t *out_msg; enumerator_t *enumerator; pa_tnc_attr_t *attr; pen_type_t attr_type; TNC_Result result; bool fatal_error = FALSE; /* parse received PA-TNC message and handle local and remote errors */ result = in_msg->receive(in_msg, &fatal_error); if (result != TNC_RESULT_SUCCESS) { return result; } out_msg = imc_msg_create_as_reply(in_msg); /* analyze PA-TNC attributes */ enumerator = in_msg->create_attribute_enumerator(in_msg); while (enumerator->enumerate(enumerator, &attr)) { attr_type = attr->get_type(attr); if (attr_type.vendor_id != PEN_IETF) { continue; } if (attr_type.type == IETF_ATTR_ATTRIBUTE_REQUEST) { ietf_attr_attr_request_t *attr_cast; pen_type_t *entry; enumerator_t *e; attr_cast = (ietf_attr_attr_request_t*)attr; e = attr_cast->create_enumerator(attr_cast); while (e->enumerate(e, &entry)) { if (entry->vendor_id != PEN_IETF) { continue; } switch (entry->type) { case IETF_ATTR_PRODUCT_INFORMATION: add_product_info(out_msg); break; case IETF_ATTR_STRING_VERSION: add_string_version(out_msg); break; case IETF_ATTR_OPERATIONAL_STATUS: add_op_status(out_msg); break; case IETF_ATTR_FORWARDING_ENABLED: add_fwd_enabled(out_msg); break; case IETF_ATTR_FACTORY_DEFAULT_PWD_ENABLED: add_default_pwd_enabled(out_msg); break; case IETF_ATTR_INSTALLED_PACKAGES: add_installed_packages(out_msg); break; default: break; } } e->destroy(e); } } enumerator->destroy(enumerator); if (fatal_error) { result = TNC_RESULT_FATAL; } else { result = out_msg->send(out_msg, TRUE); } out_msg->destroy(out_msg); return result; }
static TNC_Result receive_message(imc_msg_t *in_msg) { imc_msg_t *out_msg; enumerator_t *enumerator; pa_tnc_attr_t *attr; pen_type_t attr_type; TNC_Result result = TNC_RESULT_SUCCESS; bool fatal_error = FALSE; /* generate an outgoing PA-TNC message - we might need it */ out_msg = imc_msg_create_as_reply(in_msg); /* parse received PA-TNC message and handle local and remote errors */ result = in_msg->receive(in_msg, out_msg, &fatal_error); if (result != TNC_RESULT_SUCCESS) { out_msg->destroy(out_msg); return result; } /* analyze PA-TNC attributes */ enumerator = in_msg->create_attribute_enumerator(in_msg); while (enumerator->enumerate(enumerator, &attr)) { attr_type = attr->get_type(attr); if (attr_type.vendor_id != PEN_IETF) { continue; } if (attr_type.type == IETF_ATTR_ATTRIBUTE_REQUEST) { ietf_attr_attr_request_t *attr_cast; pen_type_t *entry; enumerator_t *e; attr_cast = (ietf_attr_attr_request_t*)attr; e = attr_cast->create_enumerator(attr_cast); while (e->enumerate(e, &entry)) { if (entry->vendor_id != PEN_IETF) { continue; } switch (entry->type) { case IETF_ATTR_PORT_FILTER: result = add_port_filter(out_msg); break; default: break; } } e->destroy(e); } } enumerator->destroy(enumerator); if (fatal_error) { result = TNC_RESULT_FATAL; } else if (result == TNC_RESULT_SUCCESS) { /* send PA-TNC message with the EXCL flag set */ result = out_msg->send(out_msg, TRUE); } out_msg->destroy(out_msg); return result; }
static TNC_Result receive_message(imc_state_t *state, imc_msg_t *in_msg) { imc_msg_t *out_msg; pa_tnc_attr_t *attr; enumerator_t *enumerator; pen_type_t type; TNC_Result result; bool fatal_error = FALSE; /* parse received PA-TNC message and handle local and remote errors */ result = in_msg->receive(in_msg, &fatal_error); if (result != TNC_RESULT_SUCCESS) { return result; } out_msg = imc_msg_create_as_reply(in_msg); /* analyze PA-TNC attributes */ enumerator = in_msg->create_attribute_enumerator(in_msg); while (enumerator->enumerate(enumerator, &attr)) { tcg_swid_attr_req_t *attr_req; uint8_t flags; uint32_t request_id; bool full_tags; swid_inventory_t *targets; type = attr->get_type(attr); if (type.vendor_id != PEN_TCG || type.type != TCG_SWID_REQUEST) { continue; } attr_req = (tcg_swid_attr_req_t*)attr; flags = attr_req->get_flags(attr_req); request_id = attr_req->get_request_id(attr_req); targets = attr_req->get_targets(attr_req); if (flags & (TCG_SWID_ATTR_REQ_FLAG_S | TCG_SWID_ATTR_REQ_FLAG_C)) { attr = swid_error_create(TCG_SWID_SUBSCRIPTION_DENIED, request_id, 0, "no subscription available yet"); out_msg->add_attribute(out_msg, attr); break; } full_tags = (flags & TCG_SWID_ATTR_REQ_FLAG_R) == 0; if (!add_swid_inventory(state, out_msg, request_id, full_tags, targets)) { break; } } enumerator->destroy(enumerator); if (fatal_error) { result = TNC_RESULT_FATAL; } else { result = out_msg->send(out_msg, TRUE); } out_msg->destroy(out_msg); return result; }
static TNC_Result receive_message(imc_state_t *state, imc_msg_t *in_msg) { imc_msg_t *out_msg; imc_attestation_state_t *attestation_state; enumerator_t *enumerator; pa_tnc_attr_t *attr; pen_type_t type; TNC_Result result; bool fatal_error = FALSE; /* parse received PA-TNC message and handle local and remote errors */ result = in_msg->receive(in_msg, &fatal_error); if (result != TNC_RESULT_SUCCESS) { return result; } out_msg = imc_msg_create_as_reply(in_msg); /* analyze PA-TNC attributes */ enumerator = in_msg->create_attribute_enumerator(in_msg); while (enumerator->enumerate(enumerator, &attr)) { type = attr->get_type(attr); if (type.vendor_id == PEN_IETF) { if (type.type == IETF_ATTR_PA_TNC_ERROR) { ietf_attr_pa_tnc_error_t *error_attr; pen_type_t error_code; chunk_t msg_info; error_attr = (ietf_attr_pa_tnc_error_t*)attr; error_code = error_attr->get_error_code(error_attr); if (error_code.vendor_id == PEN_TCG) { msg_info = error_attr->get_msg_info(error_attr); DBG1(DBG_IMC, "received TCG-PTS error '%N'", pts_error_code_names, error_code.type); DBG1(DBG_IMC, "error information: %B", &msg_info); result = TNC_RESULT_FATAL; } } } else if (type.vendor_id == PEN_TCG) { attestation_state = (imc_attestation_state_t*)state; if (!imc_attestation_process(attr, out_msg, attestation_state, supported_algorithms, supported_dh_groups)) { result = TNC_RESULT_FATAL; break; } } } enumerator->destroy(enumerator); if (result == TNC_RESULT_SUCCESS) { /* send PA-TNC message with the excl flag set */ result = out_msg->send(out_msg, TRUE); } out_msg->destroy(out_msg); return result; }
static TNC_Result receive_message(imc_state_t *state, imc_msg_t *in_msg) { imc_msg_t *out_msg; enumerator_t *enumerator; pa_tnc_attr_t *attr; pen_type_t attr_type; TNC_Result result; bool fatal_error = FALSE; /* parse received PA-TNC message and handle local and remote errors */ result = in_msg->receive(in_msg, &fatal_error); if (result != TNC_RESULT_SUCCESS) { return result; } /* analyze PA-TNC attributes */ enumerator = in_msg->create_attribute_enumerator(in_msg); while (enumerator->enumerate(enumerator, &attr)) { attr_type = attr->get_type(attr); if (attr_type.vendor_id != PEN_ITA) { continue; } if (attr_type.type == ITA_ATTR_COMMAND) { ita_attr_command_t *ita_attr; ita_attr = (ita_attr_command_t*)attr; DBG1(DBG_IMC, "received command '%s'", ita_attr->get_command(ita_attr)); } else if (attr_type.type == ITA_ATTR_DUMMY) { ita_attr_dummy_t *ita_attr; ita_attr = (ita_attr_dummy_t*)attr; DBG1(DBG_IMC, "received dummy attribute value (%d bytes)", ita_attr->get_size(ita_attr)); } } enumerator->destroy(enumerator); if (fatal_error) { return TNC_RESULT_FATAL; } /* if no assessment result is known then repeat the measurement */ if (state->get_result(state, in_msg->get_dst_id(in_msg), NULL)) { return TNC_RESULT_SUCCESS; } out_msg = imc_msg_create_as_reply(in_msg); result = send_message(state, out_msg); out_msg->destroy(out_msg); return result; }
static TNC_Result receive_message(imc_state_t *state, imc_msg_t *in_msg) { imc_msg_t *out_msg; enumerator_t *enumerator; pa_tnc_attr_t *attr; pen_type_t type; TNC_Result result; bool fatal_error = FALSE; /* generate an outgoing PA-TNC message - we might need it */ out_msg = imc_msg_create_as_reply(in_msg); /* parse received PA-TNC message and handle local and remote errors */ result = in_msg->receive(in_msg, out_msg, &fatal_error); if (result != TNC_RESULT_SUCCESS) { out_msg->destroy(out_msg); return result; } /* analyze PA-TNC attributes */ enumerator = in_msg->create_attribute_enumerator(in_msg); while (enumerator->enumerate(enumerator, &attr)) { type = attr->get_type(attr); if (type.vendor_id == PEN_IETF) { if (type.type == IETF_ATTR_ATTRIBUTE_REQUEST) { ietf_attr_attr_request_t *attr_cast; pen_type_t *entry; enumerator_t *e; attr_cast = (ietf_attr_attr_request_t*)attr; e = attr_cast->create_enumerator(attr_cast); while (e->enumerate(e, &entry)) { if (entry->vendor_id == PEN_IETF) { switch (entry->type) { case IETF_ATTR_PRODUCT_INFORMATION: add_product_info(out_msg); break; case IETF_ATTR_STRING_VERSION: add_string_version(out_msg); break; case IETF_ATTR_NUMERIC_VERSION: add_numeric_version(out_msg); break; case IETF_ATTR_OPERATIONAL_STATUS: add_op_status(out_msg); break; case IETF_ATTR_FORWARDING_ENABLED: add_fwd_enabled(out_msg); break; case IETF_ATTR_FACTORY_DEFAULT_PWD_ENABLED: add_default_pwd_enabled(out_msg); break; case IETF_ATTR_INSTALLED_PACKAGES: add_installed_packages(state, out_msg); break; default: break; } } else if (entry->vendor_id == PEN_ITA) { switch (entry->type) { case ITA_ATTR_DEVICE_ID: add_device_id(out_msg); break; default: break; } } } e->destroy(e); } } else if (type.vendor_id == PEN_ITA && type.type == ITA_ATTR_GET_SETTINGS) { ita_attr_get_settings_t *attr_cast; enumerator_t *e; attr_cast = (ita_attr_get_settings_t*)attr; e = attr_cast->create_enumerator(attr_cast); add_settings(e, out_msg); e->destroy(e); } } enumerator->destroy(enumerator); if (fatal_error) { result = TNC_RESULT_FATAL; } else { /* send PA-TNC message with the EXCL flag set */ result = out_msg->send(out_msg, TRUE); } out_msg->destroy(out_msg); return result; }