Создание отдельной подписи в CMS с использованием SHA-512 для хэша

У меня есть контент и CMS с отдельной подписью (алгоритм ключа — SHA-256) и
Я добавляю еще одну сигнатуру в CMS с алгоритмом ключа SHA-512. Но при добавлении с CryptoApi функция CryptMsgControl(hMsg, 0, CMSG_CTRL_ADD_SIGNER, &SignerEncodeInfo) возвращается CRYPT_E_UNKNOWN_ALGO,

Причина этого заключается в том, что в CMS не существует SHA-512 в digestAlgoritm:
Структура ASN.1

Если я добавлю SHA-512 с редактором ASN.1, информация о подписавшем будет добавлена: ASN.1 после вставки

Можно ли добавить этот блок или SignerInfo, используя CryptoApi напрямую, или это возможно только путем редактирования ASN.1?

1

Решение

Я нашел обходной путь для этого.

Я создал шаблон, содержащий алгоритмы, но не содержащий информацию подписавшего и сертификат. Это можно сделать с помощью редактора asn1 или CryptoApi (используя CryptMsgOpenToDecode а также CryptMsgControl(..., CMSG_CTRL_DEL_SIGNER, ...))
Затем необходимо перенести информацию подписавшего и сертификаты из текущей подписи в шаблон, созданный выше.

PCMSG_CMS_SIGNER_INFO pSignerInfo;
DWORD cbSignerInfo;
CryptMsgGetParam(hMsg2, CMSG_CMS_SIGNER_INFO_PARAM, 0, NULL, &cbSignerInfo);
pSignerInfo = (PCMSG_CMS_SIGNER_INFO)LocalAlloc(LPTR, cbSignerInfo);
CryptMsgGetParam(hMsg2, CMSG_CMS_SIGNER_INFO_PARAM, 0, (PVOID)pSignerInfo, &cbSignerInfo);

CryptMsgControl(hMsg, 0, CMSG_CTRL_ADD_CMS_SIGNER_INFO, pSignerInfo);

DWORD cbCertInfo;
CryptMsgGetParam(hMsg2, CMSG_CERT_PARAM, 0, NULL, &cbCertInfo);
std::vector<BYTE> pCertInfo(cbCertInfo);
CryptMsgGetParam(hMsg2, CMSG_CERT_PARAM, 0, &pCertInfo[0], &cbCertInfo);

CRYPT_INTEGER_BLOB certBlob;
memset(&certBlob, 0, sizeof(CRYPT_INTEGER_BLOB));
certBlob.cbData = cbCertInfo;
certBlob.pbData = &pCertInfo[0];
CryptMsgControl(hMsg, 0, CMSG_CTRL_ADD_CERT, &certBlob);

После этого вы можете добавить новую подпись.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]