wc_RsaSSL_Verify возвращает BAD_FUNC_ARG, и я не могу сказать, почему

Я пытаюсь, чтобы открытый ключ RSA расшифровал подписанный файл с помощью wolfcrypt - да, я могу или не могу злоупотреблять возможностью RSA "подписать / проверить" для шифрования отдельного ключа AES с использованием личного ключа и дешифрования с использованием открытого ключа.

К сожалению, я застрял в wc_RsaSSL_Verify() - из-за своей жизни я не могу понять, почему он возвращает BAD_FUNC_ARG - я подумал, что такая ошибка должна быть сразу видна кому-то другому, поэтому я решаю обратиться к коллективу полномочия Stackru.

Насколько я могу судить, я даю функции то, что она запрашивает - входной буфер, выходной буфер, размер каждого и указатель на структуру RsaKey. Вот фрагмент кода из рассматриваемой функции:

bool VerifyWorker::GetAESKey()
{
  bool result = true;
  uint8_t en_aes_file_buff[VerifyWorkerLocal::RSA_KEY_SIZE];
  uint8_t de_aes_file_buff[VerifyWorkerLocal::RSA_KEY_SIZE];

  uint8_t* aes_iv_ptr = NULL;

  // keyfile filestream
  std::fstream aes_file;

  // rsa_key must be initialized
  if(rsa_key == NULL)
  {
     result = false;
  }

  // Open the key file and read it into a local buffer, then decrypt it and use it to initialize the
  // aes struct
  if(result)
  {
     aes_file.open(this->aes_key_file, std::ios_base::in | std::ios_base::binary);

     if(aes_file.fail())
     {
        // Unable to open file - perror?
        perror("GetAESKey");
        result = false;
     }
     else
     {
        aes_file.read(reinterpret_cast<char*>(en_aes_file_buff), VerifyWorkerLocal::RSA_KEY_SIZE + 1);
        if(!aes_file.eof())
        {
           // we didn't have enough space to read the whole signature!
           std::cerr << "aes_file read failed! " << aes_file.rdstate() << std::endl;
           result = false;
        }
     }
  }

  // "Unsign" the aes key file with RSA verify, and load the aes struct with the result
  if(result)
  {
     int wc_ret = 0;
     wc_ret = wc_RsaSSL_Verify(const_cast<const byte*>(en_aes_file_buff),
                               VerifyWorkerLocal::RSA_KEY_SIZE, reinterpret_cast<byte*>(&de_aes_file_buff),
                               VerifyWorkerLocal::RSA_KEY_SIZE, rsa_key);

Rsa_key - это закрытый элемент, инициализированный (успешно с использованием wc_PublicKeyDecode()) в отдельной функции с файлом DER открытого ключа. Я сгенерировал как открытый, так и закрытый ключ, используя OpenSSL - который должен правильно дополнить мой ключ AES и файл iv, используя PKCS#1 v1.5 b по умолчанию.

Я должен также упомянуть, что я использую wolfssl версии 3.9.8. Спасибо!

2 ответа

Решение

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

openssl rsautl -in keyfile -out keyfile -inkey private.pem -sign

Очевидно, openssl не любит, когда вы указываете один и тот же файл для -in и -out. Когда я изменил что-то вроде

openssl rsautl -in keyfile -out keyfile_signed -inkey private.pem -sign

Я действительно смог проверить файл с помощью wc_RsaSSL_Verify.

Так что, как и большинство глупых проблем с программным обеспечением в последний вечер, я искал не в том месте. Я был немного сбит с толку возвращаемым BAD_FUNC_ARG и думал, что это связано с форматом аргументов функции, а не с их содержимым. Надеюсь, этот ответ будет полезен и для кого-то еще.

Похоже, вы пытаетесь использовать RSA_Sign для выполнения "шифрования" ключа AES. Затем я предполагаю, что вы отправляете удаленному партнеру или компьютеру, который затем запустит операцию RSA_Verify для расшифровки ключа AES, правильно ли я понимаю сценарий?

Если это так, я прошу прощения, он не обнаружился, если вы искали, как это сделать изначально, но у нас на самом деле есть пример сделать именно это:

https://github.com/wolfSSL/wolfssl-examples/tree/master/signature/encryption-through-signing

Этот пример включает в себя два отдельных приложения. Первое приложение, rsa-private-encrypt-app.c, подпишет (зашифрует) "поддельный ключ Aes" и выведет результат в файл. Второе приложение, "rsa-public-decrypt-app.c", затем открывает файл, который был выведен, и выполняет проверку (дешифрование) данных, содержащихся в файле, для восстановления оригинального "поддельного ключа Aes".

Я могу или не могу злоупотреблять полномочиями RSA "подписывать / проверять" для шифрования отдельного ключа AES с использованием личного ключа и дешифрования с использованием открытого ключа.

Нет, совсем нет, это правильное использование RSA-подписи / проверки, ПРИМЕРЯ, что вы работаете с входами фиксированной длины, такими как ключ AES.

Вот почему мы создали пример! У нас на самом деле был пользователь, который недавно задал очень похожий вопрос на наших форумах, что привело нас к тому, что мы сделали пример

Однако стоит обратить внимание на одну проблему, с которой вы столкнулись при работе с openssl и wolfssl, в README:

https://github.com/wolfSSL/wolfssl-examples/blob/master/signature/encryption-through-signing/README.md

... Имейте в виду, что это не ИСТИННЫЙ RSA ENCRYPT и, скорее всего, не будет взаимодействовать с другими библиотеками, которые предлагают API типа RSA_PRIVATE_ENCRYPT.

Это настоящая операция SIGN.

Если у вас есть какие-либо вопросы, не стесняйтесь размещать их здесь (и, конечно, добавьте тег wolfssl), или вы также можете в любое время отправить нам электронное письмо на support@wolfssl.com

Отказ от ответственности: я работаю на wolfSSL Inc.

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