Когда на вопрос «кем вы работаете?» я отвечал «разработчиком ПО для
SIM-карт», даже технически подкованные люди частенько удивлялись. Многие
думают, что SIM-карта это «что-то типа флешки».
В этой статье я постараюсь кратко рассказать что такое SIM-карта (и смарт-карты в общем), зачем она нужна и что у нее внутри.
На самом деле SIM-карта — это частный случай контактной смарт-карты с
микропроцессором. По сути, представляет из себя достаточно защищенный
микрокомпьютер с CPU, ROM (опционально), RAM и NVRAM (которая выступает в
качестве аналога жесткого диска в PC), с аппаратными генераторами
случайных чисел и аппаратной реализацией крипто-алгоритмов.
В некотором приближении архитектуру микропроцессорной смарт-карты можно представить так:
Немного о производстве
Для понимания последующего материала мне кажется правильным вкратце объяснить основные процессы при производстве карт.
1. Производство чипа
Исполнитель: Производитель чипов (silicon vendor).
Конечный продукт: пластина с чипами (wafer).
Чипы производятся несколькими компаниями, наиболее распространенные — Samsung, ST Microelectronics, Infinion, SST etc.
Обратная сторона модуля. Белый прямоугольник в центре — чип SIM-карты.
2. Сборка модулей
Исполнитель: производитель смарт-карт (card vendor) или сторонний завод по сборке модулей.
Конечный продукт: лента с модулями (чип + контактная площадка).
На этом этапе пластина режется на чипы (зачастую пластины режутся
производителем чипа), чипы крепятся на контактные площадки, затем
распаиваются контакты и чип заливается клеем (см. предыдущее фото
обратной стороны модуля). Вся эта конструкция называется «модулем».
3. Производство карты
Исполнитель: card vendor.
Конечный продукт: SIM-карта.
Модули извлекаются из лент, крепятся на пластиковую основу карты, затем
загружаются файловая система, приложения, затем идет персонализация
карты — загрузка данных, уникальных для каждой карты (различные ID,
ключи итд) и нанесение их на саму карту (например ICCID и PIN коды в
случае с SIM-картами).
Типы карт
По типу используемой памяти в последнее время SIM-карты делятся на 2
группы: карты, в которых используется ROM и EEPROM, и карты, где
используется Flash память.
В первом типе карт операционная система (ОС) и постоянно используемые и
малоизменяемые приложения помещаются в ROM производителем чипа (первый
этап производства). Цикл производства в этом случае очень долгий и
промежуток между релизом ОС и отгрузкой первых чипов занимает 2-3
месяца. EEPROM используется производителем карт для загрузки файловой
системы (ФС) и приложений.
В случае с Flash картой ОС, ФС и приложения хранятся на Flash памяти.
Использование Flash позволяет загружать ОС в процессе сборки модулей или
при производстве карты (этапы 2 и 3). На данный момент карты с
использованием flash памяти практически вытеснили ROM с рынка SIM-карт.
Flash чипы дешевле и позволяют достаточно легко вносить изменения в ОС.
Также производителю карт проще планировать заказ чипов, так как не надо
заказывать чипы с конкретными версиями ОС, а просто заказываются чипы с
различным размером памяти, и нужная ОС загружается уже под конкретного
заказчика — оператора. Так как прогноз по закупке чипов делается обычно
только раз в год, это сильно упрощает планирование.
Java на картах
Да, я не ошибся. По программной «начинке» смарт-карты делятся на 2 большие группы —
native и
javacard.
Native карты
ПО для native-карт пишется на С. Приложения (если таковые требуются
производителем) обычно тесно интегрированы с ОС и загружаются
одновременно с ОС на карту. Устанавливать какие-либо приложения,
разработанные другой компанией, на native-карту нельзя. Дополнительную
функциональность, затребованную оператором, зачастую приходится
добавлять в код ОС. Размеры самой ОС из-за использования С и простоты ОС
достаточно маленькие (для SIM карт порядка 10-20Кбайт). Поэтому
native-карты на данный момент используются в low-cost сегменте, где
оператор ничего не хочет на карте, кроме простого меню.
Javacard
В эпоху распространения языка Java компания Sun Microsystems написала
спецификации javacard. Идея javacard была в том, чтобы сделать возможным
установку приложений (апплетов) на карты различных производителей (и на
различные чипы). В 1996 году подразделение смарт-карт корпорации
Shlumberger (позже переименованное в Axalto, на данный момент Gemalto)
представила первую javacard. Идея достаточно простая. Кроме ОС карта
содержит виртуальную машину Java. Разработанное приложение компилируется
в байткод и загружается на карту. Приложения в этом случае загружаются
уже после загрузки ОС (в процессе производства карты), также, если карта
содержит Remote Applet Manager, javacard апплет может быть установлен
после выпуска карты посредством CMC.
Язык для разработки под javacard — это сильно урезанная Java. Урезана
она намного сильнее, чем в J2ME. Из примитивов остались только
boolean, byte, short
и опционально поддерживается int (но практически не используется в
угоду совместимости, так как поддерживается далеко не всеми
производителями). Нет привычных классов типа
String
(вообще из
java.lang
перекочевали только
Object
,
Throwable
и несколько
Exceptions
),
нет мультипоточности, нет garbage collector'а. Минусы javacard, на мой
взгляд, — это скорость работы и большие требования к памяти (как RAM,
так и EEPROM/Flash). Java-карты более дороги вследствие использования
более дорогих чипов и более сложной структуры ПО.
Приложения
В предыдущем тексте часто упоминались приложения, но человеку, не
знакомому со смарт-картами, чаще всего непонятно, что за приложения
могут быть на карте.
Во-первых, основная функциональность карты может быть вынесен в
отдельное приложение. К примеру, может быть SIM applet, написанный на
java, который реализует всю функциональность SIM. Может быть R-UIM
приложение (R-UIM карты используются в CDMA сетях). Это может быть
приложение Visa или Mastercard, превращающие смарт-карту в банковскую
карту. По сути, при использовании java, в ОС можно оставить управление
памятью, ввод-вывод и Java машину. При этом, если производителю надо
произвести SIM-карты — загружается SIM апплет, если надо сделать Visa —
загружается приложение Visa.
Во-вторых, существует класс приложений на картах — microbrowsers. Это
интерпретаторы байткода для построения SIM-меню. Это не java байткод, а
байткод, понятный установленному браузеру. Меню в этом случае чаще всего
разрабатывается на xml-подобном языке разметки, конвертируется в
байткод и загружается в браузер. На данный момент наиболее широкое
распространение получили браузеры S@T от
Simalliance и WIB от
Smarttrust. Обе организации не разрабатывают браузеры, они пишут спецификации и сертифицируют браузеры, написаные по этим спецификациям.
В-третьих, это могут быть SIM меню, разработанные на java (без
использования браузеров), либо просто какой-то фоновый апплет. К
примеру, это может быть апплет, следящий за тем, какой телефон вы
используете. Если вы вставили карту в новый телефон, то SIM посылает
IMEI нового телефона оператору, а тот, в свою очередь, отправляет вам
настройки wap/gprs для вашей модели.
Файловая система
На SIM-картах есть файловая система, так же как и на настольных
компьютерах. Файлы бывают 2х типов — DF (Dedicated file — аналог папки) и
EF (Elementary file — аналог обычного файла). Корневой DF файл
называется MF (Master File).
В файловой системе SIM-карты хранятся секретные ключи, адресная книга,
список последних СМС, название оператора, сети, предпочтительные в
роуминге, сети, запрещенные к использованию, и т. д. Естественно,
существуют уровни доступа к файлам. Ключи зачастую имеют NEVER в
качестве доступа на чтение, что исключает возможность их прочитать
извне.
Для чего это все нужно?
SIM-меню и остальные «несистемные» приложения являются просто value
added services. Основная цель карты — произвести идентификацию и
аутентификацию абонента в сети.
Для этого на карте есть IMSI (International Mobile Subscriber Identity) —
уникальный идентификатор SIM-карты и 128-битный ключ Ki.
Ниже представлена процедура аутентификации в сети GSM и генерации ключа сессии Kc.
Аутентификация проходит с помощью алгоритма A3, генерация Kc — A8.
Authentication Center (AuC) на запрос аутентификации карты генерирует
128-битную псевдослучайную последовательность RAND и отсылает ее
SIM-карте. Далее, зная IMSI карты, AuC использует ключ Ki, привязанный к
данному IMSI, и данные RAND в качестве входных данных в алгоритмах A3 и
A8. Карта одновременно с этим производит те же самые вычисления.
Результат вычислений алгоритма A3 Signed Response (SRES) отправляется
картой в AuC, на котором полученный SRES сравнивается с вычисленным на
AuC. При совпадении результатов процедура аутентификации считается
успешно пройденной. Ключ Kc, полученный при использовании алгоритма A8,
используется впоследствии для шифрования трафика между телефоном и
сетью.
Программы «клонирования» карт используют уязвимость в старой версии
алгоритма A8 (COMP128-1). На данный момент в GSM сетях широко
используются COMP128-2 и COMP128-3. Уязвимость была найдена еще в 1999
году, но некоторые GSM операторы так и не перешли на использование 2-го и
3-го алгоритмов (уязвимости в которых на данный момент не найдены).
Эпилог
В этой статье я постарался достаточно сжато рассказать что же такое
SIM-карты. Надеюсь у меня это получилось. Практически все описаное выше,
за исключением процедуры аутентификации, отностится и к USIM-картам,
используемым в 3G сетях (UMTS), и R-UIM картам (CDMA сети). Если есть
какие-то комментарии или вопросы — пожалуйста пишите.
Ссылки по теме:
www.3gpp.org
www.3gpp2.org
Java Card Technology