Главная Примеры использования 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.Сбросить карту, чтобы изменения вошли в силу.
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)
(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.