Commit 10e129e0 authored by Denis Filatov's avatar Denis Filatov
Browse files

(*) use BN_bn2binpad to avoid size errors

parent f4efe9cf
Loading
Loading
Loading
Loading
+14 −13
Original line number Original line Diff line number Diff line
@@ -48,6 +48,7 @@ security_ecc::security_ecc(const ec_elliptic_curves p_elliptic_curve, const OCTE
  loggers::get_instance().log(">>> security_ecc::security_ecc (1): %d", static_cast<int>(p_elliptic_curve));
  loggers::get_instance().log(">>> security_ecc::security_ecc (1): %d", static_cast<int>(p_elliptic_curve));


  // Sanity checks
  // Sanity checks
  int fsize;
  if ((_elliptic_curve == ec_elliptic_curves::nist_p_256) || (_elliptic_curve == ec_elliptic_curves::brainpool_p_256_r1) || (_elliptic_curve == ec_elliptic_curves::sm2_p_256)) {
  if ((_elliptic_curve == ec_elliptic_curves::nist_p_256) || (_elliptic_curve == ec_elliptic_curves::brainpool_p_256_r1) || (_elliptic_curve == ec_elliptic_curves::sm2_p_256)) {
    if (p_private_key.lengthof() != 32) {
    if (p_private_key.lengthof() != 32) {
      loggers::get_instance().error("security_ecc::security_ecc (1): Invalid public keys size");
      loggers::get_instance().error("security_ecc::security_ecc (1): Invalid public keys size");
@@ -88,13 +89,8 @@ security_ecc::security_ecc(const ec_elliptic_curves p_elliptic_curve, const OCTE
    loggers::get_instance().error("security_ecc::security_ecc (1): Failed to generate xy coordinates, check algorithms");
    loggers::get_instance().error("security_ecc::security_ecc (1): Failed to generate xy coordinates, check algorithms");
  }
  }
  loggers::get_instance().log("security_ecc::security_ecc (1): xy length: %d", BN_num_bytes(xy));
  loggers::get_instance().log("security_ecc::security_ecc (1): xy length: %d", BN_num_bytes(xy));
  OCTETSTRING v = int2oct(0, BN_num_bytes(xy));
  OCTETSTRING v = int2oct(0, _pri_key.lengthof());
  ::BN_bn2bin(xy, (unsigned char *)static_cast<const unsigned char *>(v));
  ::BN_bn2binpad(xy, (unsigned char *)static_cast<const unsigned char *>(v), _pri_key.lengthof());
  if ((v.lengthof() % 2) != 0) {
    // Remove first byte
    loggers::get_instance().log_msg("security_ecc::security_ecc (1): Complete xy=", v);
    v = OCTETSTRING(v.lengthof() - 1, 1 + static_cast<const unsigned char *>(v));
  }
  ::BN_clear_free(xy);
  ::BN_clear_free(xy);
  xy = nullptr;
  xy = nullptr;


@@ -832,6 +828,13 @@ int security_ecc::sign(const OCTETSTRING &p_data, OCTETSTRING &p_r_sig, OCTETSTR
  loggers::get_instance().log_msg(">>> security_ecc::sign: p_data: ", p_data);
  loggers::get_instance().log_msg(">>> security_ecc::sign: p_data: ", p_data);


  // Sanity checks
  // Sanity checks
  const EC_GROUP * g = ::EC_KEY_get0_group(_ec_key);
  if(g == nullptr) {
    loggers::get_instance().warning("security_ecc::sign: Uninitialized key");
    return -1;
  }
  int fsize = (EC_GROUP_get_degree(g) + 7) / 8;

  if (_pri_key.lengthof() == 0) { // No private key
  if (_pri_key.lengthof() == 0) { // No private key
    return -1;
    return -1;
  }
  }
@@ -855,13 +858,11 @@ int security_ecc::sign(const OCTETSTRING &p_data, OCTETSTRING &p_r_sig, OCTETSTR
  const BIGNUM *r = nullptr;
  const BIGNUM *r = nullptr;
  const BIGNUM *s = nullptr;
  const BIGNUM *s = nullptr;
  ::ECDSA_SIG_get0(signature, &r, &s);
  ::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, fsize);
  p_r_sig = int2oct(0, BN_num_bytes(r));
  ::BN_bn2binpad(r, (unsigned char *)static_cast<const unsigned char *>(p_r_sig), fsize);
  ::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_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, fsize);
  p_s_sig = int2oct(0, BN_num_bytes(s));
  ::BN_bn2binpad(s, (unsigned char *)static_cast<const unsigned char *>(p_s_sig), fsize);
  ::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);
  loggers::get_instance().log_msg("security_ecc::sign: s=", p_s_sig);


  ::ECDSA_SIG_free(signature);
  ::ECDSA_SIG_free(signature);