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(); ...@@ -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_INFO(const char* msg);
EXTERNC void LOG_WARN(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 ...@@ -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) { 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 //message must not have a bit length longer than that of n
//see: Guide to Elliptic Curve Cryptography, section 4.4.1. //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 assert(mpz_sizeinbase(message, 2) <= mpz_sizeinbase(curve->n, 2));
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);
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 gmp_randstate_t r_state;
get_global_random(rand_char);
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); get_global_random(rand_char, 32);
// mpz_set_str(k, "DC87789C4C1A09C97FF4DE72C0D0351F261F10A2B9009C80AEE70DDEC77201A0", 16);
//mpz_set_str(k,"29932781130098090011281004827843485745127563886526054275935615017309884975795",10);
//Calculate x mpz_import(seed, 32, 1, sizeof(rand_char[0]), 0, 0, rand_char);
point_multiplication(Q, k, curve->G, curve);
mpz_set(x, Q->x);
//Calculate r mpz_mod(k, seed, curve->p);
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_set_str(k, "49a0d7b786ec9cde0d0721d72804befd06571c974b191efb42ecf322ba9ddd9a", 16);
// mpz_set_str(k, "DC87789C4C1A09C97FF4DE72C0D0351F261F10A2B9009C80AEE70DDEC77201A0", 16);
//mpz_set_str(k,"29932781130098090011281004827843485745127563886526054275935615017309884975795",10);
//Calculate s //Calculate x
//s = k¯¹(e+d*r) mod n = (k¯¹ mod n) * ((e+d*r) mod n) mod n point_multiplication(Q, k, curve->G, curve);
//number_theory_inverse(t1, k, curve->n);//t1 = k¯¹ mod n mpz_set(x, Q->x);
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 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; //Calculate s
if (mpz_cmp(s_mul_2, curve->n) > 0) { //s = k¯¹(e+d*r) mod n = (k¯¹ mod n) * ((e+d*r) mod n) mod n
b = 1; //number_theory_inverse(t1, k, curve->n);//t1 = k¯¹ mod n
} mpz_invert(t1, k, curve->n);
sig->v = mpz_get_ui(rem) ^ b; 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_mod_ui(rem, Q->y, 2);
mpz_sub(neg, curve->n, s); mpz_t s_mul_2;
mpz_set(s, neg); mpz_init(s_mul_2);
} mpz_mul_ui(s_mul_2, s, 2);
//Set signature unsigned b = 0;
mpz_set(sig->r, r); if (mpz_cmp(s_mul_2, curve->n) > 0) {
mpz_set(sig->s, s); 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); //Set signature
point_clear(Q); 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); clean:
mpz_clear(t1); mpz_clear(t2); mpz_clear(t3); mpz_clear(seed); mpz_clear(n_div_2);
mpz_clear(s_mul_2); 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) { ...@@ -129,14 +129,15 @@ void *reallocate_function(void *ptr, size_t osize, size_t nsize) {
return (void *) nptr; 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; sgx_sha_state_handle_t shaStateHandle;
assert(sgx_sha256_init(&shaStateHandle) == SGX_SUCCESS); assert(sgx_sha256_init(&shaStateHandle) == SGX_SUCCESS);
assert(sgx_sha256_update(globalRandom, 32, 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_get_hash(shaStateHandle, globalRandom) == SGX_SUCCESS); assert(sgx_sha256_get_hash(shaStateHandle, globalRandom) == SGX_SUCCESS);
assert(sgx_sha256_close(shaStateHandle) == 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, ...@@ -156,7 +157,7 @@ void trustedGenerateEcdsaKey(int *errStatus, char *errString,
domain_parameters_load_curve(curve, secp256k1); domain_parameters_load_curve(curve, secp256k1);
unsigned char *rand_char = (unsigned char *) calloc(32, 1); 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_t seed;
mpz_init(seed); mpz_init(seed);
...@@ -936,7 +937,7 @@ void trustedGenerateEcdsaKeyAES(int *errStatus, char *errString, ...@@ -936,7 +937,7 @@ void trustedGenerateEcdsaKeyAES(int *errStatus, char *errString,
domain_parameters_load_curve(curve, secp256k1); domain_parameters_load_curve(curve, secp256k1);
unsigned char *rand_char = (unsigned char *) calloc(32, 1); 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_t seed;
mpz_init(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