首页 > 解决方案 > 如何确定 23 个参数中哪个是 STATUS_INVALID_PARAMETER?

问题描述

我正在尝试使用BCryptEncrypt来验证某些 AAD,但该功能因STATUS_INVALID_PARAMETER. BCryptEncrypt接受 10 个参数。其中一个参数是BCRYPT_AUTHENTICATED_CIPHER_MODE_INFOBCRYPT_AUTHENTICATED_CIPHER_MODE_INFO接受另外 13 个参数。

运行我的测试程序会导致:

>.\bcrypt-gmac.exe
BCryptEncrypt error, 0xc000000d (STATUS_INVALID_PARAMETER)

STATUS_INVALID_PARAMETER在这种情况下不是很有帮助。

我的问题是,在使用 Bcrypt 时,如何确定 23 个参数中的哪一个导致错误?

有没有办法获取扩展的错误信息,比如通过BcryptPropertyGet(可能是 aLAST_ERROR_PARAMETER或类似的东西)?

还是微软希望我们猜测这个问题?在这种情况下,我想答案是“你不能”


Microsoft 文档没有提供使用 Bcrypt 的示例。我在 Stack Overflow 或 MSDN 上也找不到有用的示例。即使为 Windows Vista 编写安全代码也无法提供示例。

这是为 Windows Vista 编写安全代码中的处理方法。它相当于伪代码,非常令人失望:

在此处输入图像描述

在此处输入图像描述

标签: cwindowscng

解决方案


我今天大部分时间都在努力解决这个问题。虽然我没有一个好的方法来回答您关于如何以通用方式确定哪个参数确实不好的问题,但我将把这些花絮留在这里以供后代使用:

  1. 需要从一开始就设置的cbTag字段。直到产生或验证标签的最终调用才需要,但BCRYPT_AUTHENTICATED_CIPHER_MODE_INFO必须始终存在。pbTagcbTag
  2. 当将调用链接在一起时(通过使用) ,结构的pbNonce字段必须为所有调用保持设置。BCRYPT_AUTHENTICATED_CIPHER_MODE_INFOBCRYPT_AUTH_MODE_CHAIN_CALLS_FLAG
  3. 在加密或解密链(再次使用BCRYPT_AUTH_MODE_CHAIN_CALLS_FLAG)期间的所有调用,除了最后一个,必须提供一个输入,其大小是算法块大小的倍数。我认为文档实际上是这么说的,但是当他们明确告诉您不要设置BCRYPT_BLOCK_PADDING标志(使用经过身份验证的密码)时,还不是很清楚。

我正在编写的代码最终将成为这里库的一部分,它有望为下一个人提供一个工作示例。


推荐阅读