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

Уведомление

Icon
Error

2 Страницы12>
Опции
К последнему сообщению К первому непрочитанному
Offline Alex_Prodigy  
#1 Оставлено : 29 октября 2013 г. 6:37:47(UTC)
Alex_Prodigy

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

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


Понять не могу, чем ему поток не угодил...
Offline Kirill Sobolev  
#2 Оставлено : 29 октября 2013 г. 9:51:46(UTC)
Кирилл Соболев

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

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

Поблагодарили: 177 раз в 168 постах
Значение cbSignedMessageBlob похоже на правду после первого вызова?
Цитата:
@MessageArray
@MessageSize

Что это такое?
Техническую поддержку оказываем тут
Наша база знаний
Offline Alex_Prodigy  
#3 Оставлено : 30 октября 2013 г. 2:48:29(UTC)
Alex_Prodigy

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

Группы: Участники
Зарегистрирован: 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;
Offline Kirill Sobolev  
#4 Оставлено : 30 октября 2013 г. 8:12:54(UTC)
Кирилл Соболев

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

Группы: Участники
Зарегистрирован: 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.
Техническую поддержку оказываем тут
Наша база знаний
Offline Alex_Prodigy  
#5 Оставлено : 30 октября 2013 г. 8:21:52(UTC)
Alex_Prodigy

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

Группы: Участники
Зарегистрирован: 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, но я предположил, что нужно брать из сертификата эту информацию... Eh?
У меня в итоге получается 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)  | Причина: Добавка

Offline MCR  
#6 Оставлено : 30 октября 2013 г. 8:57:01(UTC)
MCR

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

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


Offline Alex_Prodigy  
#7 Оставлено : 30 октября 2013 г. 9:03:53(UTC)
Alex_Prodigy

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

Группы: Участники
Зарегистрирован: 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;
Offline MCR  
#8 Оставлено : 30 октября 2013 г. 12:37:58(UTC)
MCR

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

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

Offline Alex_Prodigy  
#9 Оставлено : 31 октября 2013 г. 1:47:11(UTC)
Alex_Prodigy

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

Группы: Участники
Зарегистрирован: 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. Меня смущает, что именно при втором вызове функции вываливается ошибка... И даже не спрашивает пароль, т.е. ошибка возникает ещё до момента самого подписания.
Offline Андрей Писарев  
#10 Оставлено : 31 октября 2013 г. 3:00:02(UTC)
Андрей *

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

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

Сказал «Спасибо»: 540 раз
Поблагодарили: 2184 раз в 1707 постах
Автор: 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. Меня смущает, что именно при втором вызове функции вываливается ошибка... И даже не спрашивает пароль, т.е. ошибка возникает ещё до момента самого подписания.


С версиями ПО все нормально.
Техническую поддержку оказываем тут
Наша база знаний
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest (6)
2 Страницы12>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.