Condividi tramite


Funzione BCryptDeriveKey (bcrypt.h)

La funzione BCryptDeriveKey deriva una chiave da un valore del contratto segreto.

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 BCryptSecretAgreement.

[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 è minore delle dimensioni della chiave derivata, questa funzione copia solo il numero specificato di byte nel buffer pbDerivedKey. Se il parametro cbDerivedKey è maggiore della dimensione della chiave derivata, questa funzione copia la chiave nel buffer pbDerivedKey e imposta la variabile a cui punta il pcbResult sul numero effettivo di byte copiati.

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) Hash-Based Message Authentication Code.

Se il parametro cbDerivedKey è minore delle dimensioni della chiave derivata, questa funzione copia solo il numero specificato di byte nel buffer pbDerivedKey. Se il parametro cbDerivedKey è maggiore della dimensione della chiave derivata, questa funzione copia la chiave nel buffer pbDerivedKey e imposta la variabile a cui punta il pcbResult sul numero effettivo di byte copiati.

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:

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 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 AlgorithmID sottocampo del campo OtherInfo nella funzione di derivazione della chiave SP800-56A. Indica lo scopo previsto della chiave derivata. Obbligatorio
KDF_PARTYUINFO Specifica il campo secondario PartyUInfo del campo OtherInfo nella funzione di derivazione della chiave SP800-56A. Il campo contiene informazioni pubbliche fornite dall'iniziatore. Obbligatorio
KDF_PARTYVINFO Specifica il campo secondario PartyVInfo del campo OtherInfo nella funzione di derivazione della chiave SP800-56A. Il campo contiene informazioni pubbliche fornite dal risponditore. Obbligatorio
KDF_SUPPPUBINFO Specifica il campo secondario SuppPubInfo del campo OtherInfo nella funzione di derivazione della chiave SP800-56A. Il campo contiene informazioni pubbliche note sia all'iniziatore che al risponditore. Opzionale
KDF_SUPPPRIVINFO Specifica il sottocampo SuppPrivInfo del campo OtherInfo nella funzione di derivazione della chiave SP800-56A. Contiene informazioni private note sia all'iniziatore che al risponditore, ad esempio un segreto condiviso. 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 è minore delle dimensioni della chiave derivata, questa funzione copia solo il numero specificato di byte nel buffer pbDerivedKey. Se il parametro cbDerivedKey è maggiore della dimensione della chiave derivata, questa funzione copia la chiave nel buffer pbDerivedKey e imposta la variabile a cui punta il pcbResult sul numero effettivo di byte copiati.

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 ULONG che riceve il numero di byte copiati nel buffer pbDerivedKey. Se il parametro pbDerivedKey è NULL, questa funzione inserisce le dimensioni richieste, in byte, nel ULONG a cui punta questo parametro.

[in] dwFlags

Set di flag che modificano il comportamento di questa funzione. Può essere zero o il valore seguente.

Valore Significato
KDF_USE_SECRET_AS_HMAC_KEY_FLAG
Il valore del contratto segreto fungerà anche da chiave HMAC. Se si specifica questo flag, il parametro KDF_HMAC_KEY non deve essere incluso nel set di parametri nel parametro pParameterList. Questo flag viene usato solo dalla funzione di derivazione della chiave BCRYPT_KDF_HMAC.

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
STATUS_SUCCESS
La funzione ha avuto esito positivo.
STATUS_INTERNAL_ERROR
Si è verificato un errore interno.
STATUS_INVALID_HANDLE
L'handle nel parametro hSharedSecret non è valido.
STATUS_INVALID_PARAMETER
Uno o più parametri non sono validi.

Osservazioni

La struttura di BCryptBufferDesc nel parametro pParameterList può contenere più di uno dei parametri KDF_SECRET_PREPEND e KDF_SECRET_APPEND. Se vengono specificati più di uno di questi parametri, i valori dei parametri vengono concatenati nell'ordine in cui sono contenuti nella matrice prima che venga chiamata la funzione KDF. Si supponga, ad esempio, che vengano specificati i valori dei parametri seguenti.

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

Vedere anche

BCryptSecretAgreement