Статус: Участник
Группы: Участники
Зарегистрирован: 03.03.2014(UTC) Сообщений: 22   Откуда: Москва Сказал «Спасибо»: 2 раз
|
Здравствуйте. Мне необходимо написать программу, с помощью которой пользователи будут подписывать некий документ своей ЭЦП. Соответственно пользователь, подписывающий документ, не один и у каждого из них будет съемный носитель с контейнером ключей. Платформа - Linux. CSP версии v3.6.5365 КС2 Release Ver:3.6.7777. Опыта работы с CSP нет. Сейчас я пытаюсь получить сертификат из контейнера ключей со съемного носителя для всех доступных контейнеров, делаю вот так Код:// Получаем дескриптор криптопровайдера
HCRYPTPROV hProv = 0;
if(!CryptAcquireContext(&hProv, NULL, NULL, CSP_PROV_TYPE, CRYPT_VERIFYCONTEXT)) {
HandleError("CryptAcquireContext failed");
}
DWORD fParam = CRYPT_FIRST;
DWORD cnt = 0;
DWORD size = 1000;
BYTE ContName[1000];
BYTE* pbCertBlob = 0;
DWORD dwCertBlob = 0;
PCCERT_CONTEXT certificate = 0;
// Перебираем все доступные контейнеры
while (CryptGetProvParam(hProv, PP_ENUMCONTAINERS, ContName, &size, fParam)) {
printf("Container name: %s\n", (char*) ContName);
fParam = CRYPT_NEXT;
cnt++;
HCRYPTKEY hKey;
HCRYPTPROV hProv2;
char* name = new char[size];
strcpy(name, (char*) ContName);
printf("name: %s\n", name);
// Получаем дескриптор контейнера
// Вот тут, кстати, вопрос. Если использовать hProv для которого указано CRYPT_VERIFYCONTEXT,
// то CryptGetUserKey не находи ключи, возвращает 0x8009000d
// Поэтому получаем новый дескриптор провайдера.
// Так и надо, или я что-то делаю не так?
CryptAcquireContext(&hProv2, name, NULL, CSP_PROV_TYPE, NULL);
// Получение дескриптора открытого ключа
if (CryptGetUserKey(hProv2, CSP_KEY_TYPE, &hKey)) {
printf("CryptGetUserKey success! Type: CSP_KEY_TYPE: %d\n", CSP_KEY_TYPE);
// Получение сертификата ключа из контейнера
// Сначала получаем размер
//////Вот тут возникает ошибка 0x8010002c
if (CryptGetKeyParam(hKey, KP_CERTIFICATE, NULL, &dwCertBlob, NULL)) {
if (pbCertBlob = new BYTE[dwCertBlob]) {
// теперь сам сертификат
if (CryptGetKeyParam(hKey, KP_CERTIFICATE, pbCertBlob, &dwCertBlob, NULL)) {
printf("CryptGetKeyParam success!\n");
CRYPT_KEY_PROV_INFO key;
//key.pwszContainerName = name;
//key.pwszProvName = CSP_PROV_NAME;
key.dwProvType = CSP_PROV_TYPE;
key.dwFlags = NULL;
key.cProvParam = NULL;
key.rgProvParam = NULL;
key.dwKeySpec = CSP_KEY_TYPE;
if (certificate = CertCreateCertificateContext(
PKCS_7_ASN_ENCODING | X509_ASN_ENCODING,
pbCertBlob,
dwCertBlob)) {
} else {
printf("CertCreateCertificateContext failed!.\n");
DWORD err = GetLastError();
printf("Error number : 0x%x\n", err);
}
} else {
printf("CryptGetKeyParam 2 failed!\n");
}
} else {
printf("pbCertBlob = new BYTE[dwCertBlob] - failed!\n");
}
} else {
printf("CryptGetKeyParam 1 failed!\n");
DWORD err = GetLastError();
printf("Error number : 0x%x\n", err);
}
} else {
printf("CryptGetUserKey failed. Type: CSP_KEY_TYPE: %d\n", CSP_KEY_TYPE);
DWORD err = GetLastError();
printf("Error number : 0x%x\n", err);
}
delete[] name;
}
Вобщем вопрос, что это за ошибка 0x801002c и что я делаю не так?
|