using GostCryptography.Gost_R3411; using Hcs.ClientApi.DebtRequestsApi; using Hcs.ClientApi.DeviceMeteringApi; using Hcs.ClientApi.FileStoreServiceApi; using Hcs.ClientApi.HouseManagementApi; using Hcs.ClientApi.NsiApi; using Hcs.ClientApi.OrgRegistryCommonApi; using Hcs.ClientApi.RemoteCaller; using System; using System.Security.Cryptography.X509Certificates; namespace Hcs.ClientApi { /// /// Единый клиент для вызова всех реализованных функций интеграции с ГИС ЖКХ /// public class HcsClient : HcsClientConfig { public HcsClient() { HcsServicePointConfig.InitConfig(); // TODO: Вынести в конфиг // Роль поставщика информации по умолчанию Role = HcsOrganizationRoles.RSO; } public void SetSigningCertificate(X509Certificate2 cert, string pin = null) { if (cert == null) throw new ArgumentNullException("Не указан сертификат для подписания данных"); if (pin == null) pin = HcsConstants.DefaultCertificatePin; Certificate = cert; CertificateThumbprint = cert.Thumbprint; CertificatePassword = pin; CryptoProviderType = cert.GetProviderType(); } public HcsDebtRequestsApi DebtRequests => new HcsDebtRequestsApi(this); public HcsHouseManagementApi HouseManagement => new HcsHouseManagementApi(this); public HcsOrgRegistryCommonApi OrgRegistryCommon => new HcsOrgRegistryCommonApi(this); public HcsFileStoreServiceApi FileStoreService => new HcsFileStoreServiceApi(this); public HcsDeviceMeteringApi DeviceMeteringService => new HcsDeviceMeteringApi(this); public HcsNsiApi Nsi => new HcsNsiApi(this); public X509Certificate2 FindCertificate(Func predicate) { return HcsCertificateHelper.FindCertificate(predicate); } public X509Certificate2 ShowCertificateUI() { return HcsCertificateHelper.ShowCertificateUI(); } /// /// Производит для потока хэш по алгоритму "ГОСТ Р 34.11-94" в строке binhex /// public string ComputeGost94Hash(System.IO.Stream stream) { // API HouseManagement указывает, что файлы приложенные к договору должны размещаться // с AttachmentHASH по стандарту ГОСТ. Оказывается, ГИСЖКХ требует применения устаревшего // алгоритма ГОСТ Р 34.11-94 (соответствует `rhash --gost94-cryptopro file` в linux). using var algorithm = new Gost_R3411_94_HashAlgorithm(GostCryptoProviderType); var savedPosition = stream.Position; stream.Position = 0; var hashValue = HcsUtil.ConvertToHexString(algorithm.ComputeHash(stream)); stream.Position = savedPosition; return hashValue; } } }