[Spice-devel] [PATCH libcacard 27/45] tests: Parse the ACA responses to verify their sanity
Jakub Jelen
jjelen at redhat.com
Tue Jul 31 14:50:21 UTC 2018
Signed-off-by: Jakub Jelen <jjelen at redhat.com>
Reviewed-by: Robert Relyea <rrelyea at redhat.com>
---
tests/libcacard.c | 83 ++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 82 insertions(+), 1 deletion(-)
diff --git a/tests/libcacard.c b/tests/libcacard.c
index 3abd1a9..d5e18ad 100644
--- a/tests/libcacard.c
+++ b/tests/libcacard.c
@@ -280,6 +280,68 @@ static void get_properties(VReader *reader, int object_type)
g_assert_cmpint(pbRecvBuffer[dwRecvLength-1], ==, 0x00);
}
+static void parse_acr(uint8_t *buf, int buflen)
+{
+ uint8_t *p, *p_end;
+ int have_applet_information = 0;
+ int num_entries = 0, num_entries_expected = -1;
+
+ p = buf;
+ p_end = p + buflen - 2;
+ while (p < p_end) {
+ uint8_t tag;
+ size_t vlen;
+ if (simpletlv_read_tag(&p, p_end - p, &tag, &vlen) < 0) {
+ g_debug("The generated SimpleTLV can not be parsed");
+ g_assert_not_reached();
+ }
+ g_assert_cmpint(vlen, <=, p_end - p);
+ g_debug("Tag: 0x%02x, Len: %lu", tag, vlen);
+ switch (tag) {
+ case 0x01: /* Applet Information */
+ g_assert_cmpint(vlen, ==, 5);
+ g_assert_cmphex(*p, ==, 0x10); /* Applet family */
+ g_assert_cmpint(have_applet_information, ==, 0);
+ have_applet_information = 1;
+ break;
+
+ case 0xA1: /* Num ACR Entries */
+ case 0x81: /* Num Applet/Objects */
+ case 0x91: /* Num AMP Entries */
+ case 0x94: /* Num Service Applet Entries */
+ g_assert_cmpint(num_entries_expected, ==, -1);
+ g_assert_cmpint(num_entries, ==, 0);
+ num_entries_expected = *p;
+ break;
+
+ case 0xA0: /* ACR Entry */
+ case 0x80: /* Aplet Entry */
+ case 0x90: /* AMP Entry */
+ case 0x93: /* Service Entry */
+ num_entries++;
+ break;
+
+ case 0x82: /* Object ACR Entry */
+ /* this is only single entry without preceeding tags */
+ break;
+
+ default:
+ g_debug("Unknown tag in object: 0x%02x", tag);
+ g_assert_not_reached();
+ }
+ p += vlen;
+ }
+
+ /* Every response needs to have exactly one applet information tag */
+ g_assert_cmpint(have_applet_information, ==, 1);
+ /* The number of entries in the second tag matches the number of entries later */
+ if (num_entries_expected != -1) {
+ g_assert_cmpint(num_entries, ==, num_entries_expected);
+ }
+ /* nothing left to read */
+ g_assert_true(p == p_end);
+}
+
static void get_acr(VReader *reader)
{
int dwRecvLength = APDUBufSize;
@@ -316,7 +378,8 @@ static void get_acr(VReader *reader)
g_assert_cmphex(pbRecvBuffer[dwRecvLength-2], ==, VCARD7816_SW1_SUCCESS);
g_assert_cmphex(pbRecvBuffer[dwRecvLength-1], ==, 0x00);
- /* TODO parse the response */
+ /* parse the response */
+ parse_acr(pbRecvBuffer, dwRecvLength);
/* P1=0x01: ACR table by ACRID=0x0A */
@@ -329,6 +392,10 @@ static void get_acr(VReader *reader)
g_assert_cmphex(pbRecvBuffer[dwRecvLength-2], ==, VCARD7816_SW1_SUCCESS);
g_assert_cmphex(pbRecvBuffer[dwRecvLength-1], ==, 0x00);
+ /* parse the response */
+ parse_acr(pbRecvBuffer, dwRecvLength);
+
+
/* P1=0x01: ACR table by ACRID=0x0F (non-existing) */
get_acr_arg[5] = 0x0F;
dwRecvLength = APDUBufSize;
@@ -376,6 +443,10 @@ static void get_acr(VReader *reader)
g_assert_cmphex(pbRecvBuffer[dwRecvLength-2], ==, VCARD7816_SW1_SUCCESS);
g_assert_cmphex(pbRecvBuffer[dwRecvLength-1], ==, 0x00);
+ /* parse the response */
+ parse_acr(pbRecvBuffer, dwRecvLength);
+
+
/* P1=0x11: unknown AID should fail */
get_acr_aid[11] = 0x11;
dwRecvLength = APDUBufSize;
@@ -398,6 +469,10 @@ static void get_acr(VReader *reader)
g_assert_cmphex(pbRecvBuffer[dwRecvLength-2], ==, VCARD7816_SW1_SUCCESS);
g_assert_cmphex(pbRecvBuffer[dwRecvLength-1], ==, 0x00);
+ /* parse the response */
+ parse_acr(pbRecvBuffer, dwRecvLength);
+
+
/* P1=0x12: unknown OID should fail */
get_acr_coid[6] = 0xDB;
dwRecvLength = APDUBufSize;
@@ -421,6 +496,10 @@ static void get_acr(VReader *reader)
g_assert_cmphex(pbRecvBuffer[dwRecvLength-2], ==, VCARD7816_SW1_SUCCESS);
g_assert_cmphex(pbRecvBuffer[dwRecvLength-1], ==, 0x00);
+ /* parse the response */
+ parse_acr(pbRecvBuffer, dwRecvLength);
+
+
/* P1=0x21: Service Applet Table */
get_acr[2] = 0x21;
dwRecvLength = APDUBufSize;
@@ -432,6 +511,8 @@ static void get_acr(VReader *reader)
g_assert_cmphex(pbRecvBuffer[dwRecvLength-2], ==, VCARD7816_SW1_SUCCESS);
g_assert_cmphex(pbRecvBuffer[dwRecvLength-1], ==, 0x00);
+ /* parse the response */
+ parse_acr(pbRecvBuffer, dwRecvLength);
}
static void read_buffer(VReader *reader, uint8_t type, int object_type)
--
2.17.1
More information about the Spice-devel
mailing list