Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
La fonction NCryptDeriveKey dérive une clé d’un NCRYPT_SECRET_HANDLE. Cette fonction est destinée à être utilisée dans le cadre d’une procédure de contrat secret utilisant des clés de contrat secret persistantes.
Pour dériver le matériau de clé à l’aide d’un secret persistant à la place, utilisez la fonction NCryptKeyDerivation .
Syntaxe
SECURITY_STATUS NCryptDeriveKey(
[in] NCRYPT_SECRET_HANDLE hSharedSecret,
[in] LPCWSTR pwszKDF,
[in, optional] NCryptBufferDesc *pParameterList,
[out, optional] PBYTE pbDerivedKey,
[in] DWORD cbDerivedKey,
[out] DWORD *pcbResult,
[in] ULONG dwFlags
);
Paramètres
[in] hSharedSecret
Handle de secret à partir duquel créer la clé. Ce handle est actuellement obtenu à partir de la fonction NCryptSecretAgreement .
[in] pwszKDF
Pointeur vers une chaîne Unicode terminée par null qui identifie la fonction de dérivation de clé (KDF) à utiliser pour dériver la clé. Il peut s’agir de l’une des chaînes suivantes.
BCRYPT_KDF_HASH (L"HASH »)
Utilisez la fonction de dérivation de clé de hachage.
Si le paramètre cbDerivedKey est inférieur à la taille de la clé dérivée, cette fonction copie uniquement le nombre spécifié d’octets dans la mémoire tampon pbDerivedKey . Si le paramètre cbDerivedKey est supérieur à la taille de la clé dérivée, cette fonction copie la clé dans la mémoire tampon pbDerivedKey et définit la variable pointée par le ppcResult sur le nombre réel d’octets copiés.
Les paramètres identifiés par le paramètre pParameterList peuvent ou doivent contenir les paramètres suivants, comme indiqué par la colonne Obligatoire ou facultative.
| Paramètre | Descriptif | Obligatoire ou facultatif |
|---|---|---|
| KDF_HASH_ALGORITHM | Chaîne Unicode terminée par null qui identifie l’algorithme de hachage à utiliser. Il peut s’agir de l’un des identificateurs d’algorithme de hachage standard à partir des identificateurs d’algorithme CNG ou de l’identificateur d’un autre algorithme de hachage inscrit. Si ce paramètre n’est pas spécifié, l’algorithme de hachage SHA1 est utilisé. |
Optional |
| KDF_SECRET_PREPEND | Valeur à ajouter au début de l’entrée de message à la fonction de hachage. Pour plus d’informations, consultez Remarques. | Optional |
| KDF_SECRET_APPEND | Valeur à ajouter à la fin de l’entrée de message à la fonction de hachage. Pour plus d’informations, consultez Remarques. | Optional |
L’appel à la fonction KDF est effectué comme indiqué dans le pseudocode suivant.
KDF-Output = Hash(
KDF-Prepend +
hSharedSecret +
KDF-Append)
BCRYPT_KDF_HMAC (L"HMAC »)
Utilisez la fonction de dérivation de clé HMAC (Message Authentication Code)Hash-Based .
Si le paramètre cbDerivedKey est inférieur à la taille de la clé dérivée, cette fonction copie uniquement le nombre spécifié d’octets dans la mémoire tampon pbDerivedKey . Si le paramètre cbDerivedKey est supérieur à la taille de la clé dérivée, cette fonction copie la clé dans la mémoire tampon pbDerivedKey et définit la variable pointée par le ppcResult sur le nombre réel d’octets copiés.
Les paramètres identifiés par le paramètre pParameterList peuvent ou doivent contenir les paramètres suivants, comme indiqué par la colonne Obligatoire ou facultative.
| Paramètre | Descriptif | Obligatoire ou facultatif |
|---|---|---|
| KDF_HASH_ALGORITHM | Chaîne Unicode terminée par null qui identifie l’algorithme de hachage à utiliser. Il peut s’agir de l’un des identificateurs d’algorithme de hachage standard à partir des identificateurs d’algorithme CNG ou de l’identificateur d’un autre algorithme de hachage inscrit. Si ce paramètre n’est pas spécifié, l’algorithme de hachage SHA1 est utilisé. |
Optional |
| KDF_HMAC_KEY | Clé à utiliser pour la fonction pseudo-aléatoire (PRF). | Optional |
| KDF_SECRET_PREPEND | Valeur à ajouter au début de l’entrée de message à la fonction de hachage. Pour plus d’informations, consultez Remarques. | Optional |
| KDF_SECRET_APPEND | Valeur à ajouter à la fin de l’entrée de message à la fonction de hachage. Pour plus d’informations, consultez Remarques. | Optional |
L’appel à la fonction KDF est effectué comme indiqué dans le pseudocode suivant.
KDF-Output = HMAC-Hash(
KDF_HMAC_KEY,
KDF-Prepend +
hSharedSecret +
KDF-Append)
BCRYPT_KDF_TLS_PRF (L"TLS_PRF »)
Utilisez la fonction de dérivation de clé pseudo-aléatoire (PRF) de la fonction de dérivation de la couche de transport (TLS). La taille de la clé dérivée est toujours de 48 octets. Par conséquent, le paramètre cbDerivedKey doit être 48.
Les paramètres identifiés par le paramètre pParameterList peuvent ou doivent contenir les paramètres suivants, comme indiqué par la colonne Obligatoire ou facultative.
| Paramètre | Descriptif | Obligatoire ou facultatif |
|---|---|---|
| KDF_TLS_PRF_LABEL | Chaîne ANSI qui contient l’étiquette PRF. | Obligatoire |
| KDF_TLS_PRF_SEED | Valeur initiale de PRF. La valeur initiale doit être de 64 octets de long. | Obligatoire |
| KDF_TLS_PRF_PROTOCOL | Valeur DWORD qui spécifie la version du protocole TLS dont l’algorithme PRF doit être utilisé. Les valeurs valides sont les suivantes : SSL2_PROTOCOL_VERSION (0x0002) SSL3_PROTOCOL_VERSION (0x0300) TLS1_PROTOCOL_VERSION (0x0301) TLS1_0_PROTOCOL_VERSION (0x0301) TLS1_1_PROTOCOL_VERSION (0x0302) TLS1_2_PROTOCOL_VERSION (0x0303) DTLS1_0_PROTOCOL_VERSION (0xfeff) Windows Server 2008 et Windows Vista : TLS1_1_PROTOCOL_VERSION, les TLS1_2_PROTOCOL_VERSION et les DTLS1_0_PROTOCOL_VERSION ne sont pas pris en charge. Windows Server 2008 R2, Windows 7, Windows Server 2008 et Windows Vista : DTLS1_0_PROTOCOL_VERSION n’est pas pris en charge. |
Optional |
| KDF_HASH_ALGORITHM | ID d’algorithme CNG de hachage à utiliser avec le HMAC dans le PRF, pour la version du protocole TLS 1.2. Les choix valides sont SHA-256 et SHA-384. S’il n’est pas spécifié, SHA-256 est utilisé. | Optional |
L’appel à la fonction KDF est effectué comme indiqué dans le pseudocode suivant.
KDF-Output = PRF(
hSharedSecret,
KDF_TLS_PRF_LABEL,
KDF_TLS_PRF_SEED)
BCRYPT_KDF_SP80056A_CONCAT (L"SP800_56A_CONCAT »)
Utilisez la fonction de dérivation de clé SP800-56A.
Cela est également appelé SP800-56C rev2 KDF en une étape (section 4.1) à l’aide d’une fonction de hachage approuvée qui a une force correspondant à l’algorithme utilisé pour générer le handle secret.
Les paramètres identifiés par le paramètre pParameterList peuvent ou doivent contenir les paramètres suivants, comme indiqué par la colonne Obligatoire ou facultative. Toutes les valeurs de paramètre sont traitées comme des tableaux d’octets opaques.
| Paramètre | Descriptif | Obligatoire ou facultatif |
|---|---|---|
| KDF_ALGORITHMID | Spécifie le sous-champ AlgorithmID du champ OtherInfo dans la fonction de dérivation de clé SP800-56A. Indique l’objectif prévu de la clé dérivée. | Obligatoire |
| KDF_PARTYUINFO | Spécifie le sous-champ PartyUInfo du champ OtherInfo dans la fonction de dérivation de clé SP800-56A. Le champ contient des informations publiques fournies par l’initiateur. | Obligatoire |
| KDF_PARTYVINFO | Spécifie le sous-champ PartyVInfo du champ OtherInfo dans la fonction de dérivation de clé SP800-56A. Le champ contient des informations publiques fournies par le répondeur. | Obligatoire |
| KDF_SUPPPUBINFO | Spécifie le sous-champ SuppPubInfo du champ OtherInfo dans la fonction de dérivation de clé SP800-56A. Le champ contient des informations publiques connues de l’initiateur et du répondeur. | Optional |
| KDF_SUPPPRIVINFO | Spécifie le sous-champ SuppPrivInfo du champ OtherInfo dans la fonction de dérivation de clé SP800-56A. Il contient des informations privées connues de l’initiateur et du répondeur, telles qu’un secret partagé. | Optional |
L’appel à la fonction KDF est effectué comme indiqué dans le pseudocode suivant.
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 et Windows XP : Cette valeur n’est pas prise en charge.
BCRYPT_KDF_RAW_SECRET (L"TRUNCATE »)
Retourne la représentation petite-endienne du secret brut sans aucune modification.
Si le paramètre cbDerivedKey est inférieur à la taille de la clé dérivée, cette fonction copie uniquement le nombre spécifié d’octets dans la mémoire tampon pbDerivedKey . Si le paramètre cbDerivedKey est supérieur à la taille de la clé dérivée, cette fonction copie la clé dans la mémoire tampon pbDerivedKey et définit la variable pointée par le ppcResult sur le nombre réel d’octets copiés.
Windows 8, Windows Server 2008, Windows Vista, Windows Server 2003 et Windows XP : Cette valeur n’est pas prise en charge.
BCRYPT_KDF_HKDF (L"HKDF »)
Utilisez la fonction HKDF (Extract-and-Expand KDF) basée sur HMAC à partir de RFC 5869.
Dans HKDF, une distinction est faite entre la dérivation d’une clé de l’une ou l’autre :
- La sortie d’une fonction d’accord secret, qui n’est pas aléatoire uniformément et est considérée comme du matériel de clé d’entrée (IKM). Presque tous les utilisateurs de BCryptDeriveKey auront un handle secret de ce formulaire.
- Valeur secrète uniformément aléatoire.
La première étape consiste à « extraire » une clé pseudo-random (PRK) du handle secret.
Cette étape est effectuée en appelant BCryptSetProperty sur un handle secret avec BCRYPT_HKDF_HASH_ALGORITHM pour définir l’algorithme de hachage à utiliser dans les calculs HMAC dans HKDF.
Ceci est suivi d’un deuxième appel à BCryptSetProperty avec l’un des deux :
- Si le handle de secret représente IKM, utilisez BCRYPT_HKDF_SALT_AND_FINALIZE pour fournir la valeur de sel facultative et extraire le PRK à partir de l’IKM et finaliser le handle secret.
- Sinon, utilisez BCRYPT_HKDF_PRK_AND_FINALIZE pour transformer directement la valeur secrète en PRK HKDF et finaliser le handle secret.
La deuxième étape consiste à « Développer » le PRK dans une clé dérivée de sortie.
Cette étape est effectuée en appelant BCryptDeriveKey sur un handle de secret finalisé.
Les paramètres identifiés par le paramètre pParameterList peuvent ou doivent contenir les paramètres suivants, comme indiqué par la colonne Obligatoire ou facultative. Toutes les valeurs de paramètre sont traitées comme des tableaux d’octets opaques.
| Paramètre | Descriptif | Obligatoire ou facultatif |
|---|---|---|
| KDF_HKDF_INFO | Spécifie le champ d’informations dans l’étape de développement HKDF. Indique le contexte facultatif et les informations spécifiques à l’application. | Optional |
L’appel à la fonction KDF est effectué comme indiqué dans le pseudocode suivant.
KDF-Output = HKDF-Expand(
hSharedSecret.PRK,
info,
cbDerivedKey)
Windows 10 : La prise en charge de HKDF commence.
[in, optional] pParameterList
Adresse d’une structure NCryptBufferDesc qui contient les paramètres KDF. Ce paramètre est facultatif et peut être NULL s’il n’est pas nécessaire.
[out, optional] pbDerivedKey
Adresse d’une mémoire tampon qui reçoit la clé. Le paramètre cbDerivedKey contient la taille de cette mémoire tampon. Si ce paramètre est NULL, cette fonction place la taille requise, en octets, dans le DWORD pointé par le paramètre cciResult .
[in] cbDerivedKey
Taille, en octets, de la mémoire tampon pbDerivedKey .
[out] pcbResult
Pointeur vers un DWORD qui reçoit le nombre d’octets qui ont été copiés dans la mémoire tampon pbDerivedKey . Si le paramètre pbDerivedKey est NULL, cette fonction place la taille requise, en octets, dans le DWORD pointé par ce paramètre.
[in] dwFlags
Ensemble d’indicateurs qui modifient le comportement de cette fonction.
Il peut s’agir de zéro ou de la valeur suivante :
| Valeur | Meaning |
|---|---|
| KDF_USE_SECRET_AS_HMAC_KEY_FLAG | La valeur dans hSharedSecret servira également de clé HMAC. Si cet indicateur est spécifié, le paramètre KDF_HMAC_KEY ne doit pas être inclus dans l’ensemble de paramètres dans le paramètre pParameterList . Cet indicateur est utilisé uniquement par la fonction de dérivation de clé BCRYPT_KDF_HMAC . |
Valeur de retour
Retourne un code d’état qui indique la réussite ou l’échec de la fonction.
Les codes de retour possibles incluent, mais ne sont pas limités à, les éléments suivants.
| Retourner le code | Descriptif |
|---|---|
| ERROR_SUCCESS | La fonction a réussi. |
| NTE_INVALID_HANDLE | Le handle du paramètre hSharedSecret n’est pas valide. |
| NTE_INVALID_PARAMETER | Un ou plusieurs paramètres ne sont pas valides. |
Remarques
La structure NCryptBufferDesc dans le paramètre pParameterList peut contenir plusieurs paramètres KDF_SECRET_PREPEND et KDF_SECRET_APPEND . Si plusieurs de ces paramètres sont spécifiés, les valeurs de paramètre sont concaténées dans l’ordre dans lequel elles sont contenues dans le tableau avant l’appel de la fonction KDF. Par exemple, supposons que les valeurs de paramètre suivantes sont spécifiées.
BYTE abValue0[] = {0x01};
BYTE abValue1[] = {0x04, 0x05};
BYTE abValue2[] = {0x10, 0x11, 0x12};
BYTE abValue3[] = {0x20, 0x21, 0x22, 0x23};
Parameter[0].type = KDF_SECRET_APPEND
Parameter[0].value = abValue0;
Parameter[0].length = sizeof (abValue0);
Parameter[1].type = KDF_SECRET_PREPEND
Parameter[1].value = abValue1;
Parameter[1].length = sizeof (abValue1);
Parameter[2].type = KDF_SECRET_APPEND
Parameter[2].value = abValue2;
Parameter[2].length = sizeof (abValue2);
Parameter[3].type = KDF_SECRET_PREPEND
Parameter[3].value = abValue3;
Parameter[3].length = sizeof (abValue3);
Si les valeurs de paramètre ci-dessus sont spécifiées, les valeurs concaténées à la fonction KDF réelle sont les suivantes.
Type: KDF_SECRET_PREPEND
Value: {0x04, 0x05, 0x20, 0x21, 0x22, 0x23}, length 6
Type: KDF_SECRET_APPEND
Value: {0x01, 0x10, 0x11, 0x12}, length 4
Si le paramètre pwszKDF est défini sur BCRYPT_KDF_RAW_SECRET, le secret retourné (contrairement aux autres valeurs pwszKDF ) est encodé au format little-endian. Il est important de prendre note de cela lors de l’utilisation du secret brut dans toutes les autres fonctions CNG, car la plupart d’entre eux prennent des entrées encodées big-endian.
Un service ne doit pas appeler cette fonction à partir de sa fonction StartService. Si un service appelle cette fonction à partir de sa fonction StartService, un interblocage peut se produire et le service peut cesser de répondre.
Spécifications
| Requirement | Valeur |
|---|---|
| Client minimum requis | Windows Vista [applications de bureau | Applications UWP] |
| serveur minimum pris en charge | Windows Server 2008 [applications de bureau | Applications UWP] |
| plateforme cible | Fenêtres |
| Header | ncrypt.h |
| Library | Ncrypt.lib |
| DLL | Ncrypt.dll |