Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline user.b  
#1 Оставлено : 22 мая 2014 г. 1:09:37(UTC)
user.b

Статус: Участник

Группы: Участники
Зарегистрирован: 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;


Спасибо!
Offline Андрей Писарев  
#2 Оставлено : 22 мая 2014 г. 9:44:58(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 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+) - исправляйте свой код или выполните поиск.
Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей Писарев  
#3 Оставлено : 22 мая 2014 г. 9:47:24(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 13,340
Мужчина
Российская Федерация

Сказал «Спасибо»: 550 раз
Поблагодарили: 2212 раз в 1727 постах
Техническую поддержку оказываем тут
Наша база знаний
Offline user.b  
#4 Оставлено : 22 мая 2014 г. 9:52:54(UTC)
user.b

Статус: Участник

Группы: Участники
Зарегистрирован: 24.04.2014(UTC)
Сообщений: 10
Российская Федерация

Да, я прошу прощения. Это уже в результате экспериментов утерял. После первого вызова был P:=GetMemory(cbSignedMsgBlob); Но результат тот же.

Отредактировано пользователем 22 мая 2014 г. 9:55:57(UTC)  | Причина: Не указана

Offline Kirill Sobolev  
#5 Оставлено : 22 мая 2014 г. 10:27:44(UTC)
Кирилл Соболев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 25.12.2007(UTC)
Сообщений: 1,732
Мужчина
Откуда: КРИПТО-ПРО

Поблагодарили: 177 раз в 168 постах
Код:
cbSignedMsgBlob:=0;

Вот это лишнее. Передавайте тот размер, который был использован для выделения памяти.
Техническую поддержку оказываем тут
Наша база знаний
Offline user.b  
#6 Оставлено : 22 мая 2014 г. 10:44:22(UTC)
user.b

Статус: Участник

Группы: Участники
Зарегистрирован: 24.04.2014(UTC)
Сообщений: 10
Российская Федерация

Автор: Kirill Sobolev Перейти к цитате
Код:
cbSignedMsgBlob:=0;

Вот это лишнее. Передавайте тот размер, который был использован для выделения памяти.

Без этого выдает AV и заканчивается внутренней ошибкой

Offline Kirill Sobolev  
#7 Оставлено : 22 мая 2014 г. 11:09:09(UTC)
Кирилл Соболев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 25.12.2007(UTC)
Сообщений: 1,732
Мужчина
Откуда: КРИПТО-ПРО

Поблагодарили: 177 раз в 168 постах
Цитата:
Без этого выдает AV и заканчивается внутренней ошибкой

Была такая проблема, из-за кривого портирования wincrypt.h на delphi.
Техническую поддержку оказываем тут
Наша база знаний
Offline user.b  
#8 Оставлено : 22 мая 2014 г. 11:10:34(UTC)
user.b

Статус: Участник

Группы: Участники
Зарегистрирован: 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, как у меня было в начале... А главное, первый вызов вроде как принимает эти данные, правильно определяет размер подписи..

Всем большое спасибо.
Offline MCR  
#9 Оставлено : 23 мая 2014 г. 10:43:52(UTC)
MCR

Статус: Активный участник

Группы: Участники
Зарегистрирован: 06.03.2012(UTC)
Сообщений: 177

Сказал(а) «Спасибо»: 57 раз
Поблагодарили: 11 раз в 8 постах
Автор: Kirill Sobolev Перейти к цитате
Цитата:
Без этого выдает AV и заканчивается внутренней ошибкой

Была такая проблема, из-за кривого портирования wincrypt.h на delphi.


на delphi необходимо использовать jwawincrypt. он более-менее пригоден, хотя ошибки и в нем встречаются.
поэтому под рукой еще важно держать свежий исходник wincrypt.h.
примеров подписи на delphi в инете много.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.