FPC и работа с КриптоПРО

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

FPC и работа с КриптоПРО

Сообщение alexs » 22.01.2020 12:19:58

У кого есть опыт по взаимодействию?
Надо подписывать УКЭП сообщения.
Кто посоветует - может у кого есть готовые решения?
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4053
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: FPC и работа с КриптоПРО

Сообщение java73 » 28.01.2020 12:02:41

У КриптоПРО есть консольные утилиты, можно их использовать. Отсоединенную подпись для файлов так делал, давно.
java73
постоялец
 
Сообщения: 257
Зарегистрирован: 21.11.2013 09:08:10

Re: FPC и работа с КриптоПРО

Сообщение alexs » 29.01.2020 17:51:57

Судя по всему - КриптоПро сделало ставку только на интеграцию в броузер
Консольные сейчас не поддерживают весь функционал, который нужен.
По ходу надо разбираться с их SDK и пытаться работать на низком уровне с DLL/SO
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4053
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: FPC и работа с КриптоПРО

Сообщение olegy123 » 29.01.2020 20:54:50

Я юзал криптопро только под шарп/винду по маркировки лек.препаратов.

сама крипторо предоставляет защищенные контенеры(сертификаты, реестр, ключи) + доп шифрование интегрированную в винду.
так что можно использовать стандартные виндовые вызовы crypto указывае какими GOSTами хочешь поработать.

Добавлено спустя 13 минут 27 секунд:
под линухом не в курсе

Добавлено спустя 2 минуты 24 секунды:
чтобы подписать TBytes нужно около 10 строк кода.

Добавлено спустя 3 минуты 52 секунды:
если надо завтра дам код под шарп, fpc должен быть такимже..
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20

Re: FPC и работа с КриптоПРО

Сообщение alexs » 30.01.2020 09:02:39

У меня там проблема с генерацией подписи с цепочкой. Просто подпись получается - но ЦРПТ её не опознаёт.
Если есть возможность примера - буду признателен.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4053
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: FPC и работа с КриптоПРО

Сообщение alps » 31.01.2020 16:38:40

olegy123 писал(а):под линухом не в курсе


Точно такие же вызовы

Код: Выделить всё
             if not CryptAcquireCertificatePrivateKey(Cert, 0, nil, hProvider, @dwKeyType, @bReleaseContext) then
              raise Exception.Create('CryptAcquireCertificatePrivateKey');
            if Password <> NullString then
              begin
               sPasswd := (Password)+#0;
               Passwd := AllocMem(Length(sPasswd));
               Move(sPasswd[1], Passwd^, Length(sPasswd));
               if not CryptSetProvParam(hProvider, PP_KEYEXCHANGE_PIN, Passwd, 0) then
                 raise Exception.Create('CryptSetProvParam');
                Freemem(Passwd);
                Passwd:=nil;
              end;
           end;

           FillChar(SignParam, SizeOf(CRYPT_SIGN_MESSAGE_PARA), 0);
           SignParam.cbSize:= SizeOf(CRYPT_SIGN_MESSAGE_PARA);
           SignParam.dwMsgEncodingType:=MY_ENCODING;
           SignParam.pSigningCert:=Cert;

           SignParam.HashAlgorithm.pszObjId:= CertAlgIdToOID(CertOidToAlgId(cert^.CertInfo^.SignatureAlgorithm.pszObjId));

           //SignParam.HashAlgorithm.pszObjId:= szOID_CP_GOST_R3411;
           SignParam.cMsgCert:= 1;
           SignParam.rgpMsgCert:=@Cert;

           {$ifdef unix}
             SignParam.dwFlags:=CRYPT_MESSAGE_SILENT_KEYSET_FLAG;
           {$endif}

           pbMessage:=AInBuf;
           cbMessage:=AInBufSize;
           try
            MessageArray[0] := pbMessage;
            MessageSize[0] := cbMessage;
            cbSignMessage:= 0;
            if not CryptSignMessage(@SignParam, True, 1, @MessageArray, @MessageSize, nil, cbSignMessage) then
              raise Exception.Create('CryptSignMessage (size)');
            pbSignMessage:= AllocMem(cbSignMessage);
            if not CryptSignMessage(@SignParam, True, 1, @MessageArray, @MessageSize, pbSignMessage, cbSignMessage) then
              raise Exception.Create('CryptSignMessage (sign)');
            AOutBuf:= pbSignMessage;
            AOutBufSize:= cbSignMessage;
            Result := True;
           finally
             if bReleaseContext and (hProvider > 0) then
              CryptReleaseContext(hProvider, 0);
           end;



открыть хранилище и найти сертификат по отпечатку

Код: Выделить всё
    StoreName := PAnsiChar('MY');
    FEngine := CertOpenStore(CERT_STORE_PROV_SYSTEM, 0, 0, CERT_SYSTEM_STORE_CURRENT_USER, StoreName);;
    if Engine = nil then
      raise Exception.Create('store not opened');

    if FThumbprint <> '' then
     Hash := StrToHashBlob(FThumbprint)
    else
     Hash := StrToHashBlob(LowerCase(FCertInfo.Thumbprint));

    FCert := CertFindCertificateInStore(Engine, MY_ENCODING, 0, CERT_FIND_SHA1_HASH, @Hash, nil);
    Freemem(Hash.pbData, Hash.cbData);

    if FCert = nil then
     raise Exception.Create('certificate not found');

Последний раз редактировалось alps 07.02.2020 12:03:58, всего редактировалось 1 раз.
alps
незнакомец
 
Сообщения: 8
Зарегистрирован: 14.03.2016 15:51:49

Re: FPC и работа с КриптоПРО

Сообщение olegy123 » 02.02.2020 09:08:42

Извеняюсь, что долго.

Код: Выделить всё
    public string getH5(string message)
        {

            byte[] msg = Encoding.UTF8.GetBytes(message);
            ContentInfo contentInfo = new ContentInfo(msg);

            SignedCms signedCms = new SignedCms(contentInfo, true);

            X509Store storeMy = new X509Store(StoreName.My, StoreLocation.CurrentUser);
            storeMy.Open(OpenFlags.ReadOnly);
            string singerName = "Тут имя сертификата (CN)";
            X509Certificate2Collection certColl2 = storeMy.Certificates.Find(X509FindType.FindBySubjectName,
                singerName, false);
            storeMy.Close();
            if (certColl2.Count == 0)
                return "";

            X509Certificate2 cert1 = certColl2[0];
            CmsSigner cmsSigner = new CmsSigner(cert1);

            signedCms.ComputeSignature(cmsSigner, false);

            var r = signedCms.Encode();
            return Convert.ToBase64String(r);

        }

test.png


Добавлено спустя 12 минут 26 секунд:
в самом сертификате указано какими инструментами нужно воспользоваться "ГОСТ Р..."

Добавлено спустя 5 минут 54 секунды:
Convert.ToBase64String - требуют подпись в Base64 формате.
X509Store storeMy = new X509Store(StoreName.My, StoreLocation.CurrentUser); - искать сертификат у локального пользователя в "Хранилище сертификатов"
У вас нет необходимых прав для просмотра вложений в этом сообщении.
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20

Re: FPC и работа с КриптоПРО

Сообщение alexs » 02.02.2020 12:16:07

alps
Подскажи - где взять интерфейс к библиотекам криптопро на паскале?
А то самому заниматься переводом - не хочется. Времени много уйдёт.
Я пробую через комобъект - но это только для винды.
olegy123
Спасибо
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4053
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: FPC и работа с КриптоПРО

Сообщение alps » 07.02.2020 11:52:17

alexs писал(а):alps
Подскажи - где взять интерфейс к библиотекам криптопро на паскале?
А то самому заниматься переводом - не хочется. Времени много уйдёт.
Я пробую через комобъект - но это только для винды.


https://yadi.sk/d/SVJdaE31nK0CMg
alps
незнакомец
 
Сообщения: 8
Зарегистрирован: 14.03.2016 15:51:49


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 19

Рейтинг@Mail.ru