| Предыдущий | Следующий |
| NTE_INVALID_HANDLE | NTE_BUFFER_TOO_SMALL |
NTE_INVALID_PARAMETER
В NTE_INVALID_PARAMETER особенно важна область действия: контракта криптографического вызова. Как минимум один аргумент нарушает контракт API поставщика, даже если указатель доступен для чтения, а алгоритм или ключ существуют. Сохраняйте шестнадцатеричное значение 0x80090027 вместе с API, который его вернул, поскольку высокоуровневое ПО может преобразовать его в сообщение, теряющее это различие.
Где выбирается это состояние
Поставщик уже достигнут, но при этом результате запрос не соответствует контракту выбора контейнера, установки свойства или передачи структуры, специфичной для операции. Рассматривайте имена, флаги области, спецификации ключа, размеры структур, допустимость NULL и состояние создания как одну транзакцию, а не исследуйте только самый заметный аргумент.
Данные, которые меняют диагноз
- 1. Все флаги и размеры структур на границе API, вернувшего результат
Записывайте флаги, структуры padding, имена свойств, длины буферов и допустимость NULL именно в переданном виде. - 2. Поставщик, имя контейнера или ключа, область пользователя/компьютера и намерение создать/открыть
Проверьте размеры и инициализацию структур, особенно поля cbSize и данные padding, специфичные для алгоритма. - 3. Тот же вызов, сохранённый для успешного запроса к тому же поставщику
Сравните вызов с документированными правилами двухпроходного определения размера и aliasing входного/выходного буфера.
Для контракта криптографического вызова эти данные намеренно не содержат секретов: идентификаторов, длин, имён поставщиков, выбранных политик и переходов состояния обычно достаточно без записи закрытых ключей, паролей, PIN или plaintext.
Что включать в пакет для эскалации
Сопоставьте последнюю успешную операцию с установкой или обновлением поставщика, созданием или обновлением ключа, изменениями профиля или сеанса, подключением и отключением устройства, обновлением политик и первым неудачным вызовом. Для этого результата порядок важен: ошибка сразу после миграции ключа указывает на другую границу, чем сбой после смены учётной записи службы.
- Для этого результата подготовьте минимальный пример с именем API, поставщика, ключа или контейнера, флагами и размерами нечувствительных входных данных.
- Для этого пути сохраните события поставщика, устройства, профиля и ОС за период от последнего успеха до первого сбоя.
- Для этого пути сохраните заведомо исправный контрольный результат с той же идентичностью, архитектурой и выбором поставщика.
Контролируемое воспроизведение
При этом результате создайте минимальный вызов с явным выбором поставщика и свежим непроизводственным объектом. Добавляйте по одному флагу или свойству до повторного появления состояния. Это покажет, относится ли сбой к выбору, состоянию объекта или одному необязательному параметру, не разрушая исходный keyset.
- Сохраните исходный ввод, идентичность, выбор поставщика или протокола и первое возвращённое значение для этого результата.
- Используйте один заведомо исправный контроль, меняющий только подозреваемую часть контракта криптографического вызова.
- Где это безопасно, выполните обратное сравнение с заведомо исправным вводом на том же сбойном слое.
- Фиксируйте место первого расхождения в контракте вызова, а не оценивайте только итоговое сообщение приложения.
Соседние результаты и вводящие в заблуждение исправления
NTE_BAD_KEYSET_PARAM ограничен выбором keyset. этот результат может возникнуть из-за любого недопустимого аргумента криптографической операции. Создание нового ключа под другой учётной записью может скрыть симптом, одновременно изменив поставщика, область, ACL и идентичность объекта. Это обходной путь, а не диагноз исходного контракта.
Для контракта криптографического вызова также сохраняйте исходное числовое значение: соседние константы могут требовать существенно разного восстановления, даже если приложение показывает их все как ошибку аутентификации, сертификата или безопасности.
Что считается реальным исправлением
Исходный объект должен открываться или настраиваться документированным набором параметров в требуемой области, без скрытого перехода к другому поставщику или вновь созданному контейнеру при этом результате. Сохраните регрессионный тест с нечувствительными идентификаторами и ожидаемыми результатами, включая один отрицательный контроль, который должен по-прежнему завершаться ошибкой.
Технические ссылки
Эти источники определяют HRESULT и соответствующий интерфейс, протокол или формат данных контракта криптографического вызова.
- Открытые спецификации Microsoft: значения HRESULT.
- Microsoft: CryptAcquireContext.
- Microsoft: CNG Key Storage Providers.
Нужно найти другой код? Найти другой код состояния или ошибки.