Unverified Commit f5f6d6cd authored by Oleh Nikolaiev's avatar Oleh Nikolaiev Committed by GitHub

Merge pull request #109 from skalenetwork/bug/SKALE-2748-ecdsa-not-verified

Bug/skale 2748 ecdsa not verified
parents 5b71e0f4 609d155b
...@@ -114,6 +114,11 @@ string getECDSAPubKey(const char *_encryptedKeyHex) { ...@@ -114,6 +114,11 @@ string getECDSAPubKey(const char *_encryptedKeyHex) {
if (errStatus != 0) { if (errStatus != 0) {
throw SGXException(-666, errMsg.data()); throw SGXException(-666, errMsg.data());
} }
if (status != SGX_SUCCESS) {
spdlog::error("failed to get ECDSA public key {}", status);
throw SGXException(666, "failed to get ECDSA public key");
}
string pubKey = string(pubKeyX.data()) + string(pubKeyY.data());//concatPubKeyWith0x(pub_key_x, pub_key_y);// string pubKey = string(pubKeyX.data()) + string(pubKeyY.data());//concatPubKeyWith0x(pub_key_x, pub_key_y);//
...@@ -126,13 +131,13 @@ string getECDSAPubKey(const char *_encryptedKeyHex) { ...@@ -126,13 +131,13 @@ string getECDSAPubKey(const char *_encryptedKeyHex) {
} }
bool verifyECDSASig(string& pubKeyStr, const char *hashHex, const char *signatureR, bool verifyECDSASig(string& pubKeyStr, const char *hashHex, const char *signatureR,
const char *signatureS) { const char *signatureS, int base) {
bool result = false; bool result = false;
signature sig = signature_init(); signature sig = signature_init();
auto r = pubKeyStr.substr(0, 64); auto x = pubKeyStr.substr(0, 64);
auto s = pubKeyStr.substr(64, 128); auto y = pubKeyStr.substr(64, 128);
domain_parameters curve = domain_parameters_init(); domain_parameters curve = domain_parameters_init();
domain_parameters_load_curve(curve, secp256k1); domain_parameters_load_curve(curve, secp256k1);
point publicKey = point_init(); point publicKey = point_init();
...@@ -144,9 +149,12 @@ bool verifyECDSASig(string& pubKeyStr, const char *hashHex, const char *signatur ...@@ -144,9 +149,12 @@ bool verifyECDSASig(string& pubKeyStr, const char *hashHex, const char *signatur
goto clean; goto clean;
} }
signature_set_str(sig, signatureR, signatureS, 16); if (signature_set_str(sig, signatureR, signatureS, base) != 0) {
spdlog::error("Failed to set str signature");
goto clean;
}
point_set_hex(publicKey, r.c_str(), s.c_str()); point_set_hex(publicKey, x.c_str(), y.c_str());
if (!signature_verify(msgMpz, sig, publicKey, curve)) { if (!signature_verify(msgMpz, sig, publicKey, curve)) {
spdlog::error("ECDSA sig not verified"); spdlog::error("ECDSA sig not verified");
goto clean; goto clean;
...@@ -212,7 +220,7 @@ vector <string> ecdsaSignHash(const char *encryptedKeyHex, const char *hashHex, ...@@ -212,7 +220,7 @@ vector <string> ecdsaSignHash(const char *encryptedKeyHex, const char *hashHex,
/* Now verify signature */ /* Now verify signature */
if (!verifyECDSASig(pubKeyStr, hashHex, signatureR.data(), signatureS.data())) { if (!verifyECDSASig(pubKeyStr, hashHex, signatureR.data(), signatureS.data(), base)) {
exception = make_shared<SGXException>(667, "ECDSA did not verify"); exception = make_shared<SGXException>(667, "ECDSA did not verify");
goto clean; goto clean;
} }
......
...@@ -361,7 +361,7 @@ void trustedEcdsaSign(int *errStatus, char *errString, uint8_t *encryptedPrivate ...@@ -361,7 +361,7 @@ void trustedEcdsaSign(int *errStatus, char *errString, uint8_t *encryptedPrivate
if (!signature_verify(msgMpz, sign, publicKey, curve)) { if (!signature_verify(msgMpz, sign, publicKey, curve)) {
*errStatus = 2; *errStatus = 2;
snprintf(errString, BUF_LEN, "ECDSA sig not verified"); snprintf(errString, BUF_LEN, "ECDSA signature is not verified");
LOG_WARN(errString); LOG_WARN(errString);
goto clean; goto clean;
} }
......
...@@ -296,6 +296,21 @@ TEST_CASE_METHOD(TestFixture, "ECDSA key gen API", "[ecdsa-key-gen-api]") { ...@@ -296,6 +296,21 @@ TEST_CASE_METHOD(TestFixture, "ECDSA key gen API", "[ecdsa-key-gen-api]") {
throw; throw;
} }
} }
for (int i = 0; i <= 20; i++) {
try {
auto keyName = genECDSAKeyAPI(c);
Json::Value sig = c.ecdsaSignMessageHash(10, keyName, SAMPLE_HASH);
REQUIRE(sig["status"].asInt() == 0);
Json::Value getPubKey = c.getPublicECDSAKey(keyName);
REQUIRE(getPubKey["status"].asInt() == 0);
} catch (JsonRpcException &e) {
cerr << e.what() << endl;
throw;
}
}
} }
TEST_CASE_METHOD(TestFixture, "BLS key encrypt", "[bls-key-encrypt]") { TEST_CASE_METHOD(TestFixture, "BLS key encrypt", "[bls-key-encrypt]") {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment