powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Электронный больничный ЭЛН
25 сообщений из 196, страница 3 из 8
Электронный больничный ЭЛН
    #39687034
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shuraken,

хорошо бы опыт в бложике каком выложить. Я бы себе заныкал...
...
Рейтинг: 0 / 0
Электронный больничный ЭЛН
    #39687337
Shuraken
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док,
так он уже давно выложен на форуме криптопро. Посмотрите предыдущие сообщения в теме.
...
Рейтинг: 0 / 0
Электронный больничный ЭЛН
    #39687696
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ShurakenПосмотрите предыдущие сообщения в теме.
а-а-а, точно, запамятовал :)
...
Рейтинг: 0 / 0
Электронный больничный ЭЛН
    #39689313
Shuraken
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Столкнулся с такой непонятной для меня ситуацией. Установил несколько тестовых сертификатов от КриптоПро, чтобы проверить корректность наложения ЭЦП. В одном сертификате такие параметры:
Алгоритм подписи: ГОСТ Р 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). Тогда всё накладывается корректно и запрос получается правильным.
И я сейчас пытаюсь понять, как программно вытащить информацию о правильном хэш-алгоритме.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
  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);


И я понимаю, что ищу не то, что надо искать данные именно для хэш-алгоритма, но при этом не могу понять, какими процедурами это можно сделать, используя контекст конкретного сертификата. Подскажите пожалуйста.
С уважением, Александр.
...
Рейтинг: 0 / 0
Электронный больничный ЭЛН
    #39690581
Shuraken
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Также столкнулся с ситуацией, что не работает формирование ЭЦП в Windows 10

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
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 всё работает нормально. Подскажите, в чём может быть дело?
...
Рейтинг: 0 / 0
Электронный больничный ЭЛН
    #39690731
sql2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shuraken,

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

p.s. raise Exception.Create - сильно... GetLastError не угодил?
...
Рейтинг: 0 / 0
Электронный больничный ЭЛН
    #39690851
Shuraken
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sql2012,

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

Exception.Create ставил для отладки, чтобы видеть, в каких функциях происходили ошибки. Так их быстрее отыскивать.
...
Рейтинг: 0 / 0
Электронный больничный ЭЛН
    #39690955
sql2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shuraken,

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

CSP какой?
...
Рейтинг: 0 / 0
Электронный больничный ЭЛН
    #39691036
Shuraken
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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)
...
Рейтинг: 0 / 0
Электронный больничный ЭЛН
    #39691266
sql2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shuraken,

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

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



p.s.
Если пишешь на форуме КРИПТО-ПРО и чтобы там отвечали - пиши с проверкой результата каждой функции
+ код ошибки.
...
Рейтинг: 0 / 0
Электронный больничный ЭЛН
    #39691559
Shuraken
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sql2012,

Он проинициализирован в ноль. После вызова функции CryptAcquireCertificatePrivateKey он принимает значение 1 - AT_KEYEXCHANGE. За ссылку спасибо.
...
Немного подправил, всё равно та же самая ошибка на Windows 10 - "Неверный вызов функции". Такое чувство, что подписывание на Windows 10 осуществляется как-то по-другому, чем на других версиях.
...
Рейтинг: 0 / 0
Электронный больничный ЭЛН
    #39692053
sql2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shurakensql2012,

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

Код ошибки?
...
Рейтинг: 0 / 0
Электронный больничный ЭЛН
    #39692054
sql2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shuraken,

сборка CSP какая? последняя?
...
Рейтинг: 0 / 0
Электронный больничный ЭЛН
    #39693556
Shuraken
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sql2012,
Разобрались. Дело было не в версии Windows и не в моей программе. Просто истекла лицензия. Продлили и всё заработало.
...
Рейтинг: 0 / 0
Электронный больничный ЭЛН
    #39693776
sql2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
обычно:
0x8007065b (1627) - Ошибка исполнения функции

+ периодически CSP показывает диалог на ввод лицензии, если не вызывать явно в silent-режиме.
...
Рейтинг: 0 / 0
Электронный больничный ЭЛН
    #39724390
fssinfected
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Коллеги, сталкивались ли вы на тестовом контуре 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 отвечает нормально. При попытке использовать с шифрованием вот такая проблема, на стороне ФСС расшифрование проходит, а дальше вот такая история с пространством имён...

Куда бы вы копали?
...
Рейтинг: 0 / 0
Электронный больничный ЭЛН
    #39726385
fssinfected
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Еще одна жертва этих же граблей:



истина где-то рядом :)
...
Рейтинг: 0 / 0
Электронный больничный ЭЛН
    #39726388
fssinfected
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Уппс, ссылку неправильно вставил: http://www.cyberforum.ru/web-services-wcf/thread1807834.html
...
Рейтинг: 0 / 0
Электронный больничный ЭЛН
    #39735595
Anatole
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maratvg,

Добрый день. Вам удалось использовать библиотеку из состава arm_fss? Я пытался вызвать ее на C#, но получаю error exception.
...
Рейтинг: 0 / 0
Электронный больничный ЭЛН
    #39735905
maratvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatole,

Про шарп сказать ничего не могу. Подключал к делфи. Всё работало
...
Рейтинг: 0 / 0
Электронный больничный ЭЛН
    #39735941
Anatole
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maratvg,

а могли бы показать, как Вы реализовали эти вызовы в delphi. м.б. скинете фрагмент кода напрямую abakkav@yandex.ru
...
Рейтинг: 0 / 0
Электронный больничный ЭЛН
    #39736196
maratvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatole,

1. сгенерить из GostCryptography.dll GostCryptography_TLB.pas (TlbExp.exe, tlibimp.exe).
2. в GostCryptography_TLB.pas будут созданы классы TGostEncryptSOAP, TGostDecryptSOAP, которые собственно и использовались.
для примера
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
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;

...
Рейтинг: 0 / 0
Электронный больничный ЭЛН
    #39736528
Anatole
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maratvg,

Спасибо, за разъяснение, идея понятна.
Примерно тоже самое пытался делать и я, но наконец-то понял, что Вы говорите о библиотеке для организации страхователя (из arm_fss), а я пытаюсь использовать библиотека для медицинской организации (из fss_mo). Возможно, здесь какие-то нюансы. Буду пытаться пробиться дальше.

Да, еще вопрос, a aCertName - это "Фонд социального страхования Российской Федерации" или имя файла *.cer
...
Рейтинг: 0 / 0
Электронный больничный ЭЛН
    #39736748
maratvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aCertName - это "Фонд социального страхования Российской Федерации". , т.е. то самое имя, которое прописано в сертификате.
...
Рейтинг: 0 / 0
Электронный больничный ЭЛН
    #39741852
Shuraken
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maratvg,

А Вы не могли бы выложить сюда, или прислать мне на почту GostCryptography_tlb.pas? Дело в том, что у меня не получается сгенерировать его с помощью tlibimp из ARM_FSS\GostCryptography.dll - выдаёт ошибку. При этом, когда я пытаюсь посмотреть "внутренности" длл-ки с помощью tdump.exe, то не вижу в нём нужного функционала.
Turbo Dump Version 5.0.16.12 Copyright (c) 1988, 2000 Inprise Corporation
Display of File GOSTCRYPTOGRAPHY.DLL

Old Executable Header

DOS File Size 31400h (201728. )
Load Image Size 450h ( 1104. )
Relocation Table entry count 0000h ( 0. )
Relocation Table address 0040h ( 64. )
Size of header record (in paragraphs) 0004h ( 4. )
Minimum Memory Requirement (in paragraphs) 0000h ( 0. )
Maximum Memory Requirement (in paragraphs) FFFFh ( 65535. )
File load checksum 0000h ( 0. )
Overlay Number 0000h ( 0. )

Initial Stack Segment (SS:SP) 0000:00B8
Program Entry Point (CS:IP) 0000:0000


Portable Executable (PE) File

Header base: 00000080

CPU type 80386
Flags 2102 [ executable linenumbers symbols backwards 32bit library ]
DLL flags 8540 [ ]
Linker Version B.0
Time stamp 56B473B9 : Fri Feb 05 13:04:41 2016
O/S Version 4.0
User Version 0.0
Subsystem Version 4.0
Subsystem 0003 [ Windows character ]
Object count 00000003
Symbols offset 00000000
Symbols count 00000000
Optional header size 00E0
Magic # 10B
Code size 00030C00
Init Data size 00000600
Uninit Data size 00000000
Entry RVA 00032B7E
Image base 10000000
Code base 00002000
Data base 00034000
Object/File align 00002000/00000200
Reserved 00000000
Image size 00038000
Header size 00000200
Checksum 00000000
Stack reserve/commit 00100000/00001000
Heap reserve/commit 00100000/00001000
Number interesting RVAs 00000010
Name RVA Size
------------------ -------- --------
Exports 00000000 00000000
Imports 00032B2C 0000004F
Resources 00034000 00000328
Exceptions 00000000 00000000
Security 00000000 00000000
Fixups 00036000 0000000C
Debug 000329F4 0000001C
Description 00000000 00000000
Global Ptr 00000000 00000000
TLS 00000000 00000000
Callbacks 00000000 00000000
Bound Imports 00000000 00000000
Import Addr Table 00002000 00000008
Delayed Imports 00000000 00000000
COM Runtime 00002008 00000048
reserved 00000000 00000000

Object table:
# Name VirtSize RVA PhysSize Phys off Flags
-- -------- -------- -------- -------- -------- --------
01 .text 00030B84 00002000 00030C00 00000200 60000020 [CER]
02 .rsrc 00000328 00034000 00000400 00030E00 40000040 [IR]
03 .reloc 0000000C 00036000 00000200 00031200 42000040 [DIR]

Key to section flags:
C - contains code
D - discardable
E - executable
I - contains initialized data
R - readable

******************************************************************************
Section: Import
ImportLookUpTblRVA:00032B54
Time Stamp: 00000000
Forwarder Chain: 00000000 (index of first forwarder reference)

Imports from mscoree.dll
_CorDllMain

******************************************************************************
Section: Resources
Flags: 00000000
Time Stamp: 00000000
Major Version: 0000
Minor Version: 0000

Resources:
Type Name Lang Id
--------------------------------------------
[0 named entries, 1 ID entries]
type: Version (16) (next directory @00000018)

[0 named entries, 1 ID entries]
type: Cursor (1) (next directory @00000030)

[0 named entries, 1 ID entries]
type: Unknown (0) (data @00000048)
Offset: 00034058
Size: 000002D0
Code Page: 00000000
Reserved: 00000000



...
Рейтинг: 0 / 0
25 сообщений из 196, страница 3 из 8
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Электронный больничный ЭЛН
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]