xcd pg

30
SMART-CARD Smart- !"#$% 30 2001

Upload: companiadekartsrl

Post on 18-Dec-2014

100 views

Category:

Documents


5 download

DESCRIPTION

 

TRANSCRIPT

Page 1: Xcd pg

УТВЕРЖДЁН

СИСТЕМА УЧЕТА ПОТРЕБЛЕНИЯ РЕСУРСОВ И БЕЗНАЛИЧНЫХ РАСЧЕТОВ С ИСПОЛЬЗОВАНИЕМ SMART-CARD

Программное обеспечение для поддержки Smart-карт

Модуль для пункта пополнения на основе РС

Руководство программиста

Листов 30

2001

Page 2: Xcd pg

DSSSCT File :xcd_pg.doc Ref : XCDATAPG0000 Revision:2.0 2 / 30 Copyright © Dekart S.R.L (www.dekart.com) - 2001

This document shall not be disclosed to a third party without prior written consent of Dekart S.R.L. Никакая часть данного документа не может быть воспроизведена в какой бы то ни было форме и какими бы, то ни было

средствами без письменного разрешения владельца авторских прав.Ссылка на оригинал обязательна.

Аннотация Данный документ содержит описание функций (в стиле языка С), входящих вдинамически загружаемую библиотеку xcdata.dll.Приводится необходимая справочная информация, сведения о возможных ошибках,возникающих при работе функций.

Page 3: Xcd pg

DSSSCT File :xcd_pg.doc Ref : XCDATAPG0000 Revision:2.0 3 / 30 Copyright © Dekart S.R.L (www.dekart.com) - 2001

This document shall not be disclosed to a third party without prior written consent of Dekart S.R.L. Никакая часть данного документа не может быть воспроизведена в какой бы то ни было форме и какими бы, то ни было

средствами без письменного разрешения владельца авторских прав.Ссылка на оригинал обязательна.

Оглавление

1. НАЗНАЧЕНИЕ БИБЛИОТЕКИ XCDATA.DLL.............................................................................. 4

2. ОБЩИЕ СВЕДЕНИЯ ........................................................................................................................... 4

3. ОПИСАНИЕ ФУНКЦИЙ БИБЛИОТЕКИ XCDATA.DLL............................................................ 6

3.1. ФУНКЦИЯ CHECKACCESSCARD ..................................................................................................... 6 3.2. ФУНКЦИЯ CONNECTSAMCARD ..................................................................................................... 7 3.3. ФУНКЦИЯ CONNECTUSERCARD ..................................................................................................... 7 3.4. ФУНКЦИЯ CLOSECARD ................................................................................................................... 8 3.5. ФУНКЦИЯ GETCARDSTAT............................................................................................................... 8 3.6. ФУНКЦИЯ GETCHALLENGE ............................................................................................................ 8 3.7. ФУНКЦИЯ SELECTFILEINCARD ...................................................................................................... 9 3.8. ФУНКЦИЯ READFILERECORD....................................................................................................... 10 3.9. ФУНКЦИЯ UPDATEFILERECORD................................................................................................... 10 3.10. ФУНКЦИЯ STATICAUTH ............................................................................................................ 11 3.11. ФУНКЦИЯ EXTERNALAUTH ...................................................................................................... 12 3.12. ФУНКЦИЯ INTERNALAUTH........................................................................................................ 12 3.13. ФУНКЦИЯ DEBITTRANSACTION ................................................................................................ 13 3.14. ФУНКЦИЯ CREDITTRANSACTION ............................................................................................. 15 3.15. ФУНКЦИЯ GETMAXAMOUNT.................................................................................................... 16

4. ПРИЛОЖЕНИЯ................................................................................................................................... 17

4.1. СООБЩЕНИЯ ОБ ОШИБКАХ........................................................................................................... 17 4.2. ПРИМЕР ВЫЗОВА ФУНКЦИЙ МОДУЛЯ ИЗ ПРОГРАММЫ (BORLAND C++ V.5.01) ....................... 20 4.3. ВЗАИМОСВЯЗЬ ФУНКЦИЙ МОДУЛЯ XCDATA.DLL......................................................................... 29

Page 4: Xcd pg

DSSSCT File :xcd_pg.doc Ref : XCDATAPG0000 Revision:2.0 4 / 30 Copyright © Dekart S.R.L (www.dekart.com) - 2001

This document shall not be disclosed to a third party without prior written consent of Dekart S.R.L. Никакая часть данного документа не может быть воспроизведена в какой бы то ни было форме и какими бы, то ни было

средствами без письменного разрешения владельца авторских прав.Ссылка на оригинал обязательна.

1. Назначение библиотеки xcdata.dll Модуль - динамически загружаемая библиотека xcdata.dll - предназначен для

организации пункта пополнения кошельков карты пользователя на основе персонального компьютера.

Исполнение модуля в виде стандартной динамически загружаемой библиотеки Windows позволяет использовать её из самых разных приложений и систем программирования, начиная от FoxPro, Visual Basic кончая Delphi и С++ Builder.

2. Общие сведения

Набор функций динамически загружаемой библиотеки xcdata.dll включает: группу функций, предназначенных для аутентификации карт пользователей, группу функций для работы с электронным кошельком и различные вспомогательные функции.

Функции, входящие в модуль xcdata.dll, реализованы на языках программирования С, C++. Необходимое оборудование:• Компьютер IBM PC (486 и выше), имеющий свободные последовательные порты;

• Smart-карты: карта доступа, карта пользователя, SAM-карта (Secure Application Module);

• Считыватель smart-карт одного из следующих типов: SCR-60, Reflex 60, Reflex 72 (Schlumberger), TOWITOKO ChipDrive.

Необходимое программное обеспечение:• Операционная система MS Windows 9x, NT; • CT API для считывателей TOWITOKO ChipDrive и Schlumberger Reflex 72; • Файл с ключом ЦС/ЦСК CA_ID.KEY. Установка модуля xcdata.dll осуществляется простым его копированием всоответствующий каталог (SYSTEM, SYSTEM32) системы Windows. Взаимодействие функций модуля xcdata.dll приведено на рисунке в приложении п.4.3.

Используемые smart-карты №п/п Название доступа SAM Пользо-

вателя

Обязательный предварительный вызов функций

Необязательный предварительный вызов функций

1 CheckAccessCard + - - - 2 ConnectSAMCard - + - - CloseCard 3 ConnectUserCard - - + - CloseCard

Page 5: Xcd pg

DSSSCT File :xcd_pg.doc Ref : XCDATAPG0000 Revision:2.0 5 / 30 Copyright © Dekart S.R.L (www.dekart.com) - 2001

This document shall not be disclosed to a third party without prior written consent of Dekart S.R.L. Никакая часть данного документа не может быть воспроизведена в какой бы то ни было форме и какими бы, то ни было

средствами без письменного разрешения владельца авторских прав.Ссылка на оригинал обязательна.

4 GetChallenge - +-

-+

ConnectSAMCard/ ConnectUserCard

5 SelectFileInCard - +-

-+

ConnectSAMCard/ ConnectUserCard

6 StaticAuth +- +

--+

CheckAccessCard, ConnectSAMCard/ ConnectUserCard

7 ExternalAuth - + + ConnectSAMCard, ConnectUserCard

8 InternalAuth - + + ConnectSAMCard, ConnectUserCard

9 ReadFileRecord - +

--+

ConnectSAMCard/ ConnectUserCard, SelectFileInCard

10 UpdateFileRecord

- + + ConnectSAMCard, ConnectUserCard, ExternalAuth, InternalAuth SelectFileInCard

11 DebitTransaction

++

+

CheckAccessCard, ConnectSAMCard, ConnectUserCard, ExternalAuth, InternalAuth,

StaticAuth

12 CreditTransaction

++

+

CheckAccessCard, ConnectSAMCard, ConnectUserCard, ExternalAuth, InternalAuth

StaticAuth

13 GetMaxAmount + + ConnectSAMCard, ConnectUserCard

14 CloseCard 15 GetCardStat Могут выполняться после любой из вышеперечисленных функций

Page 6: Xcd pg

DSSSCT File :xcd_pg.doc Ref : XCDATAPG0000 Revision:2.0 6 / 30 Copyright © Dekart S.R.L (www.dekart.com) - 2001

This document shall not be disclosed to a third party without prior written consent of Dekart S.R.L. Никакая часть данного документа не может быть воспроизведена в какой бы то ни было форме и какими бы, то ни было

средствами без письменного разрешения владельца авторских прав.Ссылка на оригинал обязательна.

3. Описание функций библиотеки xcdata.dll

3.1. Функция CheckAccessCard

Название: CheckAccessCard Назначение: Функция проверяет наличие в считывателе карты доступа. Если она

присутствует, то ей предъявляется указанный PIN-код и с карты доступа считывается её серийный номер. Функция также определяет наличие файла с открытым ключом ЦС/ЦСК (CA_ID.KEY) и, если онобнаружен, то производится его «подключение» к модулю.Примечание: Перед завершением коммуникационный порт (считыватель) освобождается.

Условия применения:Необходимо наличие карты доступа и файла с ключами центра платёжной системы.

Синтаксис: #include "xCData.h" int CheckAccessCard(char *Port, short ReaderType, char *IccNo, char *KeyFile, char *PIN))

Входные данные:Port – указатель на строку содержащую имя коммуникационного порта (например COM1, COM2, COM3, COM4).

ReaderType – целое число, указывающее тип считывателя.Поддерживаются 4 типа считывателей:

№ п.п. Производитель / Название ReaderType 1 Schlumberger / SCR 60 0 2 Schlumberger / Reflex 60 1 3 TOWITOKO / ChipDrive 2 4 Schlumberger / Reflex 72 3

KeyFile – указатель на строку, содержащую путь и имя файла сключами центра платёжной системы CA_ID.KEY, который используется для получения открытого ключа центра системы.PIN – указатель на строку, содержащую PIN–код карты доступа. PIN–код может состоять от 4 до 8 десятичных цифр.

Выходные данные:IccNo – указатель на буфер (строку), в котором будет возвращён серийный номер карты доступа. Размер буфера должен быть не менее 33 байтов.

Возвращаемое значение:1 – в случае успешного завершения программы, иначе отрицательное значение кода ошибки (см. коды ошибок п.4.1).

Пример вызова функции из программы (BC++ v.5.01) см. п.4.2

Page 7: Xcd pg

DSSSCT File :xcd_pg.doc Ref : XCDATAPG0000 Revision:2.0 7 / 30 Copyright © Dekart S.R.L (www.dekart.com) - 2001

This document shall not be disclosed to a third party without prior written consent of Dekart S.R.L. Никакая часть данного документа не может быть воспроизведена в какой бы то ни было форме и какими бы, то ни было

средствами без письменного разрешения владельца авторских прав.Ссылка на оригинал обязательна.

3.2. Функция ConnectSAMCard

Название: ConnectSAMCard Назначение: Функция проверяет наличие в считывателе SAM карты. Если карта

присутствует, то она становится доступной для других функций.Условия применения: Необходимо наличие SAM-карты.Синтаксис: #include "xCData.h"

HANDLE ConnectSAMCard (char *Port, short ReaderType) Входные данные:

Port – указатель на строку, содержащую имя коммуникационного порта (см. п.3.1).

ReaderType – целое число, указывающее тип считывателя (см. п.3.1). Возвращаемое значение: HANDLE (дескриптор, логический номер, связанный с

открытым коммуникационным портом, к которому подключён считыватель и в котором находится SAM-карта) – при успешном завершении программы, иначе отрицательное значение кода ошибки (см. коды ошибок в п.4.1)

Примечание. Перед обращением к функции ConnectSAMCard необходимо предварительно удостовериться, что коммуникационный порт не был ранее открыт для работы с другой картой (см. п.3.4).

Ограничения: Необходимо соблюдения строгого соответствия типа считывателя (ReaderType) с реальным считывателем, подключённым к данному последовательному порту. Несоблюдение этого ограничения приводит к непредсказуемым результатам.

Пример вызова функции из программы (BC++ v.5.01) см. п.4.2

3.3. Функция ConnectUserCard

Название: ConnectUserCard Назначение: Функция проверяет наличие в считывателе карты пользователя. Если

карта присутствует, то она становится доступной для других функций.Условия применения: Необходимо наличие карты пользователя.Синтаксис: #include "xCData.h"

HANDLE ConnectUserCard (char *Port, short ReaderType) Входные данные:

Port – указатель на строку, содержащую имя коммуникационного порта (см. п.3.1).

ReaderType – целое число, указывающее тип считывателя (см. п.3.1). Возвращаемое значение: HANDLE (дескриптор, логический номер, связанный с

открытым коммуникационным портом, к которому подключён считыватель и в котором находится карта пользователя) – если успешное завершение программы, иначе отрицательное значение кода ошибки (см. коды ошибок в п.4.1).

Примечание. Перед обращением к функции ConnectUserCard необходимо предварительно удостовериться, что коммуникационный порт не был ранее открыт для работы с другой картой (см. п.3.4).

Page 8: Xcd pg

DSSSCT File :xcd_pg.doc Ref : XCDATAPG0000 Revision:2.0 8 / 30 Copyright © Dekart S.R.L (www.dekart.com) - 2001

This document shall not be disclosed to a third party without prior written consent of Dekart S.R.L. Никакая часть данного документа не может быть воспроизведена в какой бы то ни было форме и какими бы, то ни было

средствами без письменного разрешения владельца авторских прав.Ссылка на оригинал обязательна.

Ограничения: Необходимо соблюдения строгого соответствия типа считывателя (ReaderType) с реальным считывателем, подключённым к данному последовательному порту. Несоблюдение этого ограничения приводит к непредсказуемым результатам.

Пример вызова функции из программы (BC++ v.5.01) см. п.4.2

3.4. Функция CloseCard

Название: CloseCard Назначение: Функция завершает работу с картой, вставленной в считыватель,

закрывает и освобождает порт.Условия применения:

Необходимо наличие любой из вышеперечисленных smart-карт.Синтаксис: #include "xCData.h"

BOOL CloseCard (HANDLE hcd) Входные данные:

hcd – логический номер (HANDLE), связанный с открытым коммуникационным портом, к которому подключён считыватель и вкотором находится карта.

Возвращаемое значение: True, если успешное завершение программы, иначе – False. Пример вызова функции из программы (BC++ v.5.01) см. п.4.2

3.5. Функция GetCardStat

Название: GetCardStat Назначение: В соответствии со значением кода ошибки функция выдает

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

Условия применения:Необходимо наличие любой из вышеперечисленных smart-карт.

Синтаксис: #include "xCData.h" void GetCardStat (char *msgbuf)

Входные данные: отсутствуют.Выходные данные:

msgbuf – указатель на буфер (строку), в котором будет возвращено сообщение об ошибке. Размер буфера должен быть не менее 80 байт.

Ограничения:Функция должна вызываться непосредственно за функцией,вызвавшей ошибку в карте, иначе возвращаемое сообщение будет содержать «мусор».

Пример вызова функции из программы (BC++ v.5.01) см. п.4.2

3.6. Функция GetChallenge

Page 9: Xcd pg

DSSSCT File :xcd_pg.doc Ref : XCDATAPG0000 Revision:2.0 9 / 30 Copyright © Dekart S.R.L (www.dekart.com) - 2001

This document shall not be disclosed to a third party without prior written consent of Dekart S.R.L. Никакая часть данного документа не может быть воспроизведена в какой бы то ни было форме и какими бы, то ни было

средствами без письменного разрешения владельца авторских прав.Ссылка на оригинал обязательна.

Название: GetChallenge Назначение:

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

Условия применения:Необходимо наличие SAM-карты или карты пользователя. Перед обращением к функции GetChallenge необходимо предварительно вызвать функцию ConnectUserCard или ConnectSAMCard (если это не было выполнено ранее).

Синтаксис: #include "xCData.h" BOOL GetChallenge (HANDLE hcd, char *buf)

Входные данные:hcd – логический номер (HANDLE), связанный с открытым коммуникационным портом, к которому подключён считыватель и вкотором находится карта.

Выходные данные:buf - указатель на буфер (строку), в котором функция возвращает случайную последовательность в формате ASCII в шестнадцатеричном коде. Размер буфера должен быть не менее 17 байт.

Возвращаемое значение: True, если успешное завершение программы, иначе – False. Одной из причин появления результата False может быть отсутствие карты в считывателе.

Пример вызова функции из программы (BC++ v.5.01) см. п.4.2

3.7. Функция SelectFileInCard

Название: SelectFileInCard Назначение: Функция проверяет наличие в карте указанного файла. Если данный

файл присутствует, то он делается текущим.Условия применения:

Необходимо наличие SAM-карты или карты пользователя. Перед обращением к функции SelectFileInCard необходимо предварительно вызвать функцию ConnectUserCard или ConnectSAMCard (если это не было выполнено ранее).

Синтаксис: #include "xCData.h" BOOL SelectFileInCard (HANDLE hcd, char *FID)

Входные данные:hcd – логический номер (HANDLE), связанный с открытым коммуникационным портом, к которому подключён считыватель и вкотором находится карта.FID – указатель на строку, содержащую идентификатор (имя) файла.

Возвращаемое значение: В случае успешного завершения программы - True, иначе False, при этом расширенное сообщение об ошибке карты можно получить с помощью функции GetCardStat.

Пример вызова функции из программы (BC++ v.5.01) см. п.4.2

Page 10: Xcd pg

DSSSCT File :xcd_pg.doc Ref : XCDATAPG0000 Revision:2.0 10 / 30 Copyright © Dekart S.R.L (www.dekart.com) - 2001

This document shall not be disclosed to a third party without prior written consent of Dekart S.R.L. Никакая часть данного документа не может быть воспроизведена в какой бы то ни было форме и какими бы, то ни было

средствами без письменного разрешения владельца авторских прав.Ссылка на оригинал обязательна.

3.8. Функция ReadFileRecord

Название: ReadFileRecord Назначение: Функция ReadFileRecord проверяет наличие в карте указанного

файла. Если данный файл присутствует, то производится чтение из него выбранной записи.

Условия применения:Необходимо наличие SAM-карты или карты пользователя. Перед обращением к функции ReadFileRecord необходимо предварительно вызвать функцию ConnectUserCard или ConnectSAMCard (если это не было выполнено ранее), а также выбрать соответствующий уровень в иерархии файлов с помощью функции SelectFileInCard.

Синтаксис: #include "xCData.h" BOOL ReadFileRecord (HANDLE hcd, short rcNo, short len, char *buf)

Входные данные:hcd – логический номер (HANDLE), связанный с открытым коммуникационным портом, к которому подключён считыватель и вкотором находится карта.rcNo – номер записи для чтения, целое число. Примечание: нумерация начинается с 1.len – длина записи в байтах, целое число.buf – указатель на буфер (строка), в котором будет возвращена прочитанная запись из файла. Размер буфера должен быть не менее 2 * len + 1.

Возвращаемое значение: True, если успешное завершение программы, иначе False. Вслучае False, расширенное сообщение об ошибке карты можно получить с помощью функции GetCardStat.

Ограничения: Номер запись (rcNo) и длина записи (len) не могут быть больше 255. Кроме того, эти величины должны точно соответствовать структуре выбранного файла.

Пример вызова функции из программы (BC++ v.5.01) см. п.4.2

3.9. Функция UpdateFileRecord

Название: UpdateFileRecord Назначение: Функция UpdateFileRecord проверяет наличие в карте указанного

файла. Если данный файл присутствует, то производится замена выбранной записи.

Условия применения:Необходимо наличие SAM-карты или карты пользователя. Перед обращением к функции UpdateFileRecord необходимо предварительно вызвать функцию ConnectUserCard или ConnectSAMCard (если это не было выполнено ранее), а также выбрать соответствующий уровень в иерархии файлов с помощью

Page 11: Xcd pg

DSSSCT File :xcd_pg.doc Ref : XCDATAPG0000 Revision:2.0 11 / 30 Copyright © Dekart S.R.L (www.dekart.com) - 2001

This document shall not be disclosed to a third party without prior written consent of Dekart S.R.L. Никакая часть данного документа не может быть воспроизведена в какой бы то ни было форме и какими бы, то ни было

средствами без письменного разрешения владельца авторских прав.Ссылка на оригинал обязательна.

функции SelectFileInCard и предъявить соответствующий ключ.Например, для замены записи в файле “8400” требуется выполнить внешнюю и внутреннюю аутентификацию (функции ExternalAuth иInternalAuth).

Синтаксис: #include "xCData.h" int UpdateFileRecord (HANDLE hcd, short rcNo, short len, char *buf)

Входные данные:hcd – логический номер (HANDLE), связанный с открытым коммуникационным портом, к которому подключён считыватель и вкотором находится карта.rcNo – номер записи для чтения, целое число. Примечание: нумерация начинается с 1.len – длина записи в байтах, целое число.buf – указатель на буфер (строка), в котором находится запись для замены (в формате ASCII).

Возвращаемое значение: 1, если успешное завершение программы, иначе 0 (ошибка карты) или отрицательное значение кода ошибки (см. коды ошибок). Вслучае 0 расширенное сообщение об ошибке карты можно получить спомощью функции GetCardStat.

Ограничения: Номер запись (rcNo) и длина записи (len) не могут быть больше 255. Кроме того, эти величины должны точно соответствовать структуре выбранного файла.

Пример вызова функции из программы (BC++ v.5.01) см. п.4.2

3.10. Функция StaticAuth

Название: StaticAuth Назначение: Функция StaticAuth выполняет статическую аутентификацию карты,

которая включает проверку верности статических данных на карте,принадлежность карты данной системе и эмитенту. Данная проверка является «сильной», т.к., по сути, осуществляется проверка цифровой подписи.

Условия применения:Необходимо наличие SAM-карты или карты пользователя. Перед обращением к функции StaticAuth необходимо предварительно «подключить» файл с ключами ЦС/ЦСК (функция CheckAccessCard) и вызвать функцию ConnectUserCard или ConnectSAMCard (если это не было выполнено ранее).

Синтаксис: #include "xCData.h" int StaticAuth (HANDLE hcd)

Входные данные:hcd – логический номер (HANDLE), связанный с открытым коммуникационным портом, к которому подключён считыватель и вкотором находится карта.

Возвращаемое значение:1 - успешное завершение программы;

Page 12: Xcd pg

DSSSCT File :xcd_pg.doc Ref : XCDATAPG0000 Revision:2.0 12 / 30 Copyright © Dekart S.R.L (www.dekart.com) - 2001

This document shall not be disclosed to a third party without prior written consent of Dekart S.R.L. Никакая часть данного документа не может быть воспроизведена в какой бы то ни было форме и какими бы, то ни было

средствами без письменного разрешения владельца авторских прав.Ссылка на оригинал обязательна.

0 - ошибка карты (расширенное сообщение об ошибке карты можно получить с помощью функции GetCardStat); отрицательное значение кода ошибки (см. коды ошибок в п.4.1).

Пример вызова функции из программы (BC++ v.5.01) см. п.4.2

3.11. Функция ExternalAuth

Название: ExternalAuth Назначение: Функция ExternalAuth выполняет внешнюю аутентификацию,

которая означает, что карта пользователя проверяет, является ли корректной SAM карта. Аутентификация представляет собой проверку верности ключей в SAM модуле. Она является проверкой MAC значения полученного при помощи алгоритма DES. Эта проверка является более слабой, чем проверка, выполняемая функцией StaticAuth.

Условия применения:Необходимо наличие SAM-карты и карты пользователя. Перед обращением к функции ExternalAuth необходимо предварительно вызвать функции ConnectUserCard и ConnectSAMCard (если это не было выполнено ранее).

Синтаксис: #include "xCData.h" BOOL ExternalAuth (HANDLE hcd_user, HANDLE hcd_SAM)

Входные данные:hcd_user – логический номер (HANDLE), связанный с открытым коммуникационным портом, к которому подключён считыватель и вкотором находится карта пользователя.hcd_ SAM – логический номер (HANDLE), связанный с открытым коммуникационным портом, к которому подключён считыватель и вкотором находится SAM-карта.

Возвращаемое значение:True, если успешное завершение программы, иначе False. В случае False, расширенное сообщение об ошибке карты можно получить спомощью функции GetCardStat.

Ограничения:Если ключи SAM карты не соответствуют ключам карты пользователя,то уменьшается счётчик попыток соответствующего ключа в карте пользователя. При исчерпании всех (обычно 3-х) попыток соответствующий ключ блокируется. Если аутентификация проходит успешно, то счётчик попыток соответствующего ключа устанавливается в максимальное значение (обычно 3).

Пример вызова функции из программы (BC++ v.5.01) см. п.4.2

3.12. Функция InternalAuth

Название: InternalAuth

Page 13: Xcd pg

DSSSCT File :xcd_pg.doc Ref : XCDATAPG0000 Revision:2.0 13 / 30 Copyright © Dekart S.R.L (www.dekart.com) - 2001

This document shall not be disclosed to a third party without prior written consent of Dekart S.R.L. Никакая часть данного документа не может быть воспроизведена в какой бы то ни было форме и какими бы, то ни было

средствами без письменного разрешения владельца авторских прав.Ссылка на оригинал обязательна.

Назначение: Функция InternalAuth выполняет внутреннюю аутентификацию,которая означает, что SAM карта проверяет, является ли корректной карта пользователя. Аутентификация представляет собой проверку верности ключей карты пользователя. Она является проверкой MAC значения, полученного при помощи алгоритма DES. Данная проверка является более слабой, чем проверка, выполняемая функцией StaticAuth.

Условия применения:Необходимо наличие SAM-карты и карты пользователя. Перед обращением к функции InternalAuth необходимо предварительно вызвать функции ConnectUserCard и ConnectSAMCard (если это не было выполнено ранее).

Синтаксис: #include "xCData.h" BOOL InternalAuth (HANDLE hcd_user, HANDLE hcd_SAM)

Входные данные:hcd_user – логический номер (HANDLE), связанный с открытым коммуникационным портом, к которому подключён считыватель и вкотором находится карта пользователя.hcd_ SAM – логический номер (HANDLE), связанный с открытым коммуникационным портом, к которому подключён считыватель и вкотором находится SAM-карта.

Возвращаемое значение:True, если успешное завершение программы, иначе False. В случае False, расширенное сообщение об ошибке карты можно получить спомощью функции GetCardStat.

Ограничения:Если ключи карты пользователя не соответствуют ключам SAM карты,то уменьшается счётчик попыток соответствующего ключа в SAM карте. При исчерпании всех (обычно 3-х) попыток соответствующий ключ блокируется. Если аутентификация проходит успешно, то счётчик попыток соответствующего ключа устанавливается вмаксимальное значение (обычно 3).

Пример вызова функции из программы (BC++ v.5.01) см. п.4.2

3.13. Функция DebitTransaction

Название: DebitTransaction Назначение: Функция DebitTransaction выполняет дебетование выбранного

кошелька карты пользователя на указанную сумму. Операция выполняется в диалоге с SAM-картой, в процессе которого происходит динамическая аутентификация карт и создаётся сертификат (подпись)операции.

Условия применения:Необходимо наличие SAM-карты и карты пользователя. Перед обращением к функции DebitTransaction необходимо предварительно «подключить» файл с ключами ЦС/ЦСК (функция CheckAccessCard), вызвать функции ConnectUserCard и ConnectSAMCard (если это не

Page 14: Xcd pg

DSSSCT File :xcd_pg.doc Ref : XCDATAPG0000 Revision:2.0 14 / 30 Copyright © Dekart S.R.L (www.dekart.com) - 2001

This document shall not be disclosed to a third party without prior written consent of Dekart S.R.L. Никакая часть данного документа не может быть воспроизведена в какой бы то ни было форме и какими бы, то ни было

средствами без письменного разрешения владельца авторских прав.Ссылка на оригинал обязательна.

было выполнено ранее). Затем выполнить внешнюю и внутреннюю аутентификацию (InternalAuth, ExternalAuth).

Синтаксис: #include "xCData.h" int DebitTransaction (HANDLE hcd_user, HANDLE hcd_SAM, short purse, unsigned long amount, char *cur, char *merchantID, char *rnd, char *crt)

Входные данные:hcd_user – логический номер (HANDLE), связанный с открытым коммуникационным портом, к которому подключён считыватель и вкотором находится карта пользователя.hcd_ SAM – логический номер (HANDLE), связанный с открытым коммуникационным портом, к которому подключён считыватель и вкотором находится SAM-карта.MercantID – указатель на строку, содержащую идентификатор продавца (8 шестнадцатеричных цифр). purse – номер электронного кошелька (целое число). Примечание:нумерация начинается с 1.amount – длинное целое, определяющее сумму, на которую происходит дебетование кошелька. Примечание: сумма дебетования должна быть такой, чтобы (баланс кошелька пользователя- amount) > 0; cur – указатель на строку, содержащую код валюты по ISO, представленный в ASCII коде (3 байта);

Выходные данные:rnd – указатель на буфер (размером не менее 17 байтов), в который функция возвращает случайную последовательность (8 – двоичных байтов) в формате ASCII в шестнадцатеричном коде.crt – указатель на буфер (размером не менее 13 байтов), в который функция возвращает сертификат (подпись) операции дебетования кошелька (6 – двоичных байтов) в формате ASCII вшестнадцатеричном коде.

Возвращаемое значение:1 - успешное завершение программы;0 - ошибка карты (расширенное сообщение об ошибке карты можно получить с помощью функции GetCardStat); отрицательное значение кода ошибки (см. коды ошибок в п.4.1).

Ограничения:Если ключи карты пользователя не соответствуют ключам SAM карты,то уменьшается счётчик попыток соответствующего ключа в карте пользователя или SAM карте. При исчерпании всех (обычно 3-х)попыток соответствующий ключ блокируется. Если динамическая аутентификация проходит успешно, то счётчик попыток соответствующего ключа устанавливается в максимальное значение (обычно 3).

Пример вызова функции из программы (BC++ v.5.01) см. п.4.2

Page 15: Xcd pg

DSSSCT File :xcd_pg.doc Ref : XCDATAPG0000 Revision:2.0 15 / 30 Copyright © Dekart S.R.L (www.dekart.com) - 2001

This document shall not be disclosed to a third party without prior written consent of Dekart S.R.L. Никакая часть данного документа не может быть воспроизведена в какой бы то ни было форме и какими бы, то ни было

средствами без письменного разрешения владельца авторских прав.Ссылка на оригинал обязательна.

3.14. Функция CreditTransaction

Название: CreditTransaction Назначение: Функция CreditTransaction выполняет кредитование выбранного

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

Условия применения:Необходимо наличие SAM-карты и карты пользователя. Перед обращением к функции CreditTransaction необходимо предварительно «подключить» файл с ключами ЦС/ЦСК (функция CheckAccessCard), вызвать функции ConnectUserCard иConnectSAMCard (если это не было выполнено ранее). Затем выполнить внешнюю и внутреннюю аутентификацию (InternalAuth, ExternalAuth).

Синтаксис: #include "xCData.h" int CreditTransaction (HANDLE hcd_user, HANDLE hcd_SAM, short purse_user, short purse_SAM, unsigned long amount, char *cur, char *pointID, char *rnd, char *crt, char *rnd2, char *crt2)

Входные данные:hcd_user – логический номер (HANDLE), связанный с открытым коммуникационным портом, к которому подключён считыватель и вкотором находится карта пользователя.hcd_ SAM – логический номер (HANDLE), связанный с открытым коммуникационным портом, к которому подключён считыватель и вкотором находится SAM-карта.pointID – указатель на строку, содержащую идентификатор пункта пополнения (8 шестнадцатеричных цифр).

cur – указатель на строку, содержащую код валюты по ISO, представленный в ASCII коде (3 байта). purse_user – номер электронного кошелька карты пользователя (целое число). Примечание: нумерация начинается с 1.

purse_SAM – номер электронного кошелька SAM-карты (целое число). Примечание: нумерация начинается с 1.amount – длинное целое, определяющее сумму, на которую происходит кредитование кошелька карты пользователя и дебетование кошелька SAM-карты. Примечание: сумма кредитования должна быть такой, чтобы (баланс кошелька карты пользователя + amount) < потолок карты пользователя, (баланс кошелька SAM-карты - amount) > 0.

Выходные данные:rnd – указатель на буфер (строку), в котором функция возвращает случайную последовательность в формате ASCII в шестнадцатеричном коде. Размер буфера должен быть не менее 17 байт (ФАЗА1).

Page 16: Xcd pg

DSSSCT File :xcd_pg.doc Ref : XCDATAPG0000 Revision:2.0 16 / 30 Copyright © Dekart S.R.L (www.dekart.com) - 2001

This document shall not be disclosed to a third party without prior written consent of Dekart S.R.L. Никакая часть данного документа не может быть воспроизведена в какой бы то ни было форме и какими бы, то ни было

средствами без письменного разрешения владельца авторских прав.Ссылка на оригинал обязательна.

сrt - указатель на буфер (строку), в котором функция возвращает сертификат (подпись) операции дебетования в формате ASCII вшестнадцатеричном коде. Размер буфера должен быть не менее 13 байт (ФАЗА1). rnd2 – указатель на буфер (строку), в котором функция возвращает случайную последовательность в формате ASCII в шестнадцатеричном коде. Размер буфера должен быть не менее 17 байт (ФАЗА2).

crt2 - указатель на буфер (строку), в котором функция возвращает сертификат (подпись) операции дебетования в формате ASCII вшестнадцатеричном коде. Размер буфера должен быть не менее 13 байт (ФАЗА2).

Возвращаемое значение:1 - успешное завершение программы;0 - ошибка карты (расширенное сообщение об ошибке карты можно получить с помощью функции GetCardStat); отрицательное значение кода ошибки (см. коды ошибок в п.4.1).

Ограничения:Если ключи карты пользователя не соответствуют ключам SAM карты,то уменьшается счётчик попыток соответствующего ключа в карте пользователя или SAM карте. При исчерпании всех (обычно 3-х)попыток соответствующий ключ блокируется. Если динамическая аутентификация проходит успешно, то счётчик попыток соответствующего ключа устанавливается в максимальное значение (обычно 3).

Пример вызова функции из программы (BC++ v.5.01) см. п.4.2

3.15. Функция GetMaxAmount

Название: GetMaxAmount Назначение: Функция GetMaxAmount выполняет чтение значения потолка

выбранного кошелька карты.Условия применения:

Необходимо наличие SAM-карты или карты пользователя. Перед обращением к функции GetMaxAmount необходимо предварительно вызвать функцию ConnectUserCard или ConnectSAMCard (если это не было выполнено ранее).

Синтаксис: #include "xCData.h" int GetMaxAmount (HANDLE hcd, short purse, unsigned long &amount)

Входные данные:hcd – логический номер (HANDLE), связанный с открытым коммуникационным портом, к которому подключён считыватель и вкотором находится карта пользователя или SAM-карта.purse – номер электронного кошелька карты пользователя или SAM-карты (целое число). Примечание: нумерация начинается с 1.

Выходные данные:amount – длинное целое, определяющее значение потолка кошелька карты пользователя или SAM-карты.

Page 17: Xcd pg

DSSSCT File :xcd_pg.doc Ref : XCDATAPG0000 Revision:2.0 17 / 30 Copyright © Dekart S.R.L (www.dekart.com) - 2001

This document shall not be disclosed to a third party without prior written consent of Dekart S.R.L. Никакая часть данного документа не может быть воспроизведена в какой бы то ни было форме и какими бы, то ни было

средствами без письменного разрешения владельца авторских прав.Ссылка на оригинал обязательна.

Возвращаемое значение:1 - успешное завершение программы;0 - ошибка карты (расширенное сообщение об ошибке карты можно получить с помощью функции GetCardStat); отрицательное значение кода ошибки (см. коды ошибок в п.4.1).

Пример вызова функции из программы (BC++ v.5.01) см. п.4.2

4. Приложения

4.1. Сообщения об ошибках

Код ошибки Наименование ошибки Комментарий

Общие коды возврата 0 XCDATA_NOK Ненормальное завершение

программы. Возникла ошибка при работе с картой. Необходимо воспользоваться функцией GetCardStat.

1 XCDATA_OK Нормальное завершение программы.

Ошибки общего характера -1 ERR_PC_TIME_OUT

Ошибка вызвана сбоем в работе компьютера

-2...-7 Резерв

Ретранслируемые коды ошибки интерфейса CT-API

-8 ERR_CT_API_NOT_ACC CT-API недоступен -10 ERR_CT_API_TRANSMIS Ошибка передачи -11 ERR_CT_API_MEM_ASIGN Ошибка захвата памяти

Ошибки, возникающие при работе сфункциями модуля xCData

-12 ERR_FILE_NOT_FOUND Ошибка вызвана отсутствием файла сключами системы

-13 ERR_READING_FILE Ошибка при чтении файла с ключами системы

-14 ERR_BAD_READER

Появление данной ошибки может говорить о следующем:• отсутствует считыватель, или • тип считывателя указан неправильно, или

Page 18: Xcd pg

DSSSCT File :xcd_pg.doc Ref : XCDATAPG0000 Revision:2.0 18 / 30 Copyright © Dekart S.R.L (www.dekart.com) - 2001

This document shall not be disclosed to a third party without prior written consent of Dekart S.R.L. Никакая часть данного документа не может быть воспроизведена в какой бы то ни было форме и какими бы, то ни было

средствами без письменного разрешения владельца авторских прав.Ссылка на оригинал обязательна.

• ошибка при работе считывателя,или • указан неверный СОМ-порт.

-15 ERR_NO_CARD_ON_READER Ошибка вызвана отсутствием карты всчитывателе

-16 ERR_BAD_ACCESS_CARD Ошибка при работе с картой доступа,возможно, вставлена не карта доступа, а иная.

-17 ERR_INVALID_PIN_LEN Неправильная длина PIN-кода -18 ERR_INVALID_PIN_CHR При вводе PIN-кода были

использованы не только десятичные цифры

-19 ERR_BAD_PIN_VERIFY PIN-код не верифицирован -20 ERR_BAD_PASSWORD Неверный пароль доступа к

секретным ключам системы -21 ERR_BAD_SAM_CARD Ошибка при работе с SAM картой,

возможно, вставлена не SAM карта, аиная.

-22 ERR_BAD_USR_CARD Ошибка при работе с картой пользователя, возможно, вставлена не карта пользователя, а иная.

-23 ERR_INV_REC_LEN Неправильная длина записи -24 ERR_DNOT_FOUND_KEY Отсутствует ключ -25 ERR_APP_NOT_FOUND Отсутствует приложение -26 ERR_READ_CARD_FILE Ошибка чтения файла на карте -27 ERR_IDENT_NOT_FOUND На карте отсутствует файл 8000-28 ERR_BAD_ISS_CERT Неверный сертификат открытого

ключа эмитента -29 ERR_BAD_ISS_IDEND Неверный эмитент -30 ERR_AUTH_NOT_FOUND На карте отсутствует файл 8300-31 ERR_UNKNOWN_AUTH_ALG Неизвестный алгоритм

аутентификации -32 ERR_SN_NOT_FOUND На карте отсутствует файл 2F00 -33 ERR_SAM_NOT_FOUND Отсутствует SAM-карта -34 ERR_USR_NOT_FOUND Отсутствует карта пользователя -35 ERR_USR_PURS_NOTFOUND На карте пользователя отсутствует

файл с кошельком -36 ERR_SAM_PURS_NOTFOUND На SAM-карте отсутствует файл с

кошельком -37 ERR_USR_IS_BAD «Запорчена» карта пользователя –

подлежит изъятию -38 ERR_SAM_IS_BAD «Запорчена» SAM-карта – подлежит

изъятию -39 ERR_USR_CUR_NOT_MATCH При вызове функции указан

неверный тип валюты в кошельке карты пользователя

Page 19: Xcd pg

DSSSCT File :xcd_pg.doc Ref : XCDATAPG0000 Revision:2.0 19 / 30 Copyright © Dekart S.R.L (www.dekart.com) - 2001

This document shall not be disclosed to a third party without prior written consent of Dekart S.R.L. Никакая часть данного документа не может быть воспроизведена в какой бы то ни было форме и какими бы, то ни было

средствами без письменного разрешения владельца авторских прав.Ссылка на оригинал обязательна.

-40 ERR_SAM_CUR_NOT_MATCH При вызове функции указан неверный тип валюты в кошельке SAM-карты

-41 ERR_READ_USR_CARD Ошибка при чтении карты пользователя

-42 ERR_READ_SAM_CARD Ошибка при чтении SAM-карты -43 ERR_USR_DEBIT_PURSE Ошибка при дебетовании кошелька

карты пользователя -44 ERR_USR_CREDIT_PURSE Ошибка при кредитовании кошелька

карты пользователя -45 ERR_SAM_DEBIT_PURSE Ошибка при дебетовании кошелька

SAM-карты -46 ERR_INV_ID_LEN Неверная длина идентификатора

-47...-50 Резерв

Ошибки, возникающие при работе сбиблиотекой mirlib (работа сбольшими числами)

-51 ERR_BASE_TOO_BIG Основание числа очень большое для представления

-52 ERR_DIV_BY_ZERO Деление на ноль (в библиотеке больших чисел)

-53 ERR_OVERFLOW Переполнение – число очень большое

-54 ERR_NEG_RESULT При вычислении получено отрицательное значение

-55 ERR_BAD_FORMAT Неверный входной формат числа -56 ERR_BAD_BASE Неверное основание числа -57 ERR_BAD_PARAMETERS Неверное использование параметра -58 ERR_OUT_OF_MEMORY Недостаточно оперативной памяти -59 ERR_NEG_ROOT Четный корень из отрицательного

числа -60 ERR_NEG_POWER Возведение числа в отрицательную

степень -61 ERR_BAD_ROOT Попытка получить неверный корень -62 ERR_INT_OP Неверная операция над Flash числом -63 ERR_FLASH_OVERFLOW Flash переполнение -64 ERR_TOO_BIG Числа очень большие -65 ERR_NEG_LOG Логарифм из отрицательного числа -66 ERR_DOUBLE_FAIL Ошибка преобразования double в

flash -67 ERR_IO_OVERFLOW Переполнение буфера ввода/вывода -68 ERR_NO_MIRSYS Библиотека больших чисел не

проинициализирована -69 ERR_BAD_MONT_MOD Неверный Монтгомери модуль

Page 20: Xcd pg

DSSSCT File :xcd_pg.doc Ref : XCDATAPG0000 Revision:2.0 20 / 30 Copyright © Dekart S.R.L (www.dekart.com) - 2001

This document shall not be disclosed to a third party without prior written consent of Dekart S.R.L. Никакая часть данного документа не может быть воспроизведена в какой бы то ни было форме и какими бы, то ни было

средствами без письменного разрешения владельца авторских прав.Ссылка на оригинал обязательна.

(должен быть нечетным)-70 ERR_NO_MONT_MOD Не определен Монтгомери модуль -71 ERR_EXP_TOO_BIG Слишком большая экспонента -72 ERR_NBASE_MBP_P2 Основание должно быть степенью 2

-73...–124 Резерв

-125 ERR_FUNC_NOT_RELEASED -126 ERR_USR_ABORT Работа программы остановлена

пользователем

/* Rest of CT-API */ -127 ERR_CT_API_ABORT Работа программы остановлена

сервером -128 ERR_CT_API_HTSI Ошибка нижнего уровня

4.2. Пример вызова функций модуля из программы (Borland C++ v.5.01) //---------------------------------------------------------------------------- // Test BC++ built 32-bit DLL's (Example of xcdata.DLL call). // // Copyright (c) Dekart Ltd. All Rights Reserved // // This application tests calling into a 32-bit DLL built with Borland C++. // Code was verified with Borland C++ 5.02 // //---------------------------------------------------------------------------- #include <mfc/afxwin.h> // For GetDlgItemText() + windows.h #include <stdio.h> // stdio.h #include "xCData.h" // functions from xcdata.dll #include <stdlib.h> #include <sys/stat.h> #include <io.h> #include <conio.h> #include <dir.h> #include <fstream.h> #include <string.h> // // Declaration of DLL - functions // int ( __stdcall *pCheckAccessCard)(char *Port, short ReaderType, char *IccNo, char *KeyFile, char *PIN); int (__stdcall *pConnectSAMCard)(char *Port, short ReaderType); int (__stdcall *pConnectUserCard)(char *Port, short ReaderType); BOOL (__stdcall *pCloseCard)(int hcd); BOOL (__stdcall *pSelectFileInCard)(int hcd, char *FID); BOOL (__stdcall *pReadFileRecord)(int hcd, short rcNo, short len, char *buf); int (__stdcall *pUpdateFileRecord)(int hcd, short rcNo, short len, char *buf); int (__stdcall *pStaticAuth)(int hcd); BOOL (__stdcall *pExternalAuth)(int hcd_user, int hcd_SAM); BOOL (__stdcall *pInternalAuth)(int hcd_user, int hcd_SAM); int (__stdcall *pDebitTransaction)(int hcd_user, int hcd_SAM, short purse, unsigned long amount, char *cur, char *mercantID, char *rnd, char *crt); int (__stdcall *pCreditTransaction)(int hcd_user, int hcd_SAM, short purse_user, short purse_SAM, unsigned long amount, char *cur, char *pointID, char *rnd, char *crt, char *rnd2, char *crt2); BOOL (__stdcall *pGetChallenge)(int hcd, char *buf);

Page 21: Xcd pg

DSSSCT File :xcd_pg.doc Ref : XCDATAPG0000 Revision:2.0 21 / 30 Copyright © Dekart S.R.L (www.dekart.com) - 2001

This document shall not be disclosed to a third party without prior written consent of Dekart S.R.L. Никакая часть данного документа не может быть воспроизведена в какой бы то ни было форме и какими бы, то ни было

средствами без письменного разрешения владельца авторских прав.Ссылка на оригинал обязательна.

void (__stdcall *pGetCardStat)(char *msgbuf); int (__stdcall *pGetMaxAmount)(int hcd, short purse, unsigned long &amount);

char xDll[] = "xcdata.dll"; /////////////////////////////////////////////////////////////////////////////// int main() {

// // Declaration & Initial Values of variables // int status, i, user, sam; long int sum1=0; unsigned long amount_user=0, amount_sam=0; char cardnum[33]=" "; char port[20]=" ", port_sam[20]=" ",port_user[20]=" ", cardpin[32]=" "; char buf_err[80],buf_reader[2]=" ",buf_reader_sam[2]=" ",buf_reader_user[2]=" "; char buf_sum[80]=" ",buf_purse_sam[2]=" ",buf_purse_user[2]=" "; char card_file[5]=" "; char rand[17]=" ", str_buf[511]=" "; char rand1[17]=" ", rand2[17]=" "; char crt1[17]=" ", crt2[17]=" "; char cur[4]=" ",ident[9]=" "; short reader, reader_sam, reader_user, purse_sam, purse_user, purse_s, purse_u; char filename[MAXPATH]; BOOL res; // // Load the Dynamic Link LIbrary xcdata.DLL // HINSTANCE hLib = LoadLibrary(xDll); if ( (unsigned)hLib <= HINSTANCE_ERROR ) { printf("Failure loading library: %s\n", xDll); return 0; } // // Get all the entry points for the functions we wish to test. Typedef's can // be used to simplify casting the retrun value from GetProcAddress. // pCheckAccessCard = (int( __stdcall*)(char *Port, short ReaderType, char *IccNo,char *KeyFile, char *PIN))GetProcAddress(hLib, "CheckAccessCard"); pConnectSAMCard = (int(__stdcall*)(char *Port, short ReaderType))GetProcAddress(hLib, "ConnectSAMCard"); pConnectUserCard = (int(__stdcall*)(char *Port, short ReaderType))GetProcAddress(hLib, "ConnectUserCard"); pCloseCard = (BOOL(__stdcall*)(int hcd))GetProcAddress(hLib, "CloseCard"); pSelectFileInCard = (BOOL(__stdcall*)(int hcd, char *FID))GetProcAddress(hLib, "SelectFileInCard"); pReadFileRecord = (BOOL(__stdcall*)(int hcd, short rcNo, short len, char *buf))GetProcAddress(hLib, "ReadFileRecord"); pUpdateFileRecord = (int(__stdcall*)(int hcd, short rcNo, short len, char *buf))GetProcAddress(hLib, "UpdateFileRecord"); pStaticAuth = (int(__stdcall*)(int hcd))GetProcAddress(hLib, "StaticAuth"); pExternalAuth = (BOOL(__stdcall*)(int hcd_user, int hcd_SAM))GetProcAddress(hLib, "ExternalAuth"); pInternalAuth = (BOOL(__stdcall*)(int hcd_user, int hcd_SAM))GetProcAddress(hLib, "InternalAuth"); pDebitTransaction = (int(__stdcall*)(int hcd_user, int hcd_SAM, short purse, unsigned long amount, char *cur, char *mercantID, char *rnd, char *crt))GetProcAddress(hLib, "DebitTransaction"); pCreditTransaction = (int(__stdcall*)(int hcd_user, int hcd_SAM, short purse_user, short purse_SAM, unsigned long amount, char *cur, char *pointID, char *rnd, char *crt, char *rnd2, char *crt2))GetProcAddress(hLib, "CreditTransaction"); pGetChallenge = (BOOL(__stdcall*)(int hcd, char *buf))GetProcAddress(hLib, "GetChallenge"); pGetCardStat = (void(__stdcall*)(char *msgbuf))GetProcAddress(hLib, "GetCardStat"); pGetMaxAmount = (int (__stdcall*)(int hcd, short purse, unsigned long &amount))GetProcAddress(hLib,"GetMaxAmount");

Page 22: Xcd pg

DSSSCT File :xcd_pg.doc Ref : XCDATAPG0000 Revision:2.0 22 / 30 Copyright © Dekart S.R.L (www.dekart.com) - 2001

This document shall not be disclosed to a third party without prior written consent of Dekart S.R.L. Никакая часть данного документа не может быть воспроизведена в какой бы то ни было форме и какими бы, то ни было

средствами без письменного разрешения владельца авторских прав.Ссылка на оригинал обязательна.

// // GetProcAddress returns null on failure // if( pCheckAccessCard == NULL || pConnectSAMCard == NULL || pConnectUserCard == NULL || pCloseCard == NULL || pSelectFileInCard == NULL || pReadFileRecord == NULL || pUpdateFileRecord == NULL || pStaticAuth == NULL || pExternalAuth == NULL || pInternalAuth == NULL || pDebitTransaction == NULL || pCreditTransaction == NULL || pGetChallenge == NULL || pGetCardStat == NULL || pGetMaxAmount == NULL) { printf("Failure locating procedures.\n"); return 0; }

// // Check & load INI parameters from xcdata.ini // // PORT - name of com-port connected to reader // PORT_SAM - name of com-port connected to reader with SAM-card // PORT_USER - name of com-port connected to reader with user card // READER - reader type // READER_SAM - type of reader with SAM-card // READER_USER - type of reader with user card // CA_CARD_PIN - PIN-code to access card (CA) // PURSE_SAM - number of purse on SAM-card // PURSE_USER - number of purse on user card // CUR - currency type // SUM - sum // ID - merchant identifier // CARD_FILE - name of card file // CA_KEY_FILE - name of file with keys of CA // GetPrivateProfileString("COMMON", "PORT", "COM2", port, sizeof(port), "ex_xcd.ini"); GetPrivateProfileString("COMMON", "PORT_SAM", "COM2", port_sam, sizeof(port_sam), "ex_xcd.ini"); GetPrivateProfileString("COMMON", "PORT_USER", "COM2", port_user, sizeof(port_user), "ex_xcd.ini"); GetPrivateProfileString("COMMON", "CA_CARD_PIN", "1111", cardpin, sizeof(cardpin), "ex_xcd.ini"); GetPrivateProfileString("COMMON", "READER", "2", buf_reader, sizeof(buf_reader), "ex_xcd.ini"); GetPrivateProfileString("COMMON", "READER_SAM", "2", buf_reader_sam, sizeof(buf_reader_sam), "ex_xcd.ini"); GetPrivateProfileString("COMMON", "READER_USER", "2", buf_reader_user, sizeof(buf_reader_user), "ex_xcd.ini"); GetPrivateProfileString("COMMON", "PURSE_SAM", "2", buf_purse_sam, sizeof(buf_purse_sam), "ex_xcd.ini"); GetPrivateProfileString("COMMON", "PURSE_USER", "2", buf_purse_user, sizeof(buf_purse_user), "ex_xcd.ini"); GetPrivateProfileString("COMMON", "CUR", "498", cur, sizeof(cur), "ex_xcd.ini"); GetPrivateProfileString("COMMON", "ID", "11111111", ident, sizeof(ident), "ex_xcd.ini"); GetPrivateProfileString("COMMON", "CA_KEY_FILE", ".\\94980000.KEY", filename, sizeof(filename), "ex_xcd.ini"); GetPrivateProfileString("COMMON", "CARD_FILE", "3F00", card_file, sizeof(card_file), "ex_xcd.ini"); GetPrivateProfileString("COMMON", "SUM", "3", buf_sum, sizeof(buf_sum), "ex_xcd.ini"); // // char-to-integer conversion // reader_sam=atoi(buf_reader_sam); reader_user=atoi(buf_reader_user); purse_sam=atoi(buf_purse_sam); purse_user=atoi(buf_purse_user); sum1=atoi(buf_sum);

// // Test of XCDATA // //

Page 23: Xcd pg

DSSSCT File :xcd_pg.doc Ref : XCDATAPG0000 Revision:2.0 23 / 30 Copyright © Dekart S.R.L (www.dekart.com) - 2001

This document shall not be disclosed to a third party without prior written consent of Dekart S.R.L. Никакая часть данного документа не может быть воспроизведена в какой бы то ни было форме и какими бы, то ни было

средствами без письменного разрешения владельца авторских прав.Ссылка на оригинал обязательна.

// Keys Reading from CA_KEY_FILE // // pCloseCard(1); printf("\n Test of CheckAccessCard \n"); printf("\n\n Insert Acces Card in Reader"); getch(); status = pCheckAccessCard(port_user, reader_user, cardnum, filename, cardpin); pGetCardStat(buf_err); printf("\n Result of Keys Reading: %d ", status); if(status!=1) {printf("\n Card status: %s", buf_err); return 0;} // // Connecting to reader with user card // // pCloseCard(1); pCloseCard(2); printf("\n Test of ConnectUserCard \n"); printf("\n Insert User Card in Reader"); getch(); user = pConnectUserCard(port_user, reader_user); pGetCardStat(buf_err); if(user<0) { printf("\n Error: %d ", user); printf("\n Card status: %s", buf_err); // card status printing return 0;} else printf("\n User_handle: %d ", user);

printf("\n ....."); getch(); // // GetChallenge operation for user card // printf("\n Test of GetChallenge (user card)\n"); res=pGetChallenge(user,rand); pGetCardStat(buf_err); if(res!=1) { printf("\n Error: %d ", res); printf("\n Card status: %s", buf_err); // card status printing return 0;} else printf("\n User_random: %s ", rand); // operation result printing

printf("\n ....."); getch(); // // GetMaxAmount operation // printf("\n Test of GetMaxAmount (user card)\n"); purse_u=1; // purse 1 i=pGetMaxAmount(user, purse_u, amount_user); pGetCardStat(buf_err); if(i!=1) { printf("\n Error: %d ", res); printf("\n Card status: %s", buf_err); // card status printing return 0;} else printf("\n GetMaxAmount1: %d ", amount_user);

purse_u=2; // purse 2 i=pGetMaxAmount(user, purse_u, amount_user); pGetCardStat(buf_err); if(i!=1) { printf("\n Error: %d ", res); printf("\n Card status: %s", buf_err); // card status printing return 0;} else printf("\n GetMaxAmount2: %d ", amount_user);

purse_u=3; // purse 3 i=pGetMaxAmount(user, purse_u, amount_user); pGetCardStat(buf_err); if(i!=1) { printf("\n Error: %d ", res); printf("\n Card status: %s", buf_err); // card status printing return 0;} else

Page 24: Xcd pg

DSSSCT File :xcd_pg.doc Ref : XCDATAPG0000 Revision:2.0 24 / 30 Copyright © Dekart S.R.L (www.dekart.com) - 2001

This document shall not be disclosed to a third party without prior written consent of Dekart S.R.L. Никакая часть данного документа не может быть воспроизведена в какой бы то ни было форме и какими бы, то ни было

средствами без письменного разрешения владельца авторских прав.Ссылка на оригинал обязательна.

printf("\n GetMaxAmount3: %d ", amount_user);

printf("\n ....."); getch(); // // SelectFileInCard operation for user card // printf("\n Test of SelectFileInCard (user card)\n"); res=pSelectFileInCard(user, "3F00"); // card file select pGetCardStat(buf_err); if(res!=1) { printf("\n Error: %d ", res); printf("\n Card status: %s", buf_err); // card status printing return 0;} else printf("\n 3F00 - %d ", res);

res=pSelectFileInCard(user, "7F10"); // card file select pGetCardStat(buf_err); if(res!=1) { printf("\n Error: %d ", res); printf("\n Card status: %s", buf_err); // card status printing return 0;} else printf("\n 7F10 - %d ", res);

res=pSelectFileInCard(user, "8100"); // card file select (purse descriptors) pGetCardStat(buf_err); if(res!=1) { printf("\n Error: %d ", res); printf("\n Card status: %s", buf_err); // card status printing return 0;} else printf("\n 8100 - %d ", res);

printf("\n ....."); getch(); // // ReadFileRecord operation for user card // printf("\n Reading of Purse's Descriptors"); for(i=1;i<4;i++) { res=pReadFileRecord(user,i,16, str_buf); pGetCardStat(buf_err); if(res!=1) { printf("\n Error: %d ", res); printf("\n Card status: %s", buf_err); // card status printing return 0;} else printf("\n Purse %d description %s", i,str_buf); }

printf("\n ....."); getch(); // // StaticAuth operation for User Card // printf("\n Test of StaticAuth (user card)"); i=pStaticAuth(user); pGetCardStat(buf_err); if(i!=1) { printf("\n Error: %d ", i); printf("\n Card status: %s", buf_err); // card status printing return 0;} else printf("\n Result of StaticAuth: %d ", i); //card status & operation result printing

printf("\n ....."); getch(); // // Connecting to reader with SAM-card // // pCloseCard(2);

Page 25: Xcd pg

DSSSCT File :xcd_pg.doc Ref : XCDATAPG0000 Revision:2.0 25 / 30 Copyright © Dekart S.R.L (www.dekart.com) - 2001

This document shall not be disclosed to a third party without prior written consent of Dekart S.R.L. Никакая часть данного документа не может быть воспроизведена в какой бы то ни было форме и какими бы, то ни было

средствами без письменного разрешения владельца авторских прав.Ссылка на оригинал обязательна.

printf("\n Test of ConnectSAMCard \n"); printf("\n\n Insert SAM Card in Reader"); getch(); sam = pConnectSAMCard(port_sam, reader_sam); pGetCardStat(buf_err); if(sam<0) { printf("\nError: %d ", sam); printf("\nCard status: %s", buf_err); // card status printing return 0;} else printf("\n SAM_handle: %d ", sam);

printf("\n ....."); getch(); // // GetChallenge operation for SAM card // printf("\n Test of GetChallenge (SAM card)\n"); res=pGetChallenge(sam,rand); pGetCardStat(buf_err); if(res!=1) { printf("\n Error: %d ", res); printf("\n Card status: %s", buf_err); // card status printing return 0;} else printf("\n SAM_random: %s ", rand); // operation result printing

printf("\n ....."); getch(); // // GetMaxAmount operation for SAM card // printf("\n Test of GetMaxAmount (SAM card)\n"); purse_s=1; // purse 1 i=pGetMaxAmount(sam, purse_s, amount_sam); pGetCardStat(buf_err); if(i!=1) { printf("\n Error: %d ", i); printf("\n Card status: %s", buf_err); // card status printing return 0;} else printf("\n GetMaxAmount1: %d ", amount_sam);

purse_s=2; // purse 2 i=pGetMaxAmount(sam, purse_s, amount_sam); pGetCardStat(buf_err); if(i!=1) { printf("\n Error: %d ", i); printf("\n Card status: %s", buf_err); // card status printing return 0;} else printf("\n GetMaxAmount2: %d ", amount_sam);

purse_s=3; // purse 3 i=pGetMaxAmount(sam, purse_s, amount_sam); pGetCardStat(buf_err); if(i!=1) { printf("\n Error: %d ", i); printf("\n Card status: %s", buf_err); // card status printing return 0;} else printf("\n GetMaxAmount3: %d ", amount_sam);

printf("\n ....."); getch(); // // SelectFileInCard operation for SAM card // printf("\n Test of SelectFileInCard (SAM card)\n"); res=pSelectFileInCard(sam, "3F00"); // card file select pGetCardStat(buf_err); if(res!=1) { printf("\n Error: %d ", res); printf("\n Card status: %s", buf_err); // card status printing

Page 26: Xcd pg

DSSSCT File :xcd_pg.doc Ref : XCDATAPG0000 Revision:2.0 26 / 30 Copyright © Dekart S.R.L (www.dekart.com) - 2001

This document shall not be disclosed to a third party without prior written consent of Dekart S.R.L. Никакая часть данного документа не может быть воспроизведена в какой бы то ни было форме и какими бы, то ни было

средствами без письменного разрешения владельца авторских прав.Ссылка на оригинал обязательна.

return 0;} else printf("\n 3F00 - %d ", res);

res=pSelectFileInCard(sam, "7F10"); // card file select pGetCardStat(buf_err); if(res!=1) { printf("\n Error: %d ", res); printf("\n Card status: %s", buf_err); // card status printing return 0;} else printf("\n 7F10 - %d ", res);

res=pSelectFileInCard(sam, "8100"); // card file select (purse descriptors) pGetCardStat(buf_err); if(res!=1) { printf("\n Error: %d ", res); printf("\n Card status: %s", buf_err); // card status printing return 0;} else printf("\n 8100 - %d ", res);

printf("\n ....."); getch(); // // ReadFileRecord operation for sam card // printf("\n Reading of Purse's Descriptors (SAM)"); for(i=1;i<4;i++) { res=pReadFileRecord(sam,i,16, str_buf); pGetCardStat(buf_err); if(res!=1) { printf("\n Error: %d ", res); printf("\n Card status: %s", buf_err); // card status printing return 0;} else printf("\n Purse %d description %s", i,str_buf); }

printf("\n ....."); getch(); // // StaticAuth operation for SAM Card // printf("\n Test of StaticAuth (SAM card)"); i=pStaticAuth(sam); pGetCardStat(buf_err); if(i!=1) { printf("\n Error: %d ", i); printf("\n Card status: %s", buf_err); // card status printing return 0;} else printf("\n Result of StaticAuth: %d ", i); //card status & operation result printing

printf("\n ....."); getch();

// // Internal Authentication // printf("\n Test of InternalAuth"); res=pInternalAuth(user,sam); pGetCardStat(buf_err); if(res!=1) { printf("\n Error: %d ", res); printf("\n Card status: %s", buf_err); // card status printing return 0;} else printf("\n InternalAuth: %d ", res);

printf("\n ....."); getch(); //

Page 27: Xcd pg

DSSSCT File :xcd_pg.doc Ref : XCDATAPG0000 Revision:2.0 27 / 30 Copyright © Dekart S.R.L (www.dekart.com) - 2001

This document shall not be disclosed to a third party without prior written consent of Dekart S.R.L. Никакая часть данного документа не может быть воспроизведена в какой бы то ни было форме и какими бы, то ни было

средствами без письменного разрешения владельца авторских прав.Ссылка на оригинал обязательна.

// External Authentication // printf("\n Test of ExternalAuth"); res=pExternalAuth(user,sam); pGetCardStat(buf_err); if(res!=1) { printf("\n Error: %d ", res); printf("\n Card status: %s", buf_err); // card status printing return 0;} else printf("\n ExternalAuth: %d %s ", res,buf_err);

printf("\n ....."); getch(); // // CreditTransaction operation // printf("\n Test of CreditTransaction"); // purse_user=2; purse_sam=2; i=pCreditTransaction(user,sam,purse_user,purse_sam,sum1,cur,ident,rand1,crt1,rand2,crt2); pGetCardStat(buf_err); // printf("\n %s", buf_err); // card status printing if(i!=1) { printf("\n Error: %d ", i); printf("\n Card status: %s", buf_err); // card status printing return 0;} else printf("\n Result of CreditTransaction: %d %s",i, buf_err); // operation result printing printf("\n Rand1: %s Cert.1: %s",rand1,crt1); // Phase1 (random & certificate) printf("\n Rand2: %s Cert.2: %s",rand2,crt2); // Phase2 (random & certificate)

// // Reading of Purses after CreditTransaction // printf("\n\n Reading of Purse after CreditTransaction"); res=pSelectFileInCard(user, "6F00"); // card file select (purse 1) pGetCardStat(buf_err); printf("\n 6F00 - %d %s", res,buf_err); res=pReadFileRecord(user,1,6, str_buf); pGetCardStat(buf_err); if(res!=1) { printf("\n Error: %d ", res); printf("\n Card status: %s", buf_err); // card status printing return 0;} printf("\n Result of Reading of Purse1 - %d %s %s", res,buf_err,str_buf);

res=pSelectFileInCard(user, "6F01"); // card file select (purse 2) pGetCardStat(buf_err); printf("\n 6F01 %d %s", res,buf_err); res=pReadFileRecord(user,1,6, str_buf); pGetCardStat(buf_err); if(res!=1) { printf("\n Error: %d ", res); printf("\n Card status: %s", buf_err); // card status printing return 0;} printf("\n Result of Reading of Purse2 - %d %s %s", res,buf_err,str_buf);

res=pSelectFileInCard(user, "6F02"); // card file select (purse 3) pGetCardStat(buf_err); printf("\n 6F02 %d %s", res,buf_err); res=pReadFileRecord(user,1,6, str_buf); pGetCardStat(buf_err); if(res!=1) { printf("\n Error: %d ", res); printf("\n Card status: %s", buf_err); // card status printing return 0;} printf("\n Result of Reading of Purse3 - %d %s %s", res,buf_err,str_buf);

printf("\n ....."); getch();

Page 28: Xcd pg

DSSSCT File :xcd_pg.doc Ref : XCDATAPG0000 Revision:2.0 28 / 30 Copyright © Dekart S.R.L (www.dekart.com) - 2001

This document shall not be disclosed to a third party without prior written consent of Dekart S.R.L. Никакая часть данного документа не может быть воспроизведена в какой бы то ни было форме и какими бы, то ни было

средствами без письменного разрешения владельца авторских прав.Ссылка на оригинал обязательна.

// // DebitTransaction operation // printf("\n Test of DebitTransaction"); i=pDebitTransaction(user,sam,purse_user,sum1,cur,ident,rand1,crt1); pGetCardStat(buf_err); if(i!=1) { printf("\n Error: %d ", i); printf("\n Card status: %s", buf_err); // card status printing return 0;} else printf("\n Result of DebitTransaction: %d %s",i, buf_err); // operation result printing printf("\n Rand.: %s Cert.: %s",rand1,crt1); // random & certificate // // Reading of Purses after DebitTransaction // printf("\n\n Reading of Purse after DebitTransaction"); res=pSelectFileInCard(user, "6F00"); // card file select (purse 1) pGetCardStat(buf_err); printf("\n 6F00 - %d %s", res,buf_err); res=pReadFileRecord(user,1,6, str_buf); pGetCardStat(buf_err); if(res!=1) { printf("\n Error: %d ", res); printf("\n Card status: %s", buf_err); // card status printing return 0;} printf("\n Result of Reading of Purse1 - %d %s %s", res,buf_err,str_buf);

res=pSelectFileInCard(user, "6F01"); // card file select (purse 2) pGetCardStat(buf_err); printf("\n 6F01 %d %s", res,buf_err); res=pReadFileRecord(user,1,6, str_buf); pGetCardStat(buf_err); if(res!=1) { printf("\n Error: %d ", res); printf("\n Card status: %s", buf_err); // card status printing return 0;} printf("\n Result of Reading of Purse2 - %d %s %s", res,buf_err,str_buf);

res=pSelectFileInCard(user, "6F02"); // card file select (purse 3) pGetCardStat(buf_err); printf("\n 6F02 %d %s", res,buf_err); res=pReadFileRecord(user,1,6, str_buf); pGetCardStat(buf_err); if(res!=1) { printf("\n Error: %d ", res); printf("\n Card status: %s", buf_err); // card status printing return 0;} printf("\n Result of Reading of Purse3 - %d %s %s", res,buf_err,str_buf);

printf("\n ....."); getch();

// // Special file of user card operation // printf("\n Test of Special file of user card"); res=pSelectFileInCard(user, "8400"); // card file select pGetCardStat(buf_err); if(res!=1) { printf("\n Error: %d ", res); printf("\n Card status: %s", buf_err); // card status printing return 0;} else printf("\n 8400 - %d ", res);

res=pReadFileRecord(user,1,16, str_buf); pGetCardStat(buf_err); if(res!=1) { printf("\n Error: %d ", res); printf("\n Card status: %s", buf_err); // card status printing

Page 29: Xcd pg

DSSSCT File :xcd_pg.doc Ref : XCDATAPG0000 Revision:2.0 29 / 30 Copyright © Dekart S.R.L (www.dekart.com) - 2001

This document shall not be disclosed to a third party without prior written consent of Dekart S.R.L. Никакая часть данного документа не может быть воспроизведена в какой бы то ни было форме и какими бы, то ни было

средствами без письменного разрешения владельца авторских прав.Ссылка на оригинал обязательна.

return 0;} printf("\n Result of Reading of 8400 - %d %s %s", res,buf_err,str_buf); // // UpdateFileRecord operation // status=pUpdateFileRecord(user,1,16, "6F005000000000000010001215100003"); pGetCardStat(buf_err); if(status!=1) { printf("\n Error: %d ", status); printf("\n Card status: %s", buf_err); // card status printing return 0;} else printf("\n UpdateFileRecord: %d %s ", status,buf_err); //card status & operation result printing

res=pReadFileRecord(user,1,16, str_buf); pGetCardStat(buf_err); if(res!=1) { printf("\n Error: %d ", res); printf("\n Card status: %s", buf_err); // card status printing return 0;} printf("\n Result of Reading of 8400 - %d %s %s", res,buf_err,str_buf);

if((unsigned)hLib>HINSTANCE_ERROR) FreeLibrary(hLib); cout <<"done." <<endl; return 1; }

Содержание файла ex_xcd.ini (используется только при тестировании)[COMMON] PORT=COM2 PORT_SAM=COM2 PORT_USER=COM1 READER=0 READER_SAM=2 READER_USER=0 CARD_FILE=3F00 CA_CARD_PIN=1111 EMITENT_CARD_PIN=1111 CA_KEY_FILE=94980000.SEC EMITENT_KEY_FILE=94980001.SEC CUR=498 ID=11111111 PURSE_SAM=2 PURSE_USER=2 SUM=1

4.3. Взаимосвязь функций модуля xcdata.dll

Page 30: Xcd pg

ExternalAuth

InternalAuth

StaticAuth

GetChallenge

CheckAccessCard

ConnectSAMCard

SelectFileInCard

ConnectUserCard

CloseCard

ReadFileRecord

UpdateFileRecord

CreditTransaction

ExternalAuth

GetCardStat

DebitTransaction

GetMaxAmount