Функция 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")
Используйте функцию на основе ключа Hash-Based код проверки подлинности сообщений (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")
Используйте функци
Параметры, определенные параметром 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 |
Задает подфилд |
Обязательно |
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
Адрес структуры BCryptBufferDe sc
[out, optional] pbDerivedKey
Адрес буфера, получающего ключ. Параметр
[in] cbDerivedKey
Размер в байтах буфера pbDerivedKey.
[out] pcbResult
Указатель на ULONG, получающий количество байтов, скопированных в буфер pbDerivedKey. Если параметр pbDerivedKeyNULL, эта функция будет размещать требуемый размер в байтах в 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, так как большинство из них принимают в кодированные входные данные в большом коде.
В зависимости от того, какие режимы процессора поддерживает поставщик, 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] |
целевая платформа | Виндоус |
заголовка | bcrypt.h |
библиотеки |
Bcrypt.lib |
DLL | Bcrypt.dll |