/// <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); }
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); } }
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(); }
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(); }