Unverified Commit 5c2a8faf authored by kladko's avatar kladko

SKALE-2895-fix-build-and-docs

parent 7bcecc6a
......@@ -45,7 +45,7 @@ EXTERNC void enclave_init();
void get_global_random(unsigned char* _randBuff);
void get_global_random(unsigned char* _randBuff, uint64_t size);
EXTERNC void LOG_INFO(const char* msg);
EXTERNC void LOG_WARN(const char* _msg);
......
......@@ -92,86 +92,111 @@ void signature_extract_public_key(point public_key, mpz_t private_key, domain_pa
void signature_sign(signature sig, mpz_t message, mpz_t private_key, domain_parameters curve) {
//message must not have a bit length longer than that of n
//see: Guide to Elliptic Curve Cryptography, section 4.4.1.
assert(mpz_sizeinbase(message, 2) <= mpz_sizeinbase(curve->n, 2));
point Q = point_init();
for (int i = 0; i < 5000; i++ ) {
//Initializing variables
mpz_t k, x, r, t1, t2, t3, t4, t5, s, n_div_2, rem, neg, seed;
mpz_init(k); mpz_init(x); mpz_init(r); mpz_init(t1); mpz_init(t2); mpz_init(t3); mpz_init(s);
mpz_init(t4); mpz_init(t5); mpz_init(n_div_2); mpz_init(rem); mpz_init(neg); mpz_init(seed);
assert(mpz_sizeinbase(message, 2) <= mpz_sizeinbase(curve->n, 2));
unsigned char *rand_char = (unsigned char *) calloc(32,1);
point Q = point_init();
get_global_random(rand_char);
//Initializing variables
mpz_t k, x, r, t1, t2, t3, t4, t5, s, n_div_2, rem, neg, seed;
mpz_init(k);
mpz_init(x);
mpz_init(r);
mpz_init(t1);
mpz_init(t2);
mpz_init(t3);
mpz_init(s);
mpz_init(t4);
mpz_init(t5);
mpz_init(n_div_2);
mpz_init(rem);
mpz_init(neg);
mpz_init(seed);
gmp_randstate_t r_state;
unsigned char *rand_char = (unsigned char *) calloc(32, 1);
signature_sign_start:
get_global_random(rand_char, 32);
//Set k
get_global_random(rand_char);
gmp_randstate_t r_state;
mpz_import(seed, 32, 1, sizeof(rand_char[0]), 0, 0, rand_char);
signature_sign_start:
mpz_mod(k, seed, curve->p);
//mpz_set_str(k, "49a0d7b786ec9cde0d0721d72804befd06571c974b191efb42ecf322ba9ddd9a", 16);
// mpz_set_str(k, "DC87789C4C1A09C97FF4DE72C0D0351F261F10A2B9009C80AEE70DDEC77201A0", 16);
//mpz_set_str(k,"29932781130098090011281004827843485745127563886526054275935615017309884975795",10);
get_global_random(rand_char, 32);
//Calculate x
point_multiplication(Q, k, curve->G, curve);
mpz_set(x, Q->x);
mpz_import(seed, 32, 1, sizeof(rand_char[0]), 0, 0, rand_char);
//Calculate r
mpz_mod(r, x, curve->n);
if (!mpz_sgn(r)) //Start over if r=0, note haven't been tested memory might die :)
goto signature_sign_start;
mpz_mod(k, seed, curve->p);
//mpz_set_str(k, "49a0d7b786ec9cde0d0721d72804befd06571c974b191efb42ecf322ba9ddd9a", 16);
// mpz_set_str(k, "DC87789C4C1A09C97FF4DE72C0D0351F261F10A2B9009C80AEE70DDEC77201A0", 16);
//mpz_set_str(k,"29932781130098090011281004827843485745127563886526054275935615017309884975795",10);
//Calculate s
//s = k¯¹(e+d*r) mod n = (k¯¹ mod n) * ((e+d*r) mod n) mod n
//number_theory_inverse(t1, k, curve->n);//t1 = k¯¹ mod n
mpz_invert(t1, k, curve->n);
mpz_mul(t2, private_key, r); //t2 = d*r
mpz_add(t3, message, t2); //t3 = e+t2
mpz_mod(t4, t3, curve->n); //t2 = t3 mod n
mpz_mul(t5, t4, t1); //t3 = t2 * t1
mpz_mod(s, t5, curve->n); //s = t3 mod n
//Calculate x
point_multiplication(Q, k, curve->G, curve);
mpz_set(x, Q->x);
//Calculate v
//Calculate r
mpz_mod(r, x, curve->n);
if (!mpz_sgn(r)) //Start over if r=0, note haven't been tested memory might die :)
goto signature_sign_start;
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;
//Calculate s
//s = k¯¹(e+d*r) mod n = (k¯¹ mod n) * ((e+d*r) mod n) mod n
//number_theory_inverse(t1, k, curve->n);//t1 = k¯¹ mod n
mpz_invert(t1, k, curve->n);
mpz_mul(t2, private_key, r); //t2 = d*r
mpz_add(t3, message, t2); //t3 = e+t2
mpz_mod(t4, t3, curve->n); //t2 = t3 mod n
mpz_mul(t5, t4, t1); //t3 = t2 * t1
mpz_mod(s, t5, curve->n); //s = t3 mod n
mpz_cdiv_q_ui(n_div_2, curve->n, 2);
//Calculate v
if (mpz_cmp(s, n_div_2) > 0) {
mpz_sub(neg, curve->n, s);
mpz_set(s, neg);
}
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);
//Set signature
mpz_set(sig->r, r);
mpz_set(sig->s, s);
unsigned b = 0;
if (mpz_cmp(s_mul_2, curve->n) > 0) {
b = 1;
}
sig->v = mpz_get_ui(rem) ^ b;
clean:
mpz_cdiv_q_ui(n_div_2, curve->n, 2);
if (mpz_cmp(s, n_div_2) > 0) {
mpz_sub(neg, curve->n, s);
mpz_set(s, neg);
}
free(rand_char);
point_clear(Q);
//Set signature
mpz_set(sig->r, r);
mpz_set(sig->s, s);
mpz_clear(k); mpz_clear(r); mpz_clear(s); mpz_clear(x); mpz_clear(rem); mpz_clear(neg);
mpz_clear(t1); mpz_clear(t2); mpz_clear(t3); mpz_clear(seed); mpz_clear(n_div_2);
mpz_clear(s_mul_2);
clean:
free(rand_char);
point_clear(Q);
mpz_clear(k);
mpz_clear(r);
mpz_clear(s);
mpz_clear(x);
mpz_clear(rem);
mpz_clear(neg);
mpz_clear(t1);
mpz_clear(t2);
mpz_clear(t3);
mpz_clear(seed);
mpz_clear(n_div_2);
mpz_clear(s_mul_2);
}
}
......
......@@ -129,14 +129,15 @@ void *reallocate_function(void *ptr, size_t osize, size_t nsize) {
return (void *) nptr;
}
void get_global_random(unsigned char* _randBuff) {
void get_global_random(unsigned char* _randBuff, uint64_t _size) {
assert(_size <= 32);
sgx_sha_state_handle_t shaStateHandle;
assert(sgx_sha256_init(&shaStateHandle) == SGX_SUCCESS);
assert(sgx_sha256_update(globalRandom, 32, shaStateHandle) == SGX_SUCCESS);
assert(sgx_sha256_get_hash(shaStateHandle, globalRandom) == SGX_SUCCESS);
assert(sgx_sha256_get_hash(shaStateHandle, globalRandom) == SGX_SUCCESS);
assert(sgx_sha256_close(shaStateHandle) == SGX_SUCCESS);
memcpy(_randBuff, globalRandom, 32);
memcpy(_randBuff, globalRandom, _size);
}
......@@ -156,7 +157,7 @@ void trustedGenerateEcdsaKey(int *errStatus, char *errString,
domain_parameters_load_curve(curve, secp256k1);
unsigned char *rand_char = (unsigned char *) calloc(32, 1);
sgx_read_rand(rand_char, 32);
get_global_random(rand_char, 32);
mpz_t seed;
mpz_init(seed);
......@@ -936,7 +937,7 @@ void trustedGenerateEcdsaKeyAES(int *errStatus, char *errString,
domain_parameters_load_curve(curve, secp256k1);
unsigned char *rand_char = (unsigned char *) calloc(32, 1);
sgx_read_rand(rand_char, 32);
get_global_random(rand_char, 32);
mpz_t seed;
mpz_init(seed);
......
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