2002 г
Введение в Java Card. Часть 1
Намиот Д.Е., Сиховец Л.Б.
Эта статья открывает серию материалов, подготовленных сотрудниками Inetique, посвященных технологии смарт-карт и, в частности, технологии Java Card.
Об авторах: к.ф.-м.н. Дмитрий Намиот работает с Java технологиями последние 6 лет. Лев Сиховец является Sun Certified Programmer for the Java Platform 2, имеет более чем пятилетний опыт работы с Java. В настоящий момент оба автора сотрудничают с компанией Inetique, занимающейся разработками в области Java. Вы можете связаться с авторами и получить дополнительную информацию через сайт http://www.inetique.ru.
Java Card API позволяет программам, написанным на языке Java, исполняться на интеллектуальных картах и других устройствах с ограниченными ресурсами.
Интеллектуальные карты (смарт-карты) представляют собой сегодня одни из самых маленьких вычислительных устройств. Например, вы можете встретить устройство с 24 Kb памяти. Естественно, в таких условиях возможна поддержка только некоторого подмножества языка Java.
Виртуальная Java Card машина состоит из двух частей, одна из которых работает непосредственно на самой карте, а другая – на хост-машине вне карты. Вне Java Card исполняются такие процессы, как загрузка классов, проверка байт-кода, оптимизация и т.п. Критерием такого разделения является наличие или отсутствие ограничений на выполнение процесса во время работы программы.
В дополнение к собственно языку Java технология Java Card поддерживает среду исполнения, что влючает в себя вопросы работы с памятью карты, передачи данных, безопасности и выполнения программ. Для Java Cards эта среда соответствует стандарту ISO 7816.
Основная задача этой среды есть строгое разделение собственно смарт-карты и Java приложения. Среда служит своеобразным прокси-сервером, скрывающим от приложения детали собственной реализации. Взаимодействие с программой осуществляется через стандартизованные интерфейсы высокого уровня.
Приложения, написанные для платформы Java Card называются апплетами. Название было выбрано из схожести модели выполнения со стандартными апплетами, исполняемыми в виртуальной машине Java (JVM) веб-браузера.
Платформа Java Card включает в себя три части:
- Виртуальную машину Java Card 2.1 Virtual Machine (JCVM). Спецификация определяет подмножество языка Java и спецификацию JVM, подходящую для смарт-карт.
- Программные интерфейсы Java Card 2.1 Application Programming Interface (API). Спецификация описывает Java пакеты и классы для программирования смарт-карт
- Программные интерфейсы Java Card 2.1 Application Programming Interface (API). Спецификация описывает Java пакеты и классы для программирования смарт-карт
Подмножество языка программирования
Как уже было отмечено выше, в силу ограничений по доступной памяти, платформа Java Card поддерживает только выделенное подмножество языка программирования Java. Оставлены только самые необходимые для программирования опции. Вместе с тем, это по-прежнему объектно-ориентированный язык, и это по-прежнему Java. Например, что поддерживается:
- короткие примитивные типы данных: boolean, byte, short
- одномерные массивы
- пакеты, классы, интерфейсы и исключительные ситуации
- объектно-ориентированные свойства Java: наследование, виртуальные функции, перезагрузка методов, динамическое создание объектов, области видимости.
Не поддерживаются:
- длинные примитивные типы данных: long, double, float
- символы и строки
- многомерные массивы
- динамическая загрузка классов
- сборка мусора
- многопотоковость
- сериализация и клонирование объектов
В этом языковом ограничении возможны вариации. Так, например, на некоторых устройствах поддерживается сборка мусора.
Java Card Virtual Machine
Основное отличие от обычной виртуальной машины Java заключается в том, что JCVM представляет собой набор из двух компонент: то, что находится на самой карте (интерпретатор) и то, что находится вне карты (конвертор). Рабочий цикл может быть проиллюстрирован следующим рисунком:
Конвертор существует вне смарт-карты. Это Java приложение, работающее на пользовательском компьютере. Конвертор переводит обычные .class файлы (стандартный байт-код) в специальный формат CAP (converted applet)
CAP файл загружается в смарт-карту и далее исполняется интерпретатором. В дополнение к преобразованному байт-коду конвертор создает так называемый экспортный файл, который описывает доступные интерфесы сконвертированного класса. Все опции языка программирования, которые не поддерживаются спецификацией Java Card удаляются при конвертировании.
Собственно CAP файл содержит двоичное представление классов в пользовательском пакете. Фактически этот файл представляет собой Java архив (.jar файл). В архиве содержится информация о классах, выполняемый байт-код, информация о связывании и т.п. Байт-код, определемый CAP построен на основе стандартного Java байт-кода и оптимизирован для исполнения в условиях ограниченных ресурсов смарт-карты. CAP файл определяет двоичную совместимость приложений на платформе Java Card.
Экспортные файлы не загружаются непосредственно в смарт-карту и, следовательно, не используются интерпретатором. Их назначение есть поддержка процесса верификации. В некотором смысле они подобны файлам заголовков в языке C.
Экспортный файл содержит интерфейсов для конвертируемого пакета.описание Он содержит имена и области видимости для классов, а также области видимости и заголовки для всех методов. Также файл содержит информацию о связывании, необходимую для разрешения ссылок между пакетами приложения.
Как и файл заголовков в языке C (или как определение интерфейса в языке Java), экспортный файл не содержит реализации. Это дает возможность свободного распространения экспортных файлов, без раскрытия деталей реализации
Конвертор
Преобразуется всегда весь пакет, представляющий собой пользовательское приложение. Как обычно, компилятор Java создает стандартный байт-код. Далее конвертор преобразует все полученные .class файлы.
Во время этого преобразования конвертор выполняет задачи, обычно решаемые стандартной JVM во время загрузки приложения. Для Java Card эти задачи не выполнимы на самой карте в силу недостатка ресурсов. Именно поэтому выше и говорилось о составном характере виртуальной машины Java на платформе Java Card. Конвертор (как одна из частей JCVM) выполняет свою часть общего процесса исполнения приложения. В частности, конвертор:
- проверяет корректность байт-кода
- проверяет нарушения стандарта Java Card (подмножества Java)
- выполняет инициализацию статических переменных
- разрешает символические ссылки для классов, методов и полей класса и переводит их в более компактную форму, лучше приспособленную к ограничениям среды смарт-карты
- оптимизирует байт-код
- размешает память и создает структуры JVM для представления классов
В качестве входной информации конвертор может также использовать экспортные файлы. Это происходит в том случае, если конвертируемый пакет импортирует классы из других пакетов. В этом случае эти пакеты будут представляться для контейнера своими экспортными файлами.
Как уже отмечалось выше, помимо собственно CAP файла, конвертор создает экспортный файл для всего пакета.
Общая схема иллюстрируется следущим рисунком:
Интерпретатор
Как обычно, интерпретатор обеспечивает поддержку языка Java (байт-кода) во время исполнения. Собственно интерпретация (в отличие от компиляции) обеспечивает независимость кода апплета от аппаратуры. Интерпретатор выполняет, например, следующие задачи:
- исполнение байт-кода
- управление памятью и созданием объектов
- обеспечение безопасности
Заключение
В данном обзоре были рассмотрены основные моменты реализации платформы Java Card. В последущих частях мы остановимся на вопросах инсталляции апплетов, описании JCRE и Java Card API
Литература
- Smart Card Application Development Using Java by Uwe Hansmann (Editor), et al
- Java Card (tm) for Smart Cards: Architecture and Programmer's Guide (The Java Series) Zhiqun Chen
- Java Card for E-Payment Applications by Vesna Hassler, et al
- Smart Card Handbook, 2nd Edition by W. Rankl, W. Effing