Пользователь
0,0
рейтинг
10 февраля 2012 в 17:55

Разработка → Общаемся с SIM-картой на низком уровне из песочницы

FPGA*

f: не могу представить, как крусач может работать) Наши курсачи обычно пыляться где-то на полках
m: Вот у меня есть плата. К ней нужно подрубить сим-карту, и эта плата должна прочитать смс оттуда)
m: плата покупная, а вот программируем ее мы)
f: а нельзя смс с телефона прочитать?

— из жизни, орфография сохранена





Ну а если вам все-таки интересно узнать больше о сим-картах, протоколах передачи и их файловой структуре, прошу под кат. Ну и куда же без кода…



1. Введение


Начать стоит с того, что сим-карта является разновидностью смарт-карт, поэтому она полностью подчиняется стандарту ISO-7816. Я не буду говорить, какие выводы она имеет (об этом уже подробно говорили в предыдущей статье).

На процессор некоторых симок (если точнее — смарт-карт) можно подавать синхронизирующий сигнал до 20 МГц. Но ведь при включении симки терминал не знает ее параметров, поэтому общение начинается с, максимум, 4 МГц. Впоследствии, терминал узнает симку получше и может изменить параметры передачи.

К выводу I/O должен быть подключен pull-up резистор номиналом 20 КОм. В те моменты, когда терминалу и симке нечего сказать друг другу (т.е. они оба находятся в Z-состоянии) этот резистор обеспечит на выводе логическую единицу.

2. Активация/деактивация


Активация сим-карты и последующий cold reset




Диаграмма довольно проста, cold reset начинается с момента времени Та. Стоит лишь отметить, что I/O управляется здесь только симкой. Терминал должен игнорировать любой сигнал на нем, пока RST в нуле. После симка обязана дать ответ (Answer to reset).

Деактивация




Определенных рамок времени здесь нет, I/O также управляется симкой.

3. Протоколы передачи


У всех смарт-карт и, соответственно, сим-карт существует два типа протоколов передачи — побайтовый T0 и блочный T1. Я рассмотрю только Т0.

Сразу скажу, что T0 как две капли воды похож на UART (он используется в передаче по COM-порту). Но с небольшими оговорками. Начнем с самого начала.



Момент времени в протоколе T0 носит название элементарной единицы времени (etu), которая равна:


где F (коэффициент преобразования тактовых импульсов) и D (коэффициент регулирования скорости передачи битов) задаются исходя из ATR, а f – частота синхроимпульса для карты. По умолчанию, F = 372, а D = 1.

Передача на выводе I/O начинается с появлением стартового бита — спада с логической единицы. Время, отведенное каждому биту равно etu. Далее идут 8 битов данных, 1 бит четности и, как минимум, 2 стоповых бита. Временной отрезок между двумя стартовыми битами всегда должен быть больше или равен 12 etu и меньше или равен 9600 etu.

4. Answer to reset


Как я уже говорил, симка посылает ATR после cold reset’a. Именно в нем содержится информация с рекомендуемым значением частоты синхронизации, списком поддерживающих протоколов передачи и т.д.

Самый первый байт в ATR — TS. Он показывает, какое кодирование применяется – прямое или инверсное.



Прямое кодирование: если TS равен HHLH HHLL, то высокий уровень напряжения в цепи I/O кодирует логическую единицу, а момент времени 2 на рисунке кодирует наименьший значимый бит. При таком кодировании значение байта TS равно 0x3B.

Обратное кодирование: если TS равен HHLL LLLL, то низкий уровень напряжения в цепи I/O кодирует логическую единицу, а H – логический ноль. Момент времени 2 на рисунке кодирует наибольший значимый бит. При таком кодировании значение байта TS равно 0x3F.

Остальные байты содержат служебную информацию, например, рекомендуемые значения F и D, влияющие на значение etu.

5. Структура команд


Команды делятся на два типа: Command Transport Data Unit (C-TPDU) и Response Transport Data Unit (R-TPDU), т.е. команда и ответ на нее. Команды всегда составляют пару: на любую команду, переданную на карту, карта ответит R-TPDU. R-TPDU всегда заканчивается статусным байтом, характеризующим успешность команды.

Структура C-TPDU:
табл.1
Код Длина Описание
CLA 1 Класс инструкции Заголовок
INS 1 Код инструкции
P1 1 Параметр инструкции 1
P2 1 Параметр инструкции 2
Lc 0 или 1 Количество байтов в поле Data
Data Lc Данные команды Тело
Le 0 или 1 Максимальное количество байтов, ожидаемых в ответ


Не все карты могут сразу принять заголовок и тело команды, в таком случае нужно послать сначала заголовок, дождаться ответного статусного байта, а затем слать тело команды.

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

Структура R-TPDU:
табл.2
Код Длина Описание
Data Lr Данные ответа
SW1 1 Статусный байт 1
SW2 1 Статусный байт 2


6. Файловая структура


Типы файлов:

1. Master file (MF) — корень.
2. Dedicated files (DF) — обыкновенные папки.
3. Elementary files (EF) делятся на:
— Transparent EF — состоят из последовательности байтов,
— Linear fixed EF — состоят из последовательности записей одинакового размера,
— Cyclic EF — тоже самое, но при достижении конца файла, следующая запись начинается с нулевой записи, по кругу.

7. Примеры команд


Попробуем прочитать и записать смс-сообщение, находящееся в файле EFSMS в папке DFTELECOM.


1) SELECT

До совершения операции над файлом необходимо сначала его выбрать. Вначале нужно выбрать папку DFTELECOM.

Отправка заголовка команды SELECT:

A0 A4 00 00 02

Ответ — статусный байт:

A4 (повторяет байт инструкции)

Отправка тела команды:

7F 10 (ID данной папки)

Схожим образом выбираем EFSMS.

2) READ RECORD

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

Отправка заголовка команды READ RECORD:

A0 B2 01 04 B0 (01 — порядковый номер смс)

Ответ:

B2 07 07 91 97 62 92 90 90 F0 11 FF 04 81 21 43 00 08 FF 08 04 45 04 30 04 31 04 40 FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF 90 00

Все, кроме первых и последних двух байтов (B2, 07, 90, 00) является записью сообщения. Разберем его.

табл.3
07 Длина номера смс-центра в байтах.
91 Тип номера смс-центра (в данном случае, он представлен в международном формате).
97 62 92 90 90 F0 Номер смс-центра — +7-926-290-90-90 (читать с конца байта). Символ F нужен для выравнивания.
11 Длина номера смс-центра.
04 Длина номера отправителя.
81 Тип номера отправителя.
21 43 Номер отправителя — 1234 (опять читать с конца байта).
00 Идентификатор протокола.
08 Кодировка (00 — только латиница, 08 — с кириллицей).
08 Длина сообщения в байтах.
04 45 04 30 04 31 04 40 Сообщение — «хабр». Кодируется в UTF-16.


Важно отметить, что когда в сообщении содержатся только латинские символы, используется особая 7-битная GSM кодировка.

Возьмем слово «hi».

табл.4
h i
68 69 Смотрим в UTF-8.
0110 1000 0110 1001 Преобразуем в двоичный код.
1110 1000 0011 0100 Дополняем старший байт младшими битами следующего байта.
E8 34 Именно так будет выглядеть «hi» в 7-битной кодировке.


3) UPDATE RECORD

Отправка заголовка команды UPDATE RECORD:

A0 DC 02 04 B0 (02 — порядковый номер смс)

Ответ — статусный байт:

DC (повторяет байт инструкции)

Далее отправляется тело команды в соответствии с табл.3.

8. Программно-аппаратная реализация


В качестве аппаратной реализации была выбрана ПЛИС Altera DE1, т.к. курсач сдавать надо это замечательная плата для небольших проектов. Весь проект писали я и Breaknus, на VHDL и C. Среды разработок — Quartus II и Eclipse.

Разъем сим-карты припаян к пяти проводам IDE-шины. Плата имеет внутренние pull-up резисторы.

Краткая схема работы проекта:

Для ввода/вывода данных был собран NIOS II процессор. После ввода команды в консоли NIOS’а, она преобразуется в шестнадцатеричный код и передается побайтово в vhdl-блок. В этом блоке команда передается согласно протоколу T0 на I/O симки. После приема ответа блок передает его в NIOS, и ответ выводится в NIOS консоль. Активация/деактивация карты выбирается переключателем на плате. Нужные временные рамки для активации/деактивации, а также частота синхронизации карты обеспечиваются vhdl-блоком.

Скачать проект

Благодарности


Хочу выразить благодарность Сухинину Борису Михайловичу. Именно он познакомил нас с миром ПЛИС на замечательных лабораторных и находил время отвечать на наши вопросы.

Полезная информация


1. ISO-7816 (Википедия)
2. ETSI TS 100 977 — Mobile Equipment (SIM-ME) Interface
3. ETSI TS 102 221 — UICC-Terminal interface
@toTheSky
карма
43,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Разработка

Комментарии (37)

  • +34
    Интересный материал из песочницы?!
    Может метеорит на землю упал?
    • +90
      Судя по тому, что первый комментарий как всегда не по теме, земля в безопасности… )
    • –3
      Дайте кармы плюсануть человека хочется!
    • +3
      Вот не надо — материал из песочницы часто бывает интересным или информативным.
  • +10
    крусач
    • 0
      А они сейчас как раз и посыпятся. Время настало :) Потом дипломы :)
    • 0
      Ну так автор и написал, что орфография сохранена, так что этот мопед не его.
      • 0
        Мой мопед. Это я подруге с истфака объяснял, что значит «извини, мне надо курсач пилить».
  • –2
    ПЛИС алтерры, но не AHDL и не родная среда, хммм.
    • +2
      То есть не родная среда? Зайдите на сайт Альтеры — там вовсю Quartus рекламируют.
  • +2
    Интересно, а можно на основе симки сделать что-то полезное, не связанное с телефонией? Там же по сути микроконтроллер с памятью, файловой системой. Никто не видел никаких поделок на симках?
    • 0
      Да, были бы очень дешевы такие запчасти, для своих поделок, точнее бесплатны!
    • +1
      Ей всё равно нужно внешнее питание, внешний генератор тактовой частоты и мастер-устройство. Потому что сама сим-карта не делает вообще ничего, пока её не попросишь.
    • +2
      На основе массово выпускаемых SIM — вряд ли. Потому что оператор при выпуске ограничивает возможность установки приложений. Т.е. стандартная симка просто не даст Вам записать туда апплет вплоть до блокировки.
      Нужно брать чистую карточку (например JCOP21 — на ней есть JCRE) и заливать на нее приложение.
      Я для разработки использую NetBeans 6.9.1, для заливки — GPShell.

      Работая на уровне APDU, можно как показано выше разнообразить работу встраиваемых систем. Например, GSM-сигнализации. SIM будет отвечать за идентификацию в сети оператора, а дополнительная Java-карта за логику приложения. Микроконтроллер в данном случае выступает тупо транслятором протоколов + терминал.

      Другой бонус Java-карт — это возможность использования RMI при работе из ПК. Неуниверсально, зато разрабатывается быстрее.

      Так что SIM-ок с возможностью произвольной записи ждем ) так же как и Java 3.0 карточек с поддержкой сервлетов.
      • 0
        Ну в память SMS и в телефонную книгу своих СИМок операторы же не запрещают писать? Значит из «обычной» СИМки вполне можно сделать вполне бюджетный аппаратный самоуничтожающийся криптоконтейнер для хранения (например) ключей шифрования: достаточно написать для описанного в статье аппаратного решения ПО, которое будет запрашивать и передавать в подключенную СИМку PUK, сохранять нужные данные в памяти для тел. книги либо SMS, а при «отмонтировании» криптоконтейнера — «взводить» механизм самоуничтожения, «накручивая» 3 неверных PIN+9 неверных PUK.
        • 0
          Насчет криптоконтейнера не уверен — по-моему, работа с EF телефонной книги и SMS не требует PIN. Т.е. не защищена. Для ключей давно уже придумали карточки по стандарту PKCS#11.
        • –1
          Да, чтение/запись смс и контактов не требует PIN-кода. А раз не требует, возможно, блокировка карты не влияет на чтение смс на низком уровне. Но можно ведь просто обнулить все смс — такой результат вас устроит?
          Устройство получается мобильным, тогда я думаю здесь уместнее использовать микроконтроллер в качестве терминала. А он уже соединяется с компьютером. Почти етокен/рутокен — только здесь можно аппаратно стирать информацию с карты, например, кнопкой, подключенной к МК.
          Кстати, есть чистые смарт-карты, которые стоят очень дешево.
          • 0
            Дешево — это сколько? Я JCOP21 за ~$20 покупал.
            • 0
              SLE4442 — 60 руб. Правда минимальный заказ от 5 штук.
              • 0
                Так это карта памяти :( на неё приложение не запишешь.
                Я брал JCOP21 и JCOP3A. Они по 515 рублей.
                • 0
                  Можно правда поизвращаться — реализовать шифрование на МК. Но, наверное, это будет велосипедом)
          • 0
            Т.е. получается что у карточки с заблокированным PUK можно прочитать содержимое памяти СМС и телефонную книгу? Если это так, то это само по-себе открывает интересные возможности…
            • +1
              Возможно. Я пока не проверял. Будет плата на руках — проверю.
          • +1
            Пункт 10.5.3 Стандарта ETSI TS 100 997 гласит, что чтение и обновление файла EF_SMS, в котором находятся смски требует удовлетворения условия доступа CHV1, что означает необходимость правильного ввода пин-кода. Цитата:
            «CHV1 (card holder verification 1): The action shall only be possible if one of the following three conditions is
            fulfilled:
            — a correct CHV1 value has already been presented to the SIM during the current session;
            — the CHV1 enabled/disabled indicator is set to „disabled“;»
            • +1
              Да, я ошибся.
            • 0
              Перечитал стандарт. Я тоже ошибся с предложением использовать СИМку как криптоконтейнер.

              У файла 'ICCID' уровень доступа на чтение — ALWAYS, т.е. если даже у нас будет СИМка с вытравленным/сошкуренным с пластика номером и одной оставшейся попыткой ввода PUK1 — атакующий всегда сможет прочитать ICCID из самой карты, а потом «пробить» PUK1 по базе оператора.
  • +3
    Что то я смотрю в бауманке стало модно делать работы на VHDL и писать по ним статьи на хабр. Хотя эта статья лучшая из всех предыдущих.
  • +1
    ИУ8?
    • +1
      Отвечу за автора, ибо знаю кто это. Да (=
  • 0
    Вы меня вычислили)
    • 0
      Черт, промахнулся…
  • 0
    Скажите, пожалуйста, если есть такая информация.
    Позволяют ли современные ОС для смарт-фонов «общаться» с сим-картой напрямую, используя TPDU/APDU?

    Например, можно ли из приложения под iOS/Android считать СМС прямо с сим-карты, как в Вашем примере?
    • +2
      За современные смартфоны не скажу, но старые телефоны позволяли ограниченно общаться с sim-картой через AT команды…

      AT+CRSM=176,28448,0,0,8
      • +2
        Да и новые позволяют.
        AT+CSIM — Generic SIM access (APDU)
        AT+CRSM — это Restricted SIM access, упрощенный доступ
        Для чтения SMS вообще достаточно AT+CMGR
    • 0
      Некоторые телефоны с J2ME поддерживают JSR177, который дает интерфейсы для работы с картой.
      Про андроид не скажу, но на iOS стандартными средствами точно не получится.
  • +1
    Для тех, кому нужна более «общая» информация по SIM картам — я описывал чуть боблее полгода назад в Телекомах
    • 0
      Да, только сейчас узнал этот материал — мы с ним как раз ознакомились, как только начинали работать. Спасибо!

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.