c - 如何确定 23 个参数中哪个是 STATUS_INVALID_PARAMETER?
问题描述
我正在尝试使用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
(可能是 aLAST_ERROR_PARAMETER
或类似的东西)?
还是微软希望我们猜测这个问题?在这种情况下,我想答案是“你不能”。
Microsoft 文档没有提供使用 Bcrypt 的示例。我在 Stack Overflow 或 MSDN 上也找不到有用的示例。即使为 Windows Vista 编写安全代码也无法提供示例。
这是为 Windows Vista 编写安全代码中的处理方法。它相当于伪代码,非常令人失望:
解决方案
我今天大部分时间都在努力解决这个问题。虽然我没有一个好的方法来回答您关于如何以通用方式确定哪个参数确实不好的问题,但我将把这些花絮留在这里以供后代使用:
- 需要从一开始就设置的
cbTag
字段。直到产生或验证标签的最终调用才需要,但BCRYPT_AUTHENTICATED_CIPHER_MODE_INFO
必须始终存在。pbTag
cbTag
- 当将调用链接在一起时(通过使用) ,结构的
pbNonce
字段必须为所有调用保持设置。BCRYPT_AUTHENTICATED_CIPHER_MODE_INFO
BCRYPT_AUTH_MODE_CHAIN_CALLS_FLAG
- 在加密或解密链(再次使用
BCRYPT_AUTH_MODE_CHAIN_CALLS_FLAG
)期间的所有调用,除了最后一个,必须提供一个输入,其大小是算法块大小的倍数。我认为文档实际上是这么说的,但是当他们明确告诉您不要设置BCRYPT_BLOCK_PADDING
标志(使用经过身份验证的密码)时,还不是很清楚。
我正在编写的代码最终将成为这里库的一部分,它有望为下一个人提供一个工作示例。
推荐阅读
- node.js - 带有 TypeORM 实体和 OneToMany 的 ReferenceError
- firebase - 我可以从“找不到动态链接”页面重定向页面吗?
- coq - 寻找重写规则
- qt - 如何重新实现 QDialog 的接受和拒绝槽?
- docker - 如何更新对 worldserver 配置文件的更改
- vscode-debugger - VSCode GDB,ENOENT,即使我已经指定了 gdb 的完整路径
- reactjs - 使用 React 从 Firestore 获取地图数据
- python - 当我尝试删除字符时,为什么我的文件最终是空白的?
- vue.js - 当组件安装vue js时如何将点击事件绑定到按钮?
- html - CSS 和选择器 - 为什么质量分组不适用于 h1、h2 等?