Uso delle funzionalità di configurazione della crittografia di CNG
L'API CNG fornisce funzioni per enumerare e ottenere informazioni sui provider registrati.
Enumerazione dei provider
Per enumerare i provider registrati, usare la funzione BCryptEnumRegisteredProviders . La funzione BCryptEnumRegisteredProviders può essere chiamata in uno dei due modi seguenti:
Il primo consiste nell'avere la funzione BCryptEnumRegisteredProviders allocare la memoria. Questa operazione viene eseguita passando l'indirizzo di un puntatore NULL per il parametro ppBuffer . Questo codice allocherà la memoria necessaria per la struttura CRYPT_PROVIDERS e le stringhe associate. Quando la funzione BCryptEnumRegisteredProviders viene usata in questo modo, è necessario liberare la memoria quando non è più necessaria passando ppBuffer alla funzione BCryptFreeBuffer .
Nell'esempio seguente viene illustrato come usare la funzione BCryptEnumRegisteredProviders per allocare il buffer.
#include <windows.h> #ifndef NT_SUCCESS #define NT_SUCCESS(Status) ((NTSTATUS)(Status) >= 0) #endif void EnumProviders1() { NTSTATUS status; ULONG cbBuffer = 0; PCRYPT_PROVIDERS pBuffer = NULL; /* Get the providers, letting the BCryptEnumRegisteredProviders function allocate the memory. */ status = BCryptEnumRegisteredProviders(&cbBuffer, &pBuffer); if (NT_SUCCESS(status)) { if (pBuffer != NULL) { // Enumerate the providers. for (ULONG i = 0; i < pBuffer->cProviders; i++) { printf("%S\n", pBuffer->rgpszProviders[i]); } } } else { printf("BCryptEnumRegisteredProviders failed with error " "code 0x%08x\n", status); } if (NULL != pBuffer) { /* Free the memory allocated by the BCryptEnumRegisteredProviders function. */ BCryptFreeBuffer(pBuffer); } }
Il secondo metodo consiste nell'allocare la memoria necessaria. Questa operazione viene eseguita chiamando la funzione BCryptEnumRegisteredProviders con NULL per il parametro ppBuffer . La funzione BCryptEnumRegisteredProviders inserisce nel valore indicato dal parametro pcbBuffer , le dimensioni necessarie, in byte, della struttura CRYPT_PROVIDERS e di tutte le stringhe. Allocare quindi la memoria necessaria e passare l'indirizzo di questo puntatore del buffer per il parametro ppBuffer in una seconda chiamata alla funzione BCryptEnumRegisteredProviders .
Nell'esempio seguente viene illustrato come usare la funzione BCryptEnumRegisteredProviders per allocare e usare il proprio buffer.
#include <windows.h> #include <stdio.h> #ifndef NT_SUCCESS #define NT_SUCCESS(Status) ((NTSTATUS)(Status) >= 0) #endif void EnumProviders2() { NTSTATUS status; ULONG cbBuffer = 0; // Get the required size of the buffer. status = BCryptEnumRegisteredProviders(&cbBuffer, NULL); if (STATUS_BUFFER_TOO_SMALL == status) { // Allocate the buffer. PCRYPT_PROVIDERS pBuffer = (PCRYPT_PROVIDERS)LocalAlloc(LPTR, cbBuffer); if (NULL != pBuffer) { // Get the providers in the buffer that was allocated. status = BCryptEnumRegisteredProviders( &cbBuffer, &pBuffer); if (NT_SUCCESS(status)) { for (ULONG i = 0; i < pBuffer->cProviders; i++) { // Enumerate the providers. printf("%S\n", pBuffer->rgpszProviders[i]); } } // Free the memory that was allocated. LocalFree(pBuffer); } } }
Recupero delle informazioni di registrazione del provider
La funzione BCryptQueryProviderRegistration viene usata per ottenere informazioni aggiuntive specifiche per la registrazione su un provider. Questa funzione accetta il nome del provider per cui si desidera ottenere informazioni, la modalità provider desiderata (modalità kernel, modalità utente o entrambe) e l'identificatore dell'interfaccia del provider per recuperare le informazioni di registrazione per. Ad esempio, per ottenere le informazioni di registrazione in modalità utente per l'interfaccia di crittografia per il provider "Provider Primitivo Microsoft", si effettua una chiamata simile al seguente.
BCryptQueryProviderRegistration(
MS_PRIMITIVE_PROVIDER,
CRYPT_UM,
BCRYPT_CIPHER_INTERFACE,
//...
);
Analogamente alla funzione BCryptEnumRegisteredProviders , la funzione BCryptQueryProviderRegistration può allocare memoria o allocare la memoria autonomamente. Il processo è lo stesso per le due funzioni.