Как разрабатывать и тестировать приложения для Java Card

В статье рассказывается о том, как написать приложения для выпущенных компанией Dallas Semiconductor устройств Java iButtons, поддерживающих спецификацию Java Card 2.0. Эти устройства называются кольцами (Ring), поскольку их можно носить как обычные ювелирные украшения. Да, да, не улыбайтесь! Весьма скоро эта технология "обернется вокруг вашего пальца", а, возможно, и будет вмонтирована в вашу одежду! Смарт-карты имеют размер обычной кредитной карточки и прекрасно работают во многих приложениях. Между тем, предложенный компанией Dallas Semiconductor конструктив имеет по сравнению с устройствами типа кредитной карточки определенные преимущества: он предлагает более мощную среду выполнения программ, увеличенную емкость памяти и время работы от батареи, а также включает в себя часы (таймер реального времени). По мере развития данной технологии возможно появление устройств и с другими конструктивными параметрами.

Постановка задачи

Итак, поговорим о том, как с помощью Java Card можно решать реальные задачи. С помощью информации, представленной в этой статье и в других материалах данной серии по смарт-картам, вы сможете организовать взаимодействие устройства с браузером и передавать данные не с жесткого диска, а с кольца или смарт-карты. Для чего это нужно?

Сколько раз в день вам приходится вручать кому-то свою визитку и устно сообщать необходимые сведения? А сколько времени вы тратите на сбор и сканирование визитных карточек для ввода их в компьютер? Я вынужден иметь дело с визитными карточками и личной информацией столь часто, что я был бы рад заплатить за любую технологию, способную предложить решение этой проблемы. Странно, что телефонные компании не придумали пока способа автоматической передачи такого рода сведений (которые обычно называют профильной информацией) прямо по телефону.

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

Для работы с личной информацией предложен такой стандарт как OPS (Open Profiling Standard), а для электронного обмена данными EDI (electronic data interchange) в экстрасетях существует стандарт под названием ICE. Сами эти стандарты содержат довольно много спецификаций, и изложить их все в такой короткой статье просто невозможно, однако мы познакомим вас с основными компонентами, которые можно использовать для построения системы доставки подобной профильной информации.

Разработка апплетов для устройств Java iButtons

Мы предполагаем, что вы читали статью "Основы Java Card 2.0" Жикун Чена (см. мартовский выпуск JavaWorld Россия). На следующем рисунке в общем виде показан процесс разработки приложений.

Picture 1.

Данная диаграмма описывает процесс создания байт-кодов Java, преобразования их в формат, "понятный" смарт-карте, и загрузки этих байт-кодов. Ниже показано, какое минимальное программное и аппаратное обеспечение необходимо для разработки приложения.

Архитектура программного обеспечения

Программная архитектура коммуникаций с устройствами Java iButton требует программного и аппаратного обеспечения. Коммуникации с кольцами реализуются посредством пакетов APDU, передаваемых через последовательное или параллельное соединение. ПО, необходимое для передачи пакетов APDU считывателю, указано в разделе "Ресурсы". Для взаимодействия с последовательными и параллельными устройствами в этом ПО применяется экспериментальный API-интерфейс под названием Java.smartcard и недавно выпущенный интерфейс javax.comm.

Коммуникационный интерфейс Java Card, реализуемый в считывателях с помощью пакетов APDU/PDU
Java-
прило-
жение
Агент карты Java-
прило-
жение
Java-
прило-
жение
Java-
прило-
жение
Open Card
javacard.framework
java.smartcard
Адаптер PC/SC Драйвер, реали-
зованный на "родном" коде
Драйвер, реали-
зованный исключи-
тельно на Java
Драйвер, реали-
зованный исключи-
тельно на Java
Драйвер PC/SC Драйвер PC/SC javax.comm
Последо-
вательный считыватель
Считыватель PC Card Инфра-
красный считыватель
Считыватель кольца

ПО, указанное в разделе "Ресурсы", поддерживает все представленные выше архитектуры. Представленная в таблице схема обеспечивает несколько путей; одни являются обязательными, другие - нет. Обратите внимание, что java.smartcard представляет собой экспериментальный API-интерфейс, применяемый для передачи и приема пакетов APDU. Несмотря на свое название, он не является официальным API-интерфейсом JavaSoft и не обязательно станет основой будущих комплектов JDK или расширений. Использование API для javacard.framework четко определяется в "Принципах программирования Java Card 2.0" (см. "Ресурсы"). Между тем, для совместимости с Java Card 2.0 всегда необходимо применять javacard.framework. Это очень важный API-интерфейс для создания приложений. Иногда возникает необходимость и в дополнительных вызовах API, предлагаемых производителями устройств, или в других интерфейсах программирования типа стандартных расширений, определенных в API Java Card 2.0. В статье "Основы Java Card 2.0" об этом рассказывается достаточно подробно.

Требования к аппаратному обеспечению

Для данного приложения необходимы кольцо и считыватель. Устройства Java iButton могут применяться с параллельным или последовательным считывателем (оба варианта выпускаются компанией Dallas Semiconductor). Информацию о приобретении аппаратного обеспечения можно найти в разделе "Ресурсы". Я думаю, что цены вам понравятся.

Считыватель для последовательного порта

Адаптер последовательного порта DS9097U-9 соединяется с последовательным портом хост-системы через разъем DB9-S. Он подключается непосредственно к портативным ПК, компьютерам Java Station и многим настольным системам. Для соединения с большинством SPARC-станций необходим переходник (для преобразования вилочной части разъема в гнездовую или наоборот) и адаптер, превращающий 25-контактный разъем в 9-контактный. Последовательный адаптер DS9097U-9 подключается к разъему RJ11 на приемном узле DS1402D-DR8 Blue Dot. Достаточно прикоснуться устройством iButton к контакту Blue Dot.

Считыватель для параллельного порта

Разъем DB25-P (вилочный) параллельного адаптера DS1410E вставляется в параллельный порт любого ПК или портативного компьютера. Кабель принтера можно соединить с разъемом DB25-S (гнездовым) адаптера DS1410E. Параллельный адаптер DS1410E подключается к пустому микрогнезду приемного узла DS1402D-DB8. Достаточно прикоснуться устройством iButton к контакту Blue Dot. Следует отметить, что коммуникации через параллельный адаптер DS1410E поддерживаются только на платформах Win32.

Архитектура апплета

Да, Java Card поддерживает апплеты! Апплет, написанный для выполнения на Java Ring, строится по очень простой схеме. Процесс его создания похож на программирование обычного Java-апплета тем, что разработчик может переопределить несколько методов, а именно:

  • deselect - выбирается другой (или возможно тот же) апплет;
  • install - инсталлирует апплет;
  • process - сюда поступают входящие пакеты APDU;
  • register - регистрирует апплет;
  • select - вызывается, когда принимается команда select;

Разработчики апплета Java должны переопределять как минимум методы install и process базового класса Applet. В таком простом апплете как BusinessCard метод install просто создает новый экземпляр. Регистрация апплета в среде выполнения JCRE (Java Card Runtime Environment) возлагается на метод-конструктор.

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

class BusinessCard extends Applet {
public BusinessCard() { 
// Зарегистрировать апплет в JCRE
register();
} 
public static void install(APDU apdu) { 
new BusinessCard();
} 
public void process(APDU apdu) 
throws ISOException { . . . } . . . }

Для взаимодействия с хост-системой, называемой также "терминалом карты", данный апплет должен реализовывать метод process. Этот метод вызывается в выбранном апплете при получении с хост-системы команды APDU. Ниже приведен фрагмент реализации метода process апплета BusinessCard. Его структура аналогична апплетам Java Card.

public void process(APDU apdu) 
	throws ISOException {
byte[] buffer = apdu.getBuffer(); 
// Обрабатывать выбор отдельно
. 
. 
.
if (buffer[ISO.OFFSET_CLA] != BC_CLA) { 
// Неизвестно, что делать с этой командой
throw new ISOException
	(ISO.SW_CLA_NOT_SUPPORTED);
} 
else { 
switch (buffer[ISO.OFFSET_INS]) { 
// Сохранить новые 
// данные визитной карточки
case BC_INS_STORE: 
businessCardStore(apdu); 
break;
// Передать данные 
// визитной карточки хост-системе
case BC_INS_RETRIEVE: 
businessCardRetrieve(apdu); 
break;
default: 
// Неизвестно, что делать с данной командой
throw new ISOException
	(ISO.SW_INS_NOT_SUPPORTED);
}
}
} 

Основное назначение метода process состоит в определении целостности заголовка APDU (CLA, INS и т.д.) и вызове корректного метода диспетчеризации. Если у метода process возникают трудности с распознаванием заголовка, то порождается экземпляр ISOException с соответствующим кодом состояния. Разработчик должен определить воспринимаемые пакеты APDU и их формат.

Обмен данными с кольцом

Обычно метод диспетчеризации интерпретирует команду APDU, выполняет требуемые действия и возвращает ответный пакет APDU хост-системе. Метод диспетчеризации апплета BusinessCard для процесса выборки информации демонстрирует простой пример возврата данных хосту.

protected void businessCardRetrieve(APDU apdu) {
if (bcData != null) { 
apdu.setOutgoing(); 
// Возвратить данные 
// визитной карточки хост-системе
apdu.sendBytesLong(bcData, 
		       (short) 0, 
		       (short) bcData.length);
}
} 

Как можно догадаться, метод sendBytesLong воспринимает в качестве параметров массив, смещение и счетчик байтов, а данные возвращаются хост-системе в теле ответного пакета APDU. Поскольку байтов заголовка мы не изменяем, команда и ответный пакет APDU будут иметь один и тот же заголовок.

Постпроцесс компиляции с последующим выполнением

Производители карт могут предусматривать свои собственные программы для персонализации - процесса, при котором пустая карта персонализируется согласно выполняемой задаче. (В карту можно одновременно загружать апплеты и устанавливать личный идентификационный номер PIN.) Большинство карт требуют пост-обработки для преобразования байт-кодов в необходимый формат. Эти программы обычно позволяют вам взаимодействовать с устройством через визуальный интерфейс. Компания Dallas Semiconductor предлагает для этого соответствующую программу. Ее исходный код можно найти в комплекте разработки, указанном в разделе "Ресурсы". Не забудьте прочитать сопровождающий ее файл README. Он содержит важную информацию о пост-обработке байт-кодов Java и их преобразования в формат, подходящий для программы-загрузчика.

Представленная программа позволяет инсталлировать апплет в кольцо, передавать пакеты APDU, получать ответ на переданные пакеты APDU, а также использовать дополнительные служебные методы, предусмотренные производителем. Эту программу и более подробные инструкции можно найти в разделе "Ресурсы". Там же перечислены команды APDU, распознаваемые устройством Java iButton.

Пример апплета

Визитная карточка Java Card должна иметь возможность сохранять и считывать информацию. Такую электронную визитную карточку можно вставить в считыватель хост-системы, где имеется воспринимающее ее информацию ПО. После того как данное ПО обнаружит наличие кольца, пользователь может просмотреть или изменить данные. Используя подмножества стандартного языка Java, определенного в спецификации Java Card 2.0, достаточно развитые средства работы со стеком и "сборки мусора" Java iButton, можно выполнять апплеты с довольно существенными требованиями к вычислительным ресурсам. Апплет визитной карточки предлагает превосходное решение вышеупомянутой проблемы - эффективной передачи информации визитной карточки. Среда, в которой работает клиентское и серверное ПО, представлена в следующей таблице.

Хост-компьютер Коммуникации Java Ring
Хост-программа визитной карточки
  • Загрузка информации карточки
  • Сохранение информации карточки
Пакеты APDU Апплет визитной карточки
  • Загрузка информации карточки
  • Сохранение информации карточки

Пользователи носят с собой устройство iButton со своей личной информацией. Когда это устройство вставляется в систему, содержащую соответствующее ПО хост-машины, данную информацию можно считать из кольца или сохранить в кольце.

Многих беспокоит угроза информационной безопасности при такого рода транзакциях. Важно знать о том, как предотвратить несанкционированный доступ к личной информации. К счастью, наш пример Java Card можно легко модифицировать таким образом, чтобы пользователь мог ввести свой личный идентификационный номер (PIN). Это позволяет распознать несанкционированный запрос.

Например, на конференции поставщик может поинтересоваться вашей фамилией. Вместо того, чтобы давать ему клочок бумаги (визитную карточку), вы вставляете кольцо в его PDA, на котором функционирует PersonalJava. Если этот поставщик предпочитает оповещать всех заинтересованных лиц по почте, то данное ПО запросит ваш адрес. Если вы закрыли несанкционированный доступ к данной конкретной информации, карточка запросит ваш PIN. Предположим, ваша визитная карточка Java Card требует личного номера PIN при запросе любой информации, кроме вашего имени. Означает ли это полную защиту? Не совсем. Распространено убеждение, что ввод идентификационного номера PIN в любое устройство доступа потенциально опасен. Почему? Кто-нибудь может изъять ваш PIN из сети супермаркета, изготовить несколько пластиковых карточек и отправиться прямо в банк, снимать ваши деньги. На самом деле проделать все это достаточно нетрудно. Каково же решение?

Можно использовать устройство доступа по личному идентификационному номеру и всегда носить его с собой. При вводе PIN устройство не передает личный идентификатор, а использует некий другой протокол аутентификации.

Заключение

Устройства Java iButtons, обсуждаемые в данной статье, реализованы на основе версии 2.0 спецификации Java Card API. Пользователи Internet и корпоративных интрасетей получают от Java Card дополнительные преимущества по сравнению с традиционными смарт-картами (такие как защищенное хранение мобильных данных) в сочетании с гибкостью Java. Для программистов самое весомое преимущество заключается в том, что вместо использования специализированного языка загружаемые в карту приложения можно писать на языке Java. Мы продемонстрировали возможность программирования смарт-карт с помощью спецификации Java Card. При некоторых усилиях можно раздобыть достаточно инструментальных средств и документации для успешного применения данной технологии.

Ресурсы

  • Последняя версия комплекта разработки от Dallas Semiconductor (для выполнения демонстрационного примера к компьютеру нужно подключить считыватель)
    http://www.ibutton.com/devkit
  • Базовая страница Java Card компании JavaSoft (содержит все API и дополнительные примеры, которые должны работать на картах)
    http://www.javasoft.com/javacard
  • Команды APDU, специфические для устройств Java iButton (краткий перечень распознаваемых картой пакетов и команд APDU)
    http://www.javaworld.com/javaworld/jw-04-1998/ibuttons/cmds.html
  • Развивающийся стандарт для коммуникаций со смарт-картами
    http://www.opencard.org/
  • Принципы программирования для Java Card (файл в формате pdf)
    http://www.javaworld.com/javaworld/
    jw-04-1998/ibuttons/JC20-Concepts.pdf
  • Java Card 2.0 API (файл в формате pdf)
    http://www.javaworld.com/javaworld/
    jw-04-1998/ibuttons/JC20API-prtrat.pdf