НЕТ В МИРЕ СОВЕРШЕНСТВА...
Создал DETACH подпись в криптоарме, проверяю - вот они два подписанта.
Добавил еще три, кодом который ниже, проверяю - все пять тут.
Однако рано я обрадовался. Пытаюсь создать первую DETACH подпись:
(проверки и прочее из кода убираю)
сертификат ГОСТ или RSA - результат одинаков, и печален.
bGetBlob(fName, xData); - получили данные
bGetBlob(fName+'.sig', xSign);- получили подпись изначально (0,nil)
bDETACH := true;
if xSign.cbData =0 then begin
xSign := xData; - вставил от безысходности, на результат не влияет.
Result := bPrepareBlob(xSign)
- bPrepareBlob это
- CryptSignMessage(@SigParams, bDETACH, 1,Addr(MessageArray), Addr(MessageSizeArray),xMsg.pbData, xMsg.cbData)
- с параметрами SigParams.cMsgCert := 0; SigParams.rgpMsgCert := nil;
- как посоветовала Елена. Для присоединенной подписи все работает.
end;
bPutBlob('EmptySign.txt',xSign);
в результате получаем структуру 37 байт, прикладываю в файле
// 0 35: SEQUENCE {
// 2 9: OBJECT IDENTIFIER signedData (1 2 840 113549 1 7 2)
// 13 22: [0] {
// 15 20: SEQUENCE {
// 17 1: INTEGER 1
// 20 0: SET {}
// 22 11: SEQUENCE {
// 24 9: OBJECT IDENTIFIER data (1 2 840 113549 1 7 1)
// : }
// 35 0: SET {}
// : }
// : }
// : }
//.
if not (bGetMyCert(hStore,pCert,myCert)) then exit;
if not CryptAcquireCertificatePrivateKey(pCert, 0, nil, hProv, @KeySpec, @CallerFree) then
- Сертификат находится, ключ есть.
hMsg := CryptMsgOpenToDecode(bMY_TYPE, CMSG_DETACHED_FLAG, 0, 0, nil, nil);
- ок
if not (CryptMsgUpdate(hMsg, xSign.pbData, xSign.cbData, TRUE)) then begin
- ок
if not (CryptMsgUpdate(hMsg, xData.pbData, xData.cbData, true)) then begin
- ок
// Initialize the CMSG_SIGNER_ENCODE_INFO structure for the cosigner.
FillChar(CosignerInfo, SizeOf(CMSG_SIGNER_ENCODE_INFO), #0 );
CosignerInfo.cbSize := sizeof(CMSG_SIGNER_ENCODE_INFO);
- размер либо 48, либо 84 пробовал и так и так
CosignerInfo.pCertInfo := pCert.pCertInfo;
CosignerInfo.hCryptProv := hProv;
CosignerInfo.dwKeySpec := KeySpec; //AT_SIGNATURE; = 1
CosignerInfo.HashAlgorithm.pszObjId := pChar(bhashalg(pCert)); = '1.3.14.3.2.2.6'
CosignerInfo.cAuthAttr :=0;
CosignerInfo.rgAuthAttr :=nil;
CosignerInfo.cUnauthAttr := 0;
CosignerInfo.rgUnauthAttr :=nil;
{$IFDEF CMSG_SIGNER_ENCODE_INFO_HAS_CMS_FIELDS}
- полная структура или укороченная на результат не влияет.
CosignerInfo.SignerId := mycert.idCert; - (3,SHA1HASHblob)
CosignerInfo.HashEncryptionAlgorithm := pCert.pCertInfo.SubjectPublicKeyInfo.Algorithm ;
= '1.2.840.113549.1.1.1'
CosignerInfo.pvHashEncryptionAuxInfo := nil;
{$ENDIF CMSG_SIGNER_ENCODE_INFO_HAS_CMS_FIELDS}
// ADD Attribute. - добавляются
// Add the cosigner to the message.
if not CryptMsgControl(hMsg, 0, CMSG_CTRL_ADD_SIGNER, @CosignerInfo) then
-
ERRORLastERR = 80091002h -2146889726
LastDSC =
Unknown cryptographic algorithm- для присоединенной подписи работает,
- для DETACH если уже что-то было, тоже все замечательно
// Add the cosigner's certificate to the message.
if not CryptMsgControl(hMsg, 0, CMSG_CTRL_ADD_CERT, @CoCert) then
- если переместить этот кусочек выше, выполняется.
if not CryptMsgGetParam(hMsg, CMSG_ENCODED_MESSAGE, 0, nil, xOut.cbData) then
bSetBlob(xOut);
if not (CryptMsgGetParam(hMsg, CMSG_ENCODED_MESSAGE, 0, xOut.pbData, xOut.cbData)) then
CryptMsgClose(hMsg);
CryptReleaseContext(hProv, 0);
CertFreeCertificateContext(pcert);
CertCloseStore(hStore, CERT_CLOSE_STORE_FORCE_FLAG);
bPutBlob(fName+'.sig',xOut);
В чем проблема не могу понять.
А так хочется иметь одну функцию SignBlob()
Борис
PS:
Попробую удалить всех подписантов и посмотрю что останется в xSign-е ?
Отредактировано пользователем 15 апреля 2013 г. 9:58:02(UTC)
| Причина: Add PS
Вложение(я):
EmptySign.txt
(1kb) загружен 3 раз(а).У Вас нет прав для просмотра или загрузки вложений. Попробуйте зарегистрироваться.