ИЗГОТОВЛЕНИЕ ПЛАСТИКОВЫХ КАРТ
POS МАТЕРИАЛЫ ИЗ ПЛАСТИКА
ДОСТАВКА ДО ДВЕРИ ПО РОССИИ

Товаров:

Ваша корзина пуста

Контакты

8 (800) 1008-147

info@uscard.ru

Месенджеры

  WhatsApp

     +7 (967) 555-05-47

 

 Telegram

       uscard

 

 WeChat

       uscard_ru

Главная Примеры использования SDK

Примеры использования SDK

ПРИМЕРЫ ИСПОЛЬЗОВАНИЯ SDK

Рассмотрим типичную процедуру работы с электронным кошельком карт ACOS. Необходимо выполнить 3 действия : подготовить карту для использования кошелька, выполнить кредитование и дебетование.
 
Вариант разработки “с нуля” без SDK.
 
1.Разобраться в PC/SCAPI.
2.Изучить архитектуру карты ACOS.
3.Изучить команды и структуры данных карт ACOS.
4.Написать и отладить APDU-сценарии для решения вашей задачи.
5.Если вы программируете не на C/C++, то разобраться как вызывать функции WinAPI. Создать файл импорта APIфункций и определения констант.
6.Найти и освоить реализацию алгоритма DESдля вашего языка программирования.
7.Запрограммировать APDU-сценарии на вашем языке программирования, включая анализ и обработку ошибочных ситуаций от PC/SCAPI и статус-кодов, возвращаемых картой.
 
Вариант разработки при помощи SDK.
 
1.Изучить архитектуру карты ACOS.
2.Изучить реализацию необходимых вам действий при помощи SDK. Имеется подробная документация на русском языке и примеры на различных языках программирования.
3.Запрограммировать действия, используя средства SDK.
 
Сравним порядок сложности обоих вариантов. В начале рассмотрим что бы вам пришлось посылать карте и какие выполнять вычисления, если бы вы стали работать без SDK - “с нуля”, руководствуясь лишь документацией MSDNи используя функции PC/SC. Во избежание чрезмерной громоздкости материал дан без учета самого программирования и анализа ошибочных ситуаций. Затем покажем, как аналогичные действия могут быть запрограммированы при помощи SDKна языке C++. Решение на других языках программирования аналогично по сложности и выглядит похоже.
 
Инициализация карты
 
1.Проверить ICкод.
80 20 07 00 08 00 'ACOSTEST' (9000)
2.Выбрать файл персонализации. Установить бит ACCOUNT.
80 A4 00 00 02 00 FF 02 (9000)
80 D2 00 00 04 00 01 00 00 00 (9000)
3.Выбрать файл безопасности и записать ключи доступа для взаимной аутентификации.
80 A4 00 00 02 00 FF 03 (9000)
80 D2 02 00 08 00 'AUTHCARD' (9000)
80 D2 03 00 08 00 'AUTHTERM' (9000)
4.Выбрать файл кошелька и инициализировать его.
80 A4 00 00 02 00 FF 05 (9000)
; TransTyp Balance
80 D2 00 00 04 00 00 00 00 00 (9000)
; ACT0 CheckSum
80 D2 01 00 04 00 00 00 01 00 (9000)
; TransTyp Balance
80 D2 02 00 04 00 00 00 00 00 (9000)
; ACT0 CheckSum
80 D2 03 00 04 00 00 00 01 00 (9000)
; MAX Balance
80 D2 04 00 04 00 00 FF FF 00 (9000)
; AID
80 D2 05 00 04 00 'APPN' (9000)
; TRREF_C
80 D2 06 00 04 00 00 00 00 00 (9000)
; TRREF_D                                     
80 D2 07 00 04 00 00 00 00 00 (9000)
5.Выбрать файл безопасности кошелька и записать ключи доступа к кошельку.
80 A4 00 00 02 00 FF 06 (9000)
80 D2 00 00 08 00 'DBIT_KEY' (9000)
80 D2 01 00 08 00 'CRDT_KEY' (9000)
80 D2 02 00 08 00 'CERT_KEY' (9000)
80 D2 03 00 08 00 'RVOK_KEY' (9000)
5.Сбросить карту, чтобы изменения вошли в силу.
 
Те же действия на C++ с использованием SDK.
CPCSCCard_ACOS card;
try
{
      card.Connect();
      try
      {
            card.BeginTransaction();
            // (1)
            card.Verify(ACOS_CODE_IC,(LPBYTE)"ACOSTEST",FALSE);
            // (2)
            card.Personalize(ACOS_PERSOPT_ACCOUNT,0,0,FALSE);
            // (3)
            card.WriteSecurityFile(ACOS_SFN_CARD,(LPBYTE)"AUTHCARD");
            card.WriteSecurityFile(ACOS_SFN_TERM,(LPBYTE)"AUTHTERM");
            // (4)
            card.InitAccount('APPN',0,0xFFFF,0,0);
            // (5)
            card.WriteAccountSecurityFile1
             (ACOS_ASFN_DEBIT,(LPBYTE)"DBIT_KEY");
            card.WriteAccountSecurityFile1
             (ACOS_ASFN_CREDIT,(LPBYTE)"CRDT_KEY");
            card.WriteAccountSecurityFile1
             (ACOS_ASFN_INQUIRE,(LPBYTE)"CERT_KEY");
            card.WriteAccountSecurityFile1
             (ACOS_ASFN_REVOKE,(LPBYTE)"RVOK_KEY");
      }
      catch(...)
      {
            card.Disconnect();
            throw;
      }
      card.Disconnect();
}
catch(ICOMSrvException &e)
{
      MessageBox(0,e.GetMessage(),_T("Error"),MB_ICONERROR);
}
 
Выполнить взаимную аутентификацию
 
1.Выполнить команду START_SESSION. Сохранить случайное число карты.
80 84 00 00 00 08 [ RANDOM_NUMBER_FROM_CARD ] (9000)
 
2.Выполнитьаутентификацию
RESULT1 = DES ( RANDOM_NUMBER_FROM_CARD , 'AUTHTERM' )
80 82 00 00 10 00 RESULT1 RANDOM_NUMBER_FROM_TERMINAL (6108)
 
3.Выполнить команду GET_RESPONSE
80 C0 00 00 00 08 [ENCRYPTED_RANDOM_NUMBER_FROM_TERMINAL] (9000)
 
4.Вычислить ключ сессии
RESULT2 = DES (RANDOM_NUMBER_FROM_CARD , 'AUTHCARD')
RESULT3 = XOR (RESULT2 , RANDOM_NUMBER_FROM_TERMINAL)
RESULT_SESSION_KEY = DES( RESULT3 ,'AUTHTERM')
RESULT4 = DES (RANDOM_NUMBER_FROM_TERMINAL, RESULT_SESSION_KEY)
 
5.Проверитьсоответствие RESULT4 и ENCRYPTED_RANDOM_NUMBER_FROM_TERMINAL.
 
Провести транзакцию кредитования
 
6.Получить текущий номер транзакции.
80 E1 00 00 04 00 REFERENCE_NUMBER (6119)
80 C0 00 00 00 19 [ GET_RESPONSE_BYTES ] (9000)
 
7.Выделить ATC из ответа карты и увеличить на 1.
INC(ATC)
 
8.Вычислитькриптографическуюподпись.
SIGNATURE = MAC(INS + AMOUNT + TTREF-C + AID (‘APPN’) + ATC + PADDED 00’s)
FIRST_BLOCK = E2 + 000064 + 00000000
SECOND_BLOCK = 4150504E + ATC + 0000
RESULT1 = DES (FIRST_BLOCK , 'CRDT_KEY')
RESULT1 = XOR (RESULT1 , SECOND_BLOCK)
RESULT1 = DES (RESULT1, 'CRDT_KEY')
MAC4 = Get first 4 bytes of RESULT1
 
9.Выполнить команду CREDIT
80 E2 00 00 0B 00 MAC4 000064 00000000 (9000)
 
Провести транзакцию дебетования
 
10. Увеличить ATC на 1.
INC(ATC)
 
11. Вычислить криптографическую подпись.
SIGNATURE = MAC(INS + AMOUNT + TTREF-D + AID (‘APPN’) + ATC + PADDED 00's)
FIRST_BLOCK = E6 + 000064 + 00000000
SECOND_BLOCK = 4150504E + ATC + 0000
RESULT1 = DES (FIRST_BLOCK,'DEBT_KEY')
RESULT1 = XOR (RESULT1, SECOND_BLOCK)
RESULT1 = DES (RESULT1,'DEBT_KEY')
MAC4 = Get first 4 bytes of RESULT1
 
12. Выполнить команду DEBIT
80 E6 00 00 0B 00 MAC4 00 00 64 00000000 (9000)
 
Те же действия на C++ с использованием SDK.
Try
{
      card.Connect();
      try
      {
            card.BeginTransaction();
            // (1..5)
            card.MutualAuthenticate1((LPBYTE)"AUTHCARD",(LPBYTE)"AUTHTERM");
            // (6..9)
            card.Credit((LPBYTE)"CRDT_KEY",NULL,100);
            // (10..12)
            card.Debit((LPBYTE)"DBIT_KEY",NULL,100);
      }
      catch(...)
      {
            card.Disconnect();
            throw;
      }
      card.Disconnect();
}
catch(ICOMSrvException &e)
{
      MessageBox(0,e.GetMessage(),_T("Error"),MB_ICONERROR);
}
 
Как видно из примера, SDK позволяет существенно упростить программирование, избежать ошибок и многократно сократить время разработки. Вы можете сосредоточиться на решении основной задачи, не вникая глубоко в низкоуровневые детали и тонкости PC/SCAPI.

 

 

 

Данный сайт использует файлы cookie и прочие похожие технологии. В том числе, мы обрабатываем Ваш IP-адрес для определения региона местоположения. Используя данный сайт, вы подтверждаете свое согласие с политикой конфиденциальности сайта.
OK