NCryptCreateClaim-Funktion (ncrypt.h)
Erstellt einen Schlüsselnachweisanspruch.
Syntax
SECURITY_STATUS NCryptCreateClaim(
[in] NCRYPT_KEY_HANDLE hSubjectKey,
[in, optional] NCRYPT_KEY_HANDLE hAuthorityKey,
[in] DWORD dwClaimType,
[in, optional] NCryptBufferDesc *pParameterList,
[out] PBYTE pbClaimBlob,
[in] DWORD cbClaimBlob,
[out] DWORD *pcbResult,
[in] DWORD dwFlags
);
Parameter
[in] hSubjectKey
Der Betreffschlüsselziehpunkt, für den der Anspruch erstellt wird.
[in, optional] hAuthorityKey
Der Autoritätsschlüsselhandle, auf dem der Anspruch basiert.
[in] dwClaimType
Der Anspruchstyp.
[in, optional] pParameterList
Eine optionale Parameterliste.
[out] pbClaimBlob
Ausgabe des erstellten Anspruchs-BLOB.
[in] cbClaimBlob
Die Größe des pbClaimBlob- Puffers in Byte.
[out] pcbResult
Die Ausgabe des erstellten Anspruchs-BLOB.
[in] dwFlags
Zurzeit sind keine Flags definiert. Der parameter dwFlags sollte auf 0
festgelegt werden.
Rückgabewert
Gibt einen Statuscode zurück, der den Erfolg oder Fehler der Funktion angibt.
Bemerkungen
Schützen/Bestätigen privater Schlüssel mithilfe der virtualisierungsbasierten Sicherheit (VBS)
Anmerkung
Informationen zu VBS-Flags beziehen sich auf Vorabversionsprodukt, das vor der kommerziellen Veröffentlichung erheblich geändert werden kann. Microsoft übernimmt keine Gewährleistungen, ausdrücklich oder konkludent in Bezug auf die hier bereitgestellten Informationen.
Diese API unterstützt die Aktivierung eines erweiterten Nachweises von Sicherheitsschlüsseln basierend auf dem VBS-Schlüsselschutz, einem Windows-Modul zum Schutz/Nachweis privater Schlüssel mithilfe von VBS. Der Nachweis eines Sicherheitsschlüssels beweist die Zuordnung dieses Schlüssels zu einem verankerten Schlüssel, auch als Nachweisschlüssel bezeichnet. Diese Funktion kann die Sicherheitsstufe der Kommunikation zwischen verschiedenen Entitäten verbessern, indem die Verwendung von Nichtkontextschlüsseln eingeschränkt wird.
Die API definiert neue Flags zur Unterstützung der Erstellung und Überprüfung von Nachweisansprüchen basierend auf Attestationsschlüsseln im VBS-Schlüsselschutz.
Im Folgenden werden dwClaimType- Typen aufgeführt, die für die API definiert sind:
Anspruchstyp | Beschreibung |
---|---|
NCRYPT_CLAIM_VBS_ROOT | Dieser Typ gibt an, dass der generierte Anspruch vom VBS-Stammschlüssel erstellt wird. |
NCRYPT_CLAIM_VBS_IDENTITY | Dieser Typ gibt an, dass der generierte Anspruch von einer VBS-Identität/einem Nachweis erstellt wird. Dies bedeutet, dass der Anspruch von einem VBS-Schlüssel erstellt wird, der mit dem Nachweiskennzeichnungs-Flag NCRYPT_ALLOW_KEY_ATTESTATION_FLAG erhöht wird (siehe Details unten). |
Im Folgenden sind Puffertypen aufgeführt, die beim Erstellen eines Nachweisanspruchs in pParameterList Puffer festgelegt werden sollen:
Puffertyp | Beschreibung |
---|---|
NCRYPTBUFFER_ATTESTATION_STATEMENT_SIGNATURE_HASH | Ein Puffertyp, der in einem Parameterpuffer festgelegt werden soll, wenn ein Nachweisanspruch in NCryptCreateClaimerstellt wird. Dies ist ein obligatorischer Parametertyp für NCRYPT_CLAIM_VBS_IDENTITY Ansprüche. Dieser Parameter konfiguriert den Typ des Hashfunktionstyps, der über die Erstellung des Nachweisanspruchs verwendet werden soll. Die Werte für diesen Parameter werden in ncrypt.h definiert (z. B. die Konstanten in CNG Algorithm Identifiers):#define NCRYPT_SHA1_ALGORITHM BCRYPT_SHA1_ALGORITHM #define NCRYPT_SHA256_ALGORITHM BCRYPT_SHA256_ALGORITHM #define NCRYPT_SHA384_ALGORITHM BCRYPT_SHA384_ALGORITHM #define NCRYPT_SHA512_ALGORITHM BCRYPT_SHA512_ALGORITHM |
NCRYPTBUFFER_ATTESTATION_STATEMENT_SIGNATURE_PADDING_SCHEME | Ein Puffertyp, der in einem Parameterpuffer festgelegt werden soll, wenn ein Nachweisanspruch in NCryptCreateClaimerstellt wird. Dies ist ein obligatorischer Parameter, falls der Nachweisschlüssel im erstellten NCRYPT_CLAIM_VBS_IDENTITY Anspruch ein RSA-Schlüssel ist. Dieser Parameter konfiguriert das Abstandsschema für den Signaturfunktionstyp, der über die Erstellung des Nachweisanspruchs verwendet werden soll. Die optionalen Werte für diesen Parameter werden in bcrypt.h definiert (z. B. die dwFlags Konstanten in NCryptSignHash):#define BCRYPT_PAD_PSS 0x00000008 |
NCRYPTBUFFER_ATTESTATION_STATEMENT_SIGNATURE_PADDING_ALGO | Ein neuer Puffertyp, der in einem Parameterpuffer festgelegt werden soll, wenn ein Nachweisanspruch in NCryptCreateClaimerstellt wird. Dies ist ein obligatorischer Parameter, falls der Nachweisschlüssel im erstellten NCRYPT_CLAIM_VBS_IDENTITY Anspruch ein RSA-Schlüssel ist. Der Parameter ist ein Zeiger auf eine mit Null beendete Unicode-Zeichenfolge, die den kryptografischen Algorithmus identifiziert, der zum Erstellen des Abstands verwendet werden soll. Dieser Algorithmus muss ein Hashingalgorithmus sein. Die Werte für diesen Parameter werden in ncrypt.h definiert (z. B. die Konstanten in CNG Algorithm Identifiers):#define NCRYPT_SHA1_ALGORITHM BCRYPT_SHA1_ALGORITHM #define NCRYPT_SHA256_ALGORITHM BCRYPT_SHA256_ALGORITHM #define NCRYPT_SHA384_ALGORITHM BCRYPT_SHA384_ALGORITHM #define NCRYPT_SHA512_ALGORITHM BCRYPT_SHA512_ALGORITHM |
NCRYPTBUFFER_ATTESTATION_STATEMENT_SIGNATURE_PADDING_SALT_SIZE | Ein neuer Puffertyp, der in einem Parameterpuffer festgelegt werden soll, wenn ein Nachweisanspruch in NCryptCreateClaimerstellt wird. Dies ist ein obligatorischer Parameter, falls der Nachweisschlüssel im erstellten NCRYPT_CLAIM_VBS_IDENTITY Anspruch ein RSA-Schlüssel ist. Der Parameter stellt eine Größe (in Byte) des zufälligen Salzs dar, das für den Abstand verwendet werden soll. |
NCRYPTBUFFER_ATTESTATION_STATEMENT_NONCE | Ein Puffertyp, der in einem Parameterpuffer festgelegt werden soll, wenn beim Erstellen eines Nachweisanspruchs in NCryptCreateClaim. Dieser Parameter ist ein Alias für NCRYPTBUFFER_CLAIM_KEYATTESTATION_NONCE. |
Beispiele
In diesem Beispiel wird die Verwendung des neuen API-Flags NCRYPT_ALLOW_KEY_ATTESTATION_FLAGveranschaulicht. Darüber hinaus wird der Noncewert für die Anspruchserstellung durch den parametertyp NCRYPTBUFFER_ATTESTATION_STATEMENT_NONCE festgelegt.
Das Beispiel besteht aus den folgenden Hauptschritten:
- Es wird ein neuer Nachweisschlüssel erstellt. Der Schlüssel ist spezialisiert auf die API-Funktion NCryptSetProperty. Die Generierung eines Nachweises basiert auf einem Signaturschlüssel.
- Für einen weiteren Nachweis wird ein Anspruch erstellt. Der Anspruch ist dem Nachweisschlüssel und einem integrierten VBS-Schlüssel zugeordnet. Der Anspruch kann in NCryptVerifyClaim überprüft werden, indem er den Nachweisschlüssel bereitstellt.
- Das Attestation Key-Objekt wird freigegeben, um Speicherverluste zu vermeiden.
// Create an attestation/identity key. This function is invoked in the main code flow below.
NCRYPT_KEY_HANDLE CreateAttestationKey(NCRYPT_PROV_HANDLE provider)
{
NCRYPT_KEY_HANDLE attestationKey = NULL;
HRESULT hr;
if (FAILED(hr = NCryptCreatePersistedKey(
provider,
&attestationKey,
BCRYPT_RSA_ALGORITHM,
L"AttestationKey", // a unique name for the attestation key in the key store
0, //dwLegacyKeySpec, not used
NCRYPT_REQUIRE_VBS_FLAG/*This flag targets VBS */)))
{
wprintf(L"Error creating an Attestation Identity Key with NCryptCreatePersistedKey(): 0x%X\n", hr);
goto cleanup;
}
// This is a new flag. It’s used to enable the capability in an attestation key.
DWORD keyUsagePolicy = NCRYPT_ALLOW_KEY_ATTESTATION_FLAG;
if (FAILED(hr = NCryptSetProperty(
attestationKey,
NCRYPT_KEY_USAGE_PROPERTY,
(PUCHAR)&keyUsagePolicy,
sizeof(keyUsagePolicy),
0 /*dwFlags*/)))
{
wprintf(L"Error setting property with NCryptSetProperty (): 0x%X\n", hr);
goto cleanup;
}
DWORD keySizeBits = 2048; // minimum allowed RSA key size
if (FAILED(hr = NCryptSetProperty(
attestationKey,
NCRYPT_LENGTH_PROPERTY,
(PUCHAR)&keySizeBits,
sizeof(keySizeBits),
0 /*dwFlags*/)))
{
wprintf(L"Error setting property with NCryptSetProperty (): 0x%X\n", hr);
goto cleanup;
}
if (FAILED(hr = NCryptFinalizeKey(attestationKey, 0 /*dwFlags*/)))
{
wprintf(L"Error finalizing key with NCryptFinalizeKey (): 0x%X\n", hr);
goto cleanup;
}
return attestationKey;
cleanup:
if (attestationKey != NULL)
{
NCryptFreeObject(attestationKey);
}
return NULL;
}
HRESULT CreateAttestation()
{
HRESULT hr = S_OK;
NCRYPT_PROV_HANDLE provider = NULL;
BYTE nonce[] = "TheSuperSecretNonce";
// This way of setting parameters is an existent pattern for NCrypt APIs
NCryptBuffer paramBuffers[] =
{
{ sizeof(nonce), NCRYPTBUFFER_ATTESTATION_STATEMENT_NONCE, (PBYTE)&nonce },
};
NCryptBufferDesc params = { NCRYPTBUFFER_VERSION, ARRAYSIZE(paramBuffers), paramBuffers };
if (FAILED(hr = NCryptOpenStorageProvider(&provider, MS_KEY_STORAGE_PROVIDER, 0)))
{
wprintf(L"Error opening storage provider in NCryptOpenStorageProvider: 0x%X\n", hr);
goto cleanup;
}
// Create a VBS attestation key
NCRYPT_KEY_HANDLE attestationKey = CreateAttestationKey(provider);
if (attestationKey == NULL)
{
hr = E_ABORT;
goto cleanup;
}
DWORD bytesWritten = 0;
if (FAILED(hr = NCryptCreateClaim(
attestationKey, // key that is being attested here and may attest other keys.
NULL, // implies that IDKS (VBS root signing key) will be used.
NCRYPT_CLAIM_VBS_ROOT, // used to attest a key with IDKS (VBS root signing key).
¶ms, // parameters list
NULL, // getting the size
0, // getting the size
&bytesWritten,
0 /*dwFlags*/)))
{
wprintf(L"Error creating claim with NCryptCreateClaim (): 0x%X\n", hr);
goto cleanup;
}
DWORD claimBufferSize = bytesWritten;
PBYTE claimBuffer = (PBYTE) HeapAlloc(GetProcessHeap(), 0,claimBufferSize);
if (NULL == claimBuffer)
{
hr = HRESULT_FROM_WIN32(GetLastError());
wprintf(L"Error allocating buffer for the claim: 0x%X\n", hr);
goto cleanup;
}
bytesWritten = 0;
if (FAILED(hr = NCryptCreateClaim(
attestationKey, // key that is being attested here and may attest other keys.
NULL, //implies that IDKS (VBS root signing key) will be used.
NCRYPT_CLAIM_VBS_ROOT, // used to attest with IDKS (VBS root signing key).
¶ms, // parameters list
claimBuffer,
claimBufferSize,
&bytesWritten,
0)))
{
wprintf(L"Error creating claim with NCryptCreateClaim (): 0x%X\n", hr);
goto cleanup;
}
wprintf(L"The claim is created successfully. It may be shared with the verifier side.\n");
cleanup:
if (provider != NULL)
{
NCryptFreeObject(provider);
}
if (attestationKey != NULL)
{
NCryptFreeObject(attestationKey);
}
if (claimBuffer)
{
HeapFree(GetProcessHeap(), 0, claimBuffer);
}
return hr;
}
Im nächsten Beispiel wird die Verwendung neuer API-Parameter zum Erstellen eines allgemeinen kryptografischen Schlüssels und eines zugeordneten Nachweisanspruchs veranschaulicht. Dieser allgemeine Schlüssel wird verwendet, um einen Nachweisanspruch zu generieren.
Der Hashalgorithmustyp und der Abstand für die Anspruchserstellung werden in den parametern NCRYPTBUFFER_ATTESTATION_STATEMENT_SIGNATURE_HASH und NCRYPTBUFFER_ATTESTATION_STATEMENT_SIGNATURE_PADDING_[SCHEME/ALGO/SALT_SIZE] festgelegt.
Bitte beachten Sie Folgendes:
- Der parameter NCRYPTBUFFER_ATTESTATION_STATEMENT_SIGNATURE_HASH ist nur für NCRYPT_CLAIM_VBS_IDENTITY Ansprüche und bedeutungslos in anderen Arten von Ansprüchen erforderlich.
- Der parameter NCRYPTBUFFER_ATTESTATION_STATEMENT_SIGNATURE_PADDING ist nur für NCRYPT_CLAIM_VBS_IDENTITY Ansprüche im Falle eines RSA-Nachweisschlüssels obligatorisch. In anderen Arten von Ansprüchen ist es sinnlos.
Der Anspruch ermöglicht es uns, zu überprüfen, ob der allgemeine Schlüssel dem Nachweisschlüssel zugeordnet ist.
//
HRESULT hr = S_OK;
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 attestationKey = NULL;
// Open the attestation key, created in CreateAttestationKey(), see previous example
if (FAILED(hr = NCryptOpenKey(
provider,
&attestationKey,
L"AttestationKey",
0, //dwLegacyKeySpec, not used
0 ,/* dwFlags */)))
{
wprintf(L"Error openning the attestation key with NCryptOpenKey (): 0x%X\n", hr);
goto cleanup;
}
NCRYPT_KEY_HANDLE tokenKey = NULL; // Token key that is bound to the security token
// Create VBS token (general purpose) key
if (FAILED(hr = NCryptCreatePersistedKey(
provider,
&tokenKey,
BCRYPT_RSA_ALGORITHM,
L"TokenKey",
0, //dwLegacyKeySpec, not used
NCRYPT_REQUIRE_VBS_FLAG /*This flag targets VBS*/)))
{
wprintf(L"Error creating an token key with NCryptCreatePersistedKey(): 0x%X\n", hr);
goto cleanup;
}
DWORD keySizeBits = 2048;
if (FAILED(hr = NCryptSetProperty(
tokenKey,
NCRYPT_LENGTH_PROPERTY,
(PUCHAR)&keySizeBits,
sizeof(keySizeBits),
0 /*dwFlags*/)))
{
wprintf(L"Error setting property with NCryptSetProperty (): 0x%X\n", hr);
goto cleanup;
}
if (FAILED(hr = NCryptFinalizeKey(tokenKey, 0 /*dwFlags*/)))
{
wprintf(L"Error finalizing key with NCryptFinalizeKey (): 0x%X\n", hr);
goto cleanup;
}
DWORD bytesWritten = 0;
DWORD hashAlgoType; // This is a new flag. It’s used to set type of hash algorithm of the claim// Set specific hash function type to produce the claim
wchar_t pHashAlgo[] = NCRYPT_SHA512_ALGORITHM;
// Set specific padding scheme for hash function to produce the claim
ULONG paddingScheme = BCRYPT_PAD_PSS;
wchar_t pPaddingAlgo[] = NCRYPT_SHA256_ALGORITHM;
ULONG paddingSalt = 345;
// This way of setting parameters is an existent pattern for NCrypt APIs
NCryptBuffer paramBuffers[] =
{
{ sizeof(NCRYPT_SHA512_ALGORITHM), NCRYPTBUFFER_ATTESTATION_STATEMENT_SIGNATURE_HASH, (PBYTE)&pHashAlgo },
{ sizeof(paddingScheme), NCRYPTBUFFER_ATTESTATION_STATEMENT_SIGNATURE_PADDING_SCHEME , (PBYTE)&paddingScheme },
{ sizeof(NCRYPT_SHA256_ALGORITHM), NCRYPTBUFFER_ATTESTATION_STATEMENT_SIGNATURE_PADDING_ALGO, (PBYTE)&pPaddingAlgo },
{ sizeof(paddingSalt, NCRYPTBUFFER_ATTESTATION_STATEMENT_SIGNATURE_PADDING_SALT_SIZE, (PBYTE)&paddingSalt }
};
NCryptBufferDesc params = { NCRYPTBUFFER_VERSION, ARRAYSIZE(paramBuffers), paramBuffers };
if (FAILED(hr = NCryptCreateClaim(
tokenKey, // key that is being attested
attestationKey,
NCRYPT_CLAIM_VBS_IDENTITY, // attest general-purpose key with an attestation (identity) key.
¶ms, // parameters list
NULL, // getting the size
0, // getting the size
&bytesWritten,
0 /*dwFlags*/)))
{
wprintf(L"Error creating claim with NCryptCreateClaim (): 0x%X\n", hr);
goto cleanup;
}
DWORD claimBufferSize = bytesWritten;
PBYTE claimBuffer = (PBYTE) HeapAlloc(GetProcessHeap(), 0,claimBufferSize);
if (NULL == claimBuffer)
{
hr = HRESULT_FROM_WIN32(GetLastError());
wprintf(L"Error allocating buffer for the claim: 0x%X\n", hr);
goto cleanup;
}
bytesWritten = 0;
if (FAILED(hr = NCryptCreateClaim(
tokenKey, // key that is being attested
attestationKey, // we assume that it is already initialized
NCRYPT_CLAIM_VBS_IDENTITY, // attest general-purpose key with an attestation (identity) key
¶ms,
claimBuffer,
claimBufferSize,
&bytesWritten,
0)))
{
wprintf(L"Error creating claim with NCryptCreateClaim (): 0x%X\n", hr);
goto cleanup;
}
wprintf(L"The claim is created successfully. It may be shared with the verifier side.\n");
cleanup:
if (provider != NULL)
{
NCryptFreeObject(provider);
}
if (tokenKey != NULL)
{
NCryptFreeObject(tokenKey);
}
if (attestationKey != NULL)
{
NCryptDeleteKey(attestationKey);
}
if (claimBuffer)
{
HeapFree(GetProcessHeap(), 0, claimBuffer);
}
return hr;
Anforderungen
Anforderung | Wert |
---|---|
mindestens unterstützte Client- | Windows 10 [Desktop-Apps | UWP-Apps] |
mindestens unterstützte Server- | Windows Server 2016 [Desktop-Apps | UWP-Apps] |
Zielplattform- | Fenster |
Header- | ncrypt.h |
Library | Ncrypt.lib |
DLL- | Ncrypt.dll |