Статус: Участник
Группы: Участники
Зарегистрирован: 24.04.2014(UTC) Сообщений: 10
|
Доброго времени суток всем. Пожалуйста, подскажите, что значит ошибка (Код 234: Имеются дополнительные данные). У меня она происходит при втором вызове CryptSignMessage. Что это за данные вообще? Какой-то параметр не верно задан или не задан вовсе?.. Код:
FillChar( Sign_Msg_Para, SizeOf( CRYPT_SIGN_MESSAGE_PARA ), #0 );
Sign_Msg_Para.cbSize := SizeOF( CRYPT_SIGN_MESSAGE_PARA );
Sign_Msg_Para.dwMsgEncodingType := PKCS_7_ASN_ENCODING or X509_ASN_ENCODING;
Sign_Msg_Para.pSigningCert := pCrtContext;
Sign_Msg_Para.HashAlgorithm.pszObjId := szOID_CP_GOST_R3411;
Sign_Msg_Para.cMsgCert := 1;
Sign_Msg_Para.rgpMsgCert := @pCrtContext;
sz^:=inStream.Size;
if not ( CryptSignMessage( @Sign_Msg_Para, true, 1, inStream.Memory, sz, nil, cbSignedMsgBlob )) then
begin
res:=GetLastError;
ShowMessage('1. '+SysErrorMessage(res));
Exit;
end;
cbSignedMsgBlob:=0;
if not ( CryptSignMessage( @Sign_Msg_Para, true, 1, inStream.Memory, sz, P, cbSignedMsgBlob )) then
begin
res:=GetLastError;
ShowMessage('2. '+SysErrorMessage(res));
Exit;
end;
Спасибо!
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,340 Сказал «Спасибо»: 550 раз Поблагодарили: 2212 раз в 1727 постах
|
Автор: user.b Доброго времени суток всем. Пожалуйста, подскажите, что значит ошибка (Код 234: Имеются дополнительные данные). У меня она происходит при втором вызове CryptSignMessage. Что это за данные вообще? Какой-то параметр не верно задан или не задан вовсе?.. Код:
FillChar( Sign_Msg_Para, SizeOf( CRYPT_SIGN_MESSAGE_PARA ), #0 );
Sign_Msg_Para.cbSize := SizeOF( CRYPT_SIGN_MESSAGE_PARA );
Sign_Msg_Para.dwMsgEncodingType := PKCS_7_ASN_ENCODING or X509_ASN_ENCODING;
Sign_Msg_Para.pSigningCert := pCrtContext;
Sign_Msg_Para.HashAlgorithm.pszObjId := szOID_CP_GOST_R3411;
Sign_Msg_Para.cMsgCert := 1;
Sign_Msg_Para.rgpMsgCert := @pCrtContext;
sz^:=inStream.Size;
if not ( CryptSignMessage( @Sign_Msg_Para, true, 1, inStream.Memory, sz, nil, cbSignedMsgBlob )) then
begin
res:=GetLastError;
ShowMessage('1. '+SysErrorMessage(res));
Exit;
end;
cbSignedMsgBlob:=0;
if not ( CryptSignMessage( @Sign_Msg_Para, true, 1, inStream.Memory, sz, P, cbSignedMsgBlob )) then
begin
res:=GetLastError;
ShowMessage('2. '+SysErrorMessage(res));
Exit;
end;
Спасибо! Ответ на вопрос - Вам известно, для чего дважды используется вызов CryptSignMessage? Чтобы определить необходимый размер, выделить память и только потом передавать указатель (P). На форуме\SDK есть готовые примеры реализации (Delphi, C+) - исправляйте свой код или выполните поиск. |
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,340 Сказал «Спасибо»: 550 раз Поблагодарили: 2212 раз в 1727 постах
|
|
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 24.04.2014(UTC) Сообщений: 10
|
Да, я прошу прощения. Это уже в результате экспериментов утерял. После первого вызова был P:=GetMemory(cbSignedMsgBlob); Но результат тот же. Отредактировано пользователем 22 мая 2014 г. 9:55:57(UTC)
| Причина: Не указана
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 25.12.2007(UTC) Сообщений: 1,732 Откуда: КРИПТО-ПРО Поблагодарили: 177 раз в 168 постах
|
Вот это лишнее. Передавайте тот размер, который был использован для выделения памяти. |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 24.04.2014(UTC) Сообщений: 10
|
Автор: Kirill Sobolev Вот это лишнее. Передавайте тот размер, который был использован для выделения памяти. Без этого выдает AV и заканчивается внутренней ошибкой
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 25.12.2007(UTC) Сообщений: 1,732 Откуда: КРИПТО-ПРО Поблагодарили: 177 раз в 168 постах
|
Цитата:Без этого выдает AV и заканчивается внутренней ошибкой Была такая проблема, из-за кривого портирования wincrypt.h на delphi. |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 24.04.2014(UTC) Сообщений: 10
|
Кажется, заработало вот так: Код:
into: array of byte;
...
SetLength(into,inStream.Size);
inStream.ReadBuffer(into[0], inStream.Size);
if not ( CryptSignMessage( @Sign_Msg_Para, true, 1, @(into), sz, nil, cbSignedMsgBlob )) then
begin
res:=GetLastError;
ShowMessage('1. '+SysErrorMessage(res));
Exit;
end;
P:=GetMemory(cbSignedMsgBlob);
if not ( CryptSignMessage( @Sign_Msg_Para, true, 1, @(into), sz, P, cbSignedMsgBlob )) then
....
Странно, передаю ссылку на массив типа byte - работает. Если передать выделенную память для PByte - нет. Видел примеры, где берут данные прямо из Stream.Memory, как у меня было в начале... А главное, первый вызов вроде как принимает эти данные, правильно определяет размер подписи.. Всем большое спасибо.
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 06.03.2012(UTC) Сообщений: 177
Сказал(а) «Спасибо»: 57 раз Поблагодарили: 11 раз в 8 постах
|
Автор: Kirill Sobolev Цитата:Без этого выдает AV и заканчивается внутренней ошибкой Была такая проблема, из-за кривого портирования wincrypt.h на delphi. на delphi необходимо использовать jwawincrypt. он более-менее пригоден, хотя ошибки и в нем встречаются. поэтому под рукой еще важно держать свежий исходник wincrypt.h. примеров подписи на delphi в инете много.
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close