Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 2 [3]      все
 Re: Электронный больничный ЭЛН  [new]
Док
Member

Откуда: Казань
Сообщений: 5840
Shuraken,

хорошо бы опыт в бложике каком выложить. Я бы себе заныкал...
13 авг 18, 17:40    [21640912]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
Shuraken
Member

Откуда:
Сообщений: 582
Док,
так он уже давно выложен на форуме криптопро. Посмотрите предыдущие сообщения в теме.
14 авг 18, 11:06    [21641483]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
Док
Member

Откуда: Казань
Сообщений: 5840
Shuraken
Посмотрите предыдущие сообщения в теме.

а-а-а, точно, запамятовал :)
14 авг 18, 18:18    [21642290]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
Shuraken
Member

Откуда:
Сообщений: 582
Столкнулся с такой непонятной для меня ситуацией. Установил несколько тестовых сертификатов от КриптоПро, чтобы проверить корректность наложения ЭЦП. В одном сертификате такие параметры:
Алгоритм подписи: ГОСТ Р 34.11-2012/34.10-2012 256 бит
Хэш-алгоритм подписи: ГОСТ Р 34.11-2012 256 бит
Открытый ключ: ГОСТ Р 34.11-2012 512 бит

В другом
Алгоритм подписи: ГОСТ Р 34.11-2012/34.10-2012 256 бит
Хэш-алгоритм подписи: ГОСТ Р 34.11-2012 256 бит
Открытый ключ: ГОСТ Р 34.11-2012 256 бит

Я сперва посчитал, что раз в обоих случаях алгоритм подписи и хэш-алгоритм подписи одинаковы, то для формирования хэша будет использоваться один и тот же алгоритм - CALG_GR3411_2012_256 (32801). Ага, щаз. В случае использования второго сертификата с открытым ключом на 256 бит это было справедливо. А вот для сертификата с открытым ключом в 512 бит опытным путём удалось установить, что надо использовать другой алгоритм - CALG_GR3411_2012_512 (32802). Тогда всё накладывается корректно и запрос получается правильным.
И я сейчас пытаюсь понять, как программно вытащить информацию о правильном хэш-алгоритме.

  repeat
    pCertContext := CertEnumCertificatesInStore(hStoreHandle, pCertContext);
    if (pCertContext <> nil) then
    begin
      pSignerCert := CertDuplicateCertificateContext(pCertContext);
      if not CertGetCertificateContextProperty(pCertContext, CERT_KEY_PROV_INFO_PROP_ID, nil, @cbSize) then
        continue;
      if (cbSize < 1) then
        continue;
      GetMem(pInfo, cbSize);
      CertGetCertificateContextProperty(pCertContext, CERT_KEY_PROV_INFO_PROP_ID, pInfo, @cbSize);
      // из pInfo запоминаю pInfo^.pwszProvName и pInfo^.dwProvTyp
     // алгоритм пытаюсь вытащить так
     pOidInfo := CryptFindOIDInfo(CRYPT_OID_INFO_OID_KEY, PChar(pSignerCert^.pCertInfo.SignatureAlgorithm.pszObjId), 0);
     AlgID := CertOIDToAlgId(pOidInfo^.pszOID); // получаю CALG_GR3411_2012_256 (32801) сам pszOID = 1.2.643.7.1.1.3.2
     pOidInfo := CryptFindOIDInfo(CRYPT_OID_INFO_OID_KEY, PChar(pSignerCert^.pCertInfo.SubjectPublicKeyInfo.Algorithm.pszObjId), 0);
     // здесь у pOidInfo pszOID = 1.2.643.7.1.1.1.2, что соответствует группе { CRYPT_PUBKEY_ALG_OID_GROUP_ID  } и константе в ней szOID_CP_GOST_R3410_12_512 (взято из wincryptex)
     AlgID := CertOIDToAlgId(pOidInfo^.pszOID); // получаю CALG_GR3410_12_512 (11837) а надо CALG_GR3411_2012_512 (32802)
    // запоминаю нужные данные
    ....
  until (pCertContext = nil);

И я понимаю, что ищу не то, что надо искать данные именно для хэш-алгоритма, но при этом не могу понять, какими процедурами это можно сделать, используя контекст конкретного сертификата. Подскажите пожалуйста.
С уважением, Александр.
17 авг 18, 10:46    [21645600]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
Shuraken
Member

Откуда:
Сообщений: 582
Также столкнулся с ситуацией, что не работает формирование ЭЦП в Windows 10

type
  TByteArray = array of Byte;

function TfrmSignatureFromCertificate.GetSignature(CanonText: string;
  Cert: PCCERT_CONTEXT; AlgID: integer): string;

var
  Prov: HCRYPTPROV;
  Hash: HCRYPTHASH;
  BufLen: DWORD;
  keySpec: DWORD;
  callerFree: BOOL;
  sigData, reversedData: TByteArray;

  function ReversedBytes(const ABytes: TByteArray): TByteArray;
  var
    I: Integer;
    P: Windows.PByte;
  begin
    SetLength(Result, Length(ABytes));
    P := Windows.PByte(Result);
    for I := Length(ABytes) - 1 downto 0 do
    begin
      P^ := ABytes[I];
      Inc(P);
    end;
  end;

begin
  Result:='';
  KeySpec := 0;

  if (not CryptAcquireCertificatePrivateKey(Cert,
    CRYPT_ACQUIRE_COMPARE_KEY_FLAG, nil, @Prov, @keySpec, @callerFree)) or (not callerFree) then
  begin
    raise Exception.Create('CryptAcquireCertificatePrivateKey');
  end;

  CryptCreateHash(Prov, algID, nil, 0, @Hash);
  CryptHashData(Hash, PByte(CanonText), Length(CanonText), 0);
  BufLen:=0;
  CryptSignHash(Hash,keySpec,nil,0,nil,@BufLen); // и вот здесь получаю отлуп. BufLen = 0;
  if BufLen>0 then
  begin
    SetLength(sigData, BufLen);
    CryptSignHash(Hash,keySpec,nil,0, PByte(sigData),@BufLen);
  end;
  ReversedData := ReversedBytes(sigData);
  SetLength(Result, BufLen);
  Move(PByte(ReversedData)^, PByte(Result)^, BufLen);
  CryptDestroyHash(Hash);
  CryptReleaseContext(Prov,0);
end;


На версиях ниже 10 всё работает нормально. Подскажите, в чём может быть дело?
20 авг 18, 17:09    [21648446]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
sql2012
Member

Откуда: РФ
Сообщений: 649
Shuraken,

GetLastError для CryptHashData что-то же сообщает?
На ошибки проверки кто будет писать?

p.s. raise Exception.Create - сильно... GetLastError не угодил?
20 авг 18, 22:49    [21648731]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
Shuraken
Member

Откуда:
Сообщений: 582
sql2012,

CryptHashData - всё нормально. Пробовал и GetLastError - возвращает "Неправильный вызов функции" на CryptSignHash. При этом на других версиях винды всё нормально.

Exception.Create ставил для отладки, чтобы видеть, в каких функциях происходили ошибки. Так их быстрее отыскивать.
21 авг 18, 10:40    [21649053]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
sql2012
Member

Откуда: РФ
Сообщений: 649
Shuraken,

по-твоему должны все гадать, что у тебя там в переменных?

CSP какой?
21 авг 18, 12:42    [21649309]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
Shuraken
Member

Откуда:
Сообщений: 582
sql2012,

CSP - Crypto-Pro GOST R 34.10-2001 Cryptographic Service Provider
AlgID - CALG_GR3411 (32798)

Тот же результат и для
CSP - Crypto-Pro GOST R 34.10-2012 Cryptographic Service Provider
AlgID - CALG_GR3411_2012_256 (32801)
21 авг 18, 13:40    [21649468]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
sql2012
Member

Откуда: РФ
Сообщений: 649
Shuraken,

CryptSignHash - второй параметр - "за что отвечает" и почему прошит в коде 0?

пример:
https://www.cryptopro.ru/forum2/default.aspx?g=posts&m=91520#post91520



p.s.
Если пишешь на форуме КРИПТО-ПРО и чтобы там отвечали - пиши с проверкой результата каждой функции
+ код ошибки.
21 авг 18, 19:19    [21649914]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
Shuraken
Member

Откуда:
Сообщений: 582
sql2012,

Он проинициализирован в ноль. После вызова функции CryptAcquireCertificatePrivateKey он принимает значение 1 - AT_KEYEXCHANGE. За ссылку спасибо.
...
Немного подправил, всё равно та же самая ошибка на Windows 10 - "Неверный вызов функции". Такое чувство, что подписывание на Windows 10 осуществляется как-то по-другому, чем на других версиях.
22 авг 18, 10:57    [21650415]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
sql2012
Member

Откуда: РФ
Сообщений: 649
Shuraken
sql2012,

Он проинициализирован в ноль. После вызова функции CryptAcquireCertificatePrivateKey он принимает значение 1 - AT_KEYEXCHANGE. За ссылку спасибо.
...
Немного подправил, всё равно та же самая ошибка на Windows 10 - "Неверный вызов функции". Такое чувство, что подписывание на Windows 10 осуществляется как-то по-другому, чем на других версиях.


Код ошибки?
22 авг 18, 22:58    [21651310]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
sql2012
Member

Откуда: РФ
Сообщений: 649
Shuraken,

сборка CSP какая? последняя?
22 авг 18, 23:00    [21651311]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
Shuraken
Member

Откуда:
Сообщений: 582
sql2012,
Разобрались. Дело было не в версии Windows и не в моей программе. Просто истекла лицензия. Продлили и всё заработало.
27 авг 18, 10:09    [21654610]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
sql2012
Member

Откуда: РФ
Сообщений: 649
обычно:
0x8007065b (1627) - Ошибка исполнения функции

+ периодически CSP показывает диалог на ввод лицензии, если не вызывать явно в silent-режиме.
27 авг 18, 15:16    [21655092]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
fssinfected
Member

Откуда:
Сообщений: 3
Коллеги, сталкивались ли вы на тестовом контуре https://docs-test.fss.ru/ws-insurer-crypto-v11/FileOperationsLnPort с ошибкой:

ru.ibs.cryptoprto.jcp.wrapper.eln.ws.client.generated.CryptoException_Exception: The prefix "soapenv" for element "soapenv:Body" is not bound. class org.apache.xml.security.encryption.XMLEncryptionException

На просто подписанное сообщение без шифрования сервис https://docs-test.fss.ru/ws-insurer-v11/FileOperationsLnPort отвечает нормально. При попытке использовать с шифрованием вот такая проблема, на стороне ФСС расшифрование проходит, а дальше вот такая история с пространством имён...

Куда бы вы копали?
29 окт 18, 11:59    [21717835]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
fssinfected
Member

Откуда:
Сообщений: 3
Еще одна жертва этих же граблей:



истина где-то рядом :)
1 ноя 18, 10:52    [21721203]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
fssinfected
Member

Откуда:
Сообщений: 3
Уппс, ссылку неправильно вставил: http://www.cyberforum.ru/web-services-wcf/thread1807834.html
1 ноя 18, 10:55    [21721207]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
Anatole
Member

Откуда:
Сообщений: 2
maratvg,

Добрый день. Вам удалось использовать библиотеку из состава arm_fss? Я пытался вызвать ее на C#, но получаю error exception.
вчера, 13:19    [21739035]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
maratvg
Member

Откуда: 74
Сообщений: 100
Anatole,

Про шарп сказать ничего не могу. Подключал к делфи. Всё работало
сегодня, 06:41    [21739645]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
Anatole
Member

Откуда:
Сообщений: 2
maratvg,

а могли бы показать, как Вы реализовали эти вызовы в delphi. м.б. скинете фрагмент кода напрямую abakkav@yandex.ru
сегодня, 09:27    [21739703]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
maratvg
Member

Откуда: 74
Сообщений: 100
Anatole,

1. сгенерить из GostCryptography.dll GostCryptography_TLB.pas (TlbExp.exe, tlibimp.exe).
2. в GostCryptography_TLB.pas будут созданы классы TGostEncryptSOAP, TGostDecryptSOAP, которые собственно и использовались.
+ для примера
function EncryptSOAP(const ASignedXml: WideString; const ACertName: string): WideString;
var
  GostEncryptSOAP: TGostEncryptSOAP;
begin
  GostEncryptSOAP := TGostEncryptSOAP.Create(nil);
  try
    GostEncryptSOAP.Connect;
    Result := GostEncryptSOAP.encryptMsg(CP_GR3410_2001_PROV_A, ACertName, ASignedXml);
  finally
    GostEncryptSOAP.Free;
  end;
end;
сегодня, 15:15    [21740223]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 2 [3]      все
Все форумы / Delphi Ответить