Не удается передать AutoSeededRandomPool в качестве параметра при использовании CryptoPP::RSA, ошибка C2729

Я работаю с реализацией RSA с использованием Crypto++. Я пытаюсь сгенерировать пару ключей RSA (открытый и закрытый) для файла, подобного этому.

Код может работать идеально, когда я положил все в main, Когда я пытаюсь разделить его на функцию и передать AutoSeededRandomPool объект как параметр, подобный этому:

int generateKeyToFile(
    AutoSeededRandomPool rnd, 
    string publicKeyFileName, string privateKeyFileName){
    try
    {
        RSA::PrivateKey rsaPrivate;
        rsaPrivate.GenerateRandomWithKeySize(rnd, 3072);

        RSA::PublicKey rsaPublic(rsaPrivate);
        EncodePrivateKey(privateKeyFileName, rsaPrivate);
        EncodePublicKey(publicKeyFileName, rsaPublic);

        cout << "Successfully generated and saved RSA keys" << endl;
        return 1;
    }

    catch (CryptoPP::Exception& e)
    {
        cerr << e.what() << endl;
        return -1;
    }
}

При сборке проекта я получил ошибку:

ошибка C2719: 'rnd': формальный параметр с __declspec(align('8')) не будет выровнен

Я не могу найти точный результат, связанный с Crypto ++, для этой ошибки от Google, но я нашел некоторый результат для кода ошибки C2719. Его содержание:

'параметр': формальный параметр с __declspec(align('#')) не будет выровнен

Модификатор align __declspec недопустим для параметров функции. Выравнивание параметров функции определяется используемым соглашением о вызовах. Для получения дополнительной информации см. Соглашение о вызовах.

В следующем примере создается C2719 и показано, как его исправить:

// C2719.cpp  
void func(int __declspec(align(32)) i);   // C2719  
// try the following line instead  
 void func(int i);

Я еще не понял, применил ли это "решение" к моему делу.

Кажется AutoSeededRandomPool не может быть передан в качестве параметра. Есть ли способ обойти это?

1 ответ

Решение
int generateKeyToFile(
     AutoSeededRandomPool rnd, 
    string publicKeyFileName, string privateKeyFileName){
    ...
}

Используйте ссылку:

int GenerateKeyToFile(
    RandomNumberGenerator& rnd, 
    const string& publicKeyFileName,
    const string& privateKeyFileName)
    {
        ...
    }

Я не уверен AutoSeededRandomPool является копируемым Я думаю, что все работает, как и ожидалось, потому что вы, вероятно, не должны копировать один. Просто передайте его по ссылке или по указателю.

Другие вопросы по тегам