【发布时间】:2019-12-20 14:33:07
【问题描述】:
我正在尝试使用 BCryptEncrypt 对某些 AAD 进行身份验证,但该功能因 STATUS_INVALID_PARAMETER 而失败。 BCryptEncrypt 接受 10 个参数。其中一个参数是BCRYPT_AUTHENTICATED_CIPHER_MODE_INFO。 BCRYPT_AUTHENTICATED_CIPHER_MODE_INFO 接受另外 13 个参数。
运行我的测试程序会导致:
>.\bcrypt-gmac.exe
BCryptEncrypt error, 0xc000000d (STATUS_INVALID_PARAMETER)
STATUS_INVALID_PARAMETER 在这种情况下不是很有帮助。
我的问题是,在使用 Bcrypt 时,如何确定 23 个参数中的哪一个导致错误?
有没有办法获取扩展的错误信息,例如通过BcryptPropertyGet(可能是LAST_ERROR_PARAMETER 或类似的东西)?
或者微软希望我们猜测问题?在这种情况下,我猜答案是,“你不能”。
Microsoft 文档未提供使用 Bcrypt 的示例。我在 Stack Overflow 或 MSDN 上也找不到有用的示例。甚至Writing Secure Code for Windows Vista 也无法提供示例。
这是Writing Secure Code for Windows Vista 中的处理方法。相当于伪代码,非常令人失望:
【问题讨论】:
-
Close voter:我不想让别人检查我的代码。我想了解哪个参数导致
STATUS_INVALID_PARAMETER。 23 个潜在参数(有组合)太多了,无法通过猜测来消除。 -
BCryptEncrypt的示例代码确实存在 (here for example),但似乎无法处理经过身份验证的密码模式。BCRYPT_AUTHENTICATED_CIPHER_MODE_INFO的字段似乎确实有据可查。我还可以在 SO here 上找到一个经过身份验证的加密示例。 -
@Hasturkun - 在 CNG 示例中找到了很好的发现。 Microsoft 文档不提供示例代码或指向它们的链接。协商,BCryptOpenAlgorithmProvider(和朋友)。请注意BCRYPT_AUTHENTICATED_CIPHER_MODE_INFO 的 Microsoft 文档。至少有2处错误和遗漏。回到问题上来,你知道在调用
STATUS_INVALID_PARAMETER失败时如何获取更多信息吗? -
调试它?如果幸运的话,它可能会在函数开始时验证所有参数。