繁体   English   中英

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

[英]wc_RsaSSL_Verify returns BAD_FUNC_ARG, and I can't tell why

我正在尝试使用Wolfcrypt对RSA公钥解密签名的文件-是的,我可能会或可能不会滥用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。 谢谢!

我发现问题是我用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使我有些不满意,并认为它必须与函数参数的格式(不一定是它们的内容)明确相关。 希望这个答案对其他人也有用。

听起来您正在尝试使用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密钥并使用公钥解密。

完全没有,这是您正在使用诸如AES密钥之类的固定长度输入的RSA符号/验证ASSUMING的有效使用。

这就是我们创建示例的原因! 实际上,不久前我们有一个用户在我们的论坛上提出了一个非常类似的问题,这促使我们做出了示例。

在自述文件中实际上谈到了关于openssl和wolfssl遇到的问题的一件事:

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 Inc.工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM