pki_layer.hh 4.86 KB
Newer Older
Yann Garcia's avatar
Yann Garcia committed
/*!
 * \file      pki_layer.hh
 * \brief     Header file for ITS HTTP protocol layer.
 * \author    ETSI STF549
 * \copyright ETSI Copyright Notification
 *            No part may be reproduced except as authorized by written permission.
 *            The copyright and the foregoing restriction extend to reproduction in all media.
 *            All rights reserved.
 * \version   0.1
 */
#pragma once

#include <memory>

#include "t_layer.hh"

#include "etsi_ts102941_types_enrolment_inner_request.hh"
#include "etsi_ts102941_types_enrolment_inner_response.hh"
#include "etsi_ts103097_data_codec.hh"
#include "etsi_ts102941_data.hh"
Yann Garcia's avatar
Yann Garcia committed

namespace LibItsPki__TestSystem {
Yann Garcia's avatar
Yann Garcia committed
  class PkiPort; //! Forward declaration of TITAN class
}

namespace LibItsPki__TypesAndValues {
  class AcSetSecurityData; //! Forward declaration of TITAN class
Yann Garcia's avatar
Yann Garcia committed
}

class OCTETSTRING; //! Forward declaration of TITAN class

/*!
 * \class pki_layer
 * \brief  This class provides a factory class to create an tcp_layer class instance
 */
class pki_layer : public t_layer<LibItsPki__TestSystem::PkiPort> {
  
  static constexpr unsigned int ProtocolVersion = 1;
  
Yann Garcia's avatar
Yann Garcia committed
  params _params;
  etsi_ts102941_types_enrolment_inner_request _etsi_ts102941_types_enrolment_inner_request; // TODO Rename _codec_etsi_ts102941_types_enrolment_inner_request
  etsi_ts102941_types_enrolment_inner_response _etsi_ts102941_types_enrolment_inner_response; // TODO Rename _codec_etsi_ts102941_types_enrolment_inner_response
  etsi_ts103097_data_codec _codec; // TODO Rename _codec_etsi_ts103097_data_codec
  etsi_ts102941_data _codec_etsi_ts102941_data;
Yann Garcia's avatar
Yann Garcia committed

Yann Garcia's avatar
Yann Garcia committed
  std::unique_ptr<LibItsPki__TypesAndValues::AcSetSecurityData> _ac_set_security_data;

Yann Garcia's avatar
Yann Garcia committed
public: //! \publicsection
  /*!
   * \brief Specialised constructor
   *        Create a new instance of the pki_layer class
   * \param[in] p_type \todo
   * \param[in] p_param \todo
   */
  pki_layer() : t_layer(), _params(), _etsi_ts102941_types_enrolment_inner_request(), _etsi_ts102941_types_enrolment_inner_response(), _codec(), _codec_etsi_ts102941_data(), _ac_set_security_data(nullptr) { };
Yann Garcia's avatar
Yann Garcia committed
  /*!
   * \brief Specialised constructor
   *        Create a new instance of the pki_layer class
   * \param[in] p_type \todo
   * \param[in] p_param \todo
   */
  pki_layer(const std::string& p_type, const std::string& p_param);
  /*!
   * \brief Default destructor
   */
  virtual ~pki_layer() { };

  /*!
   * \fn void sendMsg(const EtsiTs102941TypesEnrolment::InnerEcRequest& p_inner_ec_request, params& p_param);
   * \brief Send HTTP message to the lower layers
   * \param[in] p_inner_ec_request The InnerEcRequest message to be sent
   * \param[in] p_params Some parameters to overwrite default value of the lower layers parameters
   */
  void sendMsg(const EtsiTs102941TypesEnrolment::InnerEcRequest& p_inner_ec_request, params& p_param);
  
  /*!
   * \fn void sendMsg(const EtsiTs102941TypesEnrolment::InnerEcResponse& p_inner_ec_request, params& p_param);
   * \brief Send HTTP message to the lower layers
   * \param[in] p_inner_ec_request The InnerEcResponse message to be sent
   * \param[in] p_params Some parameters to overwrite default value of the lower layers parameters
   */
  void sendMsg(const EtsiTs102941TypesEnrolment::InnerEcResponse& p_inner_ec_request, params& p_param);

  /*!
   * \virtual
   * \fn void send_data(OCTETSTRING& data, params& params);
   * \brief Send bytes formated data to the lower layers
   * \param[in] p_data The data to be sent
   * \param[in] p_params Some parameters to overwrite default value of the lower layers parameters
   */
  virtual void send_data(OCTETSTRING& data, params& params);
  /*!
   * \virtual
   * \fn void receive_data(OCTETSTRING& data, params& params);
   * \brief Receive bytes formated data from the lower layers
   * \param[in] p_data The bytes formated data received
   * \param[in] p_params Some lower layers parameters values when data was received
   */
  virtual void receive_data(OCTETSTRING& data, params& info);

Yann Garcia's avatar
Yann Garcia committed
  void set_pki_keys(const LibItsPki__TypesAndValues::AcSetSecurityData& p_ac_set_security_data);

  const int get_protocol_version() const { return ProtocolVersion; };
  
private:

  int generate_inner_ec_request_signed_for_pop(const OCTETSTRING& p_inner_ec_request, OCTETSTRING& p_etsi_ts_102941_data, params& p_params);
Yann Garcia's avatar
Yann Garcia committed

Yann Garcia's avatar
Yann Garcia committed
  /*!
   * \fn int sign_and_encrypt_payload(const OCTETSTRING& p_data, OCTETSTRING& p_secured_data);
   * \brief Sign and encrypt payload
   * \param[in] p_etsi_ts_102941_data The encoded form of the EtsiTs102941Data message
   * \param[out] p_secured_data The secured Pki message
Yann Garcia's avatar
Yann Garcia committed
   * \param[in] p_params Some lower layers parameters values when data was received
   */
  int sign_and_encrypt_payload(const OCTETSTRING& p_etsi_ts_102941_data, OCTETSTRING& p_secured_data, params& p_params);
  int decrypt_and_check_signature(const OCTETSTRING& p_signed_and_encrypted_data, OCTETSTRING& p_unsecured_payload, params& p_params);
Yann Garcia's avatar
Yann Garcia committed
}; // End of class pki_layer