Sc reader 378 что с ним можно сделать
Доброго времени суток!
Файлы PDF вроде всем хороши, но есть у них одно краеугольное место. Дело в том, что размер некоторых PDF-фок далек от "идеала", нередко, когда они весят даже по 100÷500 Мб, порой доходит до 1 Гб! 😢
Причем, далеко не всегда такой размер файла оправдан: т.е. в нем нет какой-то очень высокоточной графики, которая отнимает столько места.
Разумеется, когда имеешь дело с таким размером — возникают сложности с его передачей на другие ПК, планшеты, телефоны (например, на телефоне просто может не хватить памяти для десятка подобных файлов!) .
В подобных случаях можно "несколько" уменьшить размер PDF с помощью его сжатия . Провести сжатие, кстати, можно разными способами.
Собственно, об этом и будет сегодняшняя статья.
👉 Кстати!
Если удалить некоторые страницы из документа PDF — то можно за счет этого уменьшить его размер. Если вас этот вариант устраивает — то рекомендую вот эту заметку.
Поиск программы для восстановления флешки
Жмем на кнопку Search.
В результатах ищем своего производителя и модель флешки. У меня это Kingston DataTraveler 2.0.
В правой колонке будет название нужной нам программы или ссылка на нее.
Все. Теперь ищите в Google программу по названию или качаете по указанной ссылке. Запускаете и следуете инструкциям. Обычно, в подобных программах для восстановления всего одна кнопка, поэтому вопросов у вас возникнуть не должно.
Возникнут вопросы - задавайте в комментариях.
CardConnectionDecorator
Слово «декоратор» используется здесь в том же контексте, что и в Java, а не в том, к которому привыкли Python-разработчики.
Позволяет придать особые свойства объекту CardConnection . Библиотека предоставляет рабочие декораторы с говорящими названиями: ExclusiveConnectCardConnection и ExclusiveTransmitCardConnection . Лично я не ощутил эффекта от использования этих декораторов — если система (Windows) уж решила вклиниться со своими APDU в нашу сессию, то ни один из этих декораторов не спасет, но, возможно, я что-то не так делал.
CardConnection
Канал коммуникации нашего приложения с картой, позволяет отправлять на карту APDU и получать ответ, ключевой метод здесь — transmit() . Именно с его помощью происходит непосредственное взаимодействие нашего приложения с картой. Необходимо отметить, что метод transmit() всегда возвращает триплет (кортеж), состоящий из:
- Ответных данных (содержит реальные данные или None , в зависимости от типа APDU, не все APDU возвращают данные)
- Первого байта статуса (StatusWord) SW1
- Второго байта статуса (StatusWord) SW2
CardConnection является контекст-менеджером, что добавляет удобства при его использовании.
Класс APDUShell
Данный класс, помимо наследования от cmd.Cmd , реализует интерфейс обладает поведением наблюдателя smartcard.CardMonitoring.CardObserver
Данные экземпляра нашей оболочки
reader — устройство чтения, с которым будем работать.
card — объект карта, потребуется нам, чтобы определить момент смены карты в ридере.
connection — канал передачи APDU на карту и получения результата обработки.
sel_obj — строка, содержащая ID текущего объекта (файла или папки) выбранного командой SELECT . Эта строка меняется всякий раз, когда команда SELECT выполняется.
atr — здесь мы запоминаем ATR текущей карты, чтобы можно было вывести его на экран, не запрашивая карту каждый раз (такой запрос сбрасывает состояние выбора файла в карте).
card_connection_observer — наблюдатель, который привязывается к каждому connection, подробности ниже.
В конструкторе
Мы, помимо инициализации данных, добавляем себя в наблюдатели
smartcard.CardMonitoring.CardMonitor — объекта, который реагирует на события взаимодействия ридера и карты (карта помещена в ридер, карта извлечена из ридера) и оповещает об этих событиях smartcard.CardMonitoring.CardObserver , т.е. нас. Данный вид оповещения настраивается только один раз за время жизни нашей оболочки. CardMonitor является синглтоном, поэтому мы не заботимся о времени жизни его экземпляра.
Также обращаю внимание на экземпляр smartcard.CardConnectionObserver.ConsoleCardConnectionObserver — это готовый библиотечный объект-наблюдатель, отслеживающий состояние канала общения с картой и печатающий это состояние в консоль. Мы его будем навешивать на каждое новое соединение с картой.
update()
Это, собственно, поведение smartcard.CardMonitoring.CardObserver . Если наша текущая карта находится в списке removedcards , то мы очищаем состояние оболочки для текущей карты.
Если в нашем выбранном ридере (и в списке addedcards , заодно) появилась новая карта, то мы инициализируем новое состояние оболочки для этой карты.
default()
Здесь все введенные пользователем шестнадцатиричные APDU превращаются в списки байтов и отправляются на карту. Замечу, что единственное, что мы делаем с результатом здесь, это определяем, не является ли отправленная команда успешным SELECT -ом. Если да, то мы обновляем ID последнего выбранного объекта для печати в приглашении пользователю.
Всю остальную рутинную работу по интерпретации и отображению результата команды для пользователя выполняет наш ConsoleCardConnectionObserver .
Небольшое попутное отступление
лично мне не очень нравится, как ConsoleCardConnectionObserver отображает результат исполнения APDU — он не отделяет SW от результирующих данных так, как мне этого хотелось бы. Я использовал его только, чтобы не захламлять код примера маловажными деталями. Однако, если кому-то интересно, код метода update() моего наблюдателя есть в этом коммите.
_set_up_connection()
Трудяга, который помогает нам каждый раз, когда карта в ридере меняется. Он создает соединение с картой, навешивает на него ConsoleCardConnectionObserver , и запоминает ATR карты (чтобы команда atr могла вывести его на экран).
_clear_connection()
Антипод _set_up_connection() , «проводит зачистку», когда карта извлечена из ридера.
Определить VID и PID для восстановления флешки
Воткните флешку в компьютер и запустите Диспетчер устройств. Пуск – Выполнить - mmc devmgmt.msc.
Затем зайдите в раздел Контроллеры универсальной последовательной шины USB.
Находим в списке свою флешку. Обычно, все флешки имеют название Запоминающее устройство для USB.
Жмем на устройстве правую клавишу и открываем Свойства.
Переходим на вкладку Сведения.
В выпадающем списке выбираем пункт Код экземпляра устройства или Коды (ID) оборудования.
В этом окне мы видим PID и VID.
Способ №3: конвертирование в формат DjVU
Формат DjVU, в среднем, обеспечивает более сильное сжатие, нежели PDF. И надо признать, что DjVU один из немногих форматов, которые реально конкурирует с ним.
Для конвертирования из PDF в DjVU, на мой взгляд, наиболее предпочтительно использовать одну небольшую утилиту - PdfToDjvuGUI .
PdfToDjvuGUI
Примечание : обратите внимание, что утилита иногда неправильно читает "названия" файлов, написанных на русском.
PDF to DjVU - небольшая утилита
Пользоваться же ей очень просто: достаточно добавить нужный файл (Add PDF), задать настройки (можно ничего не трогать) и нажать кнопку "Generate DjVU" . Должно появиться "черное" окно на некоторое время, после него программа вам сообщит, что файл пере-конвертирован.
Кстати, файл DjVU программа поместит в ту же папку, где находился оригинальный PDF. В качестве примера см. скрин ниже. Без изменения качества (а программа позволяет менять DPI), удалось снизить занимаемое место файлом почти в 2 раза!
PDF VS DjVU (при одинаковом DPI)
Ниже приведу еще несколько онлайн-сервисов , которые могут проделать аналогичную операцию конвертирования.
- максимальное сжатие файла (т.е. экономия места на диске!);
- файл можно сразу же открывать в ридере, также, как вы это делаете с PDF (т.е. это не архив).
- для больших фалов требуется значительное время на конвертацию;
- при преобразовании может "потеряться" качество (поэтому важные графики проверьте вручную, как они сжались);
- формат DjVU поддерживает меньшее число программ, нежели PDF.
sw.ErrorChecker , sw.ErrorCheckingChain
По умолчанию, в ходе обмена данными между картой и нашего приложением, никакие ошибочные значения StatusWord (SW1, SW2) не возбуждают исключений. Это можно изменить, задействовав потомков ErrorChecker , которые:
- объединяются в последовательности sw.ErrorCheckingChain
- привязываются к CardConnection и проверяют на отсутствие ошибок результат каждого вызова метода transmit() .
Встроенные в библиотеку «чекеры» позволяют получить в исключении подробную информацию о проблеме без необходимости залезать в спеки и искать необходимые значения SW1 , SW2 .
CardRequest и его подклассы
Позволяют свести воедино все требования нашего приложения, касающиеся установления связи с картой:
- строго задать тип карты (см. выше)
- ограничить список допустимых ридеров (из уже установленных в системе)
- изменить таймаут ожидания карты в ридере
По умолчанию никаких ограничений в CardRequest не ставится.
Типовой шаблон программы
Пора уже сделать вброс порции кода, а то всё скучные вступительные «бубубу».
Какие задачи решает (практически любая) программа, работающая со смарт-картами в ридере? А вот эти:
- Выбор ридера, с которым мы будем взаимодействовать
- Определение момента, когда карта окажется в этом ридере
- Установка канала связи с картой
- Проверка карты на соответствие нашим критериям (мы можем захотеть работать не с каждой картой, которую пользователь нам подсунет)
- Обмен данными с картой посредством APDU
- Закрытие канала связи с картой
- Определение момента, когда карта будет извлечена из ридера
Замечу, что перечисленные задачи решает, например, прошивка мобильного телефона.
Функция System.readers()
Позволяет получить список подключенных к системе кардридеров и установить связь с картой в определенном ридере.
Подклассы CardType
Позволяют нам указать точный тип карт, с которыми наше приложение собирается работать. Можно сделать так, чтобы наше приложение даже не реагировало на помещение в ридер карты, которая нам не подходит.
Примеры:
- CardType.ATRCardType (существует в библиотеке) — фильтрация карт по значению ATR. Наше приложение будет реагировать только на карты с определенным значением ATR.
- USIMCardType (я нафантазировал, можно реализовать) — допустимыми картами являются только USIM, внутри проверяем возможность выбора USIM-приложения.
Заключение
До встречи во второй части, предполагаю, что там Python-а не будет (почти или совсем), но будут APDU и SW.
у меня есть CAC смарт-карты, и SCM Microsystems SCR3310 USB card Reader. Я запускаю Windows 7 Ultimate с пакетом обновления 1.
Эта настройка работала нормально. Когда я вставлял свой CAC, мои сертификаты немедленно распространялись бы к хранилищу сертификатов (как засвидетельствовано управлением сертификатами, certmgr.msc ), и я мог бы войти на веб-сайты, которые требовали CAC для доступа.
недавно я перестал иметь доступ к веб-сайтам. Выглядящий в Диспетчере сертификатов, я вижу, что только один, или иногда два моих сертификатов. Если я удалю их и снова вставлю свою карту, может появиться другой сертификат.
Я только что вернулся и заменил считыватель той же моделью, так что я знаю, что это не виновник.
я, наконец, подумал, чтобы посмотреть на системный журнал, и заметил следующие ошибки при вставке смарт-карты:
ошибки, в хронологический порядок:
кажется, что аппаратный сбой во время IOCTL TRANSMIT , который просачивался через фреймворк драйвера пользовательского режима.
кроме того, отправляемая команда была INS=0xC0, то есть ПОЛУЧИТЬ ОТВЕТ.
как сказать, что протокол не поддерживается? Что водитель делает иначе, чем когда он работал? Обратите внимание, что я также только что попробовал это с новым CAC, и я вижу подобное поведение. Проблема с кард-ридером или драйвером?
учитывая, что я просто заменил считыватель (и переустановил драйверы, перезагрузился и т. д.) что-то не так с моей смарт-карты? Я предполагаю, что нет, потому что это тут работа с другим устройством чтения в другой системе. Я не пробовал другой читатель на той же системе.
в самом деле тот же reader подключен к виртуальной машине Windows 7 на той же физической машине работает просто отлично! Что-то явно сломано, и это сводит меня с ума, пытаясь понять, что.
Пошаговая инструкция по восстановлению USB флешек в которой я постараюсь доступным языком ответить на вопрос Как восстановить флешку самостоятельно и без особых усилий.
Вот бывает поможешь человеку, а он потом всем растрындит, что ты такой хороший и идут уже толпы жаждущих за помощью. Примерно так все и получилось, когда я восстановил несколько флешек коллегам.
Теперь народ несет не только свои флешки, но и флешки своих друзей, знакомых и родственников. Ну вот хоть бы кто-то еще бутылочку пива приволок или печеньку – фигушки.
Мне-то не сложно помочь, но когда я предлагаю вам самим научиться все это делать, вы отнекиваетесь. Таких я в следующий раз просто отшиваю. Не хочешь учиться – проходи мимо.
С лирикой на этом заканчиваю и перехожу непосредственно к теме поста..
Если ваша флешка перестала определяться как диск, не хочет форматироваться, не дает записать информацию или еще что-то там с ней случилось, НО она не имеет механических повреждений, то знайте – еще не все потеряно. Скорее всего глюкнул контроллер и с ним придется немного повозиться. По времени эта процедура занимает, примерно, 5 минут.
Сразу скажу, что не существует универсальной программы для восстановления всех разновидностей флешек. Необходимо будет найти именно ту, которая сможет работать с контроллером вашей флешки.
Для начала нам необходимо определить VID и PID нерабочей флешки.
Видеоинструкция по восстановлению флешек
Способ №2: сжатие с помощью уменьшения качества (DPI)
DPI — это количество точек на дюйм. Чем больше точек на дюйме — тем выше качество отображаемой картинки (и тем больше весит файл).
Естественно, при пере-сохранении PDF-файла, можно указать новое количество точек на дюйм (DPI) и за счет этого уменьшить размер файла (вместе с его качеством).
Однако, сразу отмечу, что далеко не всегда при уменьшении DPI — ухудшается качество картинки (во многих случаях разницы на глаз не заметите!).
Сделать подобную процедуру можно во множестве программ : Adobe Acrobat (не путайте с Adobe Reader) , Fine Reader, Cute PDF Writer, Libre Office и др. Ниже я приведу парочку бесплатных примеров.
1) Libre Office (👉 ссылка на программу)
Хороший и бесплатный офисный набор (я уже ранее рекомендовал его, как альтернативу MS Office). В своем арсенале имеет программу DRAW, которая легко и непринужденно может провести изменения в PDF (в том числе изменить DPI). Рассмотрим поподробнее.
Чтобы запустить DRAW — запустите Libre Office, и выберите в меню "Рисунок DRAW" .
Далее откройте какой-нибудь файл PDF в программе и затем нажмите по "Файл/Экспорт в PDF. " .
Откроется окно со множеством параметров для сохранения. Тут вы можете изменить качество сжатия, разрешение (DPI) и прочие параметры. В общем-то, самое нужное я выделил на скрине ниже.
После задания параметров — нажмите кнопку экспорта для создания нового файла.
Быстро, просто и легко! Не так ли?
2) CutePDF Writer (👉 ссылка на оф. сайт)
Эта бесплатная программа после установки "создает" отдельную специальную строку при распечатке документа (с нужными свойствами для сжатия) .
Т.е. устанавливаете ее, затем открываете какой-нибудь файл PDF, скажем, в Adobe Reader (можно и в любой другой программе для чтения PDF) и нажимаете "Печать" (сочетание Ctrl+P).
Затем выбираете вместо реального принтера строчку " CutePDF Writer ", и открываете ее "Свойства" .
Свойства CutePDF Writer
После нужно открыть вкладку качества печати и перейти в "Дополнительно" .
Свойства бумаги и качества
Здесь можно будет задать качество печати в DPI (и др. параметры).
Далее сохраняете введенные изменения и производите "печать" (то бишь сохранение) нашего файла. Качество PDF будет новым: сравнивайте старый и новый файлы!
Кстати, устанавливать необходимо оба файла, которые доступны на официальном сайте программы!
Установить нужно оба файла
- не теряем совместимости (файл то остается тем же PDF);
- операция проходит довольно-таки быстро;
- операцию "по изменения DPI" можно провести десятками различных программ.
- в некоторых случаях сильно падает качество (например, если имеете дело со схемами и высококачественными портфолио - скорее всего, данный вариант не подойдет).
Важнейшие объекты пакета smartcard
В этом разделе все имена указаны относительно пакета smartcard .
Способ №1: архивирование
Пожалуй, наиболее простой и очевидный — это добавить PDF-файлы в архив. Таким образом, порой, удается существенно уменьшить занимаемый ими размер.
Кроме того, один файл архива куда быстрее и удобнее копировать с одного ПК на другой (нежели десяток, а то и сотню PDF-фок) .
👉 Дополнение!
Лучшие бесплатные архиваторы для Windows - моя золотая подборка
*
Например, в таком популярном архиваторе, как 7-Zip (его также найдете по ссылке выше) : достаточно щелкнуть правой кнопкой мышки по файлу и в появившемся меню выбрать "Добавить к архиву. " . См. скрин ниже. 👇
Добавить к архиву (7Z)
Далее указать формат архива, степень сжатия и нажать "OK" (это минимум).
Выбор формата и степени сжатия
Собственно, мой файл был сжат почти в 3 раза! Пример ниже. 👇
До сжатия, и после сжатия - обратите внимание на размер
- после распаковки архива PDF-файл не теряет свое качество;
- форматы архивов ZIP могут открывать большинство современных ридеров;
- один файл архив (внутри которого сотня PDF) гораздо быстрее копируется, нежели это делать с этими же файлами без добавления их в архив.
- чтоб открыть файл, необходимо его извлечь из архива (а не на всех ПК/телефонах/планшетах может быть установлен нужный архиватор);
- не все файлы одинаково хорошо поддаются сжатию: один может быть сжат очень прилично, другой - на 0,5%.
- при выборе некоторых форматов архивов - может потребоваться значительное время для запаковки файлов.
Командный процессор с APDU (CLI)
Не буду подробно останавливаться на модуле cmd, который любезно предоставляет нам стандартная библиотека, о нем уже писали здесь, перейду к реализации.
Весь исходный код процессора находится на гитхабе.
Пройдемся по главным моментам, не размениваясь на мелочи.
Функция select_reader()
Возвращает первый ридер, подключенный к компьютеру или None , если подключенных ридеров нет.
Есть вариант этой функции (зависит от модуля msvcrt, т.е. только для Windows), который позволяет выбрать ридер, если их в компьютере несколько.
Варианты, как можно сжать PDF-файл
Потомки CardConnectionObserver
Вооруженные таким знанием, мы вполне можем замахнуться на написание командного процессора, использующего описываемую библиотеку.
Способ №4: использование онлайн-инструментов
Сжатый файл в Small PDF
Отличный сайт для быстрого сжатия и конвертации из одного формата в другой. Файлы, размером до 20-30 Мб, обрабатываются буквально в течении 10-15 сек.!
Сервис не трогает разметку документа, ссылки, меню и пр. элементы. Сжатие происходит за счет графики (то бишь параметра PDI).
Convertio - скрин работы сервиса
На сервисе доступно 3 степени сжатия: минимальная, нормальная и экстремальная. Работает очень быстро, файлы до 3-040 Мб обрабатывает за 5-10 сек. (по крайней мере, так было с моим десятком тестовых файлов) .
Файлы были сжаты // Сервис "I love DPF"
Отмечу также, что на этом сервисе вы сможете разбить PDF файл на несколько частей, конвертировать его в другие форматы, объединить несколько PDF и т.д. В общем, довольно-таки многофункциональный сервис, рекомендую к ознакомлению!
После мигрирования ИТ структуры компании на Ubuntu linux 10.04LTS периодически попадаются интересные задачи. Вот алгоритм решения одной из них, которой может пригодится другим администраторам. Все необходимое в прилагаемом архиве или по ссылкам в ходе описания.
*USB токен Smart Card Rader 378 определяется lsusb как 15cf:0015, не подхватывается утилитой pcscd, сыпет в дебаг режиме ошибками типа: 00000070 readerfactory.c:233:RFAddReader() Smart Card Reader 378 init failed.
Изначально требуется прошить USB токен Smart Card Rader 378, основная инструкция и программное обеспечение по ссылке внизу, или в прилагаемом архиве.
Для прошивки надо чтобы токен был корректно установлен в системе (автор прошивки настоятельно рекомендует Windows XP), для этого достаточно достать папку с драйверами из ibank.pinbank.ua и скормить системному установщику (файл drv_from_ibank_pinbank_ua.zip в прилагаемом архиве)
После этого можно запускать NewUpgr378ToCCID.exe и действовать по инструкции update_SecureToken.doc с четвертой страницы. Дальше пишу по памяти.
Запустил NewUpgr378ToCCID.exe, она отработала, нажал Enter, программа закрылась, отключил токен.
Подключил токен, установил драйвер CL-Boot 381 из Drv381, отключил токен.
Запустил NewUpgr378ToCCID.exe, подключил токен, секунд через 20 нажал Enter, потом еще пару раз.
Все, устройство определяется как Secure Token, а не Smart Card Rader 378. Кстати код у него поменялся на 15cf:0019
Возможно менее удачливому админу придется посидеть над прошивкой дольше.
После этого можно настраивать Smart Card Rader 378 на линуксе.
Устанавливаю pcscd libccid opensc pcsc-tools (скорее всего нужны только первые два пакета)
После установки PCSC создайте символическую ссылку командой:
ln -s /lib/libpcsclite.so.1.0.0 /usr/lib/libpcsclite.s
Иначе джава-апплет клиент-банка будет загружаться в виде серого квадрата слева внизу окна браузера.
В файле /etc/libccid_Info.plist (символические ссылки на этот файл встречаются и в других местах, это некритично)
проверяю есть ли коды нашего токена, которые видны по команде lsusb, например в моем случае это
lsusb -s 10
Bus 002 Device 010: ID 15cf:0019
В libccid_Info.plist вбиваю коды и символьное имя первыми строчками в разделы ifdVendorID ifdProductID ifdFriendlyName соответственно
останавливаю pcscd и запускаю в режиме дебага
/etc/init.d/pcscd stop
pcscd --foreground --debug --apdu
читайте внимательно вывод, в моем случае там была ошибка
00000082 dyn_unix.c:36:DYN_LoadLibrary() /usr/lib/pcsc/drivers/ifd-KP378.bundle/Contents/Linux/libccid.so: /usr/lib/pcsc/drivers/ifd-KP378.bundle/Contents/Linux/libccid.so: cannot open shared object file: No such file or directory
и понадобилось сделать сделать символическую ссылку на
/usr/lib/pcsc/drivers/ifd-ccid.bundle/Contents/Linux/libccid.so.1.3.11
в
/usr/lib/pcsc/drivers/ifd-KP378.bundle/Contents/Linux
чтобы было так:
ls -l
итого 20
lrwxrwxrwx 1 root root 70 2011-12-23 10:14 libccid.so -> /usr/lib/pcsc/drivers/ifd-ccid.bundle/Contents/Linux/libccid.so.1.3.11
-rw-r--r-- 1 root root 14140 2011-12-23 10:05 libKP378.so
теперь все работает, можно настроить токен
из директории где лежит
device-utils.jar
запустить
LANG=ru_RU.cp1251 java -cp device-utils.jar com.bifit.security.token.DeviceUtils
Или просто запустить клиент-банк ibank.pinbank.ua
Кодировку названия токена в окне КБ пока не поборол, но в моем случае это некритично. В принципе можно настроить тот дистрибутив PC-Banking что есть в архиве. (PC-Banking-linux-i586.tar.bz2) Хотя я не уверен что они одинаковые для "проминвест" (по материалам которого это все делалось) и "первого инвестиционного" (ДЛЯ которого это все делалось) банков.
Сделано по материалам:
ibank.pib.ua
За что им огромное спасибо.
Сначала, на момент задумки, в 2014 году, данная статья планировалась как единая публикация, но, проработав материал (лень вынудила растянуть этот процесс), я понял, что необходимо её разделить на две части:
- Знакомство с библиотекой и написание/разбор кода специального командного процессора, который ее использует.
- Использование командного процессора из ч.1 для чтения содержимого файла с симки, которую я, однажды, подобрал на улице (никаких персональных данных раскрыто не будет). Узнаем, как отучить Windows встревать в наше взаимодействие с картой, а также, возможно, затронем тему выбора (активации) системного приложения на карте (если моя экспериментальная карта окажется UICC).
Думаю, для профи-карточников первая часть будет представлять бо́льший интерес, а вторая часть будет интересна, прежде всего, новичкам в этой теме (и будет иметь метку Tutorial).
Среди множества Python-библиотек, обзоры которых есть на Хабре, я не обнаружил pyscard — библиотеки для взаимодействия со смарт-картами.
В этой статье я постараюсь дать краткое описание основных фич pyscard, а на сладкое напишем простенький командный процессор, работающий с картой посредством APDU .
Прошу учесть, что для понимания того, как использовать эту библиотеку, и окружающей терминологии требуется знакомство со стандартом ISO 7816-4 или, хотя бы, GSM 11.11 . К GSM-стандарту проще получить официальный доступ, скачав его с сайта ETSI, впрочем и ISO 7816-4 (pdf, старенькая версия) гуглится, несмотря на то, что за него на оф. сайте хотят денег).
Pyscard существует с 2007 года и является кроссплатформенной (win/mac/linux) надстройкой над PC/SC API.
Мое рабочее окружение, где я использую pyscard — Windows7
Материал данной статьи я тестировал, в основном, на mac OS, но на Windows7 тоже погонял, в виртуалке. Должен отметить, что, в отличие от XP , «семерка» и, вероятно, «десятка», с настройками по умолчанию, «ставит палки в колеса» при работе с картой в ридере:
- При помещении каждой карты в ридер эта карта считается устройством Plug&Play, для нее системой «ищутся драйверы».
- Если мы дождались окончания п. 1, то система начинает искать на карте сертификаты, при этом общаясь с ней своими APDU, эти APDU смешиваются с нашими и возникают коллизии, приводящие к сбоям в наших программах.
Эти факторы доставили мне много боли при переходе с XP, пока я их не победил. Как это сделать, расскажу во второй части.
Разработка начата под эгидой одного из ведущих (и на момент создания, и сейчас) игроков карточного рынка.
Поддерживаются обе ветки Python (2 и 3).
В рабочем окружении я использую связку pyscard + Python 2.7, но, для статьи, мне показалось правильным задействовать актуальную на сегодня ветку Python (3.6)
На мой взгляд библиотека pyscard спроектирована не особо pythonic и больше напоминает порт какого-то Java фреймворка, однако полезности её это не уменьшает, по крайней мере для меня, хотя имена модулей выглядят странно, конечно.
Точкой входа в библиотеку является пакет smartcard .
Отдельно стоит упомянуть пакет smartcard.scard , который отвечает за связь с карточным API операционной системы. Если не нужны все абстракции библиотеки, а только голый PC/SC , то вам сюда. Мы же на нём подробно останавливаться не будем.
Установка pyscard возможна следующими способами:
- с PyPi ( pip install pyscard ) — подходит для систем, настроенных на сборку артефактов из исходников, используется swig (ок для mac и, возможно, linux)
- Из бинарного дистрибутива, который можно забрать c appveyor или c sourceforge (великолепно прокатывает в Windows)
Pyscard имеет информативное руководство пользователя, которое доступно на официальном сайте, pydoc и примеры, поэтому не вижу смысла дублировать все это здесь. Вместо этого мы:
- Посмотрим на типовую структуру/шаблон программы;
- Бросим взгляд на, по моему мнению, важнейшие объекты библиотеки, что должно убедить пользоваться не низкоуровневым smartcard.scard , а именно smartcard ;
- Проиллюстрируем применение библиотеки на реальном примере — напишем командный процессор (шелл) на Python 3.6, где командами будут прямо «APDU в хексе» и ответ с карты будет выводиться в консоль. Также будут поддерживаться текстовые команды exit и atr.
Читайте также: