Ошибка генерации ключа RSA при вызове функции RSA_generate_key_ex

Я пытаюсь сгенерировать ключи RSA с помощью openssl. У меня ошибка наRSA_generate_key_ex и понятия не имею, почему возникает ошибка.

Я совмещаю ERR_get_error() а также ERR_error_string() и я получил следующее сообщение: error:2506906C:lib(37):func(105):reason(108). Также я обнаружил, что код ошибки 108 означает RSA_R_DATA_GREATER_THAN_MOD_LEN

Я пытаюсь сгенерировать ключи RSA, используя приведенный ниже код C. Для краткости сокращаю бесплатные звонки и вывод ошибок

RSA* generateRSA()
{
  BIGNUM *bne = BN_new();
  if (bne == NULL)
  {
    return NULL;
  }
  if (BN_set_word(bne, RSA_F4) != 1)
  {
    return NULL;
  }

  RSA *r = RSA_new();
  if (r == NULL)
  {
    return NULL;
  }
  // THERE I'VE GOT ERROR
  if (RSA_generate_key_ex(r, 2048, bne, NULL)!= 1)
  {
    // ERR_get_error() returns 2506906C
    // ERR_error_string() gives me RSA_R_DATA_GREATER_THAN_MOD_LEN
    return NULL;
  }

  return r;
}

Вопрос в том, что означает ошибка и как ее исправить?

Изменить: я использую OpenSSL 1.1.0e 16 февраля 2017 г. Я использую его как часть проекта EDK II

1 ответ

Решение

Я понял, что необходимо засеять случайный генератор (генераторы случайных чисел openssl версий 1.0.2 и 1.1.0 должны быть явно засеяны).

я проверяю RAND_status(). Он вернул 0. Итак, решение просто добавитьRAND_seed() перед генерацией ключа:

const void* getSeedBuffer(int num);

RSA* generateRSA()
{
  RAND_seed(getSeedBuffer(1000), 1000); // don't forget to free memory
  BIGNUM *bne = BN_new();
  if (bne == NULL)
  {
    return NULL;
  }
  if (BN_set_word(bne, RSA_F4) != 1)
  {
    return NULL;
  }

  RSA *r = RSA_new();
  if (r == NULL)
  {
    return NULL;
  }
  if (RSA_generate_key_ex(r, 2048, bne, NULL)!= 1)
  {
    return NULL;
  }

  return r;
}
Другие вопросы по тегам