コード例 #1
0
ファイル: SmcTerminal.cs プロジェクト: syurov/rt.srz
        public List <SmoInfoStrings> GetSmoHistory()
        {
            const string pinCard = "5473";

            // Чтение информации о владельце карты полиса ОМС
            var manager = new PCSCReadersManager();

            try
            {
                // Установление соединения с смарт-карт API
                manager.EstablishContext(READERSCONTEXTSCOPE.SCOPE_USER);

                // Вывод списка ридеров в консоль
                if (manager.OfType <ISCard>().Select(s => s.ReaderName).ToList().Contains(ActiveCardReader) == false)
                {
                    ////printf("Устройство чтения смарт-карт с именем [{0}] не найдено в системе.");
                    manager.ReleaseContext();
                    return(null);
                }

                if (manager.OfType <ISCard>().Select(s => s.ReaderName).ToList().Contains(ActiveToken) == false)
                {
                    ////printf("Устройство чтения смарт-карт с именем [{0}] не найдено в системе.");
                    manager.ReleaseContext();
                    return(null);
                }

                // Получение объекта ридера
                var policyCard = manager[ActiveCardReader];
                var tokenCard  = manager[ActiveToken];

                // Создание объекта для работы с картой полиса ОМС
                var policy = new PolicySmartcard(policyCard, tokenCard);

                // Подключение к карте полиса ОМС
                policy.Connect();


                // Аутентификация с картой модуля безопасности
                policy.Authentificate_External(pinCard);
                policy.Authentificate_External(pinCard, true);

                // Чтение истории СМО
                var historyList = policy.GetSMOHistory();
                var histSmos    = new List <SmoInfoStrings>();
                historyList.ForEach(smo =>
                {
                    if (smo != null)
                    {
                        var smoInfo = new SmoInfoStrings
                        {
                            OgrnSmo            = smo.OGRN,
                            Okato              = smo.OKATO,
                            InsuranceStartDate =
                                FormatPolicyDate(
                                    smo.InsuranceStartDate, "Отсутствует"),
                            InsuranceEndDate =
                                FormatPolicyDate(
                                    smo.InsuranceExpireDate, "Не ограничено"),
                            Eds = smo.EDS == null
                                                            ? null
                                                            : new Eds
                            {
                                Certificate =
                                    new X509Certificate2(smo.EDS.Certificate).Subject,
                                Ecp = smo.EDS.Signature.ToHexString()
                            }
                        };

                        histSmos.Add(smoInfo);
                    }
                });

                // Отключение от карты полиса ОМС
                policy.Disconnect();

                // Отключение от смарт-карт API
                manager.ReleaseContext();
                return(histSmos);
            }
            catch
            {
                return(null);
            }
        }
コード例 #2
0
ファイル: SmcTerminal.cs プロジェクト: syurov/rt.srz
        public bool ChangeSmo(string ogrnSmo, string okatoSmo, string dateFrom, string dateTo, string securityModulePin, string cardPin)
        {
            // Чтение информации о владельце карты полиса ОМС
            var manager = new PCSCReadersManager();

            try
            {
                // Установление соединения с смарт-карт API
                manager.EstablishContext(READERSCONTEXTSCOPE.SCOPE_USER);

                // Вывод списка ридеров в консоль
                if (manager.OfType <ISCard>().Select(s => s.ReaderName).ToList().Contains(ActiveCardReader) == false)
                {
                    manager.ReleaseContext();
                    return(false);
                }

                if (manager.OfType <ISCard>().Select(s => s.ReaderName).ToList().Contains(ActiveToken) == false)
                {
                    manager.ReleaseContext();
                    return(false);
                }

                // Получение объекта ридера
                var policyCard = manager[ActiveCardReader];
                var tokenCard  = manager[ActiveToken];

                // Создание объекта для работы с картой полиса ОМС
                var policy = new PolicySmartcard(policyCard, tokenCard);

                // Подключение к карте полиса ОМС
                policy.Connect();

                // Аутентификация с картой модуля безопасности
                // Пин-код модуля безопасности 12345678
                policy.Authentificate_Mutual(securityModulePin, true);
                var verifyArgs = new VerifyPINArguments
                {
                    // Данный параметр устанавливает признак использования пин-пада для
                    // предъявления пин-кода с помощью выносной клавиатуры. В случае установки данного параметра в значение false
                    // требуется заполнение параметра 'PinValue'
                    // Использование пин-пада возможно только в случае, если карта полиса ОМС установлена
                    // в устройство с поддержкой функции выносной клавиатуры.
                    // Проверить наличие функций выносной клавиатуры у устройства можно с помощью метода
                    // 'PolicyPinpad.IsDeviceSupported(policy_card, false
                    // Не выполнять подключение к карте если подключение было выполнено внешними средствами
                    UsePinpad = PolicyPinpad.IsDeviceSupported(policyCard, false),

                    // Значение пин-кода. Данный параметр используется только если UsePinpad = false
                    PinValue = "1234",

                    // Ссылка на метод для отмены ввода пин-кода программным способом в случае использовании выносной клавиатуры
                    // Инициализация происходит на стороне метода VerifyPIN
                    CancelHandler = null,

                    // Ссылка на метод для обработки события нажатия кнопок на выносной клавиатуре
                    // Можно не инициализировать - используется только в случае использовании выносной клавиатуры
                    EnteredDigitHandler = key =>
                    {
                        // Тело метода, обработчика
                    }
                };

                // Проверка пина
                policy.VerifyPIN(ref verifyArgs);

                // Парсим даты
                DateTime dtFrom = DateTime.Now;
                DateTime.TryParse(dateFrom, out dtFrom);

                // Парсим даты
                DateTime dtTo = DateTime.Now.AddYears(5);
                DateTime.TryParse(dateTo, out dtTo);

                // Создание объекта нового СМО
                var smo = new SMOInformation
                {
                    OGRN  = ogrnSmo,
                    OKATO = okatoSmo,
                    InsuranceStartDate  = dtFrom,
                    InsuranceExpireDate = dtTo,
                    EDS = null   /*ЭЦП будет инициализирована позже после ее создания*/
                };

                // [Формирование ЭЦП нового СМО]
                // Открытие хранилища сертификатов текущего пользователя
                var store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
                store.Open(OpenFlags.ReadOnly);

                // Выбор сертификата с помощью строенного диалога
                var selected = X509Certificate2UI.SelectFromCollection(
                    store.Certificates,
                    "Сертификата",
                    "Выберите сертификат для формирования ЭЦП СМО",
                    X509SelectionFlag.SingleSelection);
                if (selected.Count > 0)
                {
                    // Создание объекта формирования подписи
                    var signatureEncoder = new SignatureEncoder(selected[0]);

                    // Формирование ЭЦП
                    smo.EDS = new SMOInformationEDS
                    {
                        Signature   = signatureEncoder.CreateSignHash(smo.EncodeBER()), // Преобразование объекта к формату BER-TLV
                        Certificate = selected[0].Export(X509ContentType.Cert)
                    };
                }

                // Запись информации о новом СМО на карту полиса ОМС
                policy.CreateNewSMO(smo);

                // Отключение от карты полиса ОМС
                policy.Disconnect();

                // Отключение от смарт-карт API
                manager.ReleaseContext();

                return(true);
            }
            catch
            {
                return(false);
            }
        }