Считывание паспорта на phyflex i.MX6 с использованием pr533 jmrtd и pcsc-lite не выполняется

В настоящее время мы работаем с этой настройкой:

Аппаратное обеспечение:

  • Плата phyFlex i.MX6 (Fsl ARM).
  • ЖК
  • Тестовая плата USB PR533 (совместимость с ccid)

Программного обеспечения:

  • yocto poky/oe 1.7, текущий уровень головокружения fsl
  • pcsc-lite (1.8.6 также тестировалась с 1.8.13)
  • ccid (1.4.8 также протестирован с 1.4.18
  • сообщество фсл 3.18
  • matchbox-sato как менеджер сеансов x11
  • JMRTD 0.4.9 (используя приложение jar для тестирования)

Мы хотим прочитать паспорт с помощью pcsc-lite и JMRTD (для проверки ключа). Установка работает с использованием стандартной рабочей станции Linux (Mint), но не может прочитать паспорт с помощью встроенной версии (может быть, из-за тайм-аутов?)

Похоже, он теряет связь с паспортом (слова состояния 0x6600 или 0x6F01 и 0x6F00), тогда как на рабочей станции это происходит только один или два раза, пока он успешно не подключится. Мы также попробовали более новую версию pcsc или ccid, но ничего не изменилось.

Ниже вы можете найти подробный журнал хоста и цели.

Любое предложение, почему это может происходить?

Журнал хоста:

00000004 Card ATR: 3B 80 80 01 01 
00000003 ifdhandler.c:291:IFDHPolling() usb:1fc9/010b:libudev:0:/dev/bus/usb/003/009 (lun: 0) 5000 ms
00000003 ccid_usb.c:1202:InterruptRead() before (0)
00052371 winscard_svc.c:319:ContextThread() Received command: CMD_GET_READERS_STATE from client 14
00001788 winscard_svc.c:319:ContextThread() Received command: CMD_GET_READERS_STATE from client 14
00000056 winscard_svc.c:319:ContextThread() Received command: STATUS from client 14
00000014 readerfactory.c:772:RFReaderInfoById() RefReader() count was: 1
00000004 winscard.c:1291:SCardStatus() UnrefReader() count was: 2
00000003 winscard_svc.c:561:ContextThread() STATUS rv=0x80100069 for client 14
00000121 winscard_svc.c:319:ContextThread() Received command: CONNECT from client 14
00000018 winscard.c:235:SCardConnect() Attempting Connect to NXP PR533 (3.60) 00 00 using protocol: 3
00000004 readerfactory.c:745:RFReaderInfo() RefReader() count was: 1
00000003 winscard.c:330:SCardConnect() powerState: POWER_STATE_INUSE
00000003 prothandler.c:87:PHSetProtocol() Attempting PTS to T=1
00000005 ifdhandler.c:668:IFDHSetProtocolParameters() protocol T=1, usb:1fc9/010b:libudev:0:/dev/bus/usb/003/009 (lun: 0)
00000002 ifdhandler.c:682:IFDHSetProtocolParameters() Timeout: 3000 ms
00000002 winscard.c:409:SCardConnect() Active Protocol: T=1
00000004 winscard.c:429:SCardConnect() hCard Identity: 64aa6fd3
00000004 winscard.c:490:SCardConnect() UnrefReader() count was: 2
00000004 winscard_svc.c:453:ContextThread() CONNECT rv=0x0 for client 14
00000053 winscard_svc.c:319:ContextThread() Received command: CMD_GET_READERS_STATE from client 14
00000037 winscard_svc.c:319:ContextThread() Received command: STATUS from client 14
00000011 readerfactory.c:772:RFReaderInfoById() RefReader() count was: 1
00000003 winscard.c:1291:SCardStatus() UnrefReader() count was: 2
00000003 winscard_svc.c:561:ContextThread() STATUS rv=0x0 for client 14
00000096 winscard_svc.c:319:ContextThread() Received command: TRANSMIT from client 14
00000020 readerfactory.c:772:RFReaderInfoById() RefReader() count was: 1
00000005 winscard.c:1587:SCardTransmit() Send Protocol: T=1
00000006 APDU: 00 A4 04 0C 07 A0 00 00 02 47 10 01 
00000003 ifdhandler.c:1266:IFDHTransmitToICC() usb:1fc9/010b:libudev:0:/dev/bus/usb/003/009 (lun: 0)
00000004 commands.c:1513:CmdXfrBlockAPDU_extended() T=0 (extended): 12 bytes
00000007 -> 000000 6F 0C 00 00 00 00 1B 00 00 00 00 A4 04 0C 07 A0 00 00 02 47 10 01 
00078174 <- 000000 80 02 00 00 00 00 1B 00 00 00 90 00 
00000020 SW: 90 00 
00000006 winscard.c:1632:SCardTransmit() UnrefReader() count was: 2
00000006 winscard_svc.c:608:ContextThread() TRANSMIT rv=0x0 for client 14
00000169 winscard_svc.c:319:ContextThread() Received command: TRANSMIT from client 14
00000018 readerfactory.c:772:RFReaderInfoById() RefReader() count was: 1
00000005 winscard.c:1587:SCardTransmit() Send Protocol: T=1
00000004 APDU: 00 A4 02 0C 02 01 1E 
00000004 ifdhandler.c:1266:IFDHTransmitToICC() usb:1fc9/010b:libudev:0:/dev/bus/usb/003/009 (lun: 0)
00000002 commands.c:1513:CmdXfrBlockAPDU_extended() T=0 (extended): 7 bytes
00000006 -> 000000 6F 07 00 00 00 00 1C 00 00 00 00 A4 02 0C 02 01 1E 
00017077 <- 000000 80 02 00 00 00 00 1C 00 00 00 69 82 
00000019 SW: 69 82

Целевой журнал:

00000140 readerfactory.c:795:RFReaderInfoById() RefReader() count was: 1
00000042 winscard.c:1314:SCardStatus() UnrefReader() count was: 2
00000034 winscard_svc.c:606:ContextThread() STATUS rv=0x80100069 for client 14
00000483 winscard_svc.c:353:ContextThread() Received command: CONNECT from client 14
00000141 winscard_svc.c:484:ContextThread() Authorized client for 'NXP PR533 (3.60) 00 00'
00000038 winscard.c:258:SCardConnect() Attempting Connect to NXP PR533 (3.60) 00 00 using protocol: 3
00000033 readerfactory.c:768:RFReaderInfo() RefReader() count was: 1
00000028 winscard.c:353:SCardConnect() powerState: POWER_STATE_INUSE
00000029 prothandler.c:110:PHSetProtocol() Attempting PTS to T=1
00000039 ifdhandler.c:682:IFDHSetProtocolParameters() protocol T=1, usb:1fc9/010b:libudev:0:/dev/bus/usb/001/003 (lun: 0)
00000028 ifdhandler.c:696:IFDHSetProtocolParameters() Timeout: 3000 ms
00000022 winscard.c:432:SCardConnect() Active Protocol: T=1
00000039 winscard.c:452:SCardConnect() hCard Identity: 31739a24
00000036 winscard.c:513:SCardConnect() UnrefReader() count was: 2
00000035 winscard_svc.c:498:ContextThread() CONNECT rv=0x0 for client 14
00000232 winscard_svc.c:353:ContextThread() Received command: CMD_GET_READERS_STATE from client 14
00000202 winscard_svc.c:353:ContextThread() Received command: STATUS from client 14
00000132 readerfactory.c:795:RFReaderInfoById() RefReader() count was: 1
00000040 winscard.c:1314:SCardStatus() UnrefReader() count was: 2
00000031 winscard_svc.c:606:ContextThread() STATUS rv=0x0 for client 14
00000450 winscard_svc.c:353:ContextThread() Received command: TRANSMIT from client 14
00000222 readerfactory.c:795:RFReaderInfoById() RefReader() count was: 1
00000042 winscard.c:1610:SCardTransmit() Send Protocol: T=1
00000050 APDU: 00 A4 04 0C 07 A0 00 00 02 47 10 01 
00000031 ifdhandler.c:1283:IFDHTransmitToICC() usb:1fc9/010b:libudev:0:/dev/bus/usb/001/003 (lun: 0)
00000028 commands.c:1590:CmdXfrBlockAPDU_extended() T=0 (extended): 12 bytes
00000066 -> 000000 6F 0C 00 00 00 00 35 00 00 00 00 A4 04 0C 07 A0 00 00 02 47 10 01 
02712060 <- 000000 80 02 00 00 00 00 35 01 00 00 6F 01 
00000058 SW: 6F 01 
00000030 winscard.c:1655:SCardTransmit() UnrefReader() count was: 2
00000033 winscard_svc.c:653:ContextThread() TRANSMIT rv=0x0 for client 14
00004692 winscard_svc.c:353:ContextThread() Received command: CMD_GET_READERS_STATE from client 14
00000241 winscard_svc.c:353:ContextThread() Received command: CMD_GET_READERS_STATE from client 14
00000287 winscard_svc.c:353:ContextThread() Received command: CMD_GET_READERS_STATE from client 14
00115382 ccid_usb.c:1254:InterruptRead() after (0) (0)
00000060 NotifySlotChange: 50 02 
00000039 ifdhandler.c:1787:IFDHICCPresence() usb:1fc9/010b:libudev:0:/dev/bus/usb/001/003 (lun: 0)
00000046 -> 000000 65 00 00 00 00 00 36 00 00 00 
00001206 <- 000000 81 00 00 00 00 00 36 02 00 00 
00000040 ifdhandler.c:1908:IFDHICCPresence() Card absent
00000056 eventhandler.c:358:EHStatusHandlerThread() Card Removed From NXP PR533 (3.60) 00 00
00000043 ifdhandler.c:304:IFDHPolling() usb:1fc9/010b:libudev:0:/dev/bus/usb/001/003 (lun: 0) 600000 ms
00000027 ccid_usb.c:1210:InterruptRead() before (0)

person Ritualmaster    schedule 30.04.2015    source источник


Ответы (1)


Вы не разместили никакого кода, поэтому я не могу быть уверен в точной причине ошибки. Это может быть просто связано со слишком коротким тайм-аутом или с понижением напряжения на чипе, который вы читаете, но слово состояния в ваших журналах, которое бросилось мне в глаза, это 0x6982.


Что означает 0x6982?

В основном 0x6982 означает, что есть какой-то несанкционированный доступ. Из документации:

Бесконтактная ИС МСОПД, поддерживающая базовый контроль доступа, ДОЛЖНА отвечать на попытки чтения без проверки подлинности (включая выбор (защищенных) файлов в LDS) сообщением «Состояние безопасности неудовлетворительно» (0x6982) после установления безопасного канала. Отправка незащищенного SELECT по безопасному каналу приведет к прерыванию безопасного канала. Когда незащищенный SELECT отправляется до установления безопасного канала или когда безопасный канал был прерван, и 6982, и 9000 являются ответами, совместимыми с ИКАО.

0x6982 используется в качестве ответа на многие команды и имеет немного разные значения в зависимости от точного контекста, в котором вы получаете слово состояния, но основное значение остается прежним: существует какая-то проблема с безопасностью. Например, вот еще несколько конкретных определений 0x6982:

В контексте команды General Authenticate это означает:

Состояние безопасности неудовлетворительно.
Терминал не авторизован для выполнения протокола (например, пароль заблокирован, деактивирован или приостановлен).

В контексте команды Verify это означает:

Статус безопасности не удовлетворен
Терминал не авторизован для выполнения проверки.

В контексте команды «Активировать» или «Деактивировать» это означает:

Состояние безопасности неудовлетворительно
Терминалу не разрешено изменять состояние PIN-кода.

Я не могу сказать из опубликованных вами журналов, в каком контексте возникает ошибка, но, как вы можете видеть, общая тема всегда одна и та же.


А как насчет 0x6F01, 0x6F00 и 0x6600?

Статусные слова, которые вы выделяете в своем вопросе, на мой взгляд, не имеют значения. И 0x6600, и 0x6F01 не используются в официальной документации, что означает, что они являются ошибками, зависящими от операционной системы. В большинстве случаев такие ошибки просто указывают на сбой шага протокола. Другими словами, они, скорее всего, только что возвращены, потому что есть ошибка, и они не должны указывать на какую-либо конкретную ошибку.

0x6F00, с другой стороны, просто указывает на неизвестную ошибку. Такой вид придает больше правдоподобности возможности отключения микросхемы МСПД, но если вы используете с платой то же аппаратное обеспечение считывателя, что и с рабочей станцией, снижение напряжения маловероятно.


Что вы можете с этим поделать?

Мое предложение простое: попробуйте прочитать разные МСПД, чтобы проверить, действительно ли существует проблема с платой или аппаратным обеспечением в целом, или же просто что-то не так с самим МСПД.
Пока вы не опубликуете какой-либо код или не предоставите дополнительную информацию. или контекст, я не могу дать вам более конкретный ответ.

person Xaver Kapeller    schedule 06.05.2015
comment
На самом деле ожидается 0x6982 в первом файле журнала. Программное обеспечение пытается выяснить, требует ли МСПД ВАС (для МСПД 1-го и 2-го поколения единственный способ сделать это — методом проб и ошибок, т. е. путем выбора EF.COM перед ВАС и отказа). - person martijno; 16.07.2015