【问题标题】:How to determine which of 23 parameters are STATUS_INVALID_PARAMETER?如何确定 23 个参数中哪个是 STATUS_INVALID_PARAMETER?
【发布时间】:2019-12-20 14:33:07
【问题描述】:

我正在尝试使用 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(可能是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 失败时如何获取更多信息吗?
  • 调试它?如果幸运的话,它可能会在函数开始时验证所有参数。

标签: c windows cng


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-06-17
    • 2016-03-22
    • 1970-01-01
    • 2011-09-14
    • 1970-01-01
    • 2016-12-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多