Commit 8ec81611 authored by garciay's avatar garciay Committed by Alexandre Berge
Browse files

std::map key_comp issue fixed for OCTETSTRING

parent d34a7bd8
Loading
Loading
Loading
Loading
+5 −5
Original line number Diff line number Diff line
@@ -48,7 +48,7 @@ int certificates_loader::build_path(const std::string& p_root_directory) {
  return 0;
} // End of method build_path

int certificates_loader::load_certificates(std::map<std::string, std::unique_ptr<security_db_record> >& p_certificates, /*std::map<OCTETSTRING, std::string>*/std::map<std::vector<unsigned char>, std::string>& p_hashed_id8s) {
int certificates_loader::load_certificates(std::map<std::string, std::unique_ptr<security_db_record> >& p_certificates, std::map<OCTETSTRING/*std::vector<unsigned char>*/, std::string, security_cache_comp>& p_hashed_id8s) {
  loggers::get_instance().log(">>> certificates_loader::load_certificates");

  // Sanity check
@@ -119,7 +119,7 @@ int certificates_loader::retrieve_certificates_list(std::set<std::experimental::
  return 0;
} // End of method retrieve_certificates_list

int certificates_loader::build_certificates_cache(std::set<std::experimental::filesystem::path>& p_files, std::map<std::string, std::unique_ptr<security_db_record> >& p_certificates, /*std::map<OCTETSTRING, std::string>*/std::map<std::vector<unsigned char>, std::string>& p_hashed_id8s) {
int certificates_loader::build_certificates_cache(std::set<std::experimental::filesystem::path>& p_files, std::map<std::string, std::unique_ptr<security_db_record> >& p_certificates, std::map<OCTETSTRING/*std::vector<unsigned char>*/, std::string, security_cache_comp>& p_hashed_id8s) {
  loggers::get_instance().log(">>> certificates_loader::build_certificates_cache");

  std::set<std::experimental::filesystem::path>::const_iterator it = p_files.cbegin();
@@ -299,10 +299,10 @@ int certificates_loader::build_certificates_cache(std::set<std::experimental::fi
      }
      loggers::get_instance().log_msg("certificates_loader::build_certificates_cache: add key: ", result.first->second.get()->hashed_id());
      loggers::get_instance().log("certificates_loader::build_certificates_cache: for : %s", result.first->first.c_str());
      //p_hashed_id8s.insert(std::pair<OCTETSTRING, std::string>(result.first->second.get()->hashed_id(), result.first->first));
      std::vector<unsigned char> v(static_cast<const unsigned char*>(result.first->second.get()->hashed_id()), result.first->second.get()->hashed_id().lengthof() + static_cast<const unsigned char*>(result.first->second.get()->hashed_id()));
      p_hashed_id8s.insert(std::pair<OCTETSTRING, std::string>(result.first->second.get()->hashed_id(), result.first->first));
      /*std::vector<unsigned char> v(static_cast<const unsigned char*>(result.first->second.get()->hashed_id()), result.first->second.get()->hashed_id().lengthof() + static_cast<const unsigned char*>(result.first->second.get()->hashed_id()));
      loggers::get_instance().log_to_hexa("security_cache::store_certificate: Converted hashed_id8: ", v.data(), v.size());
      p_hashed_id8s.insert(std::pair<std::vector<unsigned char>, std::string>(v, result.first->first));
      p_hashed_id8s.insert(std::pair<std::vector<unsigned char>, std::string>(v, result.first->first));*/
    }
    // Reset pointer
    it = p_files.cbegin();
+3 −2
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@
#include <experimental/filesystem>

#include "security_db_record.hh"
#include "security_cache.hh"
#include "security_ecc.hh"

namespace IEEE1609dot2BaseTypes {
@@ -66,14 +67,14 @@ public: /*! \publicsection */

  int build_path(const std::string& p_root_directory);

  int load_certificates(std::map<std::string, std::unique_ptr<security_db_record> >& p_certificates, /*std::map<OCTETSTRING, std::string>*/std::map<std::vector<unsigned char>, std::string>& p_hashed_id8s);
  int load_certificates(std::map<std::string, std::unique_ptr<security_db_record> >& p_certificates, std::map<OCTETSTRING/*std::vector<unsigned char>*/, std::string, security_cache_comp>& p_hashed_id8s);
  //int load_certificate(std::unique_ptr<security_db_record> >& p_certificate, std::map<const OCTETSTRING, const std::string&>& p_hashed_id8s);
  int save_certificate(const security_db_record& p_certificate);

private:
  int retrieve_certificates_list(std::set<std::experimental::filesystem::path>& p_files);

  int build_certificates_cache(std::set<std::experimental::filesystem::path>& p_files, std::map<std::string, std::unique_ptr<security_db_record> >& p_certificates, /*std::map<OCTETSTRING, std::string>*/std::map<std::vector<unsigned char>, std::string>& p_hashed_id8s);
  int build_certificates_cache(std::set<std::experimental::filesystem::path>& p_files, std::map<std::string, std::unique_ptr<security_db_record> >& p_certificates, std::map<OCTETSTRING/*std::vector<unsigned char>*/, std::string, security_cache_comp>& p_hashed_id8s);
  
  void fill_public_key_vectors(const ec_elliptic_curves p_elliptic_curve, const IEEE1609dot2BaseTypes::EccP256CurvePoint& p_ecc_point, OCTETSTRING& p_public_comp_key, OCTETSTRING& p_public_key_x, OCTETSTRING& p_public_key_y);
  void fill_public_key_vectors(const ec_elliptic_curves p_elliptic_curve, const IEEE1609dot2BaseTypes::EccP384CurvePoint& p_ecc_point, OCTETSTRING& p_public_comp_key, OCTETSTRING& p_public_key_x, OCTETSTRING& p_public_key_y);
+26 −26
Original line number Diff line number Diff line
@@ -22,23 +22,25 @@ using namespace std; // Required for isnan()

#include "loggers.hh"

/*bool security_cache_comp::operator()(const OCTETSTRING& p_lhs, const OCTETSTRING& p_rhs) const {
bool security_cache_comp::operator()(const OCTETSTRING& p_lhs, const OCTETSTRING& p_rhs) const {
  loggers::get_instance().log_msg(">>> security_cache_comp::operator(): ", p_lhs);
  loggers::get_instance().log_msg(">>> security_cache_comp::operator(): ", p_rhs);
  if (p_lhs.lengthof() != p_rhs.lengthof()) {
    return !false;
  } else {
    for (int i = 0; i < p_lhs.lengthof(); i++) {
      loggers::get_instance().log("security_cache_comp::operator(): compare %02x with %02x", p_lhs[i].get_octet(), p_rhs[i].get_octet());
      if (p_lhs[i].get_octet() != p_rhs[i].get_octet()) {
        loggers::get_instance().log("<<< security_cache_comp::operator(): false");
        return !false;
      }
  unsigned char* first1 = (unsigned char*)static_cast<const unsigned char*>(p_lhs);
  unsigned char* first2 = (unsigned char*)static_cast<const unsigned char*>(p_rhs);
  unsigned char* last1 = p_lhs.lengthof() + (unsigned char*)static_cast<const unsigned char*>(p_lhs);
  unsigned char* last2 = p_rhs.lengthof() + (unsigned char*)static_cast<const unsigned char*>(p_rhs);

  while (first1 != last1) {
    if ((first2 == last2) || (*first2 < *first1)) {
      return false;
    } else if (*first1 < *first2) {
      return true;
    }
    ++first1;
    ++first2;
  } // End of 'while' statement
  return (first2 != last2);
}
  loggers::get_instance().log("<<< security_cache_comp::operator(): true");
  return !true;
}*/

security_cache::security_cache(): _certificates(), _hashed_id8s() {
  loggers::get_instance().log(">>> security_cache::security_cache");
@@ -60,9 +62,9 @@ int security_cache::clear() {
int security_cache::get_certificate_id(const OCTETSTRING& p_hashed_id8, std::string& p_certifcate_id) const {
  loggers::get_instance().log_msg(">>> security_cache::get_certificate_id: ", p_hashed_id8);

  //std::map<OCTETSTRING, std::string>::const_iterator it = _hashed_id8s.find(p_hashed_id8);
  std::vector<unsigned char> v(static_cast<const unsigned char*>(p_hashed_id8), p_hashed_id8.lengthof() + static_cast<const unsigned char*>(p_hashed_id8));
  std::map<std::vector<unsigned char>, std::string>::const_iterator it = _hashed_id8s.find(v);
  std::map<OCTETSTRING, std::string>::const_iterator it = _hashed_id8s.find(p_hashed_id8);
  //std::vector<unsigned char> v(static_cast<const unsigned char*>(p_hashed_id8), p_hashed_id8.lengthof() + static_cast<const unsigned char*>(p_hashed_id8));
  //std::map<std::vector<unsigned char>, std::string>::const_iterator it = _hashed_id8s.find(v);
  if (it == _hashed_id8s.cend()) {
    dump();
    p_certifcate_id = "";
@@ -291,16 +293,14 @@ int security_cache::store_certificate(const CHARSTRING& p_cert_id, const OCTETST

  _certificates.insert(std::pair<std::string, std::unique_ptr<security_db_record> >(key, std::unique_ptr<security_db_record>(p)));

  //std::map<OCTETSTRING, std::string>::const_iterator h = _hashed_id8s.find(hashed_id8);
  std::vector<unsigned char> v(static_cast<const unsigned char*>(hashed_id8), hashed_id8.lengthof() + static_cast<const unsigned char*>(hashed_id8));
  loggers::get_instance().log_to_hexa("security_cache::store_certificate: Converted hashed_id8: ", v.data(), v.size());
  std::map<std::vector<unsigned char>, std::string>::const_iterator h = _hashed_id8s.find(v);
  std::map<OCTETSTRING, std::string>::const_iterator h = _hashed_id8s.find(hashed_id8);
  //std::vector<unsigned char> v(static_cast<const unsigned char*>(hashed_id8), hashed_id8.lengthof() + static_cast<const unsigned char*>(hashed_id8));
  //std::map<std::vector<unsigned char>, std::string>::const_iterator h = _hashed_id8s.find(v);
  if (h != _hashed_id8s.cend()) {
    _hashed_id8s.erase(h);
  }
  //_hashed_id8s.insert(std::pair<OCTETSTRING, std::string&>(hashed_id8, key));
  loggers::get_instance().log("security_cache::store_certificate: Insert %s to _hashed_id8", key.c_str());
  _hashed_id8s.insert(std::pair<std::vector<unsigned char>, std::string&>(v, key));
  _hashed_id8s.insert(std::pair<OCTETSTRING, std::string&>(hashed_id8, key));
  //_hashed_id8s.insert(std::pair<std::vector<unsigned char>, std::string&>(v, key));
  
  //dump();

@@ -327,8 +327,8 @@ void security_cache::dump() const {
    loggers::get_instance().log_msg("security_cache::dump: public_enc_comp_key = ", p->public_enc_comp_key());
  } // End of 'for' statement
  //for (std::map<OCTETSTRING, std::string>::const_iterator it = _hashed_id8s.cbegin(); it != _hashed_id8s.cend(); ++it) {
  for (std::map<std::vector<unsigned char>, std::string>::const_iterator it = _hashed_id8s.cbegin(); it != _hashed_id8s.cend(); ++it) {
    //    loggers::get_instance().log_to_hexa("security_cache::dump: Hashedid8 key = ", it->first.data(), it->first.size());
  for (std::map<OCTETSTRING/*std::vector<unsigned char>*/, std::string>::const_iterator it = _hashed_id8s.cbegin(); it != _hashed_id8s.cend(); ++it) {
    loggers::get_instance().log_msg("security_cache::dump: Hashedid8 key = ", it->first);
    loggers::get_instance().log("security_cache::dump: Hashedid8 idx ==> %s", it->second.c_str());
  } // End of 'for' statement
} // End of method dump
+4 −4
Original line number Diff line number Diff line
@@ -22,9 +22,9 @@ class OCTETSTRING; //! TITAN forward declaration
class INTEGER; //! TITAN forward declaration
class CHARSTRING; //! TITAN forward declaration

/*struct security_cache_comp {
struct security_cache_comp {
  bool operator()(const OCTETSTRING& p_lhs, const OCTETSTRING& p_rhs) const;
  };*/
};

/*!
 * \class security_cache
@@ -36,8 +36,8 @@ class security_cache {
protected: /*! \protectedsection */
  // TODO Enforce with const security_cache_record, and const std::string
  std::map<std::string, std::unique_ptr<security_db_record> > _certificates; //! List of the certificates indexed by the certificate identifier
  //std::map<OCTETSTRING, std::string, security_cache_comp> _hashed_id8s; //! List of the certificates indexed by the HashedId8
  std::map<std::vector<unsigned char>, std::string> _hashed_id8s; //! List of the certificates indexed by the HashedId8
  std::map<OCTETSTRING, std::string, security_cache_comp> _hashed_id8s; //! List of the certificates indexed by the HashedId8
  //std::map<std::vector<unsigned char>, std::string> _hashed_id8s; //! List of the certificates indexed by the HashedId8
  
public: /*! \publicsection */
  /*!
+2 −0
Original line number Diff line number Diff line
@@ -739,9 +739,11 @@ int security_ecc::sign(const OCTETSTRING& p_data, OCTETSTRING& p_r_sig, OCTETSTR
  const BIGNUM* r = nullptr;
  const BIGNUM* s = nullptr;
  ::ECDSA_SIG_get0(signature, &r, &s);
  loggers::get_instance().log("security_ecc::sign: r size: %d", BN_num_bytes(r));
  p_r_sig = int2oct(0, BN_num_bytes(r));
  ::BN_bn2bin(r, (unsigned char*)static_cast<const unsigned char*>(p_r_sig));
  loggers::get_instance().log_msg("security_ecc::sign: r=", p_r_sig);
  loggers::get_instance().log("security_ecc::sign: s size: %d", BN_num_bytes(s));
  p_s_sig = int2oct(0, BN_num_bytes(s));
  ::BN_bn2bin(s, (unsigned char*)static_cast<const unsigned char*>(p_s_sig));
  loggers::get_instance().log_msg("security_ecc::sign: s=", p_s_sig);