загрузка...
загрузка...
загрузка...

Детализация по запросу

загрузка...
загрузка...

Блог о пеленгации

Тема поста:

Локация в JavaCard

Здравствуйте, всем и вся.
SIM-карта является неотьемлемой частью телефона. Раз так... и про программирование SIM-карт тоже можно написать, что касаемо локации).

О SIM-карте
SIM-карта - это более частный случай смарт карты. По своему строению это миниатюрный и защищенный от несанкционированного вмешательства микрокомпьютер со своими системами хранения памяти: ROM, EEPROM, RAM, NVRAM. А также со своими генераторами случайных чисел и аппаратной реализацией алгоритмов шифрования.
Одними из основных функции SIM-карт в телефоне:

  1. Идентификация абонента в сети. На карте хранятся: 1) IMSI (International Mobile Subscriber Identity) - уникальный идентификатор SIM-карты, 2) Ключ (Ki) - индивидуальный ключ идентификации. Карта "предоставляет" оператору при регистрации в сети IMSI. Дальнейшая аутентификация абонента происходит при помощи алгоритмов А3 и A8. Смысл "входа/невхода" абонента в сеть такова (в кратце): на стороне Аутентификационного Центра (AUC) оператора происходит генерация псевдослучайной последовательности (RAND). RAND отправляется абоненту. AUC, зная IMSI и связанный с ним Ki, а также сгенерированный RAND - формирует результат вычислений алгоритма А3 (SRES). То же самое выполняется на сим карте. SRES отправляется с абонентского терминала в AUC. В Центре Аутентификации происходит сверка своих и принятых данных и на основе принципа совпадения результатов принимается решение об успешности/неуспешности аутентификации абонента в сети.
  2. Конфиденциальность голосовой связи. Полученный временный ключ (Kc), при помощи алгоритма А8 при аутентификации абонента, в дальнейшем используется для шифрования трафика между терминалом и сетью.
  3. Организация контактной книги. Удобно при смене телефонов с сохранением сим карты.
  4. Формирование списка разрешенных телефонных номеров для звонков. Частичная реализация родительского контроля.
  5. Хранение смс.
  6. Хранение разного вида счетчиков (кол-во звонков, длительность, стоимость и так далее).
  7. Читаем стандарт GSM TS 11.11. Тут описываются данные, которые хранятся в файловой системе сим карты. Исходя из этого вы можете придумать еще кучу функции sim карты. Данный стандарт справедлив для сим карт используемых в GSM сетях.

О разработке программных средств для смарт-карт

Изначально разработка приложений для SMART-карт всегда было непростым делом. Разные карты разных производителей имели разную внутреннюю структуру, хотя карты все похожие). Каждый производитель карт предоставляет свои средства и студии для разработки программных продуктов. И как правило разработка и сам язык написания специфичен. Сторонние фирмы проективарония ПО практически лишены возможности создавать самостоятельно собственные продукты и продавать их потребителям. Отсюда также "вытекает" следующие трудности и проблемы:

  • Трудоемкость создания программ. Реализация собственных протоколов связи низкого уровня. Собственный диспетчер памяти. Индивидуализация разработки под карту конкретного производителя.
  • Приложения очень тесно связаны с ОС карты. Следовательно изменения в карту после выпуска - проблематично.
  • Очень большой период до окончательного релиза продукта.
  • Перенос готовых продуктов на другие платформы труднореализуем или вообще невозможен.
  • Проблемы для широкого распространения смарт-карт.
К сожалению некоторые поставщики/операторы, которым ничего не нужно от жизни, до сих пор используют так называемые native карты, о которых мы вам сейчас рассказали выше.

Тут на сцену выходят смарт-карты с поддержкой технологии Java Card.
Краткое описание данной технологии.
На карте помимо операционной системы ещё устанавливается виртуальная машина Java. Внешнее стороннее разработаное приложение конвертируется в байт код (конечно еще далее конвертируется в CAP или IJC форматы) и далее загружается на карту.
Перечислим плюсы данной технологии:
  • Простота разработки приложений на языке Java.
  • Проблемы безопасности никаким образом не изменились и не ухудшились.
  • Нет препятствий для распространения продукта под смарт-карты.
  • Абстракция от используемых аппаратных средств смарт-карты.
  • Хранение и выполнение на карте множества приложений.
  • Совместимость с другими устройствами.Технология Java Card соответствует международному стандарту смарт-карт ISO 7816. Поэтому она поддерживает не только все системы и приложения, совместимые с ISO 7816, а еще все аплеты на данной технологии Java Card будут работать со всеми существующими устройствами ввода/вывода для смарт-карт.
Немного о ISO 7816
Название:  Информационная технология. Карты идентификационные. Карты на интегральных схемах с контактами.
Часть 1:  Физические характеристики карт.
Часть 2:  Размеры и расположение контактов.
Часть 3:  Электронные сигналы и протоколы передачи.
Часть 4:  Межотраслевые команды для обмена.
Остальные части - это дополнения к существующим.

Программирование в Java Card

Язык java в данной технологии по своей урезанности находится в цепочке (в сторону уменьшения функциональности): Java->JavaMe->Java Card. То есть язык очень сильно ограничен по своим функциям. Из типов данных есть однобайтовый boolean и byte, двухбайтовый short. Int не встречался, но если надо реализовать вам, к примеру для хранения больших сумм валюты в приложении, то рекомендуется просто использовать массив из 4-х byte.
Помимо первостепенных ограничений, которые накладывает технология Java Card, есть рекомендации и правила по созданию программ вплоть до того, как выделять память для временных объектов и прочее.
Основные и важные позиции в этих правилах:

  • Минимизировать запись в EEPROM. Использовать RAM. Но надо помнить, что оперативная память - это дорогое удовольствие.
  • Не переусердствуйте в создании большого количества классов. Понимаю, что ООП - это показатель вашей состоятельности в области программирования, но тут совершенно другие правила и ограничения.
  • При устранении избыточного кода, растет количество функций. А функции - это дополнительные расходы на хранение структур данных в памяти карты. Знайте меру)
  • Временные объекты, созданные с помощью оператора new, использовать повторно без использования уже оператора new. Использовать private static Object aInstance;
  • При доступе к массиву данных, если используется много раз индекс с одним и тем же значением, то рекомендуется это значение записать в локальную переменную.
  • Для работы с массивами использовать javacard.framework.Util.
  • Рекомендуется использовать, в качестве хранения часто используемых данных/констант, переменные с модификатором final static. Это только увеличит размер вашего CAP или IJC файла, зато убережет от использования дополнительной оперативной памяти карты
  • В коде аплета, а именно в методе install рекомендуется сразу создать все объекты, которые потребуются в течении всего жизненого цикла программы.
  • При возможности не использовать локальные переменные в методах класса.
  • В функциях не использовать много входных аргументов.
Конечно еще много можно писать про наставления как проектировать программы для смарт-карт, но суть я думаю вы уловили. Для особо непонятливых сформулирую: не переборщите ни с одним из способов оптимизации; балансируйте и выбирайте, что для вас важнее.

Приступим к программированию

В сети internet информации о разработке для Java Card не так уж сильно много, но все-таки что-то есть. Но как правило это обзорные статьи как создавать аплет для работы с внешним миром через APDU команды.

В IDE NetBeans поддержка Java Card происходит просто - установки дополнительного модуля. Даже есть маленькая инструция для данной студии. Для создания аплета без интерфейса этого предостаточно. APDU консольный симулятор имееется.
В IDE Eclipse начать программировать для Java Card так же достаточно просто. Пересказывать не буду, просто укажу ссылку на инструкцию. APDU консольный симулятор имееется.
То есть для создания простого Java Card аплета предостаточно только поставить набор инструментов для java card и всё (Development Kit for the Java Card). Не забываем проверить версию Java Card на самой смарт-карте. На момент написания статьи актуальная версия была 2.2.1, была конечно уже и 3 версия, но её продвижение было какое-то неактивное.

Для написания SIM Toolkit приложений (это различные менюшки, диалоги, обработки звонков и прочее) надо бы прочесть стандарты 3GPP TS 43.019 и 3GPP TS 11.14. Первая спецификация объясняет саму архитектуру GSM Java Card, SIM Toolkit Framework, какие команды и события есть в данной среде. Вторая - непосредственно "рассказывает" все события и методы с их детальным описанием и назначением. При разработке аплета мы будем часто к последней спецификации обращаться.
Далее в проект под SIM Toolkit скачиваем архив бибилиотеки. Подключаем имеющиеся файлы к проекту. Подключение всегда своеборазно для каждой студии разработки. Затрагивать в рамках данной статьи я не буду.
Тут надо заметить, что тестирование SIM Toolkit аплетов затруднительно в рамках вышеперечисленных студиях NetBeans и Eclipse, так как у них нет полноценных GSM, 3G симуляторов. Конечно можно всё это симулировать через APDU симулятор ибо SIM Toolkit Framework это надстройка над Java Card просто APDU тут завуалировано красивыми функциями и интерфесами. Но этот способ для конкретных парней-фанатов). Как мне известно полноценные симуляторы, которые позволяют проверить sim аплет, не отходя от компьюетра, имеются у фирм разработчиков тесно связанных со смарт - картами. К примеру это: Gemalto, Sagem Orga.
Хватит болтать! пора бы показать всё)
Далее приводится код с учетом того, что вы знаете базовые основы программирования Java Card

Наконец-то код

Далее приведем несколько способов, которые позволяют получить программе на сим карте параметры сотовой сети, благодаря которым можно однозначно идентифицировать местоположение абонента в сети. Этими параметрами будут:

  • MNC (Mobile Network Code) - код мобильной сети.
  • MCC (Mobile Country Code) - мобильный код страны.
  • LAC (Local Area Code) - код локальной зоны.
  • CID (Cell ID) - идентификатор соты.
Способ 1: С помощью проактивной команды.
3GPP TS 11.14 (Раздер 6.4.15 PROVIDE LOCAL INFORAMTION). Данная команда позволяет получить данные: MCC+MNC+LAC+CID или IMEI устройства или список каналов BCCH или текущую дату, временную зону на терминале (телефоне) или текущий выбранный язык устройства.

	public static final byte DEV_ID_ME = 0x82; // смотрим файл в пакете sim.toolkit ToolkitConstants.java
	public static final byte RES_CMD_PERF = 0x00; // смотрим файл в пакете sim.toolkit ToolkitConstants.java
	...
	private final static byte lenLocationInfo = 0x07;
	private byte resultByte;
	private byte[] tempBuffers;
	...
	private void getCurrentLocation (ProactiveHandler proHdlr, byte[] locationInfo, short offsetBufferLocationInfo) {
	try {
		//1 - PRO_CMD_PROVIDE_LOCAL_INFORMATION - Тег выполняемой проактивной команды.
		//2 - 0x00 - Надстройка команды.
		//3GPP TS 11.14 (Раздер 12.6 Command detais). Возможные значения:
		//0x00 - получение location information
		//0x01 - полчуение IMEI устройства
		//0x02 - получение списка каналов BCCH
		//0x03 - получение времени, даты, зоны
		//0x04 - настройки языка устройства
		//0x05- полчуение Timing Advance - в сети/не сети
		//0x06-0x0F - резерв
		//3 - DEV_ID_ME - идентификатор устройства.
		//3GPP TS 11.14 (Раздер 12.7 Device identities). Возможные значения устройтва, кому отправляется команда:
		//0x01 - клавиатура
		//0x02 - монитор
		//0x03 - динамик
		//0x81 - сим карта
		//0x82 - мобильный терминал (телефон)
		//0x83 - сеть
		//0x10 - 0x17 - номера кард ридеров от 0 до 7
		//0x21 - 0x27 - номера каналов от 1 до 7
		//остальные значение - это резевр
		proHdlr.init (PRO_CMD_PROVIDE_LOCAL_INFORMATION, (byte)0x00, DEV_ID_ME); 
		resultByte = proHdlr.send();//выполняем команду
		//возможные ответы в таблице - 3GPP TS 11.14 (Раздел 6.11 Proactive commands versus possible Terminal response)
		if (resultByte == RES_CMD_PERF) {
			//если успешно, читаем ответ...
			ProactiveResponseHandler rspHdlr = ProactiveResponseHandler.getTheHandler();
			//Ответ команду PRO_CMD_PROVIDE_LOCAL_INFORMATION с идентификатором 0x00 будет Simple-TLV согласно 3GPP TS 11.14 (Раздел 12.19 Location Information)
			rspHdlr.findAndCopyValue (TAG_LOCATION_INFORMATION, locationInfo, offsetBufferLocationInfo);
			//Итого боевая часть ответа всего 7 байт
			//locationInfo[offsetBufferLocationInfo]...locationInfo[offsetBufferLocationInfo + 1] = MCC
			//locationInfo[offsetBufferLocationInfo + 2] = MNC
			//locationInfo[offsetBufferLocationInfo + 3]...locationInfo[offsetBufferLocationInfo + 4] = LAC
			//locationInfo[offsetBufferLocationInfo + 5]...locationInfo[offsetBufferLocationInfo + 6] = CID
		} else {
			//Обнуляем массив с ожидаемого смещения и определенной длины
			Util.arrayFillNonAtomic (locationInfo, offsetBufferLocationInfo, lenLocationInfo, (byte)0x00);
		}
	    } catch (ToolkitException tkException) {
			//Обнуляем массив с ожидаемого смещения и определенной длины
	      	Util.arrayFillNonAtomic (locationInfo, offsetBufferLocationInfo, lenLocationInfo, (byte)0x00);
	    }
	}
	....
	//вызов метода getCurrentLocation в проекте
	//не забываем проинициализировать буфер tempBuffers в методе install аплета
	//к примеру: tempBuffers = JCSystem.makeTransientByteArray ((short)0x32, JCSystem.CLEAR_ON_DESELECT);
	....
	getCurrentLocation (ProactiveHandler.getTheHandler(), tempBuffers, (short)0x00);
	....
	

Способ 2: Данные, извлекаемые при перехвате звонка/смс.
Целый раздел №9 в 3GPP TS 11.14 посвящен контролированию звонков и смс на телефоне. В кратце, отходя от темы рассматриваемой задачи, можно отметить, что:
  • Не все профили сим карт поддерживают данный механизм. Опцию можно проверить из кода аплета. К примеру для перехвата звонков: MeProfile.check(0x09), вернет boolean результат.
  • Имея на руках такие возможности, можно отменять/разрешать звонки/смс.
  • Имея на руках такие возможности, можно модифицировать параметры звонков/смс.
  • Подписаться на перехват может только один аплет. При установке очередного аплета с данной функцией, он просто напросто не будет установлен Card Managerом сим карты.
Для тех, кто любит много читать
Дак вот, прочитайте GSM TS 11.11. Там вы найдете из прочитанного такое SIM Service Table. Это "файл" на сим карте, который отображает все вомзможности сим профиля карты.

Вернемся к нашим задачам... Рассмотрим случай с перехватом звонка.

	...
	private ToolkitRegistry reg;
	private byte resultShort;
	private byte[] tempBuffers;
	...
	public static final byte EVENT_CALL_CONTROL_BY_SIM = 0x09; // смотрим файл в пакете sim.toolkit ToolkitConstants.java
	//в конструкторе класса, который наледован от javacard.framework.Applet, прописываем:
	reg = ToolkitRegistry.getEntry();
	reg.setEvent(EVENT_CALL_CONTROL_BY_SIM);
	tempBuffers = JCSystem.makeTransientByteArray ((short)0x32, JCSystem.CLEAR_ON_DESELECT);
	...
	/**
	 * Method called by the SIM Toolkit Framework
	 * @param event the byte representation of the event triggered
	 */
	public void processToolkit (byte event) {
	...
	if (event == EVENT_CALL_CONTROL_BY_SIM) {
		EnvelopeHandler envHdlr = EnvelopeHandler.getTheHandler();
		//Согласно 3GPP TS 11.14 (Раздел 9.1.6) мы можем извлечь из события перехваченного звонка: номер, субномер(опционально), информацию о параметрах сети.
		resultShort = envHdlr.getValueLength();
		envHdlr.findAndCopyValue (TAG_ADDRESS, tempBuffers, (short) 0);//номер телефона в формате ADN
		envHdlr.findAndCopyValue (TAG_LOCATION_INFORMATION, tempBuffers, resultShort);//наши любимые 7 байт информации о локации
		//по итогу получаем:
		//tempBuffers[0]...tempBuffers[resultShort] - номер телефона в формате ADN
		//tempBuffers[resultShort]...tempBuffers[resultShort + 1] = MCC
		//tempBuffers[resultShort + 2] = MNC
		//tempBuffers[resultShort + 3]...tempBuffers[resultShort + 4] = LAC
		//tempBuffers[resultShort + 5]...tempBuffers[resultShort + 6] = CID
	}
	...
	}
	

Способ 3: Получение данных из файловой системы сим карты.
Прочитав GSM TS 11.11, вы сможете узнать какие данные хранятся в примитивной файловой системе сим карты. В нашем случае нам понадобится файл EF LOCI с идентификатором 6F7E. Полный путь его размещения: MF(3F00) -> DF GSM(7F20) -> EF LOCI(6F7E).
В файле EF LOCI содержиться 11 байт информации:
  • TMSI (4 байта) - Temporary Mobile Subscriber Identity. Временный идентификатор мобильной станции GSM. Используется, после успешной аутентификации, при совершении звонка и других оперций в сети.
  • LAI (5 байт) - Location Area Information. Идентификатор области расположения абонента. Состоит из MCC (2 байта), MNC (1 байт), LAC (2 байта)
  • TMSI TIME (1 байт) - Current value of Periodic Location Updating Timer.
  • Location update status (1 байт) - Status of location update according to TS GSM 04.08.

	...
	public static final short FID_MF = 0x3F00; // смотрим файл в пакете sim.access SIMView.java
	public static final short FID_DF_GSM = 0x7F20; // смотрим файл в пакете sim.access SIMView.java
	public static final short FID_EF_LOCI = 0x6F7E; // смотрим файл в пакете sim.access SIMView.java
	...
	private final static byte lenLocationInfo = 0x05;
	private SIMView gsmFile;
	private byte resultShort;
	private byte[] tempBuffers;
	...
	//в конструкторе класса, который наледован от javacard.framework.Applet, прописываем:
	gsmFile = SIMSystem.getTheSIMView();
	tempBuffers = JCSystem.makeTransientByteArray ((short)0x32, JCSystem.CLEAR_ON_DESELECT);
	...
	private void getCurrentLocation(byte [] locationInfo, short offsetSourceLocationInfo) {
		try {
			//последовательно выбираем файл EF LOCI, начиная от корневого главного мастер файла.
			gsmFile.select((short)SIMView.FID_MF);
			gsmFile.select((short)SIMView.FID_DF_GSM);
			gsmFile.select((short)SIMView.FID_EF_LOCI);
			//читаем содержимое файла. Читаем методом readBinary т.к. EF LOCI имеет тип обычного прозрачного файла (Transparent EF).
			gsmFile.readBinary((short)0x04, locationInfo, offsetSourceLocationInfo, lenLocationInfo);//прочитали буффер размером 5 байт и со смещения равным 4 т.к. TMSI нам не нужно.
		} catch (SIMViewException a) {
			//Обнуляем массив с ожидаемого смещения и определенной длины
			 Util.arrayFillNonAtomic (locationInfo, offsetSourceLocationInfo, lenLocationInfo, (byte)0x00);
		} catch (ToolkitException a) {
			//Обнуляем массив с ожидаемого смещения и определенной длины
			 Util.arrayFillNonAtomic (locationInfo, offsetSourceLocationInfo, lenLocationInfo, (byte)0x00);
		}
	}
	...
	}
	

Послесловие
Вот и подошло к концу наше повествование. Мы рассмотрели с вами всё, что хотели. Конечно тут всё сжато и некоторые данные (особенно в коде) появляются откуда не возьмись. Мы готовы ответить на все ваши дополнительные вопросы по почте.
Хотелось бы вас посвятить в планы по статьям, которые у нас намечаются (по крайней мере я так думаю и предполагаю). Есть желание: подробнее написать про APDU команды и про файловую систему сим карты, плотно используя в качестве теоретического материала GSM TS 11.11.
Всем пока и до скорых встреч.

Вставить карту яндекс на сайт

Работа с сетью из мидлета средствами JavaMe

Использование библиотеки Bouncy Castle в JavaMe (Часть 1)

Использование библиотеки Bouncy Castle в JavaMe (Часть 2)

Запись звонков

Найти человека по номеру телефона

Файловая система Android

Запись звука на Android

Локация в JavaCard

Философия прослушки

MBLOC.RU
Copyright © MBLOC.RU Все права защищены от взлома и подделки данного сайта. Распространение информации без разрешения владельца данного сайта запрещается и карается всей строгостью закона.