Процедура подписывания данных

Одна функция CryptSignMessage выполняет все задачи, перечисленные в разделе Создание подписанного сообщения. Однако по-прежнему требуется инициализация структур и других данных. На следующем рисунке показана связь между параметрами функции, указывающими на структуры или массивы, и их инициализированными данными. На рисунке показаны только параметры функции и члены структуры, производные от других структур или функций. Остальные параметры являются простыми инициализациями.

Схема инициализации для вызова cryptsignmessage

Подписание данных с помощью CryptSignMessage

  1. Получите указатель на данные, которые должны быть подписаны.
  2. Назначьте указатель на данные, чтобы индексировать ноль массива "данные для подписи".
  3. Получите дескриптор для поставщика служб шифрования.
  4. Откройте хранилище сертификатов , содержащее сертификат подписывателя.
  5. Получите адрес сертификата подписывателя.
  6. Назначьте адрес сертификата нулевому индексу массива MsgCert .
  7. Назначьте адреса любых других сертификатов, которые будут включены в сообщение массиву MsgCert .
  8. Инициализируйте структуру CRYPT_ALGORITHM_IDENTIFIER , инициализировав элемент pszObjId нужным хэш-алгоритмом и другими элементами соответствующим образом.
  9. Инициализируйте структуру CRYPT_SIGN_MESSAGE_PARA , инициализировав элемент pSigningCert адресом сертификата подписывателя, элемент массива MsgCert — адресом сертификата подписателя и других сертификатов, элемент HashAlgorithm — адресом структуры CRYPT_ALGORITHM_IDENTIFIER , а другие члены — соответствующим образом.
  10. Вызовите функцию CryptSignMessage , передав структуру CRYPT_SIGN_MESSAGE_PARA для параметра pSignPara, адрес массива данных для подписи для параметра rgpbToBeSigned , адрес выходного параметра pbSignedBlob и значения для других параметров соответствующим образом.