Funzione BCryptDeriveKey (bcrypt.h)
La funzione BCryptDeriveKey
Per la derivazione della chiave da un determinato segreto, vedere BCryptKeyDerivation.
Sintassi
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
);
Parametri
[in] hSharedSecret
Handle del contratto segreto da cui creare la chiave. Questo handle viene ottenuto dalla funzione
[in] pwszKDF
Puntatore a una stringa Unicode con terminazione Null che identifica la funzione di derivazione della chiave (KDF) da usare per derivare la chiave. Può trattarsi di una delle stringhe seguenti.
BCRYPT_KDF_HASH (L"HASH")
Usare la funzione di derivazione della chiave hash.
Se il parametro cbDerivedKey
I parametri identificati dal parametro pParameterList possono o devono contenere i parametri seguenti, come indicato dalla colonna Obbligatoria o facoltativa.
Parametro | Descrizione | Obbligatorio o facoltativo |
---|---|---|
KDF_HASH_ALGORITHM |
Stringa Unicode con terminazione Null che identifica l'algoritmo hash da usare. Può trattarsi di uno degli identificatori dell'algoritmo hash standard di identificatori dell'algoritmo CNG o dell'identificatore per un altro algoritmo hash registrato.
Se questo parametro non viene specificato, viene utilizzato l'algoritmo hash SHA1. |
Opzionale |
KDF_SECRET_PREPEND | Valore da aggiungere all'inizio dell'input del messaggio alla funzione hash. Per altre informazioni, vedere Osservazioni. | Opzionale |
KDF_SECRET_APPEND | Valore da aggiungere alla fine dell'input del messaggio alla funzione hash. Per altre informazioni, vedere Osservazioni. | Opzionale |
La chiamata a KDF viene eseguita come illustrato nello pseudocodice seguente.
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")
Usare la funzione di derivazione della chiave (HMAC)
Se il parametro cbDerivedKey
I parametri identificati dal parametro pParameterList possono o devono contenere i parametri seguenti, come indicato dalla colonna Obbligatoria o facoltativa.
Parametro | Descrizione | Obbligatorio o facoltativo |
---|---|---|
KDF_HASH_ALGORITHM |
Stringa Unicode con terminazione Null che identifica l'algoritmo hash da usare. Può trattarsi di uno degli identificatori dell'algoritmo hash standard di identificatori dell'algoritmo CNG o dell'identificatore per un altro algoritmo hash registrato.
Se questo parametro non viene specificato, viene utilizzato l'algoritmo hash SHA1. |
Opzionale |
KDF_HMAC_KEY | Chiave da usare per la funzione pseudo-casuale (PRF). | Opzionale |
KDF_SECRET_PREPEND | Valore da aggiungere all'inizio dell'input del messaggio alla funzione hash. Per altre informazioni, vedere Osservazioni. | Opzionale |
KDF_SECRET_APPEND | Valore da aggiungere alla fine dell'input del messaggio alla funzione hash. Per altre informazioni, vedere Osservazioni. | Opzionale |
La chiamata a KDF viene eseguita come illustrato nello pseudocodice seguente.
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")
Usare la funzione di derivazione della chiave (TLS) funzione pseudo-casuale (PRF). La dimensione della chiave derivata è sempre di 48 byte, pertanto il parametro cbDerivedKey deve essere 48.
I parametri identificati dal parametro pParameterList possono o devono contenere i parametri seguenti, come indicato dalla colonna Obbligatoria o facoltativa.
Parametro | Descrizione | Obbligatorio o facoltativo |
---|---|---|
KDF_TLS_PRF_LABEL | Stringa ANSI che contiene l'etichetta PRF. | Obbligatorio |
KDF_TLS_PRF_SEED | Valore di inizializzazione PRF. Il valore di inizializzazione deve essere lungo 64 byte. | Obbligatorio |
KDF_TLS_PRF_PROTOCOL |
Valore DWORD che specifica la versione del protocollo TLS il cui algoritmo PRF deve essere usato.
I valori validi sono:
Windows Server 2008 e Windows Vista: TLS1_1_PROTOCOL_VERSION, TLS1_2_PROTOCOL_VERSION e DTLS1_0_PROTOCOL_VERSION non sono supportati. Windows Server 2008 R2, Windows 7, Windows Server 2008 e Windows Vista: DTLS1_0_PROTOCOL_VERSION non è supportato. |
Opzionale |
KDF_HASH_ALGORITHM | ID algoritmo CNG dell'hash da usare con HMAC nella richiesta pullF per la versione del protocollo TLS 1.2. Le scelte valide sono SHA-256 e SHA-384. Se non specificato, viene usato SHA-256. | Opzionale |
La chiamata a KDF viene eseguita come illustrato nello pseudocodice seguente.
KDF-Output = PRF(
hSharedSecret,
KDF_TLS_PRF_LABEL,
KDF_TLS_PRF_SEED)
BCRYPT_KDF_SP80056A_CONCAT (L"SP800_56A_CONCAT")
Usare la funzione di derivazione della chiave SP800-56A.
I parametri identificati dal parametro pParameterList possono o devono contenere i parametri seguenti, come indicato dalla colonna Obbligatoria o facoltativa. Tutti i valori dei parametri vengono considerati come matrici di byte opache.
Parametro | Descrizione | Obbligatorio o facoltativo |
---|---|---|
KDF_ALGORITHMID |
Specifica il |
Obbligatorio |
KDF_PARTYUINFO |
Specifica il campo secondario PartyUInfo |
Obbligatorio |
KDF_PARTYVINFO |
Specifica il campo secondario |
Obbligatorio |
KDF_SUPPPUBINFO |
Specifica il campo secondario |
Opzionale |
KDF_SUPPPRIVINFO |
Specifica il sottocampo |
Opzionale |
La chiamata a KDF viene eseguita come illustrato nello pseudocodice seguente.
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 e Windows XP: Questo valore non è supportato.
BCRYPT_KDF_RAW_SECRET (L"TRUNCATE")
Restituisce la rappresentazione little-endian del segreto non elaborato senza alcuna modifica.
Se il parametro cbDerivedKey
Windows 8, Windows Server 2008, Windows Vista, Windows Server 2003 e Windows XP: Questo valore non è supportato.
[in, optional] pParameterList
Indirizzo di una struttura di BCryptBufferDesc che contiene i parametri KDF. Questo parametro è facoltativo e può essere NULL se non è necessario.
[out, optional] pbDerivedKey
Indirizzo di un buffer che riceve la chiave. Il parametro cbDerivedKey contiene le dimensioni di questo buffer. Se questo parametro è NULL, questa funzione inserisce le dimensioni richieste, in byte, nel ULONG a cui punta il parametro pcbResult.
[in] cbDerivedKey
Dimensione, in byte, del buffer pbDerivedKey
[out] pcbResult
Puntatore a un
[in] dwFlags
Set di flag che modificano il comportamento di questa funzione. Può essere zero o il valore seguente.
Valore restituito
Restituisce un codice di stato che indica l'esito positivo o negativo della funzione.
I codici restituiti possibili includono, ma non solo, quanto segue.
Codice restituito | Descrizione |
---|---|
|
La funzione ha avuto esito positivo. |
|
Si è verificato un errore interno. |
|
L'handle nel parametro hSharedSecret |
|
Uno o più parametri non sono validi. |
Osservazioni
La struttura di
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);
Se vengono specificati i valori dei parametri precedenti, i valori concatenati alla KDF effettiva sono i seguenti.
Type: KDF_SECRET_PREPEND
Value: {0x04, 0x05, 0x20, 0x21, 0x22, 0x23}, length 6
Type: KDF_SECRET_APPEND
Value: {0x01, 0x10, 0x11, 0x12}, length 4
Se il parametro pwszKDF è impostato su BCRYPT_KDF_RAW_SECRET, il segreto restituito (a differenza degli altri valori di pwszKDF) verrà codificato in formato little-endian. È importante prendere nota di questo aspetto quando si usa il segreto non elaborato in qualsiasi altra funzione CNG, perché la maggior parte di essi accetta input codificati big-endian.
A seconda delle modalità del processore supportate da un provider, è possibile chiamare BCryptDeriveKey dalla modalità utente o dal kernel. I chiamanti in modalità kernel possono essere eseguiti in PASSIVE_LEVELirQL o DISPATCH_LEVEL IRQL. Se il livello IRQL corrente è DISPATCH_LEVEL, l'handle fornito nel parametro hSharedSecret deve trovarsi nella memoria non di paging (o bloccata) e deve essere derivato da un handle di algoritmo restituito da un provider aperto tramite il flag BCRYPT_PROV_DISPATCH.
Per chiamare questa funzione in modalità kernel, usare Cng.lib, che fa parte del Driver Development Kit (DDK). Windows Server 2008 e Windows Vista: Per chiamare questa funzione in modalità kernel, usare Ksecdd.lib.
Fabbisogno
Requisito | Valore |
---|---|
client minimo supportato | Windows Vista [app desktop | App UWP] |
server minimo supportato | Windows Server 2008 [app desktop | App UWP] |
piattaforma di destinazione | Finestre |
intestazione |
bcrypt.h |
libreria |
Bcrypt.lib |
dll | Bcrypt.dll |