Bagikan melalui


Menggunakan Fitur Konfigurasi Kriptografi CNG

CNG API menyediakan fungsi untuk menghitung dan mendapatkan informasi tentang penyedia terdaftar.

Menghitung Penyedia

Anda menggunakan fungsi BCryptEnumRegisteredProviders untuk menghitung penyedia terdaftar. Fungsi BCryptEnumRegisteredProviders dapat dipanggil dengan salah satu dari dua cara:

  1. Yang pertama adalah memiliki fungsi BCryptEnumRegisteredProviders yang mengalokasikan memori. Ini dicapai dengan meneruskan alamat penunjuk NULL untuk parameter ppBuffer . Kode ini akan mengalokasikan memori yang diperlukan untuk struktur CRYPT_PROVIDERS dan string terkait. Ketika fungsi BCryptEnumRegisteredProviders digunakan dengan cara ini, Anda harus membebaskan memori ketika tidak lagi diperlukan dengan meneruskan ppBuffer ke fungsi BCryptFreeBuffer .

    Contoh berikut menunjukkan cara menggunakan fungsi BCryptEnumRegisteredProviders untuk mengalokasikan buffer untuk Anda.

    #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);
        }
    }
    
    
  2. Metode kedua adalah mengalokasikan memori yang diperlukan sendiri. Ini dicapai dengan memanggil fungsi BCryptEnumRegisteredProviders dengan NULL untuk parameter ppBuffer . Fungsi BCryptEnumRegisteredProviders akan ditempatkan dalam nilai yang ditunjukkan oleh parameter pcbBuffer , ukuran yang diperlukan, dalam byte, dari struktur CRYPT_PROVIDERS dan semua string. Anda kemudian mengalokasikan memori yang diperlukan dan meneruskan alamat penunjuk buffer ini untuk parameter ppBuffer dalam panggilan kedua ke fungsi BCryptEnumRegisteredProviders .

    Contoh berikut menunjukkan cara menggunakan fungsi BCryptEnumRegisteredProviders untuk mengalokasikan dan menggunakan buffer Anda sendiri.

    #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);
            }
        }
    }
    
    

Mendapatkan Informasi Pendaftaran Penyedia

Fungsi BCryptQueryProviderRegistration digunakan untuk mendapatkan informasi tambahan khusus pendaftaran tentang penyedia. Fungsi ini mengambil nama penyedia yang ingin Anda dapatkan informasinya, mode penyedia yang diinginkan (mode kernel, mode pengguna, atau keduanya), dan pengidentifikasi antarmuka penyedia untuk mengambil informasi pendaftaran. Misalnya, untuk mendapatkan informasi pendaftaran mode pengguna untuk antarmuka cipher untuk penyedia "Penyedia Primitif Microsoft", Anda akan melakukan panggilan yang mirip dengan yang berikut ini.

BCryptQueryProviderRegistration(
    MS_PRIMITIVE_PROVIDER,
    CRYPT_UM,
    BCRYPT_CIPHER_INTERFACE,
    //...
    );

Seperti fungsi BCryptEnumRegisteredProviders , fungsi BCryptQueryProviderRegistration dapat mengalokasikan memori untuk Anda atau Anda dapat mengalokasikan memori sendiri. Prosesnya sama untuk dua fungsi tersebut.