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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Зачем этот раздел 
:(
    Опции темы
Samuil
Дата 29.1.2008, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


в(Job)ываю
**


Профиль
Группа: Участник
Сообщений: 705
Регистрация: 26.4.2006
Где: Uzbekistan.Tashke nt

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



firstone, уважаю. 
Приведи пожалуйста самый простенький пример на JC, как Hello World и как его откомпилить. Эта тема заинтересовала многих, и я думаю им тоже будет интересно.
Заранее благодарен.

Это сообщение отредактировал(а) Samuil - 29.1.2008, 11:40


--------------------
Выбор уже сделан, остается его только осознать   
smile    smile 
      smile  

user posted image
PM MAIL ICQ   Вверх
nornad
Дата 29.1.2008, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1079
Регистрация: 16.2.2007
Где: в Караганде

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



Цитата(Alexandr87 @  19.1.2008,  11:21 Найти цитируемый пост)
деньги налом получаете? интернет -банкингов нет? e-cash нет? мобильников тоже нет? Кстати у вас водительские удостоверения в караганде старого образца? 

Удостоверения - не знаю, машины нет, прав тоже. Да и не горю желанием машину приобретать - на дорогах и без меня гонщиков валом.
Деньги у нас всё чаще карточками, но в магазин у нас с карточкой ходить неудобно - редко, где принимают.
Интернет-банкинга у нас нет. Точнее, были попытки у пары банков, но это ТАК удобно, что все их нафиг послали.
e-cash у нас только вебмани, да и те всего в нескольких точках в городе. Добавим, что продают их не весь день, а только в определённые часы и за бешенные деньги (курс бакса процентов на 20 выше, чем в обменнике, если покупать и несколько ниже, если продавать) - выходит, что и их практически нет. smile
Вот я и говорю - деревня. smile)))



--------------------
Три достоинства программиста: Леность, Нетерпение и Гордость
Ларри Уолл
PM MAIL WWW ICQ Skype MSN   Вверх
firstone
Дата 30.1.2008, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Здравствуйте, Samuil.

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

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

И так, самый простой апплет будет следующего вида:

Код

package ru.vingrad.forum.javacard.test;

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

public class Test extends Applet {

    public static void install(byte[] bArray, short bOffset, byte bLength) {
        // GP-compliant JavaCard applet registration
        new Test().register(bArray, (short) (bOffset + 1), bArray[bOffset]);
    }

    public void process(APDU apdu) {
        // Good practice: Return 9000 on SELECT
        if (selectingApplet()) {
            return;
        }

        byte[] buf = apdu.getBuffer();
        switch (buf[ISO7816.OFFSET_INS]) {
        case (byte) 0x00:
            break;
        default:
            // good practice: If you don't know the INStruction, say so:
            ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED);
        }
    }
}


И так, давайте посмотрим, что у нас есть. 
Метод install не использует опциональные параметры установки апплета, которые могут быть посланы. Единственное, что он производит - это обязательную регистрацию самого апплета в реестре смарт карты (Java Card Run-time Environment). Таким образом смарт карта будет "знать", что у нее установлен этот апплет. Каждый апплет должен иметь уникальное имя AID (Application ID) которое сохраняется в коде аплета (после компиляции) и в реестре JCRE после регистрации. Еще одна важная вещь, касающаяся установки апплетов. Вся память, которая когда-либо потребуется нашему апплету должна быть (настоятельно рекомендовано) выделена при установке. Ресурсы памяти у смарт карты ограничены и не могут быть выделены при каждом new. 

Метод process на первый взгляд немного посложнее. В первой проверке (if (selectingApplet()) ... ) проверяется, не была ли последняя команда  SELECT (определена в ISO/IEC 7816-4) запущена для выборки этого самого апплета. Дело в том, что для того, чтобы послать что-то определенному апплету, необходимо его заведомо выбрать командой SELECT. Это объясняется тем, что на одной карте могут быть установлены несколько апплетов.
Далее мы получаем все байты посланного APDU в массив buf. По хорошему после этого нам бы следовало проверить первый байт (CLA - класс команды APDU) на предмет его принадлежности к поддерживаемым CLA значениям нашего апплета, но мы этого не делаем для простоты примера. Далее мы проверяем значение второго байта APDU - INS (INStruction  code - код команды). INS определяет команду, которую нужно выполнить будь то получить какие-либо данные персонализации (имя, фамилия, номер студента, аддресс и т.д.), послать какие-либо данные или выполнить любую другую операцию (например отнять от текущего баланса стоимость телефонного разговора).
Как видно из примера единственный поддерживаемый код - 00. При получении этого кода наш апплет ничего не делает.
Особого внимания заслуживает ситуация default. Поскольку память у смарт карты ограничена несколькими десятками килобайтов, ее нельзя попросту использовать, как ОЗУ у ПК. Поэтому мы не можем просто так создать объект класса ISOException. Для того, чтобы выкинуть exception, необходимо воспользоваться предлагаемым методом: throwIt.

Ну что ж, давайте порпобуем скомпилировать и установить на карточку нашу программу.
Прежде всего несколько слов о компиляции. Нужно использовать транслятор для Java версии 4. после того, как мы получили .class файл, его необходимо сконвертировать утилитой от SUN (в пакете JC Development Kit) в .cap файл. Далее этот файл загружается на карту. Процесс загрузки описан в открытом стандарте Global Platform и Java Card Specification. Я написал свой собственный uploader. В последующих статьях я буду детально описывать формат .cap файла и каким образом он должен быть переслан на карту.

И так, после загрузки и установки апплета, выберем его по его AID:
Код

 => 00 A4 04 00 07 A0 00 00 02 47 55 55 00             .........GUU.
 (17027 usec)
 <= 90 00                                              ..
Status: No Error

Сразу объясню что и как. Здесь стрелочка => указывает на то, что данные были посланы карте, а стрелочка <= - на получение данных с карты.
И так, первая команда: 00 A4 04 00 07 A0 00 00 02 47 55 55 00. Если Вы читали мою первую статью, то должны знать, что:
CLA: 00 - класс команд ISO
INS: A4 - инструкция (команда) SELECT (см. ISO/IEC 7816-4 раздел 7.1.1)
P1: 04 - первый параметр команды SELECT (выбрать по имени аппликации, т.е. AID)
P2: 00 - второй параметр (выбрать при первом или единственном случае)
Lc: 07 - длина поля Data (в нашел случае содержит AID)
Data: A0 00 00 02 47 55 55 - поле Data хранит AID нашего апплета (я задал его изначально).
Le: 00 - количество байт в сообщении response на это APDU.

Обратите внимание, что код возврата - 9000, т.е. карта сообщает об успешном выполнении операции (команды SELECT).

Далее мы можем уже послать команду непосредственно нашему апплету.:
Код

 => 80 00 00 00 00                                     .....
 (16044 usec)
 <= 90 00                                              ..
Status: No Error

Давайте посмотрим, что это за команда. На самом деле она нигде не определена.
CLA: 80 - выбрал его просто так
INS: 00 - единственный код инструкции, который поддерживает наш апплет.
P1: 00 - я не определял никаких параметров для инструкции
P2: 00 - || --- || --- || --- || --- || --- || --- || --- || --- || --- || --- || --- || --- || ---
Обратите внимание, здесь нет опциональных полей Lc и Data.
Наш апплет работает. На наш запрос вернулся ответ 9000 - индикатор успешного выполнения операции.
Давайте попробуем вызвать ошибку. Сделать это просто - послать любой другой код инструкции, например 01:
Код

 => 80 01 00 00 00                                     .....
 (16004 usec)
 <= 6D 00                                              m.
Status: INS value not supported


Ч.т.д.

Надеюсь этот пример пролил немного света на технологию Java Card.
Если что-то непонятно, или понятно но не до конца, спросите. Я буду рад Вам помочь.

С уважением, firstone.
--------------------
В программировании я конфуцианец. В жизни я либерал-демократ. В душе я буддист.Добавлено через 1 минуту и 9 секундА на самом деле я лентяй.
PM MAIL   Вверх
firstone
Дата 30.1.2008, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



nornad, доброго времени суток!

Скоро у вас (в Казахстане) появятся новые водительские удостоверения. На картах будут установлены апплеты Java Card. Наша компания учавствует в этом проекте.



Это сообщение отредактировал(а) firstone - 30.1.2008, 15:45
--------------------
В программировании я конфуцианец. В жизни я либерал-демократ. В душе я буддист.Добавлено через 1 минуту и 9 секундА на самом деле я лентяй.
PM MAIL   Вверх
LSD
Дата 30.1.2008, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15708
Регистрация: 24.3.2004

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



Цитата(firstone @  30.1.2008,  14:15 Найти цитируемый пост)
Каждый апплет должен иметь уникальное имя AID (Application ID) которое сохраняется в коде аплета (после компиляции) и в реестре JCRE после регистрации.

Я не увидел его в коде апплета. AID как-то генерируется компилятором (наподобие serialVersionUID) или просто здесь пропущен?

Цитата(firstone @  30.1.2008,  14:15 Найти цитируемый пост)
Метод install не использует опциональные параметры установки апплета, которые могут быть посланы. Единственное, что он производит - это обязательную регистрацию самого апплета в реестре смарт карты (Java Card Run-time Environment).

Можно поподробней о входных параметрах, и что за метод был вызван в коде? И надо обязательно реализовывать его как static?


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
firstone
Дата 30.1.2008, 19:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Приветствую, LSD.

Цитата(LSD @  30.1.2008,  18:11 Найти цитируемый пост)
Я не увидел его в коде апплета. AID как-то генерируется компилятором (наподобие serialVersionUID) или просто здесь пропущен?

Это скорее я неправильно выразился. 
Всего есть 3 разных AID на карте, если мы загружаем апплет:
1) для package (появляется после загрузки package'а)
2) для класса апплета (появляется после загрузки package'а)
3) для объекта апплета (появляется только после установки - install)

В одном package могут быть несколько апплетов. При установке необходимо указать AID package, AID класса апплета и AID нового объекта апплета. AID package и AID класса сохраняются в скомпилированном коде .cap файла. Туда его записывает программа-конвертор (есть программы, которые и компилируют и конвертируют). Когда package и класс(ы) апплета(ов) записываются на карту, они регистрируются но с помощью специальных APDU команд. Далее при установке, указывается еще один AID - для объекта апплета.

Цитата(LSD @  30.1.2008,  18:11 Найти цитируемый пост)
Можно поподробней о входных параметрах, и что за метод был вызван в коде? И надо обязательно реализовывать его как static? 

Входные параметры могут содержать информацию о, например, количестве необходимой памяти для апплета. Если вам известно, что в процесс персонализации карты (т.е. записи в нее информации о уже конкретном человеке) будет использовано до 14кб для фотографии лица, то в методе install нужно будет выделить этот буфер.

Извините, я не понял Ваш вопрос касательно "что за метод был вызван в коде?". Если вы о register, то у него есть два перегрузчика:
Код

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

Первый метод получает AID для объекта апплета и регистрирует его. Второй берет AID класса апплета и регистрирует объект с тем же AID.

Касательно Вашего третьего вопроса - ответ да. Когда вызывается метод install, объект апплета еще не инстанциирован (или как там по-русски будет instantiated). В классическом случае именно install должен вызвать конструктор апплета.

Надеюсь это немного помогло Вам.

Добавлено через 6 минут и 38 секунд
Все же я забыл сказать. Все AID прописываются вручную.
--------------------
В программировании я конфуцианец. В жизни я либерал-демократ. В душе я буддист.Добавлено через 1 минуту и 9 секундА на самом деле я лентяй.
PM MAIL   Вверх
LSD
Дата 5.2.2008, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15708
Регистрация: 24.3.2004

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



Цитата(firstone @  30.1.2008,  19:10 Найти цитируемый пост)
1) для package (появляется после загрузки package'а)

Под package подразумевается .cap файл или package-и Java?


Цитата(firstone @  30.1.2008,  19:10 Найти цитируемый пост)
Если вы о register, то у него есть два перегрузчика:
...

Да я об этом.

Тогда мне непонятен код примера:
Код

public static void install(byte[] bArray, short bOffset, byte bLength) {
  // GP-compliant JavaCard applet registration
  new Test().register(bArray, (short) (bOffset + 1), bArray[bOffset]);
}

мы получили AID, а вот дальше делаем с ним, что-то странное. Почему мы просто не передаем полученный AID методу register самого апплета?


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
firstone
Дата 6.2.2008, 20:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Добрый вечер, LSD.

Извиняюсь за отсутствие. Работа, жена, дети...

К сожалению у меня не получается ответить полно в одном посте. Поэтому получается диалог.

Цитата(LSD @  5.2.2008,  15:09 Найти цитируемый пост)
Под package подразумевается .cap файл или package-и Java?

Package-и Java. Каждый такой package должен содержать один или более апплетов.
Тут важно еще уяснить терминологию. В серии стандартов ISO 7816 определена следующая иерархия: Executable Load File под ним могут быть несколько Executable Load File Modules. Так вот этот Executable Load File = package, а Executable Load File Module = applet. Ну а application = instance of applet. 

Цитата(LSD @  5.2.2008,  15:09 Найти цитируемый пост)

Тогда мне непонятен код примера:

ОК. Дело в том, что я упустил тут кое что. Посмотрите на прототип метода install:
Код

public static void install(byte[] bArray, short bOffset, byte bLength) {...}

Здесь первый параметр содержит в себе три составляющих, а именно:
  • 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 байта
Данные апплета = параметры для апплета (определяются разработчиком)

--------------------
В программировании я конфуцианец. В жизни я либерал-демократ. В душе я буддист.Добавлено через 1 минуту и 9 секундА на самом деле я лентяй.
PM MAIL   Вверх
jmdonetsk
Дата 18.4.2011, 02:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



firstone,  а можно поподробнее ( или ткнуть где почитать)
Интересно :
   -  взял пример "Hello Java Card world", но там все заканчивается на самом интересном месте : "Давайте теперь запустим наше приложение на карте."   smile  на карту записываю ( использую  eclipse и jcop tool ) но как запустить апплет ?
- еще было бы интересно узнать как выполнить этот апплет с помощью клиента написанного на C++ или Delphi

PM MAIL   Вверх
Страницы: (3) Все 1 2 [3] 
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java Card | Следующая тема »


 




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


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

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