Чтобы использовать большое количество, я нашел библиотеку gmp. Я пытаюсь писать модульные тесты по ходу работы, чтобы быть уверенным, что все работает правильно. Для модульных тестов я использую острый.
В настоящее время возникает проблема: я получаю сообщение «TEST INTERRUPTED BY SIGSEGV», когда пытаюсь выполнить слишком много операторов?
Итак, тест здесь работает:
Код: Выделить всё
void createRSA(void) {
gmp_randstate_ptr state;
gmp_randinit_default(state);
RSA rsa1(state);
RSA rsa2(state);
RSA rsa3(state);
RSA rsa4(state);
// RSA rsa5(state);
}
Код: Выделить всё
void createRSA(void) {
gmp_randstate_ptr state;
gmp_randinit_default(state);
RSA rsa(state);
mpz_class d = rsa.getD();
mpz_class e = rsa.getE();
mpz_class n = rsa.getN();
TEST_ASSERT(((mpz_sizeinbase(n.get_mpz_t(), 2) + 7) / 8) == 128);
TEST_ASSERT(((mpz_sizeinbase(n.get_mpz_t(), 2) + 7) / 8) == 128);
TEST_ASSERT(rsa.getE() == 65537);
// RSA rsa2(state);
}
Код: Выделить всё
class RSA {
private:
mpz_class e, d, n;
public:
RSA(gmp_randstate_ptr state);
getE() { return e; };
getD() { return d; };
getN() { return n; };
}
#include "rsa.hpp"
#include "gmp.h"
#include "gmpxx.h"
RSA::RSA(gmp_randstate_ptr state) {
// create rsa pair and set the values
mpz_t p, q, E, D, N, x, y, phi, u, t, gcd;
mpz_inits(p, q, E, D, N, x, y, phi, u, t, gcd, NULL);
mpz_set_ui(E, 65537);
mpz_setbit(u, 511);
mpz_setbit(t, 512);
mpz_urandomb(x, state, 512);
mpz_add(x, x, u);
mpz_mod(x, x, t);
mpz_urandomb(y, state, 512);
mpz_add(y, y, u);
mpz_mod(y, y, t);
mpz_nextprime(p, x);
mpz_nextprime(q, y);
mpz_mul(N, p, q);
int k = (mpz_sizeinbase(N, 2) + 7) / 8;
while (k != 128) {
mpz_urandomb(x, state, 512);
mpz_add(x, x, u);
mpz_mod(x, x, t);
mpz_urandomb(y, state, 512);
mpz_add(y, y, u);
mpz_mod(y, y, t);
mpz_nextprime(p, x);
mpz_nextprime(q, y);
mpz_mul(N, p, q);
k = (mpz_sizeinbase(N, 2) + 7) / 8;
}
mpz_sub_ui(p, p, 1);
mpz_sub_ui(q, q, 1);
mpz_mul(phi, p, q);
mpz_gcd(gcd, E, phi);
int res = mpz_invert(D, E, phi);
if (res == 0) {
printf("Failed to compute inverse of e!\n");
exit(1);
}
e = mpz_class(E);
d = mpz_class(D);
n = mpz_class(N);
mpz_clears(p, q, E, D, N, x, y, phi, u, t, gcd, NULL);
}
Я действительно не понимаю, почему тест в какой-то момент начинает давать сбой.
/>Если у кого-то есть идеи, любая помощь будет очень признательна!
Я попробовал несколько разных методов тестирования, чтобы выяснить, где именно что-то идет не так, но не смог определить точку сбоя. Тесты также терпят неудачу, когда я создаю 3 объекта RSA и читаю более 2 полей. Таким образом, тест, который создает два объекта, а затем сравнивает n полей обоих объектов, ПРОЙДЕТ, но если я добавлю в этот тест третий объект и попытаюсь прочитать поле n этого объекта, я получу SIGSEGV.
Я также создал очень простой конструктор, в котором я буквально просто установил для полей заданное число:
Код: Выделить всё
RSA::RSA(gmp_randstate_ptr state) {
e = mpz_class(1); // the wrapper is not needed but also without I get SIGSEGV
d = mpz_class(2);
n = mpz_class(4);
}
Подробнее здесь: https://stackoverflow.com/questions/787 ... nd-acutest