#include "pki_layer_factory.hh" #include "codec_stack_builder.hh" #include "loggers.hh" #include "converter.hh" using namespace std; // Required for isnan() #include "LibItsPki_TestSystem.hh" pki_layer::pki_layer(const std::string & p_type, const std::string & param) : t_layer(p_type), _params(), _etsi_ts102941_types_enrolment_inner_request(), _etsi_ts102941_types_enrolment_inner_request(), _codec() { loggers::get_instance().log(">>> pki_layer::pki_layer: %s, %s", to_string().c_str(), param.c_str()); // Setup parameters params::convert(_params, param); // Sanity checks params::const_iterator it = _params.find(params::certificate); if (it == _params.cend()) { _params[params::certificate] = "CERT_TS_A_EA"; } it = _params.find(params::peer_certificate); if (it == _params.cend()) { _params[params::certificate] = "CERT_IUT_A_EA"; } _params[params::its_aid] = "0"; _params[params::payload_type] = ""; _params[params::encrypted_mode] = "1"; } void pki_layer::sendMsg(const EtsiTs102941TypesEnrolment::InnerEcRequest& p_inner_ec_request, params& p_param) { loggers::get_instance().log_msg(">>> pki_layer::sendMsg: ", p_pki_message); OCTETSTRING data; _etsi_ts102941_types_enrolment_inner_request.encode(p_pki_message, data); // Add security OCTETSTRING secured_data; if (secured_payload(data, secured_data) == 0) { send_data(data, _params); } } void pki_layer::sendMsg(const EtsiTs102941TypesEnrolment::InnerEcResponse& p_inner_ec_request, params& p_param) { loggers::get_instance().log_msg(">>> pki_layer::sendMsg: ", p_pki_message); OCTETSTRING data; _etsi_ts102941_types_enrolment_inner_response.encode(p_pki_message, data); // Add security OCTETSTRING secured_data; if (secured_payload(data, secured_data) == 0) { send_data(data, _params); } } void pki_layer::send_data(OCTETSTRING& data, params& params) { loggers::get_instance().log_msg(">>> pki_layer::send_data: ", data); send_to_all_layers(data, params); } void pki_layer::receive_data(OCTETSTRING& data, params& params) { loggers::get_instance().log_msg(">>> pki_layer::receive_data: ", data); // Decode HTTP message LibItsPki__TypesAndValues::HttpMessage pki_message; if (_codec.decode(data, pki_message) == -1) { loggers::get_instance().warning("pki_layer::receive_data: Failed to decode data"); return; } // Pass it to the ports to_all_upper_ports(pki_message, params); } int pki_layer::sign_and_encrypt_payload(const OCTETSTRING& p_data, OCTETSTRING& p_secured_data) { loggers::get_instance().log_msg(">>> pki_layer::sign_and_encrypt_payload: ", p_data); if (p_binary_body.ischosen(LibItsHttp__BinaryMessageBodyTypes::BinaryBody::ALT_innerEcRequest)) { params p; // TODO To be refined // 1. Signed the data OCTETSTRING signed_data; if (security_services::get_instance().sign_payload(p_data, signed_data, p) == -1) { loggers::get_instance().warning("http_etsi_ieee1609dot2_codec::encode: Failed to sign data"); return -1; } loggers::get_instance().log_msg("pki_layer::sign_and_encrypt_payload: signed_data=", signed_data); // 3. Encrypt the signed packet if (security_services::get_instance().encrypt_gn_payload(signed_data, p_secured_data, p) == -1) { loggers::get_instance().warning("http_etsi_ieee1609dot2_codec::encode: Failed to encrypt data"); return -1; } loggers::get_instance().log_msg("<<< http_etsi_ieee1609dot2_codec::encode: ", p_secured_data); return 0; } loggers::get_instance().warning("http_etsi_ieee1609dot2_codec::encode: No _codec found"); return -1; } pki_layer_factory pki_layer_factory::_f;