Функция BCryptDeriveKey (bcrypt.h)
Функция BCryptDeriveKey наследует ключ от значения секретного соглашения.
Сведения о наследоваве ключей от заданного секрета, см. в разделе BCryptKeyDerivation.
Синтаксис
NTSTATUS BCryptDeriveKey(
[in] BCRYPT_SECRET_HANDLE hSharedSecret,
[in] LPCWSTR pwszKDF,
[in, optional] BCryptBufferDesc *pParameterList,
[out, optional] PUCHAR pbDerivedKey,
[in] ULONG cbDerivedKey,
[out] ULONG *pcbResult,
[in] ULONG dwFlags
);
Параметры
[in] hSharedSecret
Дескриптор секретного соглашения для создания ключа. Этот дескриптор получен из функции BCryptSecretAgreement .
[in] pwszKDF
Указатель на строку Юникода, завершающуюся значением NULL, которая определяет функцию наследования ключа (KDF), используемую для получения ключа. Это может быть одна из следующих строк.
BCRYPT_KDF_HASH (L"HASH")
Используйте функцию производного хэш-ключа.
Если параметр cbDerivedKey меньше размера производного ключа, эта функция копирует в буфер pbDerivedKey только указанное количество байтов. Если параметр cbDerivedKey больше размера производного ключа, эта функция копирует ключ в буфер pbDerivedKey и устанавливает для переменной, на которую указывает pcbResult , фактическое количество скопированных байтов.
Параметры, определяемые параметром pParameterList , могут или должны содержать следующие параметры, как указано в столбце Обязательный или необязательный.
Параметр | Описание | Обязательный или необязательный |
---|---|---|
KDF_HASH_ALGORITHM |
Строка Юникода, завершающаяся null, идентифицирующая используемый хэш-алгоритм. Это может быть один из стандартных идентификаторов хэш-алгоритма из идентификаторов алгоритма CNG или идентификатор для другого зарегистрированного хэш-алгоритма.
Если этот параметр не указан, используется хэш-алгоритм SHA1. |
Необязательно |
KDF_SECRET_PREPEND | Значение, добавляемое к началу входных данных сообщения хэш-функции. Дополнительные сведения см. в подразделе "Примечания". | Необязательно |
KDF_SECRET_APPEND | Значение, добавляемое в конец входных данных сообщения хэш-функции. Дополнительные сведения см. в подразделе "Примечания". | Необязательно |
Вызов KDF выполняется, как показано в следующем псевдокоде.
KDF-Prepend = KDF_SECRET_PREPEND[0] +
KDF_SECRET_PREPEND[1] +
... +
KDF_SECRET_PREPEND[n]
KDF-Append = KDF_SECRET_APPEND[0] +
KDF_SECRET_APPEND[1] +
... +
KDF_SECRET_APPEND[n]
KDF-Output = Hash(
KDF-Prepend +
hSharedSecret +
KDF-Append)
BCRYPT_KDF_HMAC (L"HMAC")
Используйте функцию наследования ключа HMAC на основе хэша .
Если параметр cbDerivedKey меньше размера производного ключа, эта функция копирует в буфер pbDerivedKey только указанное количество байтов. Если параметр cbDerivedKey больше размера производного ключа, эта функция копирует ключ в буфер pbDerivedKey и устанавливает для переменной, на которую указывает pcbResult , фактическое количество скопированных байтов.
Параметры, определяемые параметром pParameterList , могут или должны содержать следующие параметры, как указано в столбце Обязательный или необязательный.
Параметр | Описание | Обязательный или необязательный |
---|---|---|
KDF_HASH_ALGORITHM |
Строка Юникода, завершающаяся null, идентифицирующая используемый хэш-алгоритм. Это может быть один из стандартных идентификаторов хэш-алгоритма из идентификаторов алгоритма CNG или идентификатор для другого зарегистрированного хэш-алгоритма.
Если этот параметр не указан, используется хэш-алгоритм SHA1. |
Необязательно |
KDF_HMAC_KEY | Ключ, используемый для псевдослучайной функции (PRF). | Необязательно |
KDF_SECRET_PREPEND | Значение, добавляемое к началу входных данных сообщения хэш-функции. Дополнительные сведения см. в подразделе "Примечания". | Необязательно |
KDF_SECRET_APPEND | Значение, добавляемое в конец входных данных сообщения хэш-функции. Дополнительные сведения см. в подразделе "Примечания". | Необязательно |
Вызов KDF выполняется, как показано в следующем псевдокоде.
KDF-Prepend = KDF_SECRET_PREPEND[0] +
KDF_SECRET_PREPEND[1] +
... +
KDF_SECRET_PREPEND[n]
KDF-Append = KDF_SECRET_APPEND[0] +
KDF_SECRET_APPEND[1] +
... +
KDF_SECRET_APPEND[n]
KDF-Output = HMAC-Hash(
KDF_HMAC_KEY,
KDF-Prepend +
hSharedSecret +
KDF-Append)
BCRYPT_KDF_TLS_PRF (L"TLS_PRF")
Используйте функцию наследования ключа псевдослучайной функциибезопасности транспортного уровня (TLS). Размер производного ключа всегда составляет 48 байт, поэтому параметр cbDerivedKey должен быть 48.
Параметры, определяемые параметром pParameterList , могут или должны содержать следующие параметры, как указано в столбце Обязательный или необязательный.
Параметр | Описание | Обязательный или необязательный |
---|---|---|
KDF_TLS_PRF_LABEL | Строка ANSI, содержащая метку PRF. | Обязательно |
KDF_TLS_PRF_SEED | Начальное значение PRF. Начальное значение должно иметь длину 64 байта. | Обязательно |
KDF_TLS_PRF_PROTOCOL |
Значение DWORD , указывающее версию протокола TLS, для которой будет использоваться алгоритм PRF.
Допустимые значения:
Windows Server 2008 и Windows Vista: TLS1_1_PROTOCOL_VERSION TLS1_2_PROTOCOL_VERSION и DTLS1_0_PROTOCOL_VERSION не поддерживаются. Windows Server 2008 R2, Windows 7, Windows Server 2008 и Windows Vista: DTLS1_0_PROTOCOL_VERSION не поддерживается. |
Необязательно |
KDF_HASH_ALGORITHM | Идентификатор алгоритма CNG хэша, используемого с HMAC в PRF, для версии протокола TLS 1.2. Допустимые варианты: SHA-256 и SHA-384. Если не указано, используется SHA-256. | Необязательно |
Вызов KDF выполняется, как показано в следующем псевдокоде.
KDF-Output = PRF(
hSharedSecret,
KDF_TLS_PRF_LABEL,
KDF_TLS_PRF_SEED)
BCRYPT_KDF_SP80056A_CONCAT (L "SP800_56A_CONCAT")
Используйте функцию производного ключа SP800-56A.
Параметры, определяемые параметром pParameterList , могут или должны содержать следующие параметры, как указано в столбце Обязательный или необязательный. Все значения параметров обрабатываются как непрозрачные массивы байтов.
Параметр | Описание | Обязательный или необязательный |
---|---|---|
KDF_ALGORITHMID | Указывает подполе AlgorithmID поля OtherInfo в функции производной функции ключа SP800-56A. Указывает назначение производного ключа. | Обязательно |
KDF_PARTYUINFO | Указывает подполе PartyUInfo поля OtherInfo в функции наследования ключа SP800-56A. Поле содержит общедоступную информацию, представленную инициатором. | Обязательно |
KDF_PARTYVINFO | Указывает подполе PartyVInfo поля OtherInfo в функции производной функции ключа SP800-56A. Поле содержит общедоступную информацию, представленную респондентом. | Обязательно |
KDF_SUPPPUBINFO | Указывает подполе SuppPubInfo поля OtherInfo в функции производной функции ключа SP800-56A. Поле содержит общедоступную информацию, известную как инициатору, так и ответчику. | Необязательно |
KDF_SUPPPRIVINFO | Указывает подполе SuppPrivInfo поля OtherInfo в функции производной функции ключа SP800-56A. Он содержит личные сведения, известные как инициатору, так и ответчику, например общий секрет. | Необязательно |
Вызов KDF выполняется, как показано в следующем псевдокоде.
KDF-Output = SP_800-56A_KDF(
hSharedSecret,
KDF_ALGORITHMID,
KDF_PARTYUINFO,
KDF_PARTYVINFO,
KDF_SUPPPUBINFO,
KDF_SUPPPRIVINFO)
Windows Server 2008, Windows Vista, Windows Server 2003 и Windows XP: Это значение не поддерживается.
BCRYPT_KDF_RAW_SECRET (L"TRUNCATE")
Возвращает представление необработанного секрета без каких-либо изменений.
Если параметр cbDerivedKey меньше размера производного ключа, эта функция копирует в буфер pbDerivedKey только указанное количество байтов. Если параметр cbDerivedKey больше размера производного ключа, эта функция копирует ключ в буфер pbDerivedKey и устанавливает для переменной, на которую указывает pcbResult , фактическое количество скопированных байтов.
Windows 8, Windows Server 2008, Windows Vista, Windows Server 2003 и Windows XP: это значение не поддерживается.
[in, optional] pParameterList
Адрес структуры BCryptBufferDesc , содержащей параметры KDF. Этот параметр является необязательным и может иметь значение NULL , если он не требуется.
[out, optional] pbDerivedKey
Адрес буфера, получающего ключ. Параметр cbDerivedKey содержит размер этого буфера. Если этот параметр имеет значение NULL, эта функция поместит необходимый размер в байтах в ULONG , на который указывает параметр pcbResult .
[in] cbDerivedKey
Размер буфера pbDerivedKey в байтах.
[out] pcbResult
Указатель на ULONG , получающий количество байтов, скопированных в буфер pbDerivedKey . Если параметр pbDerivedKey имеет значение NULL, эта функция поместит требуемый размер в байтах в ULONG , на который указывает этот параметр.
[in] dwFlags
Набор флагов, которые изменяют поведение этой функции. Это может быть ноль или следующее значение.
Возвращаемое значение
Возвращает код состояния, указывающий на успешное или неудачное выполнение функции.
Возможные коды возврата включают, помимо прочего, следующие.
Код возврата | Описание |
---|---|
|
Функция выполнена успешно. |
|
Внутренняя ошибка. |
|
Дескриптор в параметре hSharedSecret недопустим. |
|
Один или несколько параметров недопустимы. |
Комментарии
Структура BCryptBufferDesc в параметре pParameterList может содержать несколько KDF_SECRET_PREPEND и KDF_SECRET_APPEND параметров. Если указано более одного из этих параметров, значения параметров объединяются в том порядке, в котором они содержатся в массиве перед вызовом KDF. Например, предположим, что указаны следующие значения параметров.
BYTE pbValue0[1] = {0x01};
BYTE pbValue1[2] = {0x04, 0x05};
BYTE pbValue2[3] = {0x10, 0x11, 0x12};
BYTE pbValue3[4] = {0x20, 0x21, 0x22, 0x23};
Parameter[0].type = KDF_SECRET_APPEND
Parameter[0].value = pbValue0;
Parameter[0].length = sizeof (pbValue0);
Parameter[1].type = KDF_SECRET_PREPEND
Parameter[1].value = pbValue1;
Parameter[1].length = sizeof (pbValue1);
Parameter[2].type = KDF_SECRET_APPEND
Parameter[2].value = pbValue2;
Parameter[2].length = sizeof (pbValue2);
Parameter[3].type = KDF_SECRET_PREPEND
Parameter[3].value = pbValue3;
Parameter[3].length = sizeof (pbValue3);
Если указаны указанные выше значения параметров, сцепленные значения с фактическим KDF будут следующим образом.
Type: KDF_SECRET_PREPEND
Value: {0x04, 0x05, 0x20, 0x21, 0x22, 0x23}, length 6
Type: KDF_SECRET_APPEND
Value: {0x01, 0x10, 0x11, 0x12}, length 4
Если параметр pwszKDF имеет значение BCRYPT_KDF_RAW_SECRET, возвращенный секрет (в отличие от других значений pwszKDF ) будет закодирован в формате с минимальным байтом. Важно учитывать это при использовании необработанного секрета в любых других функциях CNG, так как большинство из них принимают входные данные в кодировке big-endian.
В зависимости от того, какие режимы процессора поддерживает поставщик, BCryptDeriveKey можно вызывать либо из пользовательского режима, либо из режима ядра. Вызовы режима ядра могут выполняться в PASSIVE_LEVELIRQL или DISPATCH_LEVEL IRQL. Если текущий уровень IRQL DISPATCH_LEVEL, дескриптор, предоставленный в параметре hSharedSecret , должен находиться в непагрегированном (или заблокированном) памяти и должен быть производным от дескриптора алгоритма, возвращенного поставщиком, который был открыт с помощью флага BCRYPT_PROV_DISPATCH .
Чтобы вызвать эту функцию в режиме ядра, используйте файл Cng.lib, который входит в состав пакета средств разработки драйверов (DDK). Windows Server 2008 и Windows Vista: Чтобы вызвать эту функцию в режиме ядра, используйте Ksecdd.lib.
Требования
Требование | Значение |
---|---|
Минимальная версия клиента | Windows Vista [классические приложения | Приложения UWP] |
Минимальная версия сервера | Windows Server 2008 [классические приложения | Приложения UWP] |
Целевая платформа | Windows |
Header | bcrypt.h |
Библиотека | Bcrypt.lib |
DLL | Bcrypt.dll |
См. также раздел
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по