Обмен данными со смарт-картой
                         --------------------------------

                                                   Александр Борзов (с) 1998
                                                  e-mail: aborzov@hotmail.com


Данное описание построено на основе стандарта ISO 7816-3

                Оборудование
                ============
Для работы с картами я использовал интерфейс Smart Mouse, известный 
также под названиями Phoenix или Dumb Mouse. 
Схему такого интервейса можно найти во многих местах.
Этот интерфейс работает через COM-порт компьютера.
Кроме этого, существует ряд схем интерфейса, использующих принтерный
порт, но я не рекомендовал бы это. Хотя такой интерфейс и имеет
ряд неоспоримых преимуществ, спалить принтерный порт гораздо легче,
чем RS232.

   Немного о интерфейсе Smart Mouse.
В настоящее время этот интерфейс выпусается многими фирмами, по
большей части китайскими. Его стоимость - около 40 USD, как
правило, он не сопровождаетсмя никакими драйверами.

                             PC                     Карта

Назначение           Контакт        Направление
                      DB9

Передаваемые           3     TxD     ---->
  данные
Принимаемые            2     RxD     <----
  данные
Сброс                  7     RTS     ----->

Питание  *             4     DTR     ----->              

Наличие                8     CTS     <----
карты


* к устройству может быть подведено внешнее питание 5-9 вольт,
 "-" в центре разьема.

Устройство имеет  собственный тактовый генератор частотой
3.579545 MГц.

 Если внешнее питание не подано - питание на карту подается по
линии DTR установкой на ней "1". Сразу же после подачи
питания начинает работать тактовый генератор.
 Сброс карты формируется линией RTS. Для обеспечения работы карты
на контакте ISO:C2 должна быть "1", что выполняется подачей "1"
на RTS. Сброс карты происходит в момент, когда на ISO:C2 - "0".
 Линия CTS связана с датчиком наличия карты. При отстутствии карты
на CTS "0".

Обратите внимание - интерфейс имеет внутренее эхо - то есть
все выводимые вами данные одновременно поступают в буфер ввода
RS232. Это следует учитывать при анализе откликов карты.




       Актитвация и деактивация Карты
       ==============================

  Единица измерения времени
  -------------------------
Все временные характеристи при работе с картами выражаются в ETU -
Elementary Time Unit.
Для карт с внутренним тактовым генератором ETU=1/9600 сек, для карт 
с внешним тактовым генератором ETU=372/частота_генератора_в_гц,
однако эти параметры могут быть изменены специальной процедурой 
согласования параметров интерфейса - см.ниже.

Стандарт ISO рекомендует применять для тактового генератора наиболее
распространенные кварцевые резонаторы 3.579545 MГц и 4.9152 МГц.
   В интерфейсе Smart Mouse генератор внешний, частота 3.579545 MГц,
то есть ETU=0.1039 миллисекунды.


 Сброс карты
 ------------
  Для старта обмена с картой необходимо сформировать ее активизировать,
сформировав сигнал Reset

По ISO он форируется такой последовательностью сигналов: 
 -> RST(ISO:C2) Низкое
 -> Питание (ISO:C1) Установить 
 -> I/O (ISO:C7) Готовность_к_приему 
 -> VPP (ISO:C6) Низкое 
 -> Такт_частота (ISO:C3) Подать 
 -> RST (ISO:C2) Высок.

В SmartMouse эти сигналы формируются с помощью линий RS232:
 -Включить питание ISO:C1=+5v - DTR=1
 -Сигнал сброса RST(ISO:C2)=1 - RTS=1
 -Тактовая частота подается на ISO:C3 вместе с питанием +5v
 -Напряжение программирования VPP на ISO:C6 всегда равно напряжению питания.

Сразу же оговорим и процедуру деактивации карты:
 -> RST(ISO:C2) Низк. 
 -> Такт_частота (ISO:C3) Снять 
 ->  VPP (ISO:C6) Низк. 
 ->  I/O (ISO:C7) Низк. 
 -> Питание (ISO:C1) Низк. 


 Последовательный Ввод/Вывод
 ===========================
Для начала обратимся к схеме передачи байта в RS232:

Байт, обозначение битов которого приведено ниже:
    ,----,----,----,----,----,----,----,----,
    | b8 | b7 | b6 | b5 | b4 | b3 | b2 | b1 |
    '----'----'----'----'----'----'----'----'
в интерфейсе RS232 передается так:

                    Старт                      Бит          Следующий
                    Бит <--- 8 бит данных ---->Четности     СтартБит
  '1' -12V ________    __________________________________    ... Mark
                   |  |  |  |  |  |  |  |  |  |  |   |   |  |   
                   | С|b1|b2|b3|b4|b5|b6|b7|b8| Ч| 1   2 | C|
  '0' +12V         |__|__|__|__|__|__|__|__|__|__|       |__|_   Space
                                                  < Стоп>
                                                    Биты  (1 или 2)

   Бит четности добавляется к битам данных для обнаружения ошибок.
Возможны фактически пять видов установок: по нечетности (Odd), 
по четности (Even) и дополнительные : Нет (None), '1' (Mark),
'0' (Space).
   Когда установлен Контроль по четности (Even) то бит четности принимает
такое значение, чтобы вместе с ним (не считая стартовые и стоповые) 
число '1' (Mark) в байте было четно .
   Когда установлен Контроль по нечетности (Odd) то бит четности принимает
такое значение, чтобы вместе с ним (не считая стартовые и стоповые) 
число '1' (Mark) в байте было нечетно .
   Дополнительные установки - Нет - бит отсутствует, Mark - бит всегда '1',
Space - бит всегда '0'. 


Схема передачи байта в ISO7816
------------------------------
Стандарт ISO 7816 предусматривает очень похожую схему передачи байта:
    ,----,----,----,----,----,----,----,----,
    | ba | bb | bc | bd | be | bf | bg | bh |
    '----'----'----'----'----'----'----'----'

        Старт                      Бит         Следующий
        Бит <--- 8 бит данных ---->Четности    СтартБит
             Z ____    ____________________________.....__    _
                   |  |  |  |  |  |  |  |  |  |  |        |  |
                   | С|ba|bb|bc|bd|be|bf|bg|bh| Ч|Интервал| С|
             A     |__|__|__|__|__|__|__|__|__|__|        |__|_

Первое отличие от RS232 - обратный порядок следования битов - то есть,
если в RS232 первым передается младший бит, то в ISO первым передается
старший бит В отличие от RS232, где уровни обозначены как M(ark)=high 
и S(pace)=low в ISO уровни обозначены как Z и A. 
Их соответствие мы рассмотрим ниже. 

Скорость передачи
-----------------
Стандартная длительность бит = ETU +/-0.2ETU .
В случае, когда  ETU=0.1039 миллисекунды это вполне соотвествует скорости
интерфейса 9600 бит/сек (длительность бита 0.1041 мс).

Интервал
--------
Стандарт определяет интервал между последовательными байтами длиной в
два бита. Это соответствует установке в RS232 2-х стоп-бит.


Контроль четности
------------------
Стандартом предусматривается контроль по четности (Even) - то есть
бит четности устанавливается так, чтобы число "1" в байте вместе с
битом четности было четно. 


При асинхронной посимвольной передаче имеется небольшая проблема с 
диагностикой ошибок.
ISO 7816-3 определяет обнаружение ошибок и операцию восстановления
(обязательные для T=0) так, что это не может обнаруживаться нормальным
UART. 
   Когда карта обнаруживает ошибку четности при приеме, по стандарту она
сбрасывает линию I/O в состояние S(pace)=low в середине первого бита
интервала. Однако, RS232 в это время продолжает работу и формирует
два  стоп-бита.
Передача данных без ошибок:

         Старт-бит                             Следующий Старт-бит 
   _____    __________________________________    ___________
        |C |  |  |  Байт i   |  |  |P |   |   |C |  Байт i+1
        |__|__|__|__|__|__|__|__|__|__|       |__|___________
                                   Бит <----->
                              четности Интервал
        
Передача данных с ошибкой четности:

        Старт-бит                              Следующий Старт-бит
   _____    ____________________________          ___________
        |C |  |  |  Байт i   |  |  |P | |     |C |  Байт i+1
        |__|__|__|__|__|__|__|__|__|__| |_____|__|___________
                                   Бит   <--->
                              четности   Сигнал 
                                         ошибки

Когда такое состояние возникает, интерфейс должен повторно  передать 
ошибочный символ. 
Однако, передатчик, формирующий в этот момент стоп-биты, уровень которых 
M(ark)=high, никак не может обнаружить сигнал ошибки и, как следствие, 
в случае ошибки - повторить ошибочный байт.


     ATR-Answer To Reset
    =====================

  После сброса карты она формирует ATR - Answer To Reset в таком виде:

Reset 
 |
 |    _________________________________________    _________
 |   |   |   |   |   |   |   |   |   |   |   |     |   |   |
 '-->| TS| T0|TA1|TB1|TC1|TD1|TA2|TB2|TC2|TD2| ....| TK|TCK|
     |___|___|___|___|___|___|___|___|___|___|_   _|__ |___|


НАПРИМЕР: 
карты, применяемые в системе D2MAC/Eurocrypt спутникового телевидения 
формируют такой ATR:
3F 67 2F 00 11 14 00 03 68 90 00

карты, применяемые в сотовых телефонах GSM 
(компания North-West GSM, Санкт-Петербург):
3F 2F 00 80 69 AF 02 01 01 35 00 01 0A 0E 83 1E

 TS - наиболее важный байт "Инициирующий Символ".
 ------------------------------------------------

 Возможно два варианта этого байта:

1. Вариант - "ИНВЕРСНАЯ ПЕРЕДАЧА"
-----------
В этом варианте все биты инвертированы так, что A='1', Z='0'
Диаграмма передачи TS в этом случае выглядит так:

    Z ____    _____                   __ _.....__    _ RS232-Mark -12V
          |  |  |  |                 |  |        |  |
          | С| 1  2| 3  4  5  6  7  8| Ч|Интервал| С|
    A     |__|     |__|__|__|__|__|__|           |__|_ RS232-Space+12V

При чтении байта через RS232 это Hex 03  (00000011) - вспомните про обратную
последовательность битов  (инверсия последовательности - 11000000 ).
На самом деле -это Hex 3F (инверсия битов                00111111 ).

В Hex 3F (00111111) число '1'=6, то есть бит четности следует установить
в '0', чтобы общее количество '1' было четным, то есть Бит_четности=Z.
Однако, с точки зрения RS232 в последовательности 00000011+Бит_четности=1
нечетное количество бит, и при установке контроля Even, принятого в ISO,
возникнет ошибка.
В данном варианте контроль четности следует установить обратный - 
то есть Odd. 

2. Вариант - "ПРЯМАЯ ПЕРЕДАЧА"
------------
В этом варианте A='0', Z='1'
Диаграмма передачи TS в этом случае выглядит так:

    Z ____    _____    ________       __ _.....__    _ RS232-Mark -12V
          |  |  |  |  |  |  |  |     |  |        |  |
          | С| 1  2| 3| 4  5  6| 7  8| Ч|Интервал| С|
    A     |__|     |__|        |__|__|           |__|_ RS232-Space+12V


При чтении байта через RS232 это это Hex 3B ( 00111011) - вспомните про
обратную последовательность битов (инверсия последовательности - 11011100 ).
В Hex 3B (00111011) число '1'=5, то есть бит четности следует установить 
в '1',то есть Бит_четности=Z. C точки зрения RS232 контроль такой же 
- по четности - Even.
 

Прочитав через RS232 первый байт ATR (TS) можно сделать вывод об 
интерпретации последующих байтов.
В случае TS=03 - "ИНВЕРСНАЯ ПЕРЕДАЧА", и  на самом деле TS=3F
В случае TS=3B - "ПРЯМАЯ ПЕРЕДАЧА".

 T0 - Байт формата
 ------------------

Бит-карта в старших 4-х битах определяют передачу последующих байт TA1-TD1:
    ,----,----,----,----,----,----,----,----,
    | ba | bb | bc | bd | be | bf | bg | bh |
    '----'----'----'----'----'----'----'----'
       ^    ^    ^   ^   <-- значение K  -->
       |    |    |   |_________  если 1 - TA1 передается (см.выше)
       |    |    |_____________  если 1 - TB1 передается
       |    |__________________  если 1 - TС1 передается
       |_______________________  если 1 - TD1 передается

Старшие четыре бита - число Y1 - определяют передачу байт TA1-TD1.
Младшие 4 бита - число K - количество т.н. "Исторических байт",
которые описывают конкретную карты - время ее жизни, дату выпуска.
  Возвращаясь к карте системы Eurocrypt, где T0=67, отметим:
- последуют интерфейсные байты TB1 и TC1 (всего два)
- будет всего 7 "Исторических байт".

Набор следующих байтов TAi TBi TCi TDi описывает детальные параметры 
протокола карты, причем байты TA1 TB2 TC3 TD4 принято называть 
глобальными интерфейсными.

 Байт TA1
 --------
Старшая половина байта TC1 содежит параметр FI, который используется для
вычисления ETU при использовании внешнего генератора:
 ETU=F/частота_генератора_в_гц
По умолчанию - FI=1, F=372 (таблицу соответствия FI->F можно найти в ISO).
Младшая половина байта TC1 содежит параметр DI,  который используется для
вычисления ETU при использовании внутренннего генератора:
 ETU=D/9600 сек.
По умолчанию - DI=1, D=1 (таблицу соответствия DI->D можно найти в ISO).

 Байт TB1
 --------
Старший бит байта TB1 всегда 0.
    ,----,----,----,----,----,----,----,----,
    |ba=0| bb | bc | bd | be | bf | bg | bh |
    '----'----'----'----'----'----'----'----'
          <--II1 -> < -------- PI1 -------->
Остальные содежат:
-  параметр PI1, который определяет значение P - величину напряжения 
   программирования VPP.
   PI1=0 означает, что карта использует собственное питание для 
   напряжения программирования.
   Значения PI1 от 5 до 25 определяет величину напряжения программирования 
   так P=PI1 volt. 
-  параметр II1, который определяет значение I максимальное потребление 
   тока при программировнии.
   Может принимать три значения: II1=00 - I=25 ma, II1=01 - I=50 ma, II1=10 - I=100 ma.
   По умолчанию P=5 , I=50 . 


 Байт TC1
 --------
Байт TC1 содежит параметр N - дополнительное увеличение интервала меджу 
байтами, требуемое картой. По умолчанию N=0.


 Байт TD1
 --------
Бит-карта в старших 4-х битах определяют передачу дополнительных байт 
TA2-TD2  также, как и в T0.
Четыре младших бита в TD1 описывают тип протокола.
Могут быть следующие значения:

0 = T0 - асинхронный полудуплексный посимвольный протокол
1 = T1 - асинхронный полудуплексный блочный протокол
остальные значения пока зарезервивированы.
Если TD1 вообще не передается - принимается TD1=0
 - то есть протокол T0.


 Байт TA2
 --------
Байт TA2 индицирует возможность настройки параметров протокола карты
в процессе работы.
    ,----,----,----,----,----,----,----,----,
    | ba | bb | bc | bd | be | bf | bg | bh |
    '----'----'----'----'----'----'----'----'
       | <-Резерв->
       |
        ---- 0 - возможна смена параметров протокола
             1 - смена параметров невозможна

Если TA2 отсутствует в ATR  - принимается TA2=0

 "Исторические байты"
 --------------------
Исторические байты описывают конкретную карты - время ее жизни,
дату выпуска и т.п. Их значение определяется производителем карты.


 Рабочее время ожидания - WI
 --------------------------- 
Этот параметр определяется TC2. Если TC2 в ATR не был передан - 
считается WI=10.
   Рабочее время ожидания используется для ограничения времени ответа 
карты и интерфейса.
   Интервал между старт-битом текущего байта и старт-битом предыдущего 
байта не может превышать 960*WI Etu, причем текущий байт может исходить 
из карты, а предыдущий - из интерфейса и наоборот.
(в нашем примере MaxTime=997.44 миллисекунды)


 Байт контроля TCK
 -----------------
Контрольный байт. Вычисляется так: Исключающее_Или всех байтов ATR,
включая байты, равные нулю (или не переданные) должно равняться 0; 
В протоколе T0 он не передается.
В протоколе T1 он завершает последовательность ATR.



Итак, теперь мы знаем, что означают байты в нашем примере ATR:

3F 67 2F 00 11 14 00 03 68 90 00

 TS=3F ;
 T0=67 ;
 TA1=0 (не передан) +>  ETU=372/частота_генератора_в_гц  или  ETU=1/9600 сек ;
 TB1=2F =>  II1=2 , PI1=15 => I=100 ma, P=15 v. ;
 TC1=0 =>  N=0 , дополнительное увеличение интервала меджу байтами не треб.;
 TD1=0 (не передан) => Протокол T0 - асинхронный полудуплексный посимвольный;
 TC2=0 (не передан) => Возможна смена параметров протокола;
 TA2=0 (не передан) => Рабочее время ожидания  WI=10 Etu ;
 "Исторические байты" = 11  14  00  03  68  90  00

Приложение 1:

Возможные значения делителя тактовой частоты
внешнего генератора
---------Таблица соответствия FI - F --------------------------
  FI   |     0000      0001  0010  0011  0100  0101  0110  0111
-------+-------------------------------------------------------
  F    | Встр.генератор 372   558   744  1116  1488  1860  RFU
-------+-------------------------------------------------------
  FI   | 1000  1001  1010  1011  1100  1101  1110  1111
-------+-------------------------------------------------------
  F    |  RFU   512   768  1024  1536  2048   RFU  RFU
-------+-------------------------------------------------------
 RFU - зарезервировано

Возможные значения делителя тактовой частоты
внутреннего генератора
---------Таблица соответствия DI-D --------------------
    DI | 0000  0001  0010  0011  0100  0101  0110  0111
------+------------------------------------------------
    D  |  RFU     1     2     4     8    16   RFU   RFU
-------------------------------------------------------
-------------------------------------------------------
    DI | 1000  1001  1010  1011  1100  1101  1110  1111
------+------------------------------------------------
    D  |  RFU   RFU   1/2   1/4   1/8  1/16  1/32  1/64
-------------------------------------------------------
                         Настройка параметров протокола (PTS)
                        =====================================
Если карта допускает настройку параметров протокола, то это должно быть 
сделано непосредственно после ATR.
В процессе настройки параметров протокола возможна переустановка параметров 
F и D для согласования скоростей работы карты и интерфейса.
Запрос PTS - настройки параметров протокола выполняется шестью байтами:
     _______________________________________________
    |       |       |       |       |       |       |
    |  PTSS |  PTS0 |  PTS1 |  PTS2 |  PTS3 |  PCK  |
    |_______|_______|_______|_______|_______|_______|

Назначение этих байт:
 
  PTSS - Инициирующий байт. Всегда FF Hex;
  PTSO - Байт формата. Бит-карта в битах 5-6-7 значением '1' определяет 
         последуют ли байты PTS1,PTS2,PTS3. В четырех младших битах - 
         значение типа протокола 0-T0 или 1-T1;
  PTS1 - содержит запрашиваемые значения FI (в старшей половине байта) и
         DI (в младшей половине байта);
  PTS2 - зарезервировано для последующего применения;
  PTS3 - зарезервировано для последующего применения;
  PCK - Контрольный байт. Вычисляется так: Исключающее_Или всех байтов от 
        PTSS до PCK, включая байты, равные нулю (или не переданные) 
        должно равняться 0; 
 

В подтверждение запроса карта отвечает точно такой же последовательностью.
Однако, если бит 5 в байте PTS1 равен '1' - карта все равно использует
значения FI и DI по умолчанию.
   Очень редкие карты допускают изменение протокола. 
                          Структура и обработка команд в субпротоколе Т0
                           =============================================

После получения ATR и возможного согласования параметров интерфейса 
(если TC2 не передан или был равен нулю) возможна передача команд и данных.

Команда всегда инициализируется интерфейсом. Интерфейс сообщает
о том, что делать в заголовке из 5 байт:
     _______________________________________
    |       |       |       |       |       |
    |   CLA |  INS  |   P1  |   P2  |   P3  |
    |_______|_______|_______|_______|_______|


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

* Заголовок Команды.
====================
- CLA - класс команды. Значение FF зарезервировано для PTS.
- INS - команда в классе команд. Значение команды имеет следующие
  ограничения: младший бит всегда 0, и старшая половина байта не является
  ни 6, ни 9.
- P1, P2 - дополонительные параметры (например адрес) завершающие команду.
- P3 - число байт данных (D1, ..., Dn) которые должны быть переданы
  в этой команде. Направление движения этих данных определяется командой.
  Причем, если передача данных из карты, P3=0 представляет передачу 256
  байт из платы. При передачи данных карте, P3=0 означает отсутствие
  данных.

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

* Байт Процедуры
================
Посылается картой и определяет действие, запрошенное у интерфейса. 
  Возможны три типа байт процедуры :

- NULL: (= $ 60) Этот байт посылается картой при перезапуске,
  чтобы предупредить о последующем байт процедуры.
  Не запрашивает никакого действия ни с VPP, ни с данными.

- SW1 (= $6x или $9x, исключая $60): устройство интерфейса убирает VPP
  и ждет байт SW2 завершающий команду.

- ACK: Определяет управление VPP (напряжением программирования)
       и передачей дальнейших данных.


В каждом байте процедуры карта может ответить ACK-байтом, NULL-байтом,
ничего не ответить или закончить команду последовательностью SW1-SW2.


Интерпретация байта процедуры
=============================
Всего возможно шесть ситуаций:

Ситуация | Байт | Значение | Что сообщается интерфейсу
---------+----- + -------- + ---------------------------------------
   0     | NULL |   $ 60   | Никакого действия с VPP. Устройство интерфейса
         |      |          | ждет нового байта процедуры
---------+----- + ------- + ---------------------------------------
   1     | SW1  |    SW1   | VPP не требуется. Интерфейс ждет байт SW2 
---------+----- + ------- + ---------------------------------------
   2     |      |   INS    | VPP не требуется. Можно передавать все 
         |      |          | остающиеся байты данных (Di, ..., Dn).
         |      |          | 
   3     |      | INS + 1  | Требуется VPP. Можно передавать все остающиеся 
         |      |          | байты данных (Di, ..., Dn).
         | ACK  |   ___    | 
   4     |      |   INS    | VPP не требуется. Можно передавать один 
         |      |          | следующий байт данных.
         |      |  _______ |
   5     |      |  INS + 1 | Требуется VPP. Можно передавать один
         |      |          | следующий байт данных.

(примечание - надчеркивание означает инверсию)

Внимание: Любая смена состояния VPP должена произойти за время прохождения
байта процедуры, или за время специального ожидания.

Выполнив запрошенные действия интерфейс ждет новый байт процедуры.


Интерпретация Байт Состояния
============================
 SW1 = $6x или $9x, исключая $ 60
 SW2 = любое значение)

Конечная последовательность SW1-SW2 определяет состояние карты 
в конце команды.

Нормальное окончание - SW1=$90,  SW2=$00 .

Если старшая половина байта SW1 - $ 6, то значение SW1 не зависит от 
прикладной программы. Определны следующие пять значений SW1 в таком
случае:
 - $6E плата не поддерживает класс команды.
 - $6D команда не запрограммирована или недопустима.
 - $6B неправильная  ссылка (P1/P2).
 - $67 неправильная длина.
 - $6F Точная диагностика не дана.

Другие значения зарезервированы для будущего использования ISO7816.

Если SW1 не равен $6E и не равен $6D, то карта поддерживает
переданную команду.
Стандарт ISO7816 не оговаривает ни значения байт SW1=$9х ,
ни значения байт SW2, это касается прикладной программы карты.

Известны следющие комбинации:
     SW1  SW2  Значение
--------------------------------
     62   81   Returned data may be corrupted.
     62   82   The end of the file has been reached before the end of reading.
     62   84   Selected file is not valid.
     65   01   Memory failure. There have been problems in writing or reading
               the EEPROM. Other hardware problems may also bring this error.
     68   00   The request function is not supported by the card.
     6A   00   Bytes P1 and/or P2 are incorrect.
     6A   80   The parameters in the data field are incorrect.
     6A   82   File not found.
     6A   83   Record not found.
     6A   84   There is insufficient memory space in record or file.
     6A   87   The P3 value is not consistent with the P1 and P2 values.
     6A   88   Referenced data not found.
     6C   XX   Incorrect P3 length.


                          Структура и обработка команд в субпротоколе Т1
                           =============================================
 На момент написания статьи только одна из известных карт поддерживала
субпротокол Т1 - карта спутниковой системы Dishnetwork.

Ссылки
======

Кое что о параметрах протокола можно почитать здесь.