Команды работы с данными BER-TLV
Команды данной категории предназначены для работы с файлами TLV-записей (TF) и контекстами директорий.
См. также раздел «Команды работы с правилами доступа»:
типы файлов (кроме случая специальных тэгов – см. описание команд):
DF (MF) | BF | FRF | VRF | CRF | TF | KF | ARF |
+ | - | - | - | - | + | - | - |
Команды имеют по 2 разновидности: с четным INS и нечетным INS.
В случае четного INS, тэг записи кодируется в P1:P2. В соответствии с форматом BER-TLV, P1:P2 принимают значения в диапазонах:
- 00:40..00:FE – для однобайтовых тэгов.
- 40:00..FFFF – для 2-х байтовых тэгов.
Если выбранная запись является шаблоном, она считывается полностью. Установка шаблона в качестве текущего контекста для дальнейшего считывания из него примитивных элементов данных не поддерживается из-за двусмысленности реализации.
В случае нечетного INS, P1:P2 – идентифицируют файл:
- 00:00 – текущий файл
- если старшие 11 бит =0, а младшие 5 бит образуют значение от 1 до 30, то младшие 5 бит – короткий идентификатор файла.
- в остальных случаях, P1:P2 – полный идентификатор файла.
При этом ссылка на конкретную запись содержится в данных – см. описание команд.
9.3.1 GET DATA
Прочитать TLV-запись из файла TF или контекста директории.
Примечание. Если запись слишком велика для передачи в одной команде, она может быть прочитана в несколько приемов командами GET RESPONSE – не реализовано в v1.0
При использовании четного INS (INS=CA) несколько тэгов зарезервированы для получения специальной информации:
тэг | значение |
5F51 | Answer-to-Reset |
5F52 | байты истории (historical bytes) ATR |
00FF | полностью считать контекст текущей директории |
0000 | полностью считать содержимое текущего TF |
При использовании тэга 0000 текущим должен быть файл типа TF, а для остальных специальных тэгов – любой файл. При чтении зарезервированных тэгов текущий файл не меняется.
Байты истории ATR могут быть модифицированы командой PUT DATA на значение пользователя. В этом случае пользовательское значение хранится в контексте MF и считывается оттуда.
тип команды | in/out (case 4) |
формат команды:
CLA | 00 |
INS | CA или CB |
P1:P2 | |
Lc | размер данных |
данные | если INS=CA – ничего если INS=CB – список запрашиваемых записей (см. ниже) |
Le | 0 или N |
ответ | Le=0 – запрошенные записи целиком или первые 256 байт от них Le=N – первые N байт запрошенных записей |
характерные статусы ошибок:
6700 | Неправильная длина входных данных |
6984 | Данные команды имеют недопустимые значения |
6A80 | Данные команды имеют недопустимый формат |
6A82 | Файл не найден |
6A86 | Неправильные значения параметров P1/P2 |
6A88 | Необходимые данные отсутствуют |
Если INS четно, то поле данных запроса пусто, а назад возвращается содержание (поле V) запрошенной записи.
Если INS нечетно, в запросе передается список заголовков запрашиваемых записей, а в ответе – список (конкатенация) запрошенных записей в формате BER-TLV.
Список заголовков оформляется в виде BER-TLV записи и представляет собой одну из следующих конструкций, различаемых по тэгу:
конструкция | тэг | устройство запроса | устройство ответа |
список тэгов | 5C | Конкатенация тэгов запрашиваемых записей (без длин) | список запрошенных записей в формате BER-TLV |
список заголовков | 5D | Конкатенация пар TL запрашиваемых записей | список усеченных записей в формате BER-TLV |
Если в списке заголовков (тэг 5D) для какого либо входящего в него тэга указывается длина L=0, то соответствующая запись не усекается. Если длина L>0, то передается не больше L байт соответствующей записи.
Пусть в TF лежат следующие записи:
Tag | Length | Value |
5F 21 | 01 | 11 |
7F 22 | 07 | 45 01 01 46 02 02 02 |
41 | 02 | 33 33 |
Запрос (список тэгов):
5C 05 5F21 7F22 41
Ответ:
5F21 01 11 7F22 07 45010146020202 41 02 3333
Запрос (список заголовков):
5D 08 5F21 05 7F22 00 41 01
Ответ:
5F21 01 11 7F22 07 45010146020202 41 01 33
9.3.2 PUT DATA
Занести TLV-запись в файл TF или контекст директории.
Если запись с таким тэгом уже присутствует, то она замещается новой записью при условии равенства длин. Если длина новой записи отличается, то возникает ошибка. Таким образом, в файле может быть только одна запись с определенным тэгом.
Чтобы заместить уже существующую запись, требуется право доступа на вид доступа UPDATE, а чтобы добавить новую запись – APPEND.
При использовании четного INS (INS=DA) тэг 5F52 зарезервирован для записи пользовательского значения байтов истории (historical bytes) ATR. В этом случае пользовательское значение записывается в контекст MF (длина байтов истории не должна превышать 15 байт). Текущий файл при выполнении этой команды с зарезервированным значением тэга может быть любым и не меняется после выполнения команды.
Чтобы иметь возможность менять байты истории на пользовательское значение, контекст MF должен создаваться достаточного размера для хранения самих байтов истории и Ber-TLV заголовка (3 байта).
Будучи единожды записаны, байты истории могут быть изменены на другое значение, но без изменения длины.
Запись байтов истории требует права на доступ по записи к контексту MF.
тип команды | in (case 3) |
формат команды:
CLA | 00 |
INS | DA или DB |
P1:P2 | |
Lc | размер данных |
данные | если INS=DA, содержание записи (поле V) если INS=DB, список (конкатенация) записей в формате BER-TLV |
Le | - |
ответ | - |
характерные статусы ошибок:
6700 | Неправильная длина входных данных |
6984 | Данные команды имеют недопустимые значения |
6A80 | Данные команды имеют недопустимый формат |
6A82 | Файл не найден |
6A86 | Неправильные значения параметров P1/P2 |
6A88 | Необходимые данные отсутствуют |
Если в P1:P2 при INS=DA содержится тэг соответствующий шаблону, либо при INS=DB среди списка записей содержатся записи-шаблоны, то таковые помещаются в файл как единое целое без дальнейшего разбора на входящие в шаблон записи.