Beispiel #1
0
        /// <summary>
        /// Информация об СМО
        /// </summary>
        public SmoModel ReadSMOInformation(PolicySmartcardBase policy)
        {
            SmoModel       result = new SmoModel();
            SMOInformation currentSmoInformation = policy.GetCurrentSMOInformation();

            if (currentSmoInformation == null)
            {
                return(result);
            }
            result.SmoOgrn  = currentSmoInformation.OGRN;
            result.SmoOkato = currentSmoInformation.OKATO;
            result.SmoBegin = this.FormatPolicyDate(new DateTime?(currentSmoInformation.InsuranceStartDate), "Отсутствует");
            result.SmoEnd   = this.FormatPolicyDate(currentSmoInformation.InsuranceExpireDate, "Не ограничено");
            if (!_tersmoService.LoadDictionary().Any())
            {
                return(result);
            }

            var tersmo = _tersmoService.LoadDictionary().
                         FirstOrDefault(x => x.Q_OGRN.ToString() == currentSmoInformation.OGRN &&
                                        x.TF_OKATO.ToString() == currentSmoInformation.OKATO);

            if (tersmo != null)
            {
                result.SmoRegion = tersmo.Q_NAME;
                result.SmoName   = tersmo.Q_FNAME;
            }
            else
            {
                result.SmoRegion = "Не найден";
                result.SmoName   = "Не найден";
            }
            return(result);
        }
Beispiel #2
0
        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);
            }
        }
Beispiel #3
0
        void GetCardData()
        {
            if (ReadersComboBox.Items.Count == 0)
            {
                MessageBox.Show("Не обнаружено подключенных ридеров!");
                return;
            }

            ClearForm();

            PCSCReadersManager manager = new PCSCReadersManager();

            var SA = ReadersComboBox.Items[0].ToString();

            manager.EstablishContext(SmartCard.PCSC.READERSCONTEXTSCOPE.SCOPE_USER);
            if (manager.OfType <ISCard>().Select(s => s.ReaderName).ToList().Contains(SA))
            {
                ISCard card = manager[SA];
                PolicySmartcardBase policy = new PolicySmartcardBase(card);
                policy.Connect();

                try
                {
                    OwnerInformation owner_info = policy.GetOwnerInformation();
                    if (owner_info != null)
                    {
                        textBoxFIO.Text          = FormatPolicyText(owner_info.Identity_1, "") + " " + FormatPolicyText(owner_info.Identity_2, "") + " " + FormatPolicyText(owner_info.Identity_1, "");
                        textBoxSex.Text          = owner_info.Sex == 1 ? "Мужской" : owner_info.Sex == 2 ? "Женский" : "Неизвестно";
                        textBoxDateOfBirth.Text  = FormatPolicyDate(owner_info.BirthDate, "Отсутствует");
                        textBoxPlaceOfBirth.Text = FormatPolicyText(owner_info.BirthPlace, "Отсутствует");

                        if (owner_info.Citizenship != null)
                        {
                            textBoxCountryCode.Text = FormatPolicyText(owner_info.Citizenship.CoutryCode, "Отсутствует");
                            textBoxCountryName.Text = FormatPolicyText(owner_info.Citizenship.CoutryCyrillicName, "Отсутствует");
                        }

                        textBoxPolisNumber.Text = owner_info.PolicyNumber;
                        textBoxPolisDate.Text   = FormatPolicyDate(owner_info.ExpireDate, "Отсутствует");
                        textBoxPolisExpire.Text = FormatPolicyDate(owner_info.ExpireDate, "Не ограничено");
                        textBoxSNILS.Text       = FormatPolicyText(owner_info.SNILS, "Отсутствует");
                    }
                }
                catch (Exception exception)
                {
                    MessageBox.Show(exception.Message, "Ошибка: ");
                }
                try
                {
                    CardID cid = policy.GetCardID();
                    if (cid != null)
                    {
                        textBoxCardSerial.Text  = cid.SerialNumber.ToHexString();
                        textBoxCardType.Text    = cid.CardType.ToString();
                        textBoxCardVersion.Text = cid.CardVersion.ToString();
                        textBoxCompanyID.Text   = cid.InstitutionID.ToHexString();
                        textBoxInformation.Text = cid.AdditionalInfo.ToHexString();
                    }
                }
                catch (Exception exception)
                {
                    MessageBox.Show(exception.Message, "Ошибка: ");
                }
                try
                {
                    ICCID ccd = policy.GetICCD();
                    if (ccd != null)
                    {
                        textBoxManufacturerCode.Text = ccd.IssuerCode.ToString();
                        textBoxManufacturerData.Text = ccd.IssuerData.ToHexString();
                    }
                }
                catch (Exception exception)
                {
                    MessageBox.Show(exception.Message, "Ошибка: ");
                }

                try
                {
                    SMOInformation smo = policy.GetCurrentSMOInformation();
                    if (smo != null)
                    {
                        textBoxOGRN.Text  = smo.OGRN;
                        textBoxOKATO.Text = smo.OKATO;
                        textBoxInsuranceStartDate.Text = FormatPolicyDate(smo.InsuranceStartDate, "Отсутствует");
                        textBoxExpire.Text             = FormatPolicyDate(smo.InsuranceExpireDate, "Не ограничено");
                        textBoxCert.Text = new X509Certificate2(smo.EDS.Certificate).Subject;
                        textBoxECP.Text  = smo.EDS.Signature.ToHexString();
                        //textBoxECPStatus.Text = smo.VerifyEDS() == true ? "Верна" : "Неверна";
                    }
                }
                catch (Exception exception)
                {
                    MessageBox.Show(exception.Message, "Ошибка: ");
                }
                policy.Disconnect();
            }
            manager.ReleaseContext();
        }
Beispiel #4
0
        public static void GetData(string args = "")
        {
            PCSCReadersManager manager = new PCSCReadersManager();

            try
            {
                manager.EstablishContext(SmartCard.PCSC.READERSCONTEXTSCOPE.SCOPE_USER);
                if (args != "")
                {
                    ReaderName = args;
                }
                else
                {
                    var list = manager.OfType <ISCard>().ToList();

                    if (list.Count > 0)
                    {
                        ReaderName = list[0].ReaderName;
                    }
                    else
                    {
                        ContentFile += "Не найдены ридеры!";
                    }
                }

                if (manager.OfType <ISCard>().Select(s => s.ReaderName).ToList().Contains(ReaderName))
                {
                    //Получение объекта ридера
                    ISCard card = manager[ReaderName];
                    //Создание объекта для работы с картой полиса ОМС
                    PolicySmartcardBase policy = new PolicySmartcardBase(card);
                    //Подключение к карте полиса ОМС
                    policy.Connect();
                    //Чтение информации о владельце полиса ОМС
                    OwnerInformation owner_info = policy.GetOwnerInformation();
                    if (owner_info != null)
                    {
                        printf("Информация о владельце:");
                        printf("{0} = {1}", "Фамилия".PadRight(35, ' '), MainForm.FormatPolicyText(owner_info.Identity_1, "Отсутствует"));
                        printf("{0} = {1}", "Имя".PadRight(35, ' '), MainForm.FormatPolicyText(owner_info.Identity_2, "Отсутствует"));
                        printf("{0} = {1}", "Отчество".PadRight(35, ' '), MainForm.FormatPolicyText(owner_info.Identity_3, "Отсутствует"));
                        printf("{0} = {1}", "Пол".PadRight(35, ' '), owner_info.Sex == 1 ? "Мужской" : owner_info.Sex == 2 ? "Женский" : "Неизвестно");
                        printf("{0} = {1}", "Дата рождения".PadRight(35, ' '), MainForm.FormatPolicyDate(owner_info.BirthDate, "Отсутствует"));
                        printf("{0} = {1}", "Место рождения".PadRight(35, ' '), MainForm.FormatPolicyText(owner_info.BirthPlace, "Отсутствует"));

                        if (owner_info.Citizenship != null)
                        {
                            printf("Гражданство:");
                            printf("{0} = {1}", "Код страны".PadRight(35, ' '), MainForm.FormatPolicyText(owner_info.Citizenship.CoutryCode, "Отсутствует"));
                            printf("{0} = {1}", "Кириллическое название".PadRight(35, ' '), MainForm.FormatPolicyText(owner_info.Citizenship.CoutryCyrillicName, "Отсутствует"));
                        }
                        else
                        {
                            printf("{0} = {1}", "Гражданство".PadRight(35, ' '), "Отсутствует");
                        }

                        printf("Информация о полисе:");
                        printf("{0} = {1:D16}", "Номер полиса".PadRight(35, ' '), owner_info.PolicyNumber);
                        printf("{0} = {1}", "Дата выпуска".PadRight(35, ' '), MainForm.FormatPolicyDate(owner_info.ExpireDate, "Отсутствует"));
                        printf("{0} = {1}", "Срок действия".PadRight(35, ' '), MainForm.FormatPolicyDate(owner_info.ExpireDate, "Не ограничено"));
                        printf("{0} = {1}", "СНИЛС".PadRight(35, ' '), MainForm.FormatPolicyText(owner_info.SNILS, "Отсутствует"));
                        //printf("Чтение атрибутов безопасности карты полиса ОМС");
                        //SecurityInformation SOD = policy.GetSecurityInformation();
                        //printf("{0} = {1}", "Статус ЭЦП".PadRight(35, ' '), owner_info.VerifyEDS(SOD) ? "Верна" : "Неверна");
                    }
                    else
                    {
                        printf("Данные о владельце отсутствуют на карте!");
                    }

                    SMOInformation smo = policy.GetCurrentSMOInformation();
                    if (smo != null)
                    {
                        printf("Данные страхового приложения:");
                        printf("{0} = {1}", "ОГРН".PadRight(35, ' '), smo.OGRN);
                        printf("{0} = {1}", "ОКАТО".PadRight(35, ' '), smo.OKATO);
                        printf("{0} = {1}", "Дата начала страхования".PadRight(35, ' '), MainForm.FormatPolicyDate(smo.InsuranceStartDate, "Отсутствует"));
                        printf("{0} = {1}", "Окончание срока действия".PadRight(35, ' '), MainForm.FormatPolicyDate(smo.InsuranceExpireDate, "Не ограничено"));
                        if (smo.EDS != null)
                        {
                            printf("Данные ЭЦП");
                            printf("{0} = {1}", "Сертификат".PadRight(35, ' '), new X509Certificate2(smo.EDS.Certificate).Subject);
                            printf("{0} = {1}", "ЭЦП".PadRight(35, ' '), smo.EDS.Signature.ToHexString());
                            //printf("{0} = {1}", "Статус ЭЦП".PadRight(35, ' '), smo.VerifyEDS() == true ? "Верна" : "Неверна");
                        }
                        else
                        {
                            printf("{0} = {1}", "Данные ЭЦП".PadRight(35, ' '), "Отсутствуют");
                        }
                    }
                    else
                    {
                        printf("Данные о смо отсутствуют на карте!");
                    }

                    CardID cid = policy.GetCardID();
                    ICCID  ccd = policy.GetICCD();
                    if (cid != null)
                    {
                        printf("Идентификационные данные карты:");
                        printf("{0} = {1}", "Серийный номер карты".PadRight(35, ' '), cid.SerialNumber.ToHexString());
                        printf("{0} = {1}", "Тип карты".PadRight(35, ' '), cid.CardType);
                        printf("{0} = {1}", "Версия".PadRight(35, ' '), cid.CardVersion);
                        printf("{0} = {1}", "Идентификатор учреждения".PadRight(35, ' '), cid.InstitutionID.ToHexString());
                        printf("{0} = {1}", "Дополнительные сведения о карте".PadRight(35, ' '), cid.AdditionalInfo.ToHexString());
                    }
                    else
                    {
                        printf("Идентификационные данные отсутствуют на карте!");
                    }

                    if (ccd != null)
                    {
                        printf("Информация о микросхеме от производителя:");
                        printf("{0} = {1}", "Код производителя карты".PadRight(35, ' '), ccd.IssuerCode);
                        printf("{0} = {1}", "Данные производителя карты".PadRight(35, ' '), ccd.IssuerData.ToHexString());
                    }
                    else
                    {
                        printf("Информация о микросхеме от производителя отсутствует на карте!");
                    }
                    //Отключение от карты полиса ОМС
                    policy.Disconnect();
                    //Отключение от смарт-карт API
                    manager.ReleaseContext();
                }
                else
                {
                    printf("Устройство чтения смарт-карт с именем [{0}] не найдено в системе.");
                    manager.ReleaseContext();
                }
            }
            catch (Exception exception)
            {
                ContentFile += "Ошибка получения списка ридеров: " + exception.Message;
            }

            StreamWriter wf;

            wf = new StreamWriter("infofile.txt", false, Encoding.GetEncoding(1251));
            wf.Write(ContentFile);
            wf.Close();
        }