Commit 5e339272 authored by garciay's avatar garciay
Browse files

Major security bugs fixed for signature. Encryption to do.

parent c4cf3f38
Loading
Loading
Loading
Loading
+2 −1
Original line number Original line Diff line number Diff line
@@ -189,7 +189,8 @@ int security_cache::store_certificate(const CHARSTRING& p_cert_id, const OCTETST
  std::vector<unsigned char> private_enc_key;
  std::vector<unsigned char> private_enc_key;
  std::vector<unsigned char> public_enc_key_x;
  std::vector<unsigned char> public_enc_key_x;
  std::vector<unsigned char> public_enc_key_y;
  std::vector<unsigned char> public_enc_key_y;
  if (p_private_enc_key.lengthof() != 0) {
  loggers::get_instance().log_to_hexa("security_cache::store_certificate: public_comp_key: ", public_comp_key.data(), public_comp_key.size());
  if ((p_private_enc_key.is_bound() != 0) && (p_private_enc_key.lengthof() != 0)) {
    private_enc_key.assign(static_cast<const unsigned char*>(p_private_enc_key), static_cast<const unsigned char*>(p_private_enc_key) + p_private_enc_key.lengthof());
    private_enc_key.assign(static_cast<const unsigned char*>(p_private_enc_key), static_cast<const unsigned char*>(p_private_enc_key) + p_private_enc_key.lengthof());
    public_enc_key_x.assign(static_cast<const unsigned char*>(p_public_enc_key_x), static_cast<const unsigned char*>(p_public_enc_key_x) + p_public_enc_key_x.lengthof());
    public_enc_key_x.assign(static_cast<const unsigned char*>(p_public_enc_key_x), static_cast<const unsigned char*>(p_public_enc_key_x) + p_public_enc_key_x.lengthof());
    public_enc_key_y.assign(static_cast<const unsigned char*>(p_public_enc_key_y), static_cast<const unsigned char*>(p_public_enc_key_y) + p_public_enc_key_y.lengthof());
    public_enc_key_y.assign(static_cast<const unsigned char*>(p_public_enc_key_y), static_cast<const unsigned char*>(p_public_enc_key_y) + p_public_enc_key_y.lengthof());
+15 −7
Original line number Original line Diff line number Diff line
@@ -89,7 +89,7 @@ security_ecc::security_ecc(const ec_elliptic_curves p_elliptic_curve, const std:
  loggers::get_instance().log_to_hexa("security_ecc::security_ecc (1): _pub_key_x=", _pub_key_x.data(), _pub_key_x.size());
  loggers::get_instance().log_to_hexa("security_ecc::security_ecc (1): _pub_key_x=", _pub_key_x.data(), _pub_key_x.size());
  loggers::get_instance().log_to_hexa("security_ecc::security_ecc (1): _pub_key_y=", _pub_key_y.data(), _pub_key_y.size());
  loggers::get_instance().log_to_hexa("security_ecc::security_ecc (1): _pub_key_y=", _pub_key_y.data(), _pub_key_y.size());
  loggers::get_instance().log_to_hexa("security_ecc::security_ecc (1): _pub_key_compressed=", _pub_key_compressed.data(), _pub_key_compressed.size());
  loggers::get_instance().log_to_hexa("security_ecc::security_ecc (1): _pub_key_compressed=", _pub_key_compressed.data(), _pub_key_compressed.size());
  loggers::get_instance().log("security_ecc::security_ecc (1): _pub_key_compressed_mode=", _pub_key_compressed_mode);
  loggers::get_instance().log("security_ecc::security_ecc (1): _pub_key_compressed_mode=%d", _pub_key_compressed_mode);
} // End of constructor
} // End of constructor


security_ecc::security_ecc(const ec_elliptic_curves p_elliptic_curve, const std::vector<unsigned char>& p_public_key_x, const std::vector<unsigned char>& p_public_key_y): _elliptic_curve(p_elliptic_curve), _encryption_algotithm(encryption_algotithm::aes_128_ccm), _ec_key(nullptr), _ec_group(nullptr), _bn_ctx(nullptr), _pri_key(), _pub_key_x(p_public_key_x), _pub_key_y(p_public_key_y), _pub_key_compressed(), _pub_key_compressed_mode{ecc_compressed_mode::compressed_y_0}, _secret_key(), _enc_key_x(), _enc_key_y(), _sym_key(), _nonce(), _tag() {
security_ecc::security_ecc(const ec_elliptic_curves p_elliptic_curve, const std::vector<unsigned char>& p_public_key_x, const std::vector<unsigned char>& p_public_key_y): _elliptic_curve(p_elliptic_curve), _encryption_algotithm(encryption_algotithm::aes_128_ccm), _ec_key(nullptr), _ec_group(nullptr), _bn_ctx(nullptr), _pri_key(), _pub_key_x(p_public_key_x), _pub_key_y(p_public_key_y), _pub_key_compressed(), _pub_key_compressed_mode{ecc_compressed_mode::compressed_y_0}, _secret_key(), _enc_key_x(), _enc_key_y(), _sym_key(), _nonce(), _tag() {
@@ -228,7 +228,7 @@ security_ecc::security_ecc(const ec_elliptic_curves p_elliptic_curve, const std:
  loggers::get_instance().log_to_hexa("security_ecc::security_ecc (3): _pub_key_x=", _pub_key_x.data(), _pub_key_x.size());
  loggers::get_instance().log_to_hexa("security_ecc::security_ecc (3): _pub_key_x=", _pub_key_x.data(), _pub_key_x.size());
  loggers::get_instance().log_to_hexa("security_ecc::security_ecc (3): _pub_key_y=", _pub_key_y.data(), _pub_key_y.size());
  loggers::get_instance().log_to_hexa("security_ecc::security_ecc (3): _pub_key_y=", _pub_key_y.data(), _pub_key_y.size());
  loggers::get_instance().log_to_hexa("security_ecc::security_ecc (3): _pub_key_compressed=", _pub_key_compressed.data(), _pub_key_compressed.size());
  loggers::get_instance().log_to_hexa("security_ecc::security_ecc (3): _pub_key_compressed=", _pub_key_compressed.data(), _pub_key_compressed.size());
  loggers::get_instance().log("security_ecc::security_ecc (3): _pub_key_compressed_mode=", _pub_key_compressed_mode);
  loggers::get_instance().log("security_ecc::security_ecc (3): _pub_key_compressed_mode=%d", _pub_key_compressed_mode);
} // End of constructor
} // End of constructor


security_ecc::~security_ecc() {
security_ecc::~security_ecc() {
@@ -274,8 +274,11 @@ int security_ecc::generate() {
    loggers::get_instance().error("security_ecc::generate: Failed to get coordinates");
    loggers::get_instance().error("security_ecc::generate: Failed to get coordinates");
    return -1;
    return -1;
  }
  }
  const BIGNUM* p = ::EC_KEY_get0_private_key(_ec_key);


  const BIGNUM* p;
  do {
    p = ::EC_KEY_get0_private_key(_ec_key);
  } while (BN_num_bytes(p) == 0);
  _pri_key.resize(BN_num_bytes(p));
  _pri_key.resize(BN_num_bytes(p));
  ::BN_bn2bin(p, _pri_key.data());
  ::BN_bn2bin(p, _pri_key.data());
  _pub_key_x.resize(BN_num_bytes(&x));
  _pub_key_x.resize(BN_num_bytes(&x));
@@ -297,10 +300,11 @@ int security_ecc::generate() {
    _pub_key_compressed_mode = ((_pub_key_compressed[0] & 0x01) == 0x00) ? ecc_compressed_mode::compressed_y_0 : ecc_compressed_mode::compressed_y_1;
    _pub_key_compressed_mode = ((_pub_key_compressed[0] & 0x01) == 0x00) ? ecc_compressed_mode::compressed_y_0 : ecc_compressed_mode::compressed_y_1;
    _pub_key_compressed.erase(_pub_key_compressed.begin());
    _pub_key_compressed.erase(_pub_key_compressed.begin());
  }
  }
  loggers::get_instance().log_to_hexa("security_ecc::generate: _pri_key=", _pri_key.data(), _pri_key.size());
  loggers::get_instance().log_to_hexa("security_ecc::generate: _pub_key_x=", _pub_key_x.data(), _pub_key_x.size());
  loggers::get_instance().log_to_hexa("security_ecc::generate: _pub_key_x=", _pub_key_x.data(), _pub_key_x.size());
  loggers::get_instance().log_to_hexa("security_ecc::generate: _pub_key_y=", _pub_key_y.data(), _pub_key_y.size());
  loggers::get_instance().log_to_hexa("security_ecc::generate: _pub_key_y=", _pub_key_y.data(), _pub_key_y.size());
  loggers::get_instance().log_to_hexa("security_ecc::generate: _pub_key_compressed=", _pub_key_compressed.data(), _pub_key_compressed.size());
  loggers::get_instance().log_to_hexa("security_ecc::generate: _pub_key_compressed=", _pub_key_compressed.data(), _pub_key_compressed.size());
  loggers::get_instance().log("security_ecc::generate: _pub_key_compressed_mode=", _pub_key_compressed_mode);
  loggers::get_instance().log("security_ecc::generate: _pub_key_compressed_mode=%d", _pub_key_compressed_mode);
  
  
  return 0;
  return 0;
}
}
@@ -697,6 +701,7 @@ int security_ecc::decrypt(const std::vector<unsigned char>& p_tag, const std::ve


int security_ecc::sign(const std::vector<unsigned char>& p_data, std::vector<unsigned char>& p_r_sig, std::vector<unsigned char>& p_s_sig) {
int security_ecc::sign(const std::vector<unsigned char>& p_data, std::vector<unsigned char>& p_r_sig, std::vector<unsigned char>& p_s_sig) {
  loggers::get_instance().log(">>> security_ecc::sign");
  loggers::get_instance().log(">>> security_ecc::sign");
  loggers::get_instance().log_to_hexa(">>> security_ecc::sign: p_data: ", p_data.data(), p_data.size());


  // Sanity checks
  // Sanity checks
  if(_pri_key.size() == 0) { // No private key
  if(_pri_key.size() == 0) { // No private key
@@ -720,10 +725,10 @@ int security_ecc::sign(const std::vector<unsigned char>& p_data, std::vector<uns
  
  
  p_r_sig.resize(BN_num_bytes(signature->r));
  p_r_sig.resize(BN_num_bytes(signature->r));
  ::BN_bn2bin(signature->r, p_r_sig.data());
  ::BN_bn2bin(signature->r, p_r_sig.data());
  //loggers::get_instance().log_to_hexa("security_ecc::sign: r=", p_r_sig.data(), p_r_sig.size());
  loggers::get_instance().log_to_hexa("security_ecc::sign: r=", p_r_sig.data(), p_r_sig.size());
  p_s_sig.resize(BN_num_bytes(signature->r));
  p_s_sig.resize(BN_num_bytes(signature->r));
  ::BN_bn2bin(signature->s, p_s_sig.data());
  ::BN_bn2bin(signature->s, p_s_sig.data());
  //loggers::get_instance().log_to_hexa("security_ecc::sign: s=", p_s_sig.data(), p_s_sig.size());
  loggers::get_instance().log_to_hexa("security_ecc::sign: s=", p_s_sig.data(), p_s_sig.size());


  ::ECDSA_SIG_free(signature);
  ::ECDSA_SIG_free(signature);
  
  
@@ -732,6 +737,7 @@ int security_ecc::sign(const std::vector<unsigned char>& p_data, std::vector<uns


int security_ecc::sign_verif(const std::vector<unsigned char>& p_data, const std::vector<unsigned char>& p_signature) {
int security_ecc::sign_verif(const std::vector<unsigned char>& p_data, const std::vector<unsigned char>& p_signature) {
  loggers::get_instance().log(">>> security_ecc::sign_verif");
  loggers::get_instance().log(">>> security_ecc::sign_verif");
  loggers::get_instance().log_to_hexa(">>> security_ecc::sign_verify: p_data: ", p_data.data(), p_data.size());


  // Sanity checks
  // Sanity checks
  if (p_data.size() == 0) {
  if (p_data.size() == 0) {
@@ -743,7 +749,9 @@ int security_ecc::sign_verif(const std::vector<unsigned char>& p_data, const std
  ::BN_init(&r);
  ::BN_init(&r);
  ::BN_init(&s);
  ::BN_init(&s);
  ::BN_bin2bn(p_signature.data(), p_signature.size() / 2, &r);
  ::BN_bin2bn(p_signature.data(), p_signature.size() / 2, &r);
  loggers::get_instance().log_to_hexa("security_ecc::sign_verify: r=", p_signature.data(), p_signature.size() / 2);
  ::BN_bin2bn(p_signature.data() + p_signature.size() / 2, p_signature.size() / 2, &s);
  ::BN_bin2bn(p_signature.data() + p_signature.size() / 2, p_signature.size() / 2, &s);
  loggers::get_instance().log_to_hexa("security_ecc::sign_verify: r=", p_signature.data() + p_signature.size() / 2, p_signature.size() / 2);
  ECDSA_SIG *signature = ECDSA_SIG_new();
  ECDSA_SIG *signature = ECDSA_SIG_new();
  signature->r = &r;
  signature->r = &r;
  signature->s = &s;
  signature->s = &s;