Crypto API: Подписать данные сертификатом

221
19 декабря 2016, 19:50

Есть Crypto API, есть сертификат, есть данные. Необходимо получить подпись.

Можете написать последовательность действий, что зачем нужно вызывать, чтобы получить подпись? Ну допустим, как нибудь так:

m_certContext = CertCreateCertificateContext(X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, (BYTE*)Сертификат, ДлинаСертификата);
...
CryptSignHash(hHash, AT_SIGNATURE, NULL, 0, pbSignature, &dwSigLen)

Свой код чуть попозже выложу, чтобы не замыливать глаза.

Answer 1

Создавать хэш отдельно необязательно. Это может сделать CryptSignMessage. Примерный порядок действий

CRYPT_SIGN_MESSAGE_PARA param;// Параметры вызова
memset(&param, 0, sizeof(CRYPT_SIGN_MESSAGE_PARA)); // обязательно обнулить структуру
param.cbSize = sizeof(CRYPT_SIGN_MESSAGE_PARA); // Задать размер передаваемой структуры
param.dwMsgEncodingType = X509_ASN_ENCODING | PKCS_7_ASN_ENCODING; // В каком стандарте кодируется сообщение
param.pSigningCert = m_CertContext; // Устанавливаем сертификат открытого ключа, которым подпишем
// Остальные поля можно проигнорировать
DWORD       MessageSizeArray[1]; // Массив размеров подписываемых данных - за 1 сеанс можно подписать несколько - тут всего одно
const BYTE  *MessageArray[1]; // Массив указателей на данные
MessageArray[0] = msg; // Записываем указатель на блок подписываемых данных
MessageSizeArray[0] = (DWORD) sizeof(msg); // Записываем длину
BYTE    signed_mem[2048];   // Буфер для подписи. 2048 байтов должно хватить вроде, иначе реализуйте вариант с динамическим выделением памяти
DWORD   signed_mem_len = sizeof(signed_mem); // Размер буфера
// Собственно вызов функции подписывания
int ret;
ret = CryptSignMessage(
    &param, // Параметры
    TRUE,   // 
    1, // 1 подписываем
    MessageArray, // Сообщения
    MessageSizeArray, // Их длины
    signed_mem, // Указатель на память под подпись
    &signed_mem_len // Размер буфера
);
READ ALSO
Выделение памяти с помощью операции new

Выделение памяти с помощью операции new

Немогу понять в чем разница между следующими двумя операторами

234
Оператор преобразования типа

Оператор преобразования типа

Какие аргументы и код возврата имеет оператор преобразования типа? В каких случаях неизбежно его использование?

305
Сортировка массива

Сортировка массива

По результатам опроса прошлого года известен список 10 политических деятелей в порядке убывания их популярностиПроведен новый опрос

220