2015-05-30 4 views
-3

Я пытаюсь освоить программирование Java-карт. Я только начал. Но я не нахожу полную электронную книгу.Как понять команды Java Card APDU?

Как понять команды APDU?

Например, как я могу понять смысл, если CLA = 10101010? или, если INS = 10101010?

Есть ли в сети интуитивный путеводитель?

+2

В Интернете так много ссылок. Просто Google это, а затем читать, наконец, вы будете undrestand – BzH

+0

Привет, что еще информация хотела бы получить? Если у вас есть какие-либо вопросы, пожалуйста, спросите меня в комментарии под моим ответом ... – vojta

+0

Спецификации APDU приведены в ISO/IEC 7816-4. Вы можете получить копию последней версии. Тем не менее, это платная. –

ответ

9

команда APDU является очередью двоичных чисел в следующем виде:

CLA | INS | P1 | P2 | Lc | CData | Ле

Первые четыре секции, т.е. КЛК, ИНС, Р1 и Р2 являются обязательными во всех команд APDU и каждый из них имеет длину один байт. Эти секции длиной в 1 байт соответствуют классам, инструкциям, параметрам1 и параметру2 соответственно.

Последние три секции, т.е. Lc, CDATA и Ле являются optional.Lc является кодирование Nc, который является кодирование длины поля CDATA. Le - это кодировка Ne, а затем кодирование максимальных данных ответа, которые могут быть отправлены. На основании наличия или отсутствия этих секций, мы имеем 4 случай для команды APDU, как показано ниже:

  • case1: CLA | INS | P1 | P2
  • Вариант 2: CLA | INS | P1 | P2 | Le
  • Вопрос 3: CLA | INS | P1 | P2 | Lc | Data
  • Case4: CLA | INS | P1 | P2 | Lc | Data | Le

Длина CData отличается для разных команд и разных апплетов. на основе длины CDATA (т.е. Lc), а длина максимального данных отклика, которые могут отправить (т.е. Le), мы должны ввести в APDU команды:

  • Normal/Short APDU команды, когда LcиЛе меньше 0xFF
  • увеличенная длина APDU команд, когда Lcи/илиLe больше, чем 0xFF.

Таким образом, для длины этих участков мы имеем:

Lc: 1 байт для коротких APDU команд и 3 байта (они определяют эту длину, так как его достаточно) для расширенных команд APDU.

Данные: Различные длины.

Le: То же, что и Lc.


Как я могу понять команды APDU?

Ответ:

Когда вы пишете апплет, можно указать реакцию вашего апплета к различным APDU команды, которые он получит в будущем. Диспетчер карт также является апплетом. Команды, которые он поддерживает, определены в спецификациях/таблицах вашей карты. Обычно почти все карты имеют GlobalPlatform и ISO7816, поэтому они должны поддерживать эти обязательные команды APDU, определенные в этих документах. Например, поскольку 0xA4 определяется как Команда SELECT FILE в стандарте ISO7816-4. Если вы видите, что APDU, например xx A4 xx xx, отправляет в Диспетчер карт, вы можете сделать вывод, что он связан с SELECT FILE.

Обратите внимание, что вы можете выбрать одно значение для разных функций в разных апплетах. Например, в следующем, Applet1 будет возвращать 0x6990 в приеме 00 B0 xx xx команд APDU, в то время как Applet2 вернется 0x6991 в приеме одной и той же команды:

Applet1:

public class SOQ extends Applet { 

    private SOQ() { 
    } 

    public static void install(byte bArray[], short bOffset, byte bLength) 
      throws ISOException { 
     new SOQ().register(); 
    } 

    public void process(APDU arg0) throws ISOException { 
     byte buffer[] = arg0.getBuffer(); 

     if(buffer[ISO7816.OFFSET_CLA]==0x00 && buffer[ISO7816.OFFSET_INS]==0xB0){ 
      ISOException.throwIt((short)0x6990); 
     } 

    } 

} 

Выход:

OpenSC: opensc-tool.exe -s 00a404000b0102030405060708090000 -s 00B00000 -s 00B00 
100 
Using reader with a card: ACS CCID USB Reader 0 
Sending: 00 A4 04 00 0B 01 02 03 04 05 06 07 08 09 00 00 
Received (SW1=0x90, SW2=0x90) 
Sending: 00 B0 00 00 
Received (SW1=0x69, SW2=0x90) 
Sending: 00 B0 01 00 
Received (SW1=0x69, SW2=0x90) 

Applet2:

public class SOQ extends Applet { 

    private SOQ() { 
    } 

    public static void install(byte bArray[], short bOffset, byte bLength) 
      throws ISOException { 
     new SOQ().register(); 
    } 

    public void process(APDU arg0) throws ISOException { 
     byte buffer[] = arg0.getBuffer(); 

     if(buffer[ISO7816.OFFSET_CLA]==0x00 && buffer[ISO7816.OFFSET_INS]==0xB0){ 
      ISOException.throwIt((short)0x6991); 
     } 

    } 

} 

Выход:

OpenSC: opensc-tool.exe -s 00a404000b0102030405060708090000 -s 00B00000 -s 00B00 
100 
Using reader with a card: ACS CCID USB Reader 0 
Sending: 00 A4 04 00 0B 01 02 03 04 05 06 07 08 09 00 00 
Received (SW1=0x90, SW2=0x00) 
Sending: 00 B0 00 00 
Received (SW1=0x69, SW2=0x91) 
Sending: 00 B0 01 00 
Received (SW1=0x69, SW2=0x91) 

Таким образом, окончательный и короткий ответ на ваш вопрос (Как я могу понять команды APDU?) является:

  • Вы имеете дело с апплета?

    Вы сами определили поддерживаемые команды и их формы!

  • Вы имеете дело с другим апплетом (например, с Диспетчером карт)?

    Вам необходим исходный код этого апплета или его документации о его поддерживаемых командах и их формах или стандарте/спецификации, которые соответствуют этому апплетам (например, Global Platform for Card Managers).

Примечание: у нас почти одинаковы ответы APDU.

+2

Я думаю, что CLA и INS указаны в двоичном формате, не шестнадцатеричный. Lc - это кодирование Nc, которое является кодировкой длины поля CDATA. Le - это кодировка Ne, а затем кодирование данных * максимального * ответа, которые могут быть отправлены. В настоящее время это неверно и в спецификациях Java Card :) –

+0

Еще раз благодарю господина Бодева :) Я изменил те части, которые вы упомянули. Но я не понял первое предложение вашего комментария (то есть: _CLA и INS указаны в двоичном, а не в hex._). Не имеет значения только значение? Я имею в виду, как вы знаете, гекса или бин - это только форма взгляда и не имеет значения. Я сказал _ «очередь из ** hex ** numbers» _, потому что я почти всегда вижу команды APDU в их шестнадцатеричной форме ». Я пропустил точку в вашем комментарии? Я думаю, что у меня не было смысла :) – Abraham

+0

Из вашего ответа: «Первые четыре раздела, то есть CLA, INS, P1 и P2, являются обязательными во всех командах APDU, и каждый из них имеет одну длину байта (поэтому CLA = 10101010 или INS = 10101010). это немного недоразумение. Сначала вопрос задал APDU в шестнадцатеричном виде, а теперь INS и CLA в двоичном формате. Если он двоичный, он является допустимым кодированием CLA и INS, даже если BROY просто записал некоторые биты. –

6

Я боюсь, что такой «полной» электронной книги просто не существует. Честно говоря, я думаю, что это совсем не обязательно. Если вы знаете базовый синтаксис Java, вы обнаружите, что JavaCard довольно легко учится (хотя и раздражает использование). Все обычные сложные вещи (потоки, GUI, IO, аннотации, шаблоны, базы данных ...) просто отсутствуют в Javacard, и стандартные библиотеки настолько ограничены, что вы сможете узнать их через несколько дней.

Есть несколько хороших учебников там:

http://www.oracle.com/technetwork/java/embedded/javacard/overview/index.html http://javacard.vetilles.com/tutorial/

и очень хороший SO вопрос:

How to get started with Java Cards?

Чтобы ответить на ваш вопрос: JavaCard это просто язык для написания приложений смарт-карт, называемых апплетами. Он обрабатывает всю логику приложения, но не указывает формат APDU. Это связано с тем, что JavaCard - это не единственная технология смарт-карт. Формат APDU указан в стандарте ISO7816, который я действительно рекомендую вам прочитать. Это не бесплатно, чтобы скачать, но вы можете найти самые важные части здесь:

http://www.cardwerk.com/smartcards/smartcard_standard_ISO7816-4_5_basic_organizations.aspx

Вы нашли бы там, что ваша команда APDU состоит из заголовка:

00A404000E

и a data part:

63616C63756C61746F722E617070.

Заголовок определяет, какая функция должна быть вызвана:

00 - класс байт (CLA, 00 означает, что "команда межотраслевой отправляется логический канал 0")

A4 - инструкция байты (INS, A4 означает "SELECT команду апплет")

04 - параметр 1 (Р1)

00 - параметр 2 (Р2)

0E - длина части данных (Lc)

и часть данных содержит идентификатор апплета, который должен быть выбран для дальнейшего использования (в вашем случае это ASCII строка в кодировке «calculator.app» BTW).

+0

Как понять любые значения CLA или INS? В Интернете нет хорошо оформленных документов. Например, как я могу понять смысл, если CLA = 10101010? или, если INS = 10101010? – anonymous

+0

@BROY Взгляните на главы 5.4.1 и 5.4.2 в этом документе: http://www.cardwerk.com/smartcards/smartcard_standard_ISO7816-4_5_basic_organizations.aspx#chap5_3 – vojta

Смежные вопросы