Функции конвертирования ключей
Архитектура круговорота открытых ключей для "нестандартных" алгоритмов в Windows представлена на .
Функция A_ConvertPublicKeyInfo - на входе принимает ключ в формате ASN.1 DER и должна преобразовать его в формат, который "понимает" функция CSP CPImportKey
Функция A_EncodePublicKeyInfoAndParameters на входе принимает ключ в том формате,
в котором ключ экспортирует CPExportKey. На выходе A_EncodePublicKeyInfoAndParameters должна сформировать ASN.1 DER структуру с ключом - ту же самую, которая в случае импорта передается в A_ConvertPublicKeyInfo - на вход. Надеюсь, вы не запутались во всех этих входах и выходах.
Вот сигнатуры и краткие описания параметров этих функций:
BOOL WINAPI A_ConvertPublicKeyInfo( DWORD dwCertEncodingType, // IN - VOID *EncodedKeyInfo, // IN - буфер с ключом - указатель // на структуру CERT_PUBLIC_KEY_INFO
DWORD dwAlg, // IN - AlgId ключа
DWORD dwFlags, // IN - обычно 0
BYTE **ppStructInfo, // OUT - двойной указатель на структуру // в заголовке структуры идет сначала PUBLICKEYSTRUC, затем DSSPUBKEY, // а затем сам ключ с параметрами DWORD *StructLen // OUT - длина структуры
);
BOOL WINAPI A_EncodePublicKeyAndParameters( DWORD dwCertEncodingType, // IN
LPCSTR lpszStructType, // IN - OID алгоритма
const void* pvStructInfo, // IN - такая же структура как // на выходе ConvertPublicKeyInfo
DWORD nStructLen, // IN - длина входной структуры
DWORD dwFlags, // IN - обычно 0
DWORD Unk, // ? - неизвестно
BYTE **pbPubKey, // OUT - открытый ключ в ASN.1 DER
DWORD* pcPubKeyLen, // OUT - длина открытого ключа BYTE **pbParams, // OUT - параметры открытого ключа
DWORD* pcParamsLen // OUT - длина параметров
);
Форматы ключей зависят от криптопровайдера и используемых алгоритмов.