1

切り離された署名 (鍵アルゴリズム - SHA-256) を持つコンテンツと CMS があり、鍵アルゴリズム SHA-512 を持つ CMS にもう 1 つの署名を追加します。しかし、CryptoApi で追加すると、関数は をCryptMsgControl(hMsg, 0, CMSG_CTRL_ADD_SIGNER, &SignerEncodeInfo)返しますCRYPT_E_UNKNOWN_ALGO

この理由は、CMS では、digestAlgoritm: ASN.1 構造に SHA-512 が存在しないためです。

ASN.1 エディターで SHA-512 を追加すると、署名者情報が追加されます: ASN.1 after insert

CryptoApi を直接使用してこのブロックまたは SignerInfo を追加することは可能ですか?それとも ASN.1 を編集することによってのみ可能ですか?

4

1 に答える 1

0

これを行うための回避策を見つけました。

アルゴリズムを含むが、署名者情報と証明書を含まないテンプレートを作成しました。CryptMsgOpenToDecodeasn1 エディターまたは CryptoApi (およびを使用) を使用して実行できます。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);

その後、新しい署名を追加できます。

于 2018-07-03T09:29:23.910 に答える