Ошибка GMP на mpz_tdiv_q_2exp - PullRequest
       8

Ошибка GMP на mpz_tdiv_q_2exp

0 голосов
/ 11 февраля 2020

У меня есть программа, которая является своего рода экспериментом в криптографии. В моей попытке выделить показатель степени c и модуль, я использовал вышеупомянутую функцию. Это работает некоторое время, но всякий раз, когда я выполняю вычисление достаточно раз, адрес переменной mpz_t изменяется, а затем выдает ошибку сегментации.

// get N and e from public key of format
// {e}FFFFFFFFFFFFFFFF{N}
void get_N_e(mpz_t retvalN, mpz_t retvale, mpz_t key) {
        // create 0xFF as a mpz_t to use AND on it later
        mpz_t ff;
        mpz_init(ff);
        mpz_set_ui(ff, 0xff);

        // store the huge number to be imported later
        char data[4096];
        // count the number of consecutive 0xFFs
        int no_ffs = 0;
        // index for data
        long i = 0;
        while (no_ffs < 8) {
                // test = key & 0xFF
                mpz_t test;
                mpz_init(test);
                mpz_set_ui(test, 0);
                mpz_and(test, key, ff);
                // tmp = (unsigned int) test
                unsigned int tmp;
                tmp = mpz_get_ui(test);
                mpz_clear(test);
                if (tmp == 0xff) {
                        ++no_ffs;
                }
                else {
                        data[i++] = tmp;
                        no_ffs = 0;
                }
                // key >>= 8
                // source of the segfault
                mpz_tdiv_q_2exp(key, key, 8);
        }

        mpz_clear(ff);
        mpz_import(retvalN, 4096, 1, sizeof(char), 1, 0, data);
}

1 Ответ

0 голосов
/ 11 февраля 2020

Я нашел ответ. Оказывается, я не смог проверить, был ли key не равен нулю. Добавление некоторого кода, чтобы проверить, что исправило мою проблему с сегфолтом.

...