Windows CNG поставщик пользовательских хранилищ ключей - PullRequest
1 голос
/ 09 марта 2012

Как зарегистрировать пользовательский поставщик хранилища ключей в CNG со своим собственным ключевым форматом BLOB и т. Д.?Что я действительно хочу сделать, так это предоставить возможность обрабатывать пользовательский формат BLOB ключа CNG в .NET.Я читал в документации по CNG, что он дает возможность добавлять сторонние KSP, но не смог найти ни одного примера или учебника, как это сделать.

1 Ответ

1 голос
/ 16 января 2015

Как зарегистрировать пользовательский поставщик хранилища ключей в CNG со своим собственным ключом Формат BLOB и т. Д.

Поскольку вы хотите зарегистрироваться, я предполагаю, что у вас уже есть готовый пользовательский KSP, просто нужно его зарегистрировать. В любом случае, вы можете сделать это программно.

Следующий код взят из примера KSP, поставляемого с комплектом разработчика криптографических провайдеров (http://www.microsoft.com/en-us/download/details.aspx?id=30688)

    void
RegisterProvider(
    void
    )
{
    NTSTATUS ntStatus = STATUS_SUCCESS;

    //
    // Make CNG aware that our provider
    // exists...
    //
    ntStatus = BCryptRegisterProvider(
                    SAMPLEKSP_PROVIDER_NAME,
                    0,                          // Flags: fail if provider is already registered
                    &SampleKSPProvider
                    );
    if (!NT_SUCCESS(ntStatus))
    {
        wprintf(L"BCryptRegisterProvider failed with error code 0x%08x\n", ntStatus);
    }

    //
    // Add the algorithm name to the priority list of the
    // symmetric cipher algorithm class. (This makes it
    // visible to BCryptResolveProviders.)
    //
    ntStatus = BCryptAddContextFunction(
                    CRYPT_LOCAL,                    // Scope: local machine only
                    NULL,                           // Application context: default
                    NCRYPT_KEY_STORAGE_INTERFACE,   // Algorithm class
                    NCRYPT_KEY_STORAGE_ALGORITHM,   // Algorithm name
                    CRYPT_PRIORITY_BOTTOM           // Lowest priority
                    );
    if ( !NT_SUCCESS(ntStatus))
    {
        wprintf(L"BCryptAddContextFunction failed with error code 0x%08x\n", ntStatus);
    }

    //
    // Identify our new provider as someone who exposes
    // an implementation of the new algorithm.
    //
    ntStatus = BCryptAddContextFunctionProvider(
                    CRYPT_LOCAL,                    // Scope: local machine only
                    NULL,                           // Application context: default
                    NCRYPT_KEY_STORAGE_INTERFACE,   // Algorithm class
                    NCRYPT_KEY_STORAGE_ALGORITHM,   // Algorithm name
                    SAMPLEKSP_PROVIDER_NAME,        // Provider name
                    CRYPT_PRIORITY_BOTTOM           // Lowest priority
                    );
    if ( !NT_SUCCESS(ntStatus))
    {
        wprintf(L"BCryptAddContextFunctionProvider failed with error code 0x%08x\n", ntStatus);
    }
}
...