Есть Crypto API, есть сертификат, есть данные. Необходимо получить подпись.
Можете написать последовательность действий, что зачем нужно вызывать, чтобы получить подпись? Ну допустим, как нибудь так:
m_certContext = CertCreateCertificateContext(X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, (BYTE*)Сертификат, ДлинаСертификата);
...
CryptSignHash(hHash, AT_SIGNATURE, NULL, 0, pbSignature, &dwSigLen)
Свой код чуть попозже выложу, чтобы не замыливать глаза.
Создавать хэш отдельно необязательно. Это может сделать CryptSignMessage. Примерный порядок действий
CRYPT_SIGN_MESSAGE_PARA param;// Параметры вызова
memset(¶m, 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(
¶m, // Параметры
TRUE, //
1, // 1 подписываем
MessageArray, // Сообщения
MessageSizeArray, // Их длины
signed_mem, // Указатель на память под подпись
&signed_mem_len // Размер буфера
);
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Немогу понять в чем разница между следующими двумя операторами
Какие аргументы и код возврата имеет оператор преобразования типа? В каких случаях неизбежно его использование?
По результатам опроса прошлого года известен список 10 политических деятелей в порядке убывания их популярностиПроведен новый опрос