Модераторы: AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Hello world на Java Card 
:(
    Опции темы
firstone
Дата 14.4.2008, 09:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 25.9.2007
Где: Кровью залитая Св ятая Земля

Репутация: 5
Всего: 7



Это черновик!

Приветствую!

Думаю начинать нужно с простого, а посему разберем простой пример: карта передаст сообщение "Hello Java Card world!". По скольку как ни смотри мы программируем внешнее устройство, то нам придется перевести строку в ее байтовый вид (здесь я использовал ASCII-кодировку):  48 65 6C 6C 6F 20 4A 61 76 61 20 43 61 72 64 20 77 6F 72 6C 64 21. Ну что, приступим?

Сперва необходимо сказать пару слов oб организации информации на карте. Все приложения на карте делятся на два вида: security domains & applications. Security domain - это представитель определенной организации, которой принадлежит security domain. Для того, чтобы установить приложение в security domain организации, необходимо получить ее разрешение в виде ключей для аутентификации security domain, а в некоторых случаях и специальную печать (строго говоря криптографическим языком - подпись), уникальную для каждого приложения (апплета). Уровень безопасности определяет организация. Security domain-ов может быть несколько, причем они могут быть пострены в иерархию (подробнее смотрите статью: "Организация информации на карте").

Программные модули на карте имеют следующую структуру: каждое приложение может содержать несколько апплетов. Говоря языком Java приложение - это package, а апплеты отдельные классы в этом package-е, причем и у package и у классов есть уникальные AID (Application ID) - байтовые строки (другими словами - имена). AID задаются разработчиком и содержатся в скомпилированном коде. При загрузке апплетов на карту, AID всех апплетов + AID самого package регистрируются в реестре карты. Кроме самих AID в реестр записываются также привелегии (такие как, например может ли апплет удалять апплеты в другом security domain-е, блокировать карту и пр.) 

Для того, чтобы лучше понять следующее Вам желательно ознакомиться со статьей "Смарт карты. Общие сведения".

Модуль приложения для Java Card представляет собой класс наследуемый от абстрактного класса javacard.framework.Applet (в большинстве случаев приложения содержат один апплет). Есть минимальный набор методов, которые должны быть реализованы для того, чтобы обеспечить загрузку апплета в память карты и его функционирование, а именно:
  • public static void install(byte[] bArray, short bOffset, byte bLength) - этот метод создает объект апплета в памяти карты (instantiation) и регистрирует его в реестре карты (registration)
  • public void process(APDU apdu) - этот метод вызывается при каждой посылке APDU (см. статью "Смарт Карты. Общие сведения") апплету. Эти данные передаются как параметр. Далее функция process обрабатывает данные посланные ей в зависимости от требований. Эта функция может также послать необходимые данные обратно офф-карт сервису.
Ниже мы разберем эти методы по подробнее.



Метод install
    Метод install имеет следующие параметры:
  • bArray[0] = длина в байтах (Li) AID объекта апплета (instance),
  • bArray[1..Li] = AID объекта апплета,
  • bArray[Li+1]= длина в байтах (Lc) контрольных данных,
  • bArray[Li+2..Li+Lc+1] = контрольные данные,
  • bArray[Li+Lc+2] = длина в байтах (La) данных апплета,
  • bArray[Li+Lc+2..Li+Lc+La+1] = данные апплета
AID объекта апплета: обсуждалось выше
Контрольные данные: это в принципе привилегии (privileges) для апплета (т.е. перечень специальных действий которые ему разрешается выполнять). 1-3 байта
Данные апплета: параметры для апплета (определяются разработчиком)

Как было сказано выше метод install создает объект класса апплета и регистрирует его в реестре карты. Этот метод обязан выполнить эти два действия для успешной установки апплета. Первое, что выполняется - это создание объекта апплета (вызов конструктора), здесь все определяет разработчик. Регистрация апплета выполняется путем вызова метода Applet.register(). У этого метода есть два перегрузчика:

Код

protected final void register(byte[] bArray,
                              short bOffset,
                              byte bLength);
protected final void register();


Первый перегрузчик имеет следующие параметры:
bArray - буфер содержащий AID только что созданного объекта апплета.
bOffset - смещение в буфере указывающее на начало этого AID.
bLength - длина AID.
Именно указанный AID и будет зарегистрирован в реестре карты.

Второй перегрузчик не имеет параметров, он использует AID класса апплета для регистрации в реестре.



Метод process
С методом process все немного сложнее, ведь он ответственнен за всю передачу/прием APDU-пакетов, в чем заключается вся функциональность апплета. Мы конечно же в нашем примере не будем останавливаться на всех тонкостях приема/передачи пакетов, лишь определим команды нашего апплета. Для начала определим CLA (class byte): 0x80. Инструкции выберем следующие:
0х01: Передать сообщение "Hello Java Card world!"
0x02: Ничего не делать (только для проверки)
Все остальные значения INS будут выдавать ошибку 6D00 (т.е. INS value not supported).

Еще один момент заслуживает внимания. Как было сказано выше на карте могут быть установлены несколько апплетов. Значит должен быть какой-то механизм который бы позволил выбрать определенный апплет для работы. Такой механизм представлен командой SELECT (определена в ISO/IEC 7816-4). В поле Data этой команды записывается AID объекта апплета созданного на карте, который необходимо выбрать (эта команда имеет также некоторые параметры, но мы на них останавливаться не будем). В классе Applet есть специальный метод, позволяющий отличить команду выбора этого апплета от всех других команд: 
Код

protected final boolean selectingApplet()

Этот метод может вызываться только из метода process. Обычно в случае выбора апплета возвращают код 9000, т.е. удачное выполнение команды.

И так, давайте посмотрим на нашу программу:

Код

package ru.vingrad.forum.javacard.examples;

import javacard.framework.APDU;
import javacard.framework.Applet;
import javacard.framework.ISO7816;
import javacard.framework.ISOException;

public class Hello extends Applet {

    /**
     * Instruction: say hello
     */
    private final static byte SAY_HELLO_INS = (byte) 0x01;
    
    /**
     * Instruction: do nothing
     */
    private final static byte DO_NOTHING_INS = (byte) 0x02;

    /**
     * Byte array representing "Hello Java Card world!" string.
     */
    private static byte[] helloMessage = new byte[]
    {
        0x48, 0x65, 0x6C, 0x6C, 0x6F, 0x20, // "Hello "
        0x4A, 0x61, 0x76, 0x61, 0x20,        // "Java " 
        0x43, 0x61, 0x72, 0x64, 0x20,        // "Card " 
        0x77, 0x6F, 0x72, 0x6C, 0x64, 0x21  // "world!"
    };
    
    /**
     * This method is called once during applet instantiation process.
     * @param bArray 
     * @param bOffset
     * @param bLength
     * @throws ISOException
     */
    public static void install(byte[] bArray, short bOffset, byte bLength  ) 
        throws ISOException 
    {
        new Hello().register(bArray, (short) (bOffset + 1), bArray[bOffset]);
    }
    
    /**
     * This method is called each time the applet receives APDU.
     */
    public void process(APDU apdu) {
        byte[] buffer = apdu.getBuffer();

        // Handle applet selecting.
        if (selectingApplet()) {
            // Return 9000 - selecting is successful
            return;
        }
        
        // Now determine the requested instruction: 
        switch (buffer[ISO7816.OFFSET_INS]) {
        case SAY_HELLO_INS:
            sayHello(apdu);
            return; 
        case DO_NOTHING_INS:
            return;
        default:
            // We do not support any other INS values
            ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED);
        }
        return;
    }

    /**
     * Sends hello message to host using given APDU.
     * @param apdu APDU that requested hello message
     */
    private void sayHello(APDU apdu) {
        // Here all bytes of the APDU are stored
        byte[] buffer = apdu.getBuffer();

        // Get length of hello message
        short length = (short) helloMessage.length;
        // Tell JVM that we will send data
        apdu.setOutgoing(); 
        // Set the length of data to send
        apdu.setOutgoingLength((byte) length);
        
        // Copy hello message to the APDU buffer
        for (short i = 0; i < length; i++)
            buffer[i] = helloMessage[i]; 
        
        // Send our message starting at 0 position
        apdu.sendBytes((short) 0, length); 
    }
}


Для того, чтобы скомпилировать и установить апплет, ознакомтесь со статьей: "Компиляция и установка приложений на Java Card"

Давайте теперь запустим наше приложение на карте.

Это сообщение отредактировал(а) firstone - 17.4.2008, 12:09
--------------------
В программировании я конфуцианец. В жизни я либерал-демократ. В душе я буддист.Добавлено через 1 минуту и 9 секундА на самом деле я лентяй.
PM MAIL   Вверх
Alexandr87
Дата 28.4.2008, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


дыкий псых
***


Профиль
Группа: Завсегдатай
Сообщений: 1459
Регистрация: 27.11.2004
Где: Алматы, Казахстан

Репутация: нет
Всего: 39



<здесь был тупой вопрос, возникший по невнимательности>


Это сообщение отредактировал(а) Alexandr87 - 30.4.2008, 08:01
PM Jabber   Вверх
jmdonetsk
Дата 17.4.2011, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 17.4.2011

Репутация: нет
Всего: нет



Подскажите почему Jcop tool не создает .сар файл, и в результате не может его загрузить на карту... 
С картами только начинаю разбираться, извините за примитивный вопрос 

Вопрос решился полным сносом eclipse и повторной установкой. 

Это сообщение отредактировал(а) jmdonetsk - 18.4.2011, 01:27
PM MAIL   Вверх
sknzv
Дата 5.5.2011, 21:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 5.5.2011

Репутация: нет
Всего: нет



добрый вечер!! скачал и установил "java_card_kit-classic-3_0_2-rr-bin-do-b48-windows-11_dec_2009.jar"..пытался запустить апплет helloworld как описано в документации..при вводе команды "ant all" выводит сообщение "ant не является внутренней или внешней программой.."..что такое ant и как исправить ошибку?? спасибо!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java Card | Следующая тема »


 




[ Время генерации скрипта: 0.1201 ]   [ Использовано запросов: 23 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.