feat: prime working rly slow and leaks
This commit is contained in:
parent
a000c56ce5
commit
6806db1c6f
|
@ -12,6 +12,9 @@ all: $(NAME)
|
||||||
$(NAME):
|
$(NAME):
|
||||||
gcc -Wall -Wextra -Werror $(SRC) -o $(NAME)
|
gcc -Wall -Wextra -Werror $(SRC) -o $(NAME)
|
||||||
|
|
||||||
|
fast:
|
||||||
|
gcc -Wall -Wextra -Werror -o3 $(SRC) -o $(NAME)
|
||||||
|
|
||||||
fclean:
|
fclean:
|
||||||
rm -rf $(NAME)
|
rm -rf $(NAME)
|
||||||
|
|
||||||
|
|
191
rsa/bigint.c
191
rsa/bigint.c
|
@ -164,6 +164,35 @@ bigint_t assignable_bigint_modulo(bigint_t a, bigint_t b) {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO check opti
|
||||||
|
void custom_bigint_modulo(bigint_t a, bigint_t b, bigint_t result) {
|
||||||
|
bigint_set_zeros(result);
|
||||||
|
memcpy(result.data, a.data, a.len * sizeof(uint32_t));
|
||||||
|
bigint_t mod = bigint_clone(b);
|
||||||
|
if (a.len > b.len) {
|
||||||
|
mod = bigint_zero(a.len);
|
||||||
|
memcpy(mod.data, b.data, b.len * sizeof(uint32_t));
|
||||||
|
}
|
||||||
|
if (bigint_cmp(result, b) == -1) {
|
||||||
|
bigint_destroy(mod);
|
||||||
|
return ;
|
||||||
|
}
|
||||||
|
bigint_bitwise_left_shift(mod);
|
||||||
|
while (bigint_cmp(b, mod) == -1) {
|
||||||
|
while (bigint_cmp(result, mod) == 1) {
|
||||||
|
bigint_bitwise_left_shift(mod);
|
||||||
|
}
|
||||||
|
bigint_bitwise_right_shift(mod);
|
||||||
|
if (bigint_cmp(result, mod) == 1) {
|
||||||
|
bigint_substraction(result, mod);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
while (bigint_cmp(result, b) == 1) {
|
||||||
|
bigint_substraction(result, b);
|
||||||
|
}
|
||||||
|
bigint_destroy(mod);
|
||||||
|
}
|
||||||
|
|
||||||
void bigint_add(bigint_t a, bigint_t b) {
|
void bigint_add(bigint_t a, bigint_t b) {
|
||||||
bigint_t result = bigint_zero(a.len);
|
bigint_t result = bigint_zero(a.len);
|
||||||
size_t size = sizeof(uint32_t) * 8;
|
size_t size = sizeof(uint32_t) * 8;
|
||||||
|
@ -207,10 +236,31 @@ bigint_t assignable_bigint_mul(bigint_t a, bigint_t b) {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void custom_bigint_mul(bigint_t a, bigint_t b, bigint_t result) {
|
||||||
|
bigint_t b_tool = bigint_zero(RSA_BLOCK_SIZE / 8 / sizeof(uint32_t) * 4);
|
||||||
|
size_t size = sizeof(uint32_t) * 8;
|
||||||
|
size_t width = a.len * size;
|
||||||
|
bigint_set_zeros(result);
|
||||||
|
for (size_t cursor = 0; cursor < width; cursor++) {
|
||||||
|
if (a.data[cursor / 32] >> (cursor % 32) & 1) {
|
||||||
|
bigint_set_zeros(b_tool);
|
||||||
|
memcpy(b_tool.data, b.data, b.len * sizeof(uint32_t));
|
||||||
|
for (size_t i = 0; i < cursor; i++) {
|
||||||
|
bigint_bitwise_left_shift(b_tool);
|
||||||
|
}
|
||||||
|
bigint_add(result, b_tool);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
bigint_destroy(b_tool);
|
||||||
|
}
|
||||||
|
|
||||||
// a^e mod n
|
// a^e mod n
|
||||||
// clean memory tricks !!!
|
// clean memory tricks !!!
|
||||||
bigint_t assignable_bigint_pow_mod(bigint_t a, bigint_t e, bigint_t n) {
|
void custom_bigint_pow_mod(bigint_t a, bigint_t e, bigint_t n, bigint_t result, bigint_t custom, bigint_t custom2) {
|
||||||
bigint_t result = bigint_clone(a);
|
bigint_set_zeros(result);
|
||||||
|
bigint_set_zeros(custom);
|
||||||
|
bigint_set_zeros(custom2);
|
||||||
|
memcpy(result.data, a.data, a.len * sizeof(uint32_t));
|
||||||
size_t size = sizeof(uint32_t) * 8;
|
size_t size = sizeof(uint32_t) * 8;
|
||||||
int cursor = e.len * size - 1;
|
int cursor = e.len * size - 1;
|
||||||
while (!(e.data[cursor / 32] & 1 << (cursor % 32))) {
|
while (!(e.data[cursor / 32] & 1 << (cursor % 32))) {
|
||||||
|
@ -218,26 +268,45 @@ bigint_t assignable_bigint_pow_mod(bigint_t a, bigint_t e, bigint_t n) {
|
||||||
}
|
}
|
||||||
cursor--;
|
cursor--;
|
||||||
while (cursor >= 0) {
|
while (cursor >= 0) {
|
||||||
bigint_t tmp_result2 = assignable_bigint_mul(result, result);
|
custom_bigint_mul(result, result, custom);
|
||||||
bigint_destroy(result);
|
custom_bigint_modulo(custom, n, custom2);
|
||||||
result = bigint_clone(tmp_result2);
|
bigint_set_zeros(result);
|
||||||
bigint_destroy(tmp_result2);
|
memcpy(result.data, custom2.data, custom2.len * sizeof(uint32_t));
|
||||||
tmp_result2 = assignable_bigint_modulo(result, n);
|
|
||||||
bigint_destroy(result);
|
|
||||||
result = bigint_clone(tmp_result2);
|
|
||||||
bigint_destroy(tmp_result2);
|
|
||||||
if (e.data[cursor / 32] & 1 << (cursor % 32)) {
|
if (e.data[cursor / 32] & 1 << (cursor % 32)) {
|
||||||
bigint_t tmp_result = assignable_bigint_mul(result, a);
|
custom_bigint_mul(result, a, custom);
|
||||||
bigint_destroy(result);
|
custom_bigint_modulo(custom, n, custom2);
|
||||||
result = bigint_clone(tmp_result);
|
memcpy(result.data, custom2.data, custom2.len * sizeof(uint32_t));
|
||||||
bigint_destroy(tmp_result);
|
|
||||||
tmp_result = assignable_bigint_modulo(result, n);
|
|
||||||
bigint_destroy(result);
|
|
||||||
result = bigint_clone(tmp_result);
|
|
||||||
bigint_destroy(tmp_result);
|
|
||||||
}
|
}
|
||||||
cursor -= 1;
|
cursor -= 1;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
// a^e mod n
|
||||||
|
// clean memory tricks !!!
|
||||||
|
bigint_t assignable_bigint_pow_mod(bigint_t a, bigint_t e, bigint_t n) {
|
||||||
|
bigint_t result = bigint_zero(RSA_BLOCK_SIZE / 8 / sizeof(uint32_t) * 4);
|
||||||
|
memcpy(result.data, a.data, a.len * sizeof(uint32_t));
|
||||||
|
bigint_t custom = bigint_zero(RSA_BLOCK_SIZE / 8 / sizeof(uint32_t) * 4);
|
||||||
|
bigint_t custom2 = bigint_zero(RSA_BLOCK_SIZE / 8 / sizeof(uint32_t) * 4);
|
||||||
|
size_t size = sizeof(uint32_t) * 8;
|
||||||
|
int cursor = e.len * size - 1;
|
||||||
|
while (!(e.data[cursor / 32] & 1 << (cursor % 32))) {
|
||||||
|
cursor--;
|
||||||
|
}
|
||||||
|
cursor--;
|
||||||
|
while (cursor >= 0) {
|
||||||
|
custom_bigint_mul(result, result, custom);
|
||||||
|
custom_bigint_modulo(custom, n, custom2);
|
||||||
|
bigint_set_zeros(result);
|
||||||
|
memcpy(result.data, custom2.data, custom2.len * sizeof(uint32_t));
|
||||||
|
if (e.data[cursor / 32] & 1 << (cursor % 32)) {
|
||||||
|
custom_bigint_mul(result, a, custom);
|
||||||
|
custom_bigint_modulo(custom, n, custom2);
|
||||||
|
memcpy(result.data, custom2.data, custom2.len * sizeof(uint32_t));
|
||||||
|
}
|
||||||
|
cursor -= 1;
|
||||||
|
}
|
||||||
|
bigint_destroy(custom);
|
||||||
|
bigint_destroy(custom2);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -257,39 +326,97 @@ bigint_t bigint_clone(bigint_t src) {
|
||||||
return dst;
|
return dst;
|
||||||
}
|
}
|
||||||
|
|
||||||
bigint_t bigint_prime(size_t len) {
|
void bulk_destroy(bigint_t x, bigint_t y, bigint_t n, bigint_t d, bigint_t two, bigint_t one, bigint_t n_minus_two, bigint_t n_minus_one) {
|
||||||
bigint_t n = bigint_new(len);
|
bigint_destroy(x);
|
||||||
|
bigint_destroy(y);
|
||||||
|
bigint_destroy(n);
|
||||||
|
bigint_destroy(d);
|
||||||
|
bigint_destroy(two);
|
||||||
|
bigint_destroy(one);
|
||||||
|
bigint_destroy(n_minus_two);
|
||||||
|
bigint_destroy(n_minus_one);
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
bigint_t bigint_random_range(bigint_t low, bigint_t high) {
|
||||||
|
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
bigint_t bigint_prime(size_t len) {
|
||||||
|
bigint_t n = bigint_zero(len);
|
||||||
|
|
||||||
printf("new\n");
|
|
||||||
bigint_print(n);
|
|
||||||
bigint_set_random_bytes(n);
|
bigint_set_random_bytes(n);
|
||||||
printf("random bytes\n");
|
|
||||||
bigint_print(n);
|
|
||||||
bigint_set_msb_and_lsb_to_one(n);
|
bigint_set_msb_and_lsb_to_one(n);
|
||||||
printf("msb and lsb set to one\n");
|
// printf("msb and lsb set to one N IS: \n");
|
||||||
bigint_print(n);
|
// bigint_print(n);
|
||||||
|
|
||||||
bigint_t d = bigint_clone(n);
|
bigint_t d = bigint_clone(n);
|
||||||
d.data[0] -= 1;
|
d.data[0] -= 1;
|
||||||
uint32_t s = 0;
|
uint32_t s = 0;
|
||||||
while (!d.data[0] & 1) {
|
while (!(d.data[0] & 1)) {
|
||||||
bigint_bitwise_right_shift(d);
|
bigint_bitwise_right_shift(d);
|
||||||
s += 1;
|
s += 1;
|
||||||
}
|
}
|
||||||
|
// printf("D IS:\n");
|
||||||
|
// bigint_print(d);
|
||||||
|
|
||||||
|
bigint_t x = bigint_zero(RSA_BLOCK_SIZE / 8 / sizeof(uint32_t) * 4);
|
||||||
|
bigint_t y = bigint_zero(RSA_BLOCK_SIZE / 8 / sizeof(uint32_t) * 4);
|
||||||
|
bigint_t custom = bigint_zero(RSA_BLOCK_SIZE / 8 / sizeof(uint32_t) * 4);
|
||||||
|
bigint_t custom2 = bigint_zero(RSA_BLOCK_SIZE / 8 / sizeof(uint32_t) * 4);
|
||||||
|
|
||||||
bigint_t two = bigint_zero(len);
|
bigint_t two = bigint_zero(len);
|
||||||
two.data[0] = 2;
|
two.data[0] = 2;
|
||||||
bigint_t n_minus_two = bigint_clone(d);
|
bigint_t one = bigint_zero(len);
|
||||||
|
one.data[0] = 1;
|
||||||
|
bigint_t n_minus_two = bigint_clone(n);
|
||||||
|
bigint_t n_minus_one = bigint_clone(n);
|
||||||
|
n_minus_two.data[0] -= 1;
|
||||||
|
n_minus_one.data[0] -= 1;
|
||||||
bigint_decrement(n_minus_two);
|
bigint_decrement(n_minus_two);
|
||||||
|
bigint_t a = bigint_zero(len);
|
||||||
|
// printf("s is %d\n", s);
|
||||||
for (uint32_t k = 0; k < 128; k++) {
|
for (uint32_t k = 0; k < 128; k++) {
|
||||||
bigint_t a = bigint_zero(len);
|
// printf("this is good %d\n", k);
|
||||||
|
//bigint_t a = bigint_zero(len);
|
||||||
|
bigint_set_zeros(a);
|
||||||
while (bigint_cmp(a, two) == -1 || bigint_cmp(a, n_minus_two) == 1) {
|
while (bigint_cmp(a, two) == -1 || bigint_cmp(a, n_minus_two) == 1) {
|
||||||
printf("this is good %d\n", k);
|
|
||||||
bigint_set_random_bytes(a);
|
bigint_set_random_bytes(a);
|
||||||
}
|
}
|
||||||
bigint_destroy(a);
|
//printf("A IS: \n");
|
||||||
|
//bigint_print(a);
|
||||||
|
//printf("a %d\n", k);
|
||||||
|
//bigint_t x = custom_bigint_pow_mod(a, d, n, x, custom, custom2);
|
||||||
|
custom_bigint_pow_mod(a, d, n, x, custom, custom2);
|
||||||
|
//printf("b %d\n", k);
|
||||||
|
for (uint32_t i = 0; i < s; i++) {
|
||||||
|
//bigint_destroy(y);
|
||||||
|
custom_bigint_pow_mod(x, two, n, y, custom, custom2);
|
||||||
|
//y = assignable_bigint_pow_mod(x, two, n);
|
||||||
|
//printf("X IS: \n");
|
||||||
|
//bigint_print(x);
|
||||||
|
//printf("Y IS: \n");
|
||||||
|
//bigint_print(y);
|
||||||
|
if (bigint_cmp(y, one) == 0 && bigint_cmp(x, one) != 0 && bigint_cmp(x, n_minus_one) != 0) {
|
||||||
|
bulk_destroy(x, y, n, d, two, one, n_minus_two, n_minus_one);
|
||||||
|
bigint_destroy(a);
|
||||||
|
// printf("failed first test\n");
|
||||||
|
return bigint_prime(len);
|
||||||
|
}
|
||||||
|
bigint_destroy(x);
|
||||||
|
x = bigint_clone(y);
|
||||||
|
}
|
||||||
|
if (bigint_cmp(y, one) != 0) {
|
||||||
|
// printf("y is equal to %d and %d", y.data[1], y.data[0]);
|
||||||
|
// printf("failed second test\n");
|
||||||
|
bulk_destroy(x, y, n, d, two, one, n_minus_two, n_minus_one);
|
||||||
|
bigint_destroy(a);
|
||||||
|
return bigint_prime(len);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
bigint_destroy(a);
|
||||||
|
// for (int i = 0; i < 10000; i++) {
|
||||||
|
// printf("CHU A MON PRIME!!!\n");
|
||||||
|
// }
|
||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
85
rsa/rsa.c
85
rsa/rsa.c
|
@ -3,11 +3,15 @@
|
||||||
rsa_t rsa_init(size_t len) {
|
rsa_t rsa_init(size_t len) {
|
||||||
rsa_t rsa;
|
rsa_t rsa;
|
||||||
|
|
||||||
// rsa.p = bigint_prime(len / 2);
|
printf("Generating two primes of length %d bits\n", RSA_BLOCK_SIZE / 2);
|
||||||
// rsa.q = bigint_prime(len / 2);
|
printf("Generating p...\n");
|
||||||
|
rsa.p = bigint_prime(len / 2);
|
||||||
|
printf("p = %u\n", rsa.p.data[0]);
|
||||||
|
printf("Generating q...\n");
|
||||||
|
rsa.q = bigint_prime(len / 2);
|
||||||
|
printf("q = %u\n", rsa.q.data[0]);
|
||||||
|
|
||||||
|
|
||||||
rsa.p = bigint_zero(len / 2);
|
|
||||||
rsa.q = bigint_zero(len / 2);
|
|
||||||
return rsa;
|
return rsa;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -20,84 +24,21 @@ rsa_t rsa_generate_keys(size_t block_size) {
|
||||||
|
|
||||||
a.data[0] = 1234567890;
|
a.data[0] = 1234567890;
|
||||||
b.data[0] = 234567;
|
b.data[0] = 234567;
|
||||||
|
|
||||||
printf("cmp a and b %d\n", bigint_cmp(a, b));
|
|
||||||
|
|
||||||
a.data[0] = 1234567890;
|
|
||||||
// b.data[0] = 1921572864;
|
|
||||||
|
|
||||||
printf("cmp a and b %d\n", bigint_cmp(a, b));
|
|
||||||
|
|
||||||
/*
|
|
||||||
printf("cmp a and b %d\n", bigint_cmp(a, b));
|
|
||||||
printf("cmp b and a %d\n", bigint_cmp(b, a));
|
|
||||||
|
|
||||||
bigint_bitwise_left_shift(b);
|
|
||||||
printf("cmp a and b %d\n", bigint_cmp(a, b));
|
|
||||||
bigint_bitwise_left_shift(b);
|
|
||||||
printf("cmp a and b %d\n", bigint_cmp(a, b));
|
|
||||||
bigint_bitwise_left_shift(b);
|
|
||||||
printf("cmp a and b %d\n", bigint_cmp(a, b));
|
|
||||||
bigint_bitwise_left_shift(b);
|
|
||||||
printf("cmp a and b %d\n", bigint_cmp(a, b));
|
|
||||||
bigint_bitwise_left_shift(b);
|
|
||||||
printf("cmp a and b %d\n", bigint_cmp(a, b));
|
|
||||||
bigint_bitwise_left_shift(b);
|
|
||||||
printf("cmp a and b %d\n", bigint_cmp(a, b));
|
|
||||||
bigint_bitwise_left_shift(b);
|
|
||||||
printf("cmp a and b %d\n", bigint_cmp(a, b));
|
|
||||||
bigint_bitwise_left_shift(b);
|
|
||||||
printf("cmp a and b %d\n", bigint_cmp(a, b));
|
|
||||||
bigint_bitwise_left_shift(b);
|
|
||||||
printf("b %ud\n", b.data[0]);
|
|
||||||
printf("cmp a and b %d\n", bigint_cmp(a, b));
|
|
||||||
bigint_bitwise_left_shift(b);
|
|
||||||
printf("b %ud\n", b.data[0]);
|
|
||||||
printf("cmp a and b %d\n", bigint_cmp(a, b));
|
|
||||||
bigint_bitwise_left_shift(b);
|
|
||||||
printf("b %ud\n", b.data[0]);
|
|
||||||
printf("cmp a and b %d\n", bigint_cmp(a, b));
|
|
||||||
bigint_bitwise_left_shift(b);
|
|
||||||
printf("b %ud\n", b.data[0]);
|
|
||||||
printf("cmp a and b %d\n", bigint_cmp(a, b));
|
|
||||||
bigint_bitwise_left_shift(b);
|
|
||||||
printf("b %ud\n", b.data[0]);
|
|
||||||
printf("cmp a and b %d\n", bigint_cmp(a, b));
|
|
||||||
bigint_bitwise_left_shift(b);
|
|
||||||
printf("b %ud\n", b.data[0]);
|
|
||||||
printf("cmp a and b %d\n", bigint_cmp(a, b));
|
|
||||||
bigint_bitwise_left_shift(b);
|
|
||||||
printf("b %ud\n", b.data[0]);
|
|
||||||
printf("cmp a and b %d\n", bigint_cmp(a, b));
|
|
||||||
bigint_bitwise_left_shift(b);
|
|
||||||
printf("b %ud\n", b.data[0]);
|
|
||||||
printf("cmp a and b %d\n", bigint_cmp(a, b));
|
|
||||||
bigint_bitwise_left_shift(b);
|
|
||||||
printf("b %ud\n", b.data[0]);
|
|
||||||
printf("cmp a and b %d\n", bigint_cmp(a, b));
|
|
||||||
*/
|
|
||||||
bigint_t result = assignable_bigint_modulo(a, b);
|
bigint_t result = assignable_bigint_modulo(a, b);
|
||||||
|
|
||||||
printf("result is %ud\n", result.data[0]);
|
printf("result is %ud\n", result.data[0]);
|
||||||
|
|
||||||
|
bigint_destroy(a);
|
||||||
a = bigint_clone(result);
|
a = bigint_clone(result);
|
||||||
b.data[0] = 5764;
|
b.data[0] = 5764;
|
||||||
|
|
||||||
printf("length\na: %lu e: %lu n: %lu\n", result.len, a.len, b.len);
|
printf("length\na: %lu e: %lu n: %lu\n", result.len, a.len, b.len);
|
||||||
|
|
||||||
bigint_t result2 = assignable_bigint_pow_mod(result, a, b);
|
bigint_t result2 = assignable_bigint_pow_mod(result, a, b);
|
||||||
|
bigint_destroy(a);
|
||||||
|
bigint_destroy(b);
|
||||||
|
bigint_destroy(result);
|
||||||
printf("bigpowmod is %u \n", result2.data[0]);
|
printf("bigpowmod is %u \n", result2.data[0]);
|
||||||
/* result.data[0] = 8;
|
bigint_destroy(result2);
|
||||||
a.data[0] = 4;
|
|
||||||
result2 = assignable_bigint_mul(result, a);
|
|
||||||
printf("result2 is %u \n", result2.data[0]);
|
|
||||||
result.data[0] = 84;
|
|
||||||
a.data[0] = 463;
|
|
||||||
result2 = assignable_bigint_mul(result, a);
|
|
||||||
printf("result2 is %u \n", result2.data[0]);
|
|
||||||
bigint_add(result, a);
|
|
||||||
|
|
||||||
printf("result2 is %u \n", result.data[0]);
|
|
||||||
*/
|
|
||||||
return rsa;
|
return rsa;
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#define RSA_BLOCK_SIZE 2048
|
#define RSA_BLOCK_SIZE 64
|
||||||
|
|
||||||
typedef struct bigint_s {
|
typedef struct bigint_s {
|
||||||
uint32_t *data;
|
uint32_t *data;
|
||||||
|
@ -42,6 +42,7 @@ void bigint_add(bigint_t a, bigint_t b);
|
||||||
bigint_t assignable_bigint_mul(bigint_t a, bigint_t b);
|
bigint_t assignable_bigint_mul(bigint_t a, bigint_t b);
|
||||||
bigint_t assignable_bigint_modulo(bigint_t a, bigint_t b);
|
bigint_t assignable_bigint_modulo(bigint_t a, bigint_t b);
|
||||||
bigint_t assignable_bigint_pow_mod(bigint_t a, bigint_t e, bigint_t n);
|
bigint_t assignable_bigint_pow_mod(bigint_t a, bigint_t e, bigint_t n);
|
||||||
|
void bigint_set_zeros(bigint_t n);
|
||||||
|
|
||||||
void bigint_destroy(bigint_t n);
|
void bigint_destroy(bigint_t n);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue