wc_RsaSSL_Verify返回BAD_FUNC_ARG,我不知道为什么

时间:2018-02-14 01:09:49

标签: c++ ssl aes wolfssl

我正在尝试RSA公钥使用wolfcrypt解密签名文件 - 是的,我可能会也可能不会滥用"签署/验证" RSA的权力使用私钥加密单独的AES密钥并使用公钥解密。

不幸的是,我被困在wc_RsaSSL_Verify() - 在我的生活中我无法弄清楚它为什么会返回BAD_FUNC_ARG - 我认为这样的错误应该立即被其他人看到所以我'决定调用StackOverflow的集体权力。

据我所知,我给出了它要求的功能 - 输入缓冲区,输出缓冲区,每个的大小以及指向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是在具有公钥DER文件的单独函数中初始化(成功,使用wc_PublicKeyDecode())的私有成员。我使用OpenSSL生成公钥和私钥 - 应该使用PKCS#1 v1.5 b默认情况下正确填充我的AES密钥和iv文件。

我还应该提到我使用的是wolfssl版本3.9.8。谢谢!

2 个答案:

答案 0 :(得分:1)

我发现问题是我用RSA密钥签名的文件没有正确签名。当我使用OpenSSL签署文件时,我的cli调用是

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略微抛弃了,并认为它必须明确地使用函数参数的格式,不一定是它们的内容。希望这个答案对其他人也有用。

答案 1 :(得分:1)

听起来您正在尝试使用RSA_Sign执行&#34;加密&#34;一把AES密钥。然后我假设您正在发送给远程合作伙伴或计算机,然后他将运行RSA_Verify操作来解密AES密钥我是否正确理解了该方案?

如果是这样,我道歉它没有出现,如果你最初搜索了如何做到这一点,但我们实际上有一个例子,在这里做到这一点:

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

该示例包括两个单独的应用程序。第一个应用程序&#34; rsa-private-encrypt-app.c&#34;将签署(加密)&#34;假Aes密钥&#34;并将结果输出到文件。第二个应用程序&#34; rsa-public-decrypt-app.c&#34;然后打开输出的文件并对文件中包含的数据进行验证(解密)以恢复原始文件&#34;假Aes Key&#34;。

  

我可能会也可能不会滥用&#34;签署/验证&#34; RSA的权力使用私钥加密单独的AES密钥并使用公钥解密。

总而言之,这是对RSA签名/验证确认的有效使用,您正在使用固定长度的输入,例如AES密钥。

这就是我们创建这个例子的原因!我们实际上有一个用户在我们的论坛上问了一个非常相似的问题,这导致我们做出了榜样。

有一点需要注意的是,你在openssl和wolfssl遇到的问题实际上是在README中讨论的:

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

  

...请记住,这不是真正的RSA ENCRYPT,并且可能不会与提供RSA_PRIVATE_ENCRYPT类型API的其他库互操作。

     

这是一个真正的SIGN操作。

如果您有任何其他问题,请随时在此处发布(当然也可以添加wolfssl标签),或者您也可以随时发送电子邮件至support@wolfssl.com

免责声明:我为wolfSSL公司工作。