Как определить, какой из 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 в этом случае не очень помогает.

Мой вопрос: как определить, какой из 23 параметров вызывает ошибку при использовании Bcrypt?

Есть ли способ получить расширенную информацию об ошибке, например, через BcryptPropertyGet (может быть, LAST_ERROR_PARAMETER или что-то подобное)?

Или Microsoft ожидает, что мы догадаемся о проблеме? В этом случае, я думаю, ответ будет "вы не можете".


Документы Microsoft не содержат примеров использования Bcrypt. Я также не могу найти полезные примеры в Stack Overflow или MSDN. Даже Writing Secure Code for Windows Vista не обеспечивает Примеры.

Вот обработка в Написание безопасного кода для Windows Vista. Это равносильно псевдокоду, что очень разочаровывает:

введите здесь описание изображения

введите здесь описание изображения


person jww    schedule 14.08.2019    source источник
comment
Близкий избиратель: я не заинтересован в том, чтобы кто-то проверял мой код. Я хочу узнать, какой параметр вызывает STATUS_INVALID_PARAMETER. 23 потенциальных параметра (с комбинациями) слишком много, чтобы исключить их путем угадывания.   -  person jww    schedule 14.08.2019
comment
Пример кода для BCryptEncrypt существует (здесь, например), хотя, по-видимому, не поддерживает режим шифрования с проверкой подлинности. Поля для BCRYPT_AUTHENTICATED_CIPHER_MODE_INFO кажутся прилично задокументировано однако. Я также мог бы найти пример аутентифицированного шифрования на SO здесь.   -  person Hasturkun    schedule 14.08.2019
comment
@Hasturkun - Хорошая находка в примерах CNG. Документы Microsoft не содержат примеров кода или ссылок на них. Посоветуйтесь, BCryptOpenAlgorithmProvider (и друзья ). Будьте осторожны с документами Microsoft для BCRYPT_AUTHENTICATED_CIPHER_MODE_INFO. Как минимум 2 ошибки и неточности. Возвращаясь к вопросу, знаете ли вы, как получить дополнительную информацию в случае сбоя вызова с STATUS_INVALID_PARAMETER?   -  person jww    schedule 14.08.2019
comment
Отладить? Если вам повезет, он может проверить все параметры в начале функции.   -  person Anders    schedule 14.08.2019


Ответы (1)


Я провел большую часть дня сегодня, борясь с этой самой проблемой. Хотя у меня нет хорошего способа ответить на ваш вопрос о том, как определить в общем виде, какой именно параметр является плохим, я оставлю эти несколько лакомых кусочков здесь для потомков:

  1. Поле cbTag поля BCRYPT_AUTHENTICATED_CIPHER_MODE_INFO должно быть установлено с самого начала. pbTag не требуется до последнего вызова, который создает или проверяет тег, но cbTag должен присутствовать всегда.
  2. Поле pbNonce структуры BCRYPT_AUTHENTICATED_CIPHER_MODE_INFO должно оставаться заданным для всех вызовов при объединении вызовов в цепочку (с помощью BCRYPT_AUTH_MODE_CHAIN_CALLS_FLAG).
  3. Все вызовы во время цепочки (опять же с использованием BCRYPT_AUTH_MODE_CHAIN_CALLS_FLAG) шифрования или дешифрования, кроме последнего, должны предоставлять входные данные, размер которых кратен размеру блока алгоритма. Я думаю, что документация на самом деле говорит об этом, но не совсем ясно, когда они явно говорят вам не устанавливать флаг BCRYPT_BLOCK_PADDING (с аутентифицированными шифрами).

Код, над которым я работаю, в конечном итоге станет частью библиотеки здесь, которая надеюсь предоставить рабочий пример следующему человеку.

person John Tyner    schedule 12.11.2020