Форум КриптоПро
»
Средства криптографической защиты информации
»
Встраивание
»
CryptSignMessage - внутренняя ошибка 2148073504 при втором вызове
Статус: Участник
Группы: Участники
Зарегистрирован: 29.10.2013(UTC) Сообщений: 11 Откуда: г. Чита
|
Здравствуйте! Сделал по примерам MSDN подпись файла с помощью функции CryptSignMessage. После первого вызова CryptSignMessage получаю размер необходимого буфера - всё ОК! А вот при втором вызове - FALSE и GetLastError = 2148073504 (Внутренняя ошибка). Пользовался и Wcryp2.pas, и JwaWincrypt.pas - одна и та же ошибка. Сначала ищу сертификат по его отпечатку: cert := CertFindCertificateInStore(store, encType, 0, CERT_FIND_SHA1_HASH, @certhash, nil); Здесь всё ОК - находит правильный сертификат (проверял получением субъекта, серийного №, поставщика...). Первый вызов CryptSignMessage отрабатывает всегда, а вот второй вызов: Код:
pStreamOut := TMemoryStream.Create;
try
pStreamOut.SetSize(cbSignedMessageBlob);
if (not (CryptSignMessage(@SigParams,
True {для Detached},
1,
@MessageArray,
@MessageSize,
pStreamOut.Memory,
cbSignedMessageBlob))) then
begin
// сваливается сюда с кодом 2148073504
ShowMessage(SysErrorMessage(GetLastError) + ' - ' + IntToStr(GetLastError));
Exit;
end;
pStreamOut.SetSize(cbSignedMessageBlob);
if FileExists(AFile + '.sig') then
DeleteFile(AFile + '.sig');
pStreamOut.SaveToFile(AFile + '.sig');
finally
FreeAndNil(pStreamOut);
end;
Понять не могу, чем ему поток не угодил...
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 25.12.2007(UTC) Сообщений: 1,732 Откуда: КРИПТО-ПРО Поблагодарили: 177 раз в 168 постах
|
Значение cbSignedMessageBlob похоже на правду после первого вызова? Цитата:@MessageArray @MessageSize Что это такое? |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 29.10.2013(UTC) Сообщений: 11 Откуда: г. Чита
|
Автор: Kirill Sobolev Значение cbSignedMessageBlob похоже на правду после первого вызова? Цитата:@MessageArray @MessageSize Что это такое? 1. cbSignedMessageBlob всегда точно такой же, как при подписи файла через csptest.exe - 2273 (после подписи должен стать 2257) если не включать сертификат в подпись, то cbSignedMessageBlob меньше, но опять такой же, как и при вызове csptest 2. Код:var
MessageArray: array of PByte;
MessageSize: array of DWORD;
...
pStreamIn := TMemoryStream.Create;
try
pStreamOut := TMemoryStream.Create;
try
SetLength(MessageArray, 1);
SetLength(MessageSize, 1);
pStreamIn.LoadFromFile(AFile);
MessageArray[0] := pStreamIn.Memory;
MessageSize[0] := pStreamIn.Size;
FillChar(SigParams, SizeOf(CRYPT_SIGN_MESSAGE_PARA), #0);
//ZeroMemory(@SigParams, SizeOf(CRYPT_SIGN_MESSAGE_PARA));
SigParams.cbSize := SizeOF(CRYPT_SIGN_MESSAGE_PARA);
SigParams.dwMsgEncodingType := encType; //PKCS_7_ASN_ENCODING; //encType;
SigParams.pSigningCert := cert; //pSignerCert;
SigParams.HashAlgorithm.pszObjId := cert^.pCertInfo^.SignatureAlgorithm.pszObjId;
SigParams.cMsgCert := 1;
SigParams.rgpMsgCert := @cert;
cbSignedMessageBlob := 0;
// первый вызов CryptSignMessage отрабатывает, как положено, без нареканий
if (not (CryptSignMessage(@SigParams,
True {для Detached},
1,
@MessageArray,
@MessageSize, nil,
cbSignedMessageBlob))) then
begin
ShowMessage(SysErrorMessage(GetLastError) + ' - ' + IntToStr(GetLastError));
Exit;
end;
pStreamOut.SetSize(cbSignedMessageBlob);
if (not (CryptSignMessage(@SigParams,
True {для Detached},
1,
@MessageArray,
@MessageSize,
pStreamOut.Memory,
cbSignedMessageBlob))) then
begin
// сваливается сюда с кодом 2148073504
ShowMessage(SysErrorMessage(GetLastError) + ' - ' + IntToStr(GetLastError));
Exit;
end;
pStreamOut.SetSize(cbSignedMessageBlob);
if FileExists(AFile + '.sig') then
DeleteFile(AFile + '.sig');
pStreamOut.SaveToFile(AFile + '.sig');
finally
FreeAndNil(pStreamOut);
end;
finally
FreeAndNil(pStreamIn);
end;
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 25.12.2007(UTC) Сообщений: 1,732 Откуда: КРИПТО-ПРО Поблагодарили: 177 раз в 168 постах
|
Цитата:SigParams.cbSize := SizeOF(CRYPT_SIGN_MESSAGE_PARA); Какое реально значение? Цитата:SigParams.HashAlgorithm.pszObjId := cert^.pCertInfo^.SignatureAlgorithm.pszObjId; Так делать нельзя. OID ГОСТ Р.34-11 - 1.2.643.2.2.9. |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 29.10.2013(UTC) Сообщений: 11 Откуда: г. Чита
|
Автор: Kirill Sobolev Цитата:SigParams.cbSize := SizeOF(CRYPT_SIGN_MESSAGE_PARA); Какое реально значение? Получается 68Автор: Kirill Sobolev Цитата:SigParams.HashAlgorithm.pszObjId := cert^.pCertInfo^.SignatureAlgorithm.pszObjId; Так делать нельзя. OID ГОСТ Р.34-11 - 1.2.643.2.2.9. Почему нельзя? В примере, конечно, стоит szOID_RSA_SHA1RSA, но я предположил, что нужно брать из сертификата эту информацию... У меня в итоге получается 1.2.643.2.2.3 - неправильно? Надо именно 1.2.643.2.2.9 указывать? К слову, поставил SigParams.HashAlgorithm.pszObjId := '1.2.643.2.2.9'; Ничего не поменялось... P.S. Забыл упомянуть, второй раз даже не появляется окно с запросом пароля. Отредактировано пользователем 30 октября 2013 г. 8:28:22(UTC)
| Причина: Добавка
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 06.03.2012(UTC) Сообщений: 177
Сказал(а) «Спасибо»: 57 раз Поблагодарили: 11 раз в 8 постах
|
Автор: Alex_Prodigy Автор: Kirill Sobolev Цитата:SigParams.cbSize := SizeOF(CRYPT_SIGN_MESSAGE_PARA); Какое реально значение? Получается 68Автор: Kirill Sobolev Цитата:SigParams.HashAlgorithm.pszObjId := cert^.pCertInfo^.SignatureAlgorithm.pszObjId; Так делать нельзя. OID ГОСТ Р.34-11 - 1.2.643.2.2.9. Почему нельзя? В примере, конечно, стоит szOID_RSA_SHA1RSA, но я предположил, что нужно брать из сертификата эту информацию... У меня в итоге получается 1.2.643.2.2.3 - неправильно? Надо именно 1.2.643.2.2.9 указывать? К слову, поставил SigParams.HashAlgorithm.pszObjId := '1.2.643.2.2.9'; Ничего не поменялось... P.S. Забыл упомянуть, второй раз даже не появляется окно с запросом пароля. Нельзя т.к. SigParams. HashAlgorithm.pszObjId := cert^.pCertInfo^. SignatureAlgorithm.pszObjId;
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 29.10.2013(UTC) Сообщений: 11 Откуда: г. Чита
|
Автор: MCR Цитата:Нельзя т.к. SigParams.HashAlgorithm.pszObjId := cert^.pCertInfo^.SignatureAlgorithm.pszObjId; А что конкретно туда нужно присваивать? Я уже много чего пробовал: '1.2.643.2.2.3'; '1.2.643.2.2.9'; szOID_RSA_MD5; CertAlgIdToOID(CALG_MD5); szOID_PKCS_7;
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 06.03.2012(UTC) Сообщений: 177
Сказал(а) «Спасибо»: 57 раз Поблагодарили: 11 раз в 8 постах
|
Автор: Alex_Prodigy Автор: MCR Цитата:Нельзя т.к. SigParams.HashAlgorithm.pszObjId := cert^.pCertInfo^.SignatureAlgorithm.pszObjId; А что конкретно туда нужно присваивать? Я уже много чего пробовал: '1.2.643.2.2.3'; '1.2.643.2.2.9'; szOID_RSA_MD5; CertAlgIdToOID(CALG_MD5); szOID_PKCS_7; Не нужно много. Лучше правильно: Код:szOID_CP_GOST_R3411 = '1.2.643.2.2.9';
И пробуйте в TMemoryStream результат сразу из функции не записывать. Отредактировано пользователем 30 октября 2013 г. 12:41:33(UTC)
| Причина: Не указана
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 29.10.2013(UTC) Сообщений: 11 Откуда: г. Чита
|
Автор: MCR Цитата:Не нужно много. Лучше правильно: Код:szOID_CP_GOST_R3411 = '1.2.643.2.2.9';
И пробуйте в TMemoryStream результат сразу из функции не записывать. Я пробовал 1.2.643.2.2.9. И записывать не сразу в поток тоже пробовал, никаких перемен :( Может быть, Delphi 7 уже не подходит для этого? Или у меня старенький Крипто-Про установлен? Версия ядра СКЗИ: 3.6.5359 КС1 Версия продукта: 3.6.6627 P.S. Меня смущает, что именно при втором вызове функции вываливается ошибка... И даже не спрашивает пароль, т.е. ошибка возникает ещё до момента самого подписания.
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,281 Сказал «Спасибо»: 548 раз Поблагодарили: 2196 раз в 1714 постах
|
Автор: Alex_Prodigy Автор: MCR Цитата:Не нужно много. Лучше правильно: Код:szOID_CP_GOST_R3411 = '1.2.643.2.2.9';
И пробуйте в TMemoryStream результат сразу из функции не записывать. Я пробовал 1.2.643.2.2.9. И записывать не сразу в поток тоже пробовал, никаких перемен :( Может быть, Delphi 7 уже не подходит для этого? Или у меня старенький Крипто-Про установлен? Версия ядра СКЗИ: 3.6.5359 КС1 Версия продукта: 3.6.6627 P.S. Меня смущает, что именно при втором вызове функции вываливается ошибка... И даже не спрашивает пароль, т.е. ошибка возникает ещё до момента самого подписания. С версиями ПО все нормально. |
|
|
|
|
Форум КриптоПро
»
Средства криптографической защиты информации
»
Встраивание
»
CryptSignMessage - внутренняя ошибка 2148073504 при втором вызове
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close