Unverified Commit 913ba03c authored by svetaro's avatar svetaro

SKALE-1594 Correct v calculation.Add leading zeroes to public key

parent c58207e0
......@@ -7,6 +7,7 @@
#include "sgxwallet.h"
#include <iostream>
std::vector<std::string> gen_ecdsa_key(){
char *errMsg = (char *)calloc(1024, 1);
int err_status = 0;
......@@ -70,9 +71,11 @@ std::vector<std::string> ecdsa_sign_hash(const char* encryptedKeyHex, const char
std::cerr << "encryptedKeyHex: "<< encryptedKeyHex << std::endl;
std::cerr << "HASH: "<< hashHex << std::endl;
std::cerr << "encrypted len" << dec_len << std::endl;
status = ecdsa_sign1(eid, &err_status, errMsg, encr_key, ECDSA_ENCR_LEN, (unsigned char*)hashHex, signature_r, signature_s, signature_v, base );
status = ecdsa_sign1(eid, &err_status, errMsg, encr_key, ECDSA_ENCR_LEN, (unsigned char*)hashHex, signature_r, signature_s, &signature_v, base );
std::cerr << "signature r in ecdsa_sign_hash "<< signature_r << std::endl;
std::cerr << "signature s in ecdsa_sign_hash "<< signature_s << std::endl;
......
......@@ -22,4 +22,5 @@ std::string get_ecdsa_pubkey(const char* encryptedKeyHex);
std::vector<std::string> ecdsa_sign_hash(const char* encryptedKeyHex, const char* hashHex, int base);
#endif //SGXD_ECDSACRYPTO_H
......@@ -185,11 +185,19 @@ Json::Value ecdsaSignMessageHashImpl(int base, const std::string &_keyName, cons
result["signature_s"] = "";
std::vector<std::string> sign_vect(3);
std::cerr << "entered ecdsaSignMessageHashImpl" << std::endl;
std::cerr << "entered ecdsaSignMessageHashImpl" << messageHash << "length " << messageHash.length() << std::endl;
std::string cutHash = messageHash;
if (cutHash[0] == '0' && (cutHash[1] == 'x'||cutHash[1] == 'X')){
cutHash.erase(cutHash.begin(), cutHash.begin()+2);
}
while (cutHash[0] == '0'){
cutHash.erase(cutHash.begin(), cutHash.begin()+1);
}
std::cerr << "Hash handled " << cutHash << std::endl;
try {
std::shared_ptr<std::string> key_ptr = readECDSAKey(_keyName);
// std::cerr << "read encr key" << *key_ptr << std::endl;
sign_vect = ecdsa_sign_hash(key_ptr->c_str(), messageHash.c_str(), base);
sign_vect = ecdsa_sign_hash(key_ptr->c_str(),cutHash.c_str(), base);
} catch (RPCException &_e) {
std::cerr << "err str " << _e.errString << std::endl;
result["status"] = _e.status;
......@@ -240,6 +248,7 @@ Json::Value SGXWalletServer::getPublicECDSAKey(const std::string &_keyName) {
Json::Value SGXWalletServer::ecdsaSignMessageHash(int base, const std::string &_keyName, const std::string &messageHash ) {
std::cerr << "entered ecdsaSignMessageHash" << std::endl;
std::cerr << "MessageHash first " << messageHash << std::endl;
return ecdsaSignMessageHashImpl(base,_keyName, messageHash);
}
......
......@@ -90,7 +90,7 @@ libff::alt_bn128_Fr PolynomialValue(const std::vector<libff::alt_bn128_Fr>& pol,
libff::alt_bn128_Fr pow = libff::alt_bn128_Fr::one();
for (size_t i = 0; i < _t; ++i) {
if (i == _t - 1 && pol[i] == libff::alt_bn128_Fr::zero()) {
throw std::runtime_error("Error, incorrect degree of a polynomial");
//snprintf(err_string, BUF_LEN,"sgx_unseal_data failed with status
}
value += pol[i] * pow;
pow *= point;
......@@ -105,12 +105,12 @@ void calc_secret_shares(const char* decrypted_koefs, char * secret_shares,
std::string result;
char symbol = ':';
std::vector<libff::alt_bn128_Fr> poly = SplitStringToFr(decrypted_koefs, &symbol);
for (size_t i = 0; i < _n; ++i) {
for (size_t i = 0; i < _n; ++i) {
libff::alt_bn128_Fr secret_share = PolynomialValue(poly, libff::alt_bn128_Fr(i + 1), _t);
result += stringFromFr(secret_share);
result += ":";
}
strncpy(secret_shares, result.c_str(), result.length());
strncpy(secret_shares, result.c_str(), 2000);//result.length());
}
void calc_public_shares(const char* decrypted_koefs, char * public_shares,
......
......@@ -164,14 +164,21 @@ void generate_ecdsa_key(int *err_status, char *err_string,
//snprintf(err_string, BUF_LEN, "len = %d\n", len);
char arr_x[len];
char* px = mpz_get_str(arr_x, base, Pkey->x);
// snprintf(err_string, BUF_LEN, "arr=%p px=%p\n", arr_x, px);
strncpy(pub_key_x, arr_x, 1024);
//snprintf(err_string, BUF_LEN, "arr=%p px=%p\n", arr_x, px);
int n_zeroes = 64 - strlen(arr_x);
for ( int i = 0; i < n_zeroes; i++){
pub_key_x[i] = '0';
}
strncpy(pub_key_x + n_zeroes, arr_x, 1024 - n_zeroes);
char arr_y[mpz_sizeinbase (Pkey->y, base) + 2];
char* py = mpz_get_str(arr_y, base, Pkey->y);
strncpy(pub_key_y, arr_y, 1024);
n_zeroes = 64 - strlen(arr_y);
for ( int i = 0; i < n_zeroes; i++){
pub_key_y[i] = '0';
}
strncpy(pub_key_y + n_zeroes, arr_y, 1024 - n_zeroes);
char skey_str[mpz_sizeinbase (skey, ECDSA_SKEY_BASE) + 2];
char* s = mpz_get_str(skey_str, ECDSA_SKEY_BASE, skey);
snprintf(err_string, BUF_LEN, "skey is %s len %d\n", skey_str, strlen(skey_str));
......@@ -210,7 +217,7 @@ void get_public_ecdsa_key(int *err_status, char *err_string,
return;
}
strncpy(err_string, skey, 1024);
//strncpy(err_string, skey, 1024);
mpz_t skey_mpz;
mpz_init(skey_mpz);
......@@ -238,11 +245,20 @@ void get_public_ecdsa_key(int *err_status, char *err_string,
char arr_x[len];
char* px = mpz_get_str(arr_x, base, Pkey->x);
//snprintf(err_string, BUF_LEN, "arr=%p px=%p\n", arr_x, px);
strncpy(pub_key_x, arr_x, 1024);
int n_zeroes = 64 - strlen(arr_x);
for ( int i = 0; i < n_zeroes; i++){
pub_key_x[i] = '0';
}
strncpy(pub_key_x + n_zeroes, arr_x, 1024 - n_zeroes);
char arr_y[mpz_sizeinbase (Pkey->y, base) + 2];
char* py = mpz_get_str(arr_y, base, Pkey->y);
strncpy(pub_key_y, arr_y, 1024);
n_zeroes = 64 - strlen(arr_y);
for ( int i = 0; i < n_zeroes; i++){
pub_key_y[i] = '0';
}
strncpy(pub_key_y + n_zeroes, arr_y, 1024 - n_zeroes);
mpz_clear(skey_mpz);
domain_parameters_clear(curve);
......@@ -442,7 +458,7 @@ void get_public_shares(int *err_status, char* err_string, uint8_t* encrypted_dkg
}
void ecdsa_sign1(int *err_status, char *err_string, uint8_t *encrypted_key, uint32_t dec_len,
unsigned char* hash, char * sig_r, char * sig_s, uint8_t sig_v, int base) {
unsigned char* hash, char * sig_r, char * sig_s, uint8_t* sig_v, int base) {
domain_parameters curve = domain_parameters_init();
domain_parameters_load_curve(curve, secp256k1);
......@@ -477,6 +493,7 @@ void ecdsa_sign1(int *err_status, char *err_string, uint8_t *encrypted_key, uint
signature sign = signature_init();
signature_sign( sign, msg_mpz, skey_mpz, curve);
point Pkey = point_init();
......@@ -504,26 +521,10 @@ void ecdsa_sign1(int *err_status, char *err_string, uint8_t *encrypted_key, uint
char* s = mpz_get_str(arr_s, base, sign->s);
strncpy(sig_s, arr_s, 1024);
sig_v = 0;
mpz_t rem;
mpz_init(rem);
mpz_mod_ui(rem, sign->r, 2);
int r_gr_n = mpz_cmp(sign->r, curve->n);
if (mpz_sgn(rem) && r_gr_n < 0){
sig_v = 1;
}
else if (mpz_sgn(rem) > 0 && r_gr_n > 0){
sig_v = 3;
}
else if (mpz_sgn(rem) == 0 && r_gr_n > 0){
sig_v = 2;
}
*sig_v = sign->v;
mpz_clear(skey_mpz);
mpz_clear(msg_mpz);
mpz_clear(rem);
domain_parameters_clear(curve);
signature_clear(sign);
point_clear(Pkey);
......
......@@ -78,7 +78,7 @@ from "sgx_tsgxssl.edl" import *;
public void get_secret_shares (
[user_check] int *err_status,
[out, count = 1024] char* err_string,
[in, count = 2000] uint8_t* decrypted_dkg_secret,
[in, count = 2000] uint8_t* encrypted_dkg_secret,
uint32_t enc_len,
[out, count = 2000] char* secret_shares,
unsigned _t,
......@@ -101,7 +101,7 @@ from "sgx_tsgxssl.edl" import *;
[in, count = 1024] unsigned char* hash,
[out, count = 1024] char* sig_r,
[out, count = 1024] char* sig_s,
uint8_t sig_v,
[user_check] uint8_t* sig_v,
int base);
};
......
......@@ -16,6 +16,7 @@ signature signature_init()
sig = malloc(sizeof(struct signature_s));
mpz_init(sig->r);
mpz_init(sig->s);
sig->v = 0;
return sig;
}
......@@ -106,11 +107,11 @@ void signature_sign(signature sig, mpz_t message, mpz_t private_key, domain_para
//mpz_set_str(k, "49a0d7b786ec9cde0d0721d72804befd06571c974b191efb42ecf322ba9ddd9a", 16);
// mpz_set_str(k, "DC87789C4C1A09C97FF4DE72C0D0351F261F10A2B9009C80AEE70DDEC77201A0", 16);
//mpz_set_str(k,"29932781130098090011281004827843485745127563886526054275935615017309884975795",10);
//Calculate x
point_multiplication(Q, k, curve->G, curve);
mpz_set(x, Q->x);
point_clear(Q);
//Calculate r
mpz_mod(r, x, curve->n);
......@@ -131,10 +132,32 @@ void signature_sign(signature sig, mpz_t message, mpz_t private_key, domain_para
mpz_init(t3);
mpz_mul(t3, t2, t1); //t3 = t2 * t1
mpz_mod(s, t3, curve->n); //s = t3 mod n
/*
mpz_t n_div_2;
//Calculate v
mpz_t rem;
mpz_init(rem);
mpz_mod_ui(rem, Q->y, 2);
mpz_t s_mul_2;
mpz_init(s_mul_2);
mpz_mul_ui(s_mul_2, s, 2);
unsigned b = 0;
if (mpz_cmp(s_mul_2, curve->n) > 0) {
b = 1;
}
sig->v = mpz_get_ui(rem) ^ b ;
point_clear(Q);
mpz_clear(rem);
mpz_clear(s_mul_2);
mpz_t n_div_2;
mpz_init(n_div_2);
mpz_cdiv_q_ui(n_div_2, curve->n + 1, 2);
mpz_cdiv_q_ui(n_div_2, curve->n , 2);
if (mpz_cmp(s, n_div_2) > 0) {
mpz_t neg;
......@@ -148,12 +171,13 @@ void signature_sign(signature sig, mpz_t message, mpz_t private_key, domain_para
mpz_clear(neg);
}
mpz_clear(n_div_2);*/
mpz_clear(n_div_2);
mpz_clear(t1);
mpz_clear(t2);
mpz_clear(t3);
//Set signature
mpz_set(sig->r, r);
mpz_set(sig->s, s);
......
......@@ -4,6 +4,7 @@ struct signature_s
{
mpz_t r;
mpz_t s;
unsigned int v;
};
typedef struct signature_s* signature;
......
......@@ -318,7 +318,7 @@ std::vector<libff::alt_bn128_Fr> SplitStringToFr(const char* koefs, const char*
return tokens;
}
TEST_CASE( "DKG auto secret shares test", "[dkg-s_shares]" ) {
TEST_CASE( "DKG secret shares test", "[dkg-s_shares]" ) {
//init_all();
init_enclave();
......@@ -330,16 +330,16 @@ std::vector<libff::alt_bn128_Fr> SplitStringToFr(const char* koefs, const char*
unsigned t = 3, n = 4;
status = gen_dkg_secret (eid, &err_status, errMsg, encrypted_dkg_secret, &enc_len, 3);
status = gen_dkg_secret (eid, &err_status, errMsg, encrypted_dkg_secret, &enc_len, n);
REQUIRE(status == SGX_SUCCESS);
printf("gen_dkg_secret completed with status: %d %s \n", err_status, errMsg);
printf("\n Length: %d \n", enc_len);
char* errMsg1 = (char*) calloc(1024,1);
char colon = ':';
char* secret_shares = (char*)calloc(DKG_MAX_SEALED_LEN, sizeof(char));
char* secret_shares = (char*)calloc(DKG_MAX_SEALED_LEN, 1);
printf("BEFORE get_secret_shares\n");
status = get_secret_shares(eid, &err_status, errMsg1, encrypted_dkg_secret, enc_len, secret_shares, t, n);
REQUIRE(status == SGX_SUCCESS);
printf("\nget_secret_shares: %d %s \n", err_status, errMsg1);
......@@ -380,7 +380,6 @@ std::vector<libff::alt_bn128_Fr> SplitStringToFr(const char* koefs, const char*
}
TEST_CASE("ECDSA keygen and signature test", "[ecdsa_test]") {
init_enclave();
......@@ -406,12 +405,13 @@ TEST_CASE("ECDSA keygen and signature test", "[ecdsa_test]") {
printf("%u ", encr_pr_key[i]);*/
// char* hex = "4b688df40bcedbe641ddb16ff0a1842d9c67ea1c3bf63f3e0471baa664531d1a";
char* hex = "3F891FDA3704F0368DAB65FA81EBE616F4AA2A0854995DA4DC0B59D2CADBD64F";
char* hex = "0x09c6137b97cdf159b9950f1492ee059d1e2b10eaf7d51f3a97d61f2eee2e81db";
printf("hash length %d ", strlen(hex));
char* signature_r = (char *)calloc(1024, 1);
char* signature_s = (char *)calloc(1024, 1);
uint8_t signature_v = 0;
status = ecdsa_sign1(eid, &err_status, errMsg, encr_pr_key, enc_len, (unsigned char*)hex, signature_r, signature_s, signature_v, 16);
status = ecdsa_sign1(eid, &err_status, errMsg, encr_pr_key, enc_len, (unsigned char*)hex, signature_r, signature_s, &signature_v, 16);
REQUIRE(status == SGX_SUCCESS);
printf("\nsignature r : %s ", signature_r);
printf("\nsignature s: %s ", signature_s);
......@@ -481,8 +481,9 @@ TEST_CASE("get public ECDSA key", "[get_pub_ecdsa_key_test]") {
printf("\nerrMsg %s\n", errMsg );
REQUIRE(status == SGX_SUCCESS);
printf("\nwas pub_key_x %s: \n", pub_key_x);
printf("\nwas pub_key_y %s: \n", pub_key_y);
printf("\nwas pub_key_x %s length %d: \n", pub_key_x, strlen(pub_key_x));
printf("\nwas pub_key_y %s length %d: \n", pub_key_y, strlen(pub_key_y));
/*printf("\nencr priv_key %s: \n");
for ( int i = 0; i < 1024 ; i++)
printf("%u ", encr_pr_key[i]);*/
......@@ -521,23 +522,11 @@ TEST_CASE("API test", "[api_test]") {
cerr << "Client inited" << endl;
try {
cout << c.generateECDSAKey("known_key1") << endl;
// cout << c.generateECDSAKey("known_key1") << endl;
//cout<<c.getPublicECDSAKey("test_key");
//cout << c.ecdsaSignMessageHash(16, "known_key1","3F891FDA3704F0368DAB65FA81EBE616F4AA2A0854995DA4DC0B59D2CADBD64F" );
cout << c.ecdsaSignMessageHash(16, "known_key1","0x09c6137b97cdf159b9950f1492ee059d1e2b10eaf7d51f3a97d61f2eee2e81db" );
} catch (JsonRpcException &e) {
cerr << e.what() << endl;
}
}
TEST_CASE("bytes to hex test", "[bytes_to_hex_test]") {
char kavun[] = {'a','b','c','d'};
uint8_t raw_kavun[3];
uint64_t n = 0;
hex2carray(kavun, &n, raw_kavun);
char new_kavun[10];
carray2Hex(raw_kavun, 5, new_kavun);
std::cerr << " got kavun " << new_kavun << std::endl;
}
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