Статус: Новичок
Группы: Участники
Зарегистрирован: 24.09.2008(UTC) Сообщений: 1 Откуда: Gomel, Belarus
|
Код: HCRYPTPROV hCryptoProvider = 0;
HCRYPTKEY hPubKey = 0;
HCRYPTHASH hHash = 0;
if (use_machine_key)
// Подключение к криптопровайдеру и получение
// указателя(hCryptoProvider) на ключесодержащее место в CSP.
res = CryptAcquireContext(
&hCryptoProvider
, m_container.c_str()
, 0
, type()
, CRYPT_MACHINE_KEYSET | CRYPT_SILENT
);
else
res = CryptAcquireContext(
&hCryptoProvider
, m_container.c_str()
, 0
, type()
, CRYPT_SILENT
);
res = CryptGetUserKey( hCryptoProvider, AT_SIGNATURE, &hPubKey );
// Создание в системе хэш-объекта.
res = CryptCreateHash(
hCryptoProvider
, cert_alg_id()
, 0
, unsigned int(0)
, &hHash
);
// Добавление данных к объекту хэш-функции.
res = CryptHashData(
hHash
, reinterpret_cast {const BYTE *} ( body.c_str() )
, body.length()
, 0
);
DWORD signature_length = 0;
// Вычисление значения ЭЦП от значения хэша.
res = CryptSignHash(
hHash
, (unsigned int)AT_SIGNATURE
, NULL
, 0
// 0 - возврат в signature_length
// необходимого размера для подписи.
, 0
, &signature_length
);
// Буфер для приема подписи.
std::vector {BYTE} temp(signature_length);
// Вычисление значения ЭЦП от значения хэша.
res = CryptSignHash(
hHash
, (unsigned int)AT_SIGNATURE
, NULL
, 0
, &temp[0]
, &signature_length
);
Вышепредставленный код проверен для 2.0 (представлен без проверок ошибок). Генерация : http://www.cryptopro.ru/certsrv/certrqma.asp, ключи находятся в контейнерах КриптоПро. Версии: 2.0: 2.0 Build 2104, Win 2000 3.0: KC1 3.0.3300.3, Win Server 2003 После перехода на 3.0 на другой машине появилась проблема: при операции CryptGetUserKey ключ не находится (ошибка CryptGetUserKey - NTE_NO_KEY The key requested by the dwKeySpec parameter does not exist ). После просмотра форумов и нахождения http://www.cryptopro.ru/...ro/forum/view.asp?q=6728 (последние сообщения) пришли к выводу, что замена AT_SIGNATURE -> AT_KEYEXCHANGE должна решить проблему. После замены функции отрабатывают, но в плане полной корректности уверенности нет. В связи со всем этим есть 2 вопроса: 1) насколько такая реализация жизнеспособна для 3.0? 2) можно ли написать код, который был бы универсален для 2.0 и 3.0? P.S. У вас форум не переваривает знаки больше/меньше (> <) внутри [ code ], там где vector и reinterpret_cast, пишет что Цитата:There has been a serious error loading the forum. No futher information is available.
Please contact the administrator if this message persists. Отредактировано пользователем 24 сентября 2008 г. 2:21:37(UTC)
| Причина: Не указана
|