Форум КриптоПро
»
Средства криптографической защиты информации
»
Встраивание
»
CryptSignMessage - внутренняя ошибка 2148073504 при втором вызове
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,281 Сказал «Спасибо»: 548 раз Поблагодарили: 2196 раз в 1714 постах
|
|
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 29.10.2013(UTC) Сообщений: 11 Откуда: г. Чита
|
Автор: Андрей * При втором вызове: cbSignedMessageBlob = 0, так? Да, именно так.
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 29.10.2013(UTC) Сообщений: 11 Откуда: г. Чита
|
Обновил Крипто-ПРО: Версия ядра СКЗИ: 3.6.5364 КС1 Версия продукта: 3.6.7491
При втором вызове функции теперь "Параметр задан неверно - 87"! Интересно, какой же параметр имеется ввиду...
А подпись через csptest.exe второй раз теперь не спрашивает пароль! :)
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,281 Сказал «Спасибо»: 548 раз Поблагодарили: 2196 раз в 1714 постах
|
Автор: Alex_Prodigy А подпись через csptest.exe второй раз теперь не спрашивает пароль! :) Вкладка Безопасность Включена служба хранения ключей \ кеширование |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 29.10.2013(UTC) Сообщений: 11 Откуда: г. Чита
|
Автор: Андрей * Автор: Alex_Prodigy А подпись через csptest.exe второй раз теперь не спрашивает пароль! :) Вкладка Безопасность Включена служба хранения ключей \ кеширование Хм, нет, не включена. Стоит "Хранить ключи в памяти приложений"
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 29.10.2013(UTC) Сообщений: 11 Откуда: г. Чита
|
Код:
var
cert: PCCERT_CONTEXT;
MessageArray: array of PByte;
MessageSize: array of DWORD;
SigParams: CRYPT_SIGN_MESSAGE_PARA;
cbSignedMessageBlob: DWORD;
pbSignedMessageBlob: PByte;
pStreamIn, pStreamOut: TMemoryStream;
..
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 := PKCS_7_ASN_ENCODING or X509_ASN_ENCODING;
SigParams.pSigningCert := cert;
SigParams.HashAlgorithm.pszObjId := '1.2.643.2.2.9';
SigParams.cMsgCert := 1;
SigParams.rgpMsgCert := @cert;
cbSignedMessageBlob := 0;
if (not (CryptSignMessage(@SigParams,
True {для Detached},
1,
@MessageArray,
@MessageSize,
nil,
cbSignedMessageBlob))) then
begin
ShowMessage(SysErrorMessage(GetLastError) + ' - ' + IntToStr(GetLastError));
Exit;
end;
pStreamOut.SetSize(cbSignedMessageBlob);
GetMem(pbSignedMessageBlob, cbSignedMessageBlob);
try
if (not (CryptSignMessage(@SigParams,
True {для Detached},
1,
@MessageArray,
@MessageSize,
pbSignedMessageBlob, // pStreamOut.Memory,
cbSignedMessageBlob))) then
begin
// после обновления Крипто-ПРО здесь уже код ошибки [b]87[/b] - Параметр задан неверно
ShowMessage(SysErrorMessage(GetLastError) + ' - ' + IntToStr(GetLastError));
Exit;
end;
pStreamOut.SetSize(cbSignedMessageBlob);
pStreamOut.WriteBuffer(pbSignedMessageBlob, cbSignedMessageBlob);
pStreamOut.SaveToFile(AFile + '.sig');
finally
FreeMem(pbSignedMessageBlob, cbSignedMessageBlob);
end;
finally
FreeAndNil(pStreamOut);
end;
finally
FreeAndNil(pStreamIn);
end;
Какой же именно параметр задан неверно?!
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 29.10.2013(UTC) Сообщений: 11 Откуда: г. Чита
|
Проблема разрешилась с помощью Pointer(). Код:
var
cert: PCCERT_CONTEXT;
MessageArray: array of PByte;
MessageSize: array of DWORD;
SigParams: CRYPT_SIGN_MESSAGE_PARA;
cbSignedMessageBlob: DWORD;
pStreamIn, pStreamOut: TMemoryStream;
..
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 := PKCS_7_ASN_ENCODING or X509_ASN_ENCODING;
SigParams.pSigningCert := cert;
SigParams.HashAlgorithm.pszObjId := '1.2.643.2.2.9';
SigParams.cMsgCert := 1;
SigParams.rgpMsgCert := @cert;
cbSignedMessageBlob := 0;
if (not (CryptSignMessage(@SigParams,
True {для Detached},
1,
Pointer(MessageArray), // <- вместо @, хотя размер же всегда правильно определял!
Pointer(MessageSize), // <- вместо @
nil,
cbSignedMessageBlob))) then
begin
ShowMessage(SysErrorMessage(GetLastError) + ' - ' + IntToStr(GetLastError));
Exit;
end;
pStreamOut.SetSize(cbSignedMessageBlob);
if (not (CryptSignMessage(@SigParams,
True {для Detached},
1,
Pointer(MessageArray), // <- вместо @
Pointer(MessageSize), // <- вместо @
pStreamOut.Memory,
cbSignedMessageBlob))) then
begin
ShowMessage(SysErrorMessage(GetLastError) + ' - ' + IntToStr(GetLastError));
Exit;
end;
pStreamOut.SetSize(cbSignedMessageBlob);
pStreamOut.SaveToFile(AFile + '.sig');
finally
FreeAndNil(pStreamOut);
end;
finally
FreeAndNil(pStreamIn);
end;
Всем спасибо за участие! И, кстати, если кто знает, подскажите, пожалуйста, в каком направлении копать при описанном подходе, чтобы при подписании нескольких файлов за раз пароль спрашивался только ОДИН раз, а потом кешировался до следующего подписания пачки файлов. Отредактировано пользователем 31 октября 2013 г. 8:02:31(UTC)
| Причина: Не указана
|
|
|
|
Статус: Сотрудник
Группы: Администраторы, Участники Зарегистрирован: 10.12.2008(UTC) Сообщений: 924 Откуда: Крипто-Про Поблагодарили: 99 раз в 95 постах
|
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 29.10.2013(UTC) Сообщений: 11 Откуда: г. Чита
|
Автор: Новожилова Елена Спасибо, уже всё сделал, работает, как надо :)
|
|
|
|
Форум КриптоПро
»
Средства криптографической защиты информации
»
Встраивание
»
CryptSignMessage - внутренняя ошибка 2148073504 при втором вызове
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close