Funzione NCryptVerifyClaim (ncrypt.h)
Verifica un'attestazione di attestazione della chiave.
Sintassi
SECURITY_STATUS NCryptVerifyClaim(
[in] NCRYPT_KEY_HANDLE hSubjectKey,
[in, optional] NCRYPT_KEY_HANDLE hAuthorityKey,
[in] DWORD dwClaimType,
[in, optional] NCryptBufferDesc *pParameterList,
[in] PBYTE pbClaimBlob,
[in] DWORD cbClaimBlob,
[out] NCryptBufferDesc *pOutput,
[in] DWORD dwFlags
);
Parametri
[in] hSubjectKey
Handle della chiave dell'oggetto per l'attestazione.
[in, optional] hAuthorityKey
Handle della chiave dell'autorità da usare per la verifica dell'attestazione. Questo parametro è facoltativo perché la chiave dell'autorità è autonoma per determinati tipi di attestazione.
[in] dwClaimType
Tipo di attestazione.
[in, optional] pParameterList
Elenco di parametri facoltativo.
[in] pbClaimBlob
BLOB dell'attestazione di input.
[in] cbClaimBlob
Dimensioni, in byte, del buffer pbClaimBlob
[out] pOutput
BLOB di output.
[in] dwFlags
NCRYPT_VBS_RETURN_CLAIM_DETAILS_FLAG è un nuovo flag da impostare durante la verifica di un'attestazione generata da VBS. Per altre informazioni, vedere la sezione osservazioni
Attualmente non sono definiti altri flag. Il parametro dwFlags
Valore restituito
Restituisce un codice di stato che indica l'esito positivo o negativo della funzione.
Di seguito sono riportati alcuni dei codici di errore che possono essere restituiti dall'API di verifica durante la verifica delle attestazioni di attestazione della protezione della chiave VBS:
Codice restituito | Significato |
---|---|
NTE_BAD_TYPE | Il parametro di input del tipo di attestazione è diverso dal tipo di BLOB dell'attestazione di input. |
STATUS_BAD_DATA | Il BLOB dell'attestazione di input non è valido. |
STATUS_NO_MEMORY | L'allocazione della memoria (richiesta per la verifica dell'attestazione) non è riuscita. |
STATUS_INVALID_PARAMETER | Manca un parametro di input obbligatorio o uno dei parametri ha un valore non valido. |
STATUS_FAIL_CHECK | I controlli dell'attestazione BLOB di input non sono riusciti. |
NTE_BAD_VER | La versione del BLOB attestazione non corrisponde all'implementazione della verifica. |
NTE_BAD_FLAGS | I flag forniti in dwFlags non sono supportati. |
Osservazioni
Protezione/attestazione di chiavi private tramite la sicurezza basata su virtualizzazione (VBS)
Nota
Le informazioni relative ai flag VBS riguardano il prodotto in versione non definitiva che potrebbe essere modificato in modo sostanziale prima che venga rilasciato commercialmente. Microsoft non fornisce alcuna garanzia, espressa o implicita, in relazione alle informazioni fornite qui.
Questa API consente di abilitare un'attestazione avanzata delle chiavi di sicurezza in base alla protezione della chiave VBS, un modulo di Windows per la protezione e l'attestazione di chiavi private usando la sicurezza basata su vbs. L'attestazione di una chiave di sicurezza dimostra l'associazione di questa chiave a una chiave ancorata, ovvero una chiave di attestazione. Questa funzionalità può migliorare il livello di sicurezza della comunicazione tra entità diverse limitando l'utilizzo delle chiavi fuori contesto.
L'API definisce nuovi flag per supportare la creazione e la verifica delle attestazioni di attestazione in base alle chiavi di attestazione nella protezione della chiave VBS.
Di seguito sono riportati tipi di dwClaimType definiti per l'API:
Tipo di attestazione | Descrizione |
---|---|
NCRYPT_CLAIM_VBS_ROOT | Questo tipo indica che l'attestazione generata viene prodotta dalla chiave radice VBS. |
NCRYPT_CLAIM_VBS_IDENTITY | Questo tipo indica che l'attestazione generata viene prodotta da un'identità/attestazione VBS. Ciò significa che l'attestazione viene prodotta da una chiave VBS con privilegi elevati con il flag di attestazione NCRYPT_ALLOW_KEY_ATTESTATION_FLAG (vedere i dettagli di seguito). |
Di seguito sono riportati i tipi di buffer da impostare in buffer pParameterList durante la verifica di un'attestazione di attestazione:
NCRYPT_VBS_ROOT_KEY_ATTESTATION_CLAIM_DETAILS
Nuova struttura da impostare come elemento NCryptBuffer di tipo NCRYPTBUFFER_VBS_ATTESTATION_STATEMENT_ROOT_DETAILS in NCryptBufferDesc parametro di output di NCryptVerifyClaim con dwClaimType impostato su NCRYPT_CLAIM_VBS_ROOT. La definizione della struttura è:
typedef struct _NCRYPT_VBS_ROOT_KEY_ATTESTATION_CLAIM_DETAILS { ULONG ulKeyFlags; ULONGLONG ullTrustletId; ULONG ulTrustletSecurityVersion; ULONG ulTrustletDebuggable; } NCRYPT_VBS_ROOT_KEY_ATTESTATION_CLAIM_DETAILS, *PNCRYPT_VBS_ROOT_KEY_ATTESTATION_CLAIM_DETAILS;
La struttura include questi elementi:
ulKeyFlags : combinazione di valoriNCRYPT_VBS_KEY_FLAG_* impostati per la chiave identity. - ullTrustletId: intero identificatore hardcoded nei metadati dei criteri del trustlet VBS che ha creato l'attestazione.
- ulTrustletSecurityVersion : numero di versione di sicurezza del trustlet VBS che ha creato l'attestazione. Questa versione riflette gli aggiornamenti della sicurezza applicati al trustlet e di conseguenza implica il livello di sicurezza.
-
ulTrustletDebuggable: indica se il Trustlet VBS che ha creato l'attestazione è debugbile. Un valore
1
indica che il trustlet è debugbile e un0
indica un trustlet non di cui è possibile eseguire il debug
Se in futuro sono necessari ulteriori elementi informativi, verrà definita una nuova struttura e un tipo di struttura corrispondente.
Nota
Questo parametro di output deve essere rilasciato dopo che non viene più fatto riferimento.
NCRYPT_VBS_IDENTITY_KEY_ATTESTATION_CLAIM_DETAILS
Nuova struttura da impostare come elemento
NCryptBuffer di tipo NCRYPTBUFFER_VBS_ATTESTATION_STATEMENT_IDENTITY_DETAILS inparametro di output NCryptBufferDesc diNCryptVerifyClaim condwClaimType impostato suNCRYPT_CLAIM_VBS_IDENTITY . La definizione della struttura è:typedef struct _NCRYPT_VBS_IDENTITY_KEY_ATTESTATION_CLAIM_DETAILS { ULONG ulKeyFlags; LPCWSTR pszSignatureHashAlg; ULONG ulPaddingScheme; LPCWSTR pszPaddingHashAlg; ULONG ulPaddingSalt; } NCRYPT_VBS_IDENTITY_KEY_ATTESTATION_CLAIM_DETAILS, *PNCRYPT_VBS_IDENTITY_KEY_ATTESTATION_CLAIM_DETAILS;
La struttura include questi elementi:
ulKeyFlags : combinazione di valoriNCRYPT_VBS_KEY_FLAG_* impostati per la chiave identity. - pszSignatureHashAlg: puntatore a una stringa Unicode dell'algoritmo hash della firma attestazione.
- ulPaddingScheme - Schema padding dell'algoritmo di firma usato tramite la creazione di attestazioni in BCryptSignHash.
- pszPaddingHashAlg: puntatore a una stringa Unicode dell'algoritmo hash di riempimento attestazione usato tramite la creazione di attestazioni in BCryptSignHash.
- ulPaddingSalt- Riempimento dell'algoritmo di firma usato tramite la creazione di attestazioni in BCryptSignHash.
Se in futuro sono necessari ulteriori elementi informativi, verrà definita una nuova struttura e un tipo di struttura corrispondente.
Nota
Questo parametro di output deve essere rilasciato dopo che non viene più fatto riferimento. Il codice di esempio per il rilascio di questo parametro viene fornito nell'esempio di codice seguente.
NCRYPTBUFFER_VBS_ATTESTATION_STATEMENT_ROOT_DETAILS
Nuovo tipo di buffer da impostare in un parametro NCryptBuffer nel NCryptBufferDesc*pOutput parametro di NCryptVerifyClaim. Questo tipo indica che il NCryptBuffer include la struttura dei dati NCRYPT_VBS_ROOT_KEY_ATTESTATION_CLAIM_DETAILS.
NCRYPTBUFFER_VBS_ATTESTATION_STATEMENT_IDENTITY_DETAILS
Nuovo tipo di buffer da impostare in un parametro NCryptBuffer nel NCryptBufferDesc*pOutput parametro di NCryptVerifyClaim. Questo tipo indica che il NCryptBuffer include la struttura dei dati NCRYPT_VBS_IDENTITY_KEY_ATTESTATION_CLAIM_DETAILS.
NCRYPT_VBS_RETURN_CLAIM_DETAILS_FLAG
Si tratta di un nuovo flag da impostare nel dwFlags parametro di input durante la verifica di un'attestazione generata da VBS. Quando questo flag viene impostato
NCryptVerifyClaim genera il parametro di output NCryptBufferDesc con un tipo di buffer dei parametri interno NCRYPTBUFFER_VBS_ATTESTATION_STATEMENT_ROOT_DETAILS oNCRYPTBUFFER_VBS_ATTESTATION_STATEMENT_IDENTITY_DETAILS .Nella tabella seguente viene descritta la relazione tra i tipi di struttura di dati di input e di output, in uno scenario riuscito con NCRYPT_VBS_RETURN_CLAIM_DETAILS_FLAG:
Immissione Prodotto dwClaimType = NCRYPT_CLAIM_VBS_ROOT
NCRYPTBUFFER_VBS_ATTESTATION_STATEMENT_ROOT_DETAILS tipo di buffer con struttura informativa interna NCRYPT_VBS_ROOT_KEY_ATTESTATION_CLAIM_DETAILS. dwClaimType = NCRYPT_CLAIM_VBS_IDENTITY
NCRYPTBUFFER_VBS_ATTESTATION_STATEMENT_IDENTITY_DETAILS tipo di buffer con struttura informativa interna NCRYPT_VBS_IDENTITY_KEY_ATTESTATION_CLAIM_DETAILS.
Esempi
Questo esempio illustra l'utilizzo dell'API esistente per verificare le attestazioni di attestazione generate in con NCryptCreateClaim.
L'API di verifica può essere richiamata in locale (nel computer che ha generato il BLOB di attestazioni) o in remoto. La procedura di verifica richiede questi elementi, corrispondenti alle chiavi di generazione delle attestazioni:
- BLOB di attestazioni
- BLOB di chiavi di attestazione pubblica
- BLOB di chiavi del token pubblico (utilizzo generico)
L'API di verifica produce una delle strutture informative di output NCRYPT_VBS_ROOT_KEY_ATTESTATION_CLAIM_DETAILS o NCRYPT_VBS_IDENTITY_KEY_ATTESTATION_CLAIM_DETAILS se è impostato il flag di input NCRYPT_VBS_RETURN_CLAIM_DETAILS_FLAG. La memoria di queste strutture viene liberata alla fine del flusso di codice per evitare perdite di memoria.
HRESULT VerifyClaim(
BCRYPT_RSAKEY_BLOB *pAttestPublicKeyBlob,
BCRYPT_RSAKEY_BLOB *pTokenPublicKeyBlob,
PBYTE pRootClaim,
DWORD rootClaimSize,
PBYTE pIdentityClaim,
DWORD identityClaimSize)
{
HRESULT hr = S_OK;
DWORD bytesWritten = 0;
NCRYPT_PROV_HANDLE provider = NULL;
if (FAILED(hr = NCryptOpenStorageProvider(&provider, MS_KEY_STORAGE_PROVIDER, 0)))
{
wprintf(L"Error opening storage provider in NCryptOpenStorageProvider: 0x%X\n", hr);
goto cleanup;
}
NCRYPT_KEY_HANDLE attestPublicKey = NULL;
if (FAILED(hr = NCryptImportKey(
provider,
NULL,
BCRYPT_RSAPUBLIC_BLOB,
NULL,
&attestPublicKey,
(PBYTE)pAttestPublicKeyBlob,
GetRsaPublicKeyBlobSize(pAttestPublicKeyBlob),
0)))
{
wprintf(L"Unable to create a key handle for attestation public key blob with NCryptImportKey(): 0x%X\n", hr);
goto cleanup;
}
NCRYPT_KEY_HANDLE tokenPublicKey = NULL;
if (FAILED(hr = NCryptImportKey(
provider,
NULL,
BCRYPT_RSAPUBLIC_BLOB,
NULL,
&tokenPublicKey,
(PBYTE)pTokenPublicKeyBlob,
GetRsaPublicKeyBlobSize(pTokenPublicKeyBlob),
0)))
{
wprintf(L"Unable to create a key handle for token public key blob with NCryptImportKey(): 0x%X\n", hr);
goto cleanup;
}
NCryptBufferDesc rootOutput{};
// Verify the VBS root claim using the attestation/identity public key
if (FAILED(hr = NCryptVerifyClaim(
attestPublicKey,
NULL,
NCRYPT_CLAIM_VBS_ROOT, // Created claim by IDKS (VBS root signing key)
NULL, // parameters
pRootClaim,
rootClaimSize,
&rootOutput,
NCRYPT_VBS_RETURN_CLAIM_DETAILS_FLAG /*dwFlags*/)))
{
switch (hr)
{
case STATUS_OBJECT_TYPE_MISMATCH:
wprintf(L"The dwClaimType parameter’s value is different than the claim’s type.\n-----\n", hr);
break;
case STATUS_BAD_DATA:
wprintf(L"Something wrong in one of the data structures. E.g. Magic value mismatch\n-----\n", hr);
break;
case STATUS_NO_MEMORY:
wprintf(L"Memory allocation failed\n-----\n", hr);
break;
case STATUS_INVALID_PARAMETER:
wprintf(L"Missing mandatory parameter or one of the parameters has a bad value.\n-----\n", hr);
break;
case STATUS_FAIL_CHECK:
wprintf(L"One of the claim checks has failed.\n-----\n", hr);
break;
default:
wprintf(L"Unable to verify VBS root claim from NCryptVerifyClaim(): 0x%X\n-----\n", hr);
}
goto cleanup;
}
PNCryptBuffer pRootOutBuffer;
DWORD count;
// Look into the retrieved VBS root claim details
for (count = 0; count < rootOutput.cBuffers; ++count)
{
pRootOutBuffer = rootOutput.pBuffers[count];
if (pRootOutBuffer->BufferType == NCRYPTBUFFER_VBS_ATTESTATION_STATEMENT_ROOT_DETAILS)
{
PNCRYPT_VBS_ROOT_KEY_ATTESTATION_CLAIM_DETAILS pDetails =
(PNCRYPT_VBS_ROOT_KEY_ATTESTATION_CLAIM_DETAILS) pRootOutBuffer->pvBuffer;
wprintf(L"The claim trustlet id is: %lu\n-----\n", pDetails->ullTrustletId);
wprintf(L"The claim trustlet Security Version number is: %llu\n-----\n", pDetails->ulTrustletSecurityVersion);
}
}
NCryptBufferDesc identityOutput{};
// Verify the identity claim using the attestation/identity and token public keys
if (FAILED(hr = NCryptVerifyClaim(
tokenPublicKey,
attestPublicKey,
NCRYPT_CLAIM_VBS_IDENTITY, // Claim created by an attestation/identity key
NULL, // parameters
pIdentityClaim,
identityClaimSize,
&identityOutput,
NCRYPT_VBS_RETURN_CLAIM_DETAILS_FLAG /*dwFlags*/)))
{
wprintf(L"Unable to verify identity claim from NCryptVerifyClaim(): 0x%X\n-----\n", hr);
goto cleanup;
}
PNCryptBuffer pIdentityOutBuffer;
// Look into the retrieved identity claim details
for (count = 0; count < identityOutput.cBuffers; ++count)
{
pIdentityOutBuffer = identityOutput.pBuffers[count];
if (pIdentityOutBuffer->BufferType == NCRYPTBUFFER_VBS_ATTESTATION_STATEMENT_IDENTITY_DETAILS)
{
PNCRYPT_VBS_IDENTITY_KEY_ATTESTATION_CLAIM_DETAILS pDetails =
(PNCRYPT_VBS_IDENTITY_KEY_ATTESTATION_CLAIM_DETAILS) pIdentityOutBuffer->pvBuffer;
wprintf(L"The claim hash algorithm is: %S\n-----\n", pDetails-> pszSignatureHashAlg);
wprintf(L"The claim padding scheme is: %lu\n-----\n", pDetails->ulPaddingScheme);
}
}
wprintf(L"Verify claim for root and identity types passed successfully\n");
cleanup:
if (provider != NULL)
{
NCryptFreeObject(provider);
}
if (attestPublicKey != NULL)
{
CryptDestroyKey(attestPublicKey);
}
if (tokenPub != NULL)
{
CryptDestroyKey(tokenPublicKey);
}
if (rootOutput.pBuffers != NULL)
{
for (count = 0; count < rootOutput.cBuffers; ++count)
{
NCryptFreeBuffer(rootOutput.pBuffers[count].pvBuffer);
}
NCryptFreeBuffer(rootOutput.pBuffers);
}
if (identityOutput.pBuffers != NULL)
{
for (count = 0; count < identityOutput.cBuffers; ++count)
{
NCryptFreeBuffer(identityOutput.pBuffers[count].pvBuffer);
}
NCryptFreeBuffer(identityOutput.pBuffers);
}
return hr;
}
DWORD GetRsaPublicKeyBlobSize(BCRYPT_RSAKEY_BLOB* publicKeyBlob)
{
return sizeof(BCRYPT_RSAKEY_BLOB) +
publicKeyBlob->cbModulus +
publicKeyBlob->cbPublicExp;
}
Fabbisogno
Requisito | Valore |
---|---|
client minimo supportato | Windows 10 [app desktop | App UWP] |
server minimo supportato | Windows Server 2016 [app desktop | App UWP] |
piattaforma di destinazione | Finestre |
intestazione |
ncrypt.h |
libreria |
Ncrypt.lib |
dll | Ncrypt.dll |