У кого есть опыт по взаимодействию?
Надо подписывать УКЭП сообщения.
Кто посоветует - может у кого есть готовые решения?
			
		Модератор: Модераторы



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');
    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);
        }
alexs писал(а):alps
Подскажи - где взять интерфейс к библиотекам криптопро на паскале?
А то самому заниматься переводом - не хочется. Времени много уйдёт.
Я пробую через комобъект - но это только для винды.
Вернуться в Free Pascal Compiler
Сейчас этот форум просматривают: Yandex [Bot] и гости: 1