Разработка считывателя смарт-карт в Android

Мы разработали прототип платы с микроконтроллером, который может обмениваться данными со смарт-картой (он может считывать ATR, выдавать и читать ответы на команды APDU и т. д.). Теперь я хочу использовать это оборудование с телефоном или планшетом Android. Наша плата имеет USB-соединение, через которое мы можем читать и записывать в MCU через Android.

Конечная цель состоит в том, чтобы иметь работающее устройство чтения смарт-карт на платформе Android с поддержкой PKCS #11 и предоставить библиотеку конечным пользователям устройства чтения смарт-карт, чтобы они могли обмениваться данными со своими картами.

Я читал несколько обсуждений на эту тему, в некоторых из них говорилось, что для этого мне нужно будет создать собственный Android. Я не очень хорошо знаком с архитектурой Android, чтобы понять, зачем мне пересобирать Android, когда я могу общаться со своим периферийным устройством (картридером) через USB. Мне кажется, что если я предоставлю библиотеку, которая реализует CCID-подобный интерфейс, пользователи смогут затем общаться с моим ридером, используя USB-стек Android, путем интеграции моей библиотеки в их целевой файл .apk.

Есть ли какие-либо проблемы с вышеуказанным планом, о которых мы не знаем? Меня беспокоит то, что мы упускаем что-то фундаментальное в устройствах для чтения Android или смарт-карт в целом (например, безопасность), что вызовет у нас проблемы, когда мы начнем внедрять библиотеки, описанные выше.


person SomethingBetter    schedule 26.03.2013    source источник
comment
Будет ли полезна эта информация о USB-подключении на Android? ваш вопрос?   -  person Joe    schedule 27.03.2013
comment
Безопасность в основном обеспечивается самой смарт-картой. Основная уязвимость заключается в том, что секретные данные в телефоне (например, PIN-код) перехватываются другим вредоносным приложением; поэтому считыватели с ПИН-падом, где ПИН-код не покидает считыватель, имеют преимущество. Некоторые рекомендации: используйте безопасный обмен сообщениями для защиты пути передачи, не храните ничего в незашифрованном виде на телефоне и не кэшируйте PIN-коды.   -  person guidot    schedule 01.04.2013
comment
Было бы полезно, если бы вы связались с теми оригинальными обсуждениями, которые вы читали о необходимости пользовательского ПЗУ Android. Эта часть тоже не имеет для меня смысла. В их проектах может быть скрытое требование, которое вы, возможно, не заметили или просто не увидели (и которое, скорее всего, вообще не имеет отношения к вашему проекту). Также может быть, что их обсуждение довольно старое и предшествует USB-хосту Android, который был представлен с Android 3.0 и выше.   -  person Stephan Branczyk    schedule 15.04.2013


Ответы (3)


Я интегрировал периферийные устройства USB в настраиваемый дистрибутив Gingerbread для своей пользовательской платформы. Единственная причина, по которой вы будете настраивать платформу Android, — это добавить или изменить некоторые драйверы, которые предоставят вам доступ к вашему USB-устройству. Если ваше USB-устройство уже использует протокол, поддерживаемый стандартными устройствами Android, просто наслаждайтесь удачей! Все готово. Но прежде чем праздновать свою победу, я бы попробовал его на самых разных устройствах. На уровне Android и ядра Google предоставляет очень простой дистрибутив с большим количеством исходного кода драйвера. Производитель телефона/планшета должен решить, какие низкоуровневые драйверы и протокол они будут включать в зависимости от аппаратного обеспечения, которое использует их устройство. Поскольку объем памяти на телефоне/планшете ограничен, общее правило заключается в том, чтобы включать только то, что необходимо. В архитектуре PC-Linux у вас нет проблемы, поскольку место на жестком диске настолько велико, что вы включаете все существующие драйверы и позволяете системе выбирать то, что ей нужно, в соответствии с тем, что она обнаружит.

Надеюсь, этот простой ответ будет полезен.

person Sylvain Huard    schedule 17.04.2013

После проведения дополнительных исследований в этой области вам доступно несколько решений:

  1. Создайте свои собственные драйверы (простое общение, несколько простых команд для сброса карты и включения питания). В этом случае вам просто нужно будет реализовать команды сброса / питания и протокол связи T = 1, однако большим недостатком этого метода является то, что он будет работать только с вашими картридерами, что является большим ограничением.
  2. Реализуйте интерфейс CCID на контроллере и оберните его вокруг команд APDU. Этот метод является масштабируемым, если вы соблюдаете спецификацию (многие производители этого не делают, поэтому у pcsc-lite есть список поддерживаемых ридеров). Этот метод является наиболее экономичным, если вы хотите продать много читателей. Вы можете найти спецификацию здесь
  3. Добавьте микросхему CCID в свою сборку, в которой уже реализована связь CCID. Такие чипы производятся разными производителями, у STMelectronics их много, однако в таком случае ваш конечный считыватель будет стоить дороже, и вы не сможете полностью контролировать протокол.

Что касается Android, seek предлагает порт pcsc- lite, не пробовал, но из исходного кода я могу сказать, что они только модифицировали usb api из исходного драйвера и использовали интерфейс JNI для связи с кодом c.

person Daniel    schedule 21.08.2019

Я не уверен в реализации CCID для ридера, но для Android есть несколько портов C/C++, но не уверен, что они работают. В части Android довольно легко реализовать протокол CCID, взгляните на это. Самое сложное сделать свою прошивку для читалки, там много мелких деталей, о которых надо позаботиться.

person Daniel    schedule 11.03.2019