Статус: Активный участник
Группы: Участники
Зарегистрирован: 07.08.2012(UTC) Сообщений: 123
Сказал(а) «Спасибо»: 4 раз Поблагодарили: 6 раз в 6 постах
|
Итого алгоритм проверки подписи по хешу: 1. Создаю объект для сообщения с отсоединенной подписью Код:CryptMsgOpenToDecode(MY_ENCODING_TYPE, 0, 0, 0, NULL, NULL);
2. Заполняю данными Код:CryptMsgUpdate(cmsObject, cmsData, fileDataRead, TRUE);
2. Беру из сообщение значение подписи Код:CryptMsgGetParam(cmsObject, CMSG_ENCRYPTED_DIGEST, 0, NULL, &signatureLen);
3. Переворачиваю подпись Код:for (i = 0; i<=(signatureLen/2 - 1); i++) {
BYTE b = signatureData[i];
signatureData[i] = signatureData[signatureLen - 1 - i];
signatureData[signatureLen - 1 - i] = b;
}
4. Беру сертификат из сообщения Код:CryptMsgGetParam(cmsObject, CMSG_CERT_PARAM, 0, certificateData, &certificateLen);
5. Создаю контекст сертификата Код:certificateContext = CertCreateCertificateContext(MY_ENCODING_TYPE, certificateData, certificateLen);
6. Импортирую публичный ключ из сертификата Код:CryptImportPublicKeyInfoEx(providerObject, MY_ENCODING_TYPE, &(certificateContext->pCertInfo->SubjectPublicKeyInfo), CALG_GR3410EL, 0, NULL, &certificateObject);
8. Создаю объект для хеша Код:CryptCreateHash(prov, CALG_GR3411, 0, 0, &hashObject);
9. Задаю алгоритм хеширования Код:CryptSetHashParam(hashObject, HP_OID, (BYTE*)szOID_GostR3411_94_CryptoProParamSet, 0);
7. Получение хеша от подписанных атрибутов Код:CryptMsgGetParam(cmsObject, CMSG_COMPUTED_HASH_PARAM, 0, attrHashData, &cmsParamLen);
10. Устанавливаю значение хеша в объект Код:CryptSetHashParam(hashObject, HP_HASHVAL, attrHashData, 0);
11. Проверяю подпись Код:CryptVerifySignature(hashObject, signatureData, signatureLen, certificateObject, 0, 0);
Отредактировано пользователем 11 ноября 2013 г. 8:39:53(UTC)
| Причина: Не указана
|