mirror of git://git.sysmocom.de/ofono
test-stk: Add test for perform card apdu parser
This commit is contained in:
parent
5330612d28
commit
854d09a286
|
@ -45,6 +45,7 @@ static gboolean g_mem_equal(const unsigned char *v1, const unsigned char *v2,
|
|||
for (i = 0; i < len; i++)
|
||||
if (v1[i] != v2[i])
|
||||
return FALSE;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
@ -254,6 +255,21 @@ static void check_item_icon_id_list(const struct stk_item_icon_id_list *command,
|
|||
g_assert(g_mem_equal(command->list, test->list, test->len));
|
||||
}
|
||||
|
||||
/* Defined in TS 102.223 Section 8.35 */
|
||||
static void check_c_apdu(const struct stk_c_apdu *command,
|
||||
const struct stk_c_apdu *test)
|
||||
{
|
||||
g_assert(command->cla == test->cla);
|
||||
g_assert(command->ins == test->ins);
|
||||
g_assert(command->p1 == test->p1);
|
||||
g_assert(command->p2 == test->p2);
|
||||
g_assert(command->lc == test->lc);
|
||||
g_assert(g_mem_equal(command->data, test->data, test->lc));
|
||||
|
||||
if (test->has_le)
|
||||
g_assert(command->le == test->le);
|
||||
}
|
||||
|
||||
/* Defined in TS 102.223 Section 8.43 */
|
||||
static inline void check_imm_resp(const unsigned char command,
|
||||
const unsigned char test)
|
||||
|
@ -9185,6 +9201,230 @@ static void test_setup_event_list(gconstpointer data)
|
|||
stk_command_free(command);
|
||||
}
|
||||
|
||||
struct perform_card_apdu_test {
|
||||
const unsigned char *pdu;
|
||||
unsigned int pdu_len;
|
||||
unsigned char qualifier;
|
||||
unsigned char dst;
|
||||
struct stk_c_apdu c_apdu;
|
||||
};
|
||||
|
||||
static unsigned char perform_card_apdu_111[] = { 0xD0, 0x12, 0x81, 0x03, 0x01,
|
||||
0x30, 0x00, 0x82, 0x02, 0x81,
|
||||
0x11, 0xA2, 0x07, 0xA0, 0xA4,
|
||||
0x00, 0x00, 0x02, 0x3F, 0x00 };
|
||||
|
||||
static unsigned char perform_card_apdu_112[] = { 0xD0, 0x10, 0x81, 0x03, 0x01,
|
||||
0x30, 0x00, 0x82, 0x02, 0x81,
|
||||
0x11, 0xA2, 0x05, 0xA0, 0xC0,
|
||||
0x00, 0x00, 0x1B };
|
||||
|
||||
static unsigned char perform_card_apdu_121[] = { 0xD0, 0x12, 0x81, 0x03, 0x01,
|
||||
0x30, 0x00, 0x82, 0x02, 0x81,
|
||||
0x11, 0xA2, 0x07, 0xA0, 0xA4,
|
||||
0x00, 0x00, 0x02, 0x7F, 0x20 };
|
||||
|
||||
static unsigned char perform_card_apdu_122[] = { 0xD0, 0x12, 0x81, 0x03, 0x01,
|
||||
0x30, 0x00, 0x82, 0x02, 0x81,
|
||||
0x11, 0xA2, 0x07, 0xA0, 0xA4,
|
||||
0x00, 0x00, 0x02, 0x6F, 0x30 };
|
||||
|
||||
static unsigned char perform_card_apdu_123[] = { 0xD0, 0x28, 0x81, 0x03, 0x01,
|
||||
0x30, 0x00, 0x82, 0x02, 0x81,
|
||||
0x11, 0xA2, 0x1D, 0xA0, 0xD6,
|
||||
0x00, 0x00, 0x18, 0x00, 0x01,
|
||||
0x02, 0x03, 0x04, 0x05, 0x06,
|
||||
0x07, 0x08, 0x09, 0x0A, 0x0B,
|
||||
0x0C, 0x0D, 0x0E, 0x0F, 0x10,
|
||||
0x11, 0x12, 0x13, 0x14, 0x15,
|
||||
0x16, 0x17 };
|
||||
|
||||
static unsigned char perform_card_apdu_124[] = { 0xD0, 0x10, 0x81, 0x03, 0x01,
|
||||
0x30, 0x00, 0x82, 0x02, 0x81,
|
||||
0x11, 0xA2, 0x05, 0xA0, 0xB0,
|
||||
0x00, 0x00, 0x18 };
|
||||
|
||||
static unsigned char perform_card_apdu_125[] = { 0xD0, 0x28, 0x81, 0x03, 0x01,
|
||||
0x30, 0x00, 0x82, 0x02, 0x81,
|
||||
0x11, 0xA2, 0x1D, 0xA0, 0xD6,
|
||||
0x00, 0x00, 0x18, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF };
|
||||
|
||||
static unsigned char perform_card_apdu_151[] = { 0xD0, 0x12, 0x81, 0x03, 0x01,
|
||||
0x30, 0x00, 0x82, 0x02, 0x81,
|
||||
0x17, 0xA2, 0x07, 0xA0, 0xA4,
|
||||
0x00, 0x00, 0x02, 0x3F, 0x00 };
|
||||
|
||||
static unsigned char perform_card_apdu_211[] = { 0xD0, 0x12, 0x81, 0x03, 0x01,
|
||||
0x30, 0x00, 0x82, 0x02, 0x81,
|
||||
0x11, 0xA2, 0x07, 0xA0, 0xA4,
|
||||
0x00, 0x00, 0x02, 0x3F, 0x00 };
|
||||
|
||||
static struct perform_card_apdu_test perform_card_apdu_data_111 = {
|
||||
.pdu = perform_card_apdu_111,
|
||||
.pdu_len = sizeof(perform_card_apdu_111),
|
||||
.qualifier = 0x00,
|
||||
.dst = STK_DEVICE_IDENTITY_TYPE_CARD_READER_1,
|
||||
.c_apdu = {
|
||||
.cla = 0xA0,
|
||||
.ins = STK_INS_SELECT,
|
||||
.p1 = 0x00,
|
||||
.p2 = 0x00,
|
||||
.lc = 0x02,
|
||||
.data = { 0x3F, 0x00 }
|
||||
}
|
||||
};
|
||||
|
||||
static struct perform_card_apdu_test perform_card_apdu_data_112 = {
|
||||
.pdu = perform_card_apdu_112,
|
||||
.pdu_len = sizeof(perform_card_apdu_112),
|
||||
.qualifier = 0x00,
|
||||
.dst = STK_DEVICE_IDENTITY_TYPE_CARD_READER_1,
|
||||
.c_apdu = {
|
||||
.cla = 0xA0,
|
||||
.ins = STK_INS_GET_RESPONSE,
|
||||
.p1 = 0x00,
|
||||
.p2 = 0x00,
|
||||
.has_le = 1,
|
||||
.le = 0x1B
|
||||
}
|
||||
};
|
||||
|
||||
static struct perform_card_apdu_test perform_card_apdu_data_121 = {
|
||||
.pdu = perform_card_apdu_121,
|
||||
.pdu_len = sizeof(perform_card_apdu_121),
|
||||
.qualifier = 0x00,
|
||||
.dst = STK_DEVICE_IDENTITY_TYPE_CARD_READER_1,
|
||||
.c_apdu = {
|
||||
.cla = 0xA0,
|
||||
.ins = STK_INS_SELECT,
|
||||
.p1 = 0x00,
|
||||
.p2 = 0x00,
|
||||
.lc = 0x02,
|
||||
.data = { 0x7F, 0x20 }
|
||||
}
|
||||
};
|
||||
|
||||
static struct perform_card_apdu_test perform_card_apdu_data_122 = {
|
||||
.pdu = perform_card_apdu_122,
|
||||
.pdu_len = sizeof(perform_card_apdu_122),
|
||||
.qualifier = 0x00,
|
||||
.dst = STK_DEVICE_IDENTITY_TYPE_CARD_READER_1,
|
||||
.c_apdu = {
|
||||
.cla = 0xA0,
|
||||
.ins = STK_INS_SELECT,
|
||||
.p1 = 0x00,
|
||||
.p2 = 0x00,
|
||||
.lc = 0x02,
|
||||
.data = { 0x6F, 0x30 }
|
||||
}
|
||||
};
|
||||
|
||||
/* Byte 14 of Data is not correct in spec. */
|
||||
static struct perform_card_apdu_test perform_card_apdu_data_123 = {
|
||||
.pdu = perform_card_apdu_123,
|
||||
.pdu_len = sizeof(perform_card_apdu_123),
|
||||
.qualifier = 0x00,
|
||||
.dst = STK_DEVICE_IDENTITY_TYPE_CARD_READER_1,
|
||||
.c_apdu = {
|
||||
.cla = 0xA0,
|
||||
.ins = STK_INS_UPDATE_BINARY_D6,
|
||||
.p1 = 0x00,
|
||||
.p2 = 0x00,
|
||||
.lc = 0x18,
|
||||
.data = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
|
||||
0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10,
|
||||
0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17 }
|
||||
}
|
||||
};
|
||||
|
||||
static struct perform_card_apdu_test perform_card_apdu_data_124 = {
|
||||
.pdu = perform_card_apdu_124,
|
||||
.pdu_len = sizeof(perform_card_apdu_124),
|
||||
.qualifier = 0x00,
|
||||
.dst = STK_DEVICE_IDENTITY_TYPE_CARD_READER_1,
|
||||
.c_apdu = {
|
||||
.cla = 0xA0,
|
||||
.ins = STK_INS_READ_BINARY_B0,
|
||||
.p1 = 0x00,
|
||||
.p2 = 0x00,
|
||||
.has_le = 1,
|
||||
.le = 0x18
|
||||
}
|
||||
};
|
||||
|
||||
static struct perform_card_apdu_test perform_card_apdu_data_125 = {
|
||||
.pdu = perform_card_apdu_125,
|
||||
.pdu_len = sizeof(perform_card_apdu_125),
|
||||
.qualifier = 0x00,
|
||||
.dst = STK_DEVICE_IDENTITY_TYPE_CARD_READER_1,
|
||||
.c_apdu = {
|
||||
.cla = 0xA0,
|
||||
.ins = STK_INS_UPDATE_BINARY_D6,
|
||||
.p1 = 0x00,
|
||||
.p2 = 0x00,
|
||||
.lc = 0x18,
|
||||
.data = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }
|
||||
}
|
||||
};
|
||||
|
||||
static struct perform_card_apdu_test perform_card_apdu_data_151 = {
|
||||
.pdu = perform_card_apdu_151,
|
||||
.pdu_len = sizeof(perform_card_apdu_151),
|
||||
.qualifier = 0x00,
|
||||
.dst = STK_DEVICE_IDENTITY_TYPE_CARD_READER_7,
|
||||
.c_apdu = {
|
||||
.cla = 0xA0,
|
||||
.ins = STK_INS_SELECT,
|
||||
.p1 = 0x00,
|
||||
.p2 = 0x00,
|
||||
.lc = 0x02,
|
||||
.data = { 0x3F, 0x00 }
|
||||
}
|
||||
};
|
||||
|
||||
static struct perform_card_apdu_test perform_card_apdu_data_211 = {
|
||||
.pdu = perform_card_apdu_211,
|
||||
.pdu_len = sizeof(perform_card_apdu_211),
|
||||
.qualifier = 0x00,
|
||||
.dst = STK_DEVICE_IDENTITY_TYPE_CARD_READER_1,
|
||||
.c_apdu = {
|
||||
.cla = 0xA0,
|
||||
.ins = STK_INS_SELECT,
|
||||
.p1 = 0x00,
|
||||
.p2 = 0x00,
|
||||
.lc = 0x02,
|
||||
.data = { 0x3F, 0x00 }
|
||||
}
|
||||
};
|
||||
|
||||
static void test_perform_card_apdu(gconstpointer data)
|
||||
{
|
||||
const struct perform_card_apdu_test *test = data;
|
||||
struct stk_command *command;
|
||||
|
||||
command = stk_command_new_from_pdu(test->pdu, test->pdu_len);
|
||||
|
||||
g_assert(command);
|
||||
|
||||
g_assert(command->number == 1);
|
||||
g_assert(command->type == STK_COMMAND_TYPE_PERFORM_CARD_APDU);
|
||||
g_assert(command->qualifier == test->qualifier);
|
||||
|
||||
g_assert(command->src == STK_DEVICE_IDENTITY_TYPE_UICC);
|
||||
g_assert(command->dst == test->dst);
|
||||
|
||||
check_c_apdu(&command->perform_card_apdu.c_apdu, &test->c_apdu);
|
||||
|
||||
stk_command_free(command);
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
g_test_init(&argc, &argv, NULL);
|
||||
|
@ -9845,5 +10085,24 @@ int main(int argc, char **argv)
|
|||
g_test_add_data_func("/teststk/Setup Event List 1.4.1",
|
||||
&setup_event_list_data_141, test_setup_event_list);
|
||||
|
||||
g_test_add_data_func("/teststk/Perform Card APDU 1.1.1",
|
||||
&perform_card_apdu_data_111, test_perform_card_apdu);
|
||||
g_test_add_data_func("/teststk/Perform Card APDU 1.1.2",
|
||||
&perform_card_apdu_data_112, test_perform_card_apdu);
|
||||
g_test_add_data_func("/teststk/Perform Card APDU 1.2.1",
|
||||
&perform_card_apdu_data_121, test_perform_card_apdu);
|
||||
g_test_add_data_func("/teststk/Perform Card APDU 1.2.2",
|
||||
&perform_card_apdu_data_122, test_perform_card_apdu);
|
||||
g_test_add_data_func("/teststk/Perform Card APDU 1.2.3",
|
||||
&perform_card_apdu_data_123, test_perform_card_apdu);
|
||||
g_test_add_data_func("/teststk/Perform Card APDU 1.2.4",
|
||||
&perform_card_apdu_data_124, test_perform_card_apdu);
|
||||
g_test_add_data_func("/teststk/Perform Card APDU 1.2.5",
|
||||
&perform_card_apdu_data_125, test_perform_card_apdu);
|
||||
g_test_add_data_func("/teststk/Perform Card APDU 1.5.1",
|
||||
&perform_card_apdu_data_151, test_perform_card_apdu);
|
||||
g_test_add_data_func("/teststk/Perform Card APDU 2.1.1",
|
||||
&perform_card_apdu_data_211, test_perform_card_apdu);
|
||||
|
||||
return g_test_run();
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue