[Spice-devel] [PATCH libcacard 24/45] cac: Generate CardURLs in CCC based on the cert list
Jakub Jelen
jjelen at redhat.com
Tue Jul 31 14:50:18 UTC 2018
* This provides the real list of applets in the emulated card
in the CCC applet CardURLs, which is mandatory for applet and certificated
discovery.
* This also increaseses the amount of possible certificates to 10
Signed-off-by: Jakub Jelen <jjelen at redhat.com>
Reviewed-by: Robert Relyea <rrelyea at redhat.com>
---
src/cac.c | 80 +++++++++++++++++++++++++++++------------------
tests/libcacard.c | 2 +-
2 files changed, 51 insertions(+), 31 deletions(-)
diff --git a/src/cac.c b/src/cac.c
index fc6ba34..c023ee1 100644
--- a/src/cac.c
+++ b/src/cac.c
@@ -1137,23 +1137,30 @@ cac_new_ccc_applet_private(int cert_count)
"\x72\x36\x0E\x00\x00\x58\xBD\x00\x2C\x19\xB5";
unsigned char cc_version[] = "\x21";
unsigned char cg_version[] = "\x21";
- unsigned char pki_cardurl[] =
- "\xA0\x00\x00\x00\x79\x04\x01\x00\x01\x00\x00\x00\x00\x00\x00\x00";
- unsigned char cardurl[14][16] = {
- "\xA0\x00\x00\x01\x16\x01\x30\x00\x30\x00\x00\x00\x00\x00\x00\x00", /* ACA */
+ unsigned char cardurl[21][16] = {
+ /* common CardURLs */
"\xA0\x00\x00\x00\x79\x01\x02\xFB\x02\xFB\x00\x00\x00\x00\x00\x00", /* ??? */
"\xA0\x00\x00\x00\x79\x01\x02\xFE\x02\xFE\x00\x00\x00\x00\x00\x00", /* PKI Certificate */
"\xA0\x00\x00\x00\x79\x01\x02\xFD\x02\xFD\x00\x00\x00\x00\x00\x00", /* PKI Credential */
"\xA0\x00\x00\x00\x79\x01\x02\x00\x02\x00\x00\x00\x00\x00\x00\x00", /* Person Instance */
"\xA0\x00\x00\x00\x79\x01\x02\x01\x02\x01\x00\x00\x00\x00\x00\x00", /* Personel */
+ "\xA0\x00\x00\x01\x16\x01\x30\x00\x30\x00\x00\x00\x00\x00\x00\x00", /* Access Control F. */
+ "\xA0\x00\x00\x01\x16\x01\x60\x10\x30\x00\x00\x00\x00\x00\x00\x00", /* -//- */
+ "\xA0\x00\x00\x01\x16\x01\x60\x30\x30\x00\x00\x00\x00\x00\x00\x00", /* -//- */
+ "\xA0\x00\x00\x01\x16\x01\x90\x00\x30\x00\x00\x00\x00\x00\x00\x00", /* -//- */
+ "\xA0\x00\x00\x00\x79\x01\x12\x01\x12\x01\x00\x00\x00\x00\x00\x00", /* ?? */
+ "\xA0\x00\x00\x00\x79\x01\x12\x02\x12\x02\x00\x00\x00\x00\x00\x00", /* ?? */
+ /* dynamic list of all possible PKI objects CardURLs */
"\xA0\x00\x00\x00\x79\x04\x01\x00\x01\x00\x00\x00\x00\x00\x00\x00", /* PKI */
"\xA0\x00\x00\x00\x79\x04\x01\x01\x01\x01\x00\x00\x00\x00\x00\x00", /* PKI */
"\xA0\x00\x00\x00\x79\x04\x01\x02\x01\x02\x00\x00\x00\x00\x00\x00", /* PKI */
- "\xA0\x00\x00\x01\x16\x01\x60\x10\x30\x00\x00\x00\x00\x00\x00\x00", /* ?? AID=ACA ?? */
- "\xA0\x00\x00\x01\x16\x01\x60\x30\x30\x00\x00\x00\x00\x00\x00\x00", /* ?? AID=ACA ?? */
- "\xA0\x00\x00\x01\x16\x01\x90\x00\x30\x00\x00\x00\x00\x00\x00\x00", /* ?? AID=ACA ?? */
- "\xA0\x00\x00\x00\x79\x01\x12\x01\x12\x01\x00\x00\x00\x00\x00\x00", /* ?? */
- "\xA0\x00\x00\x00\x79\x01\x12\x02\x12\x02\x00\x00\x00\x00\x00\x00", /* ?? */
+ "\xA0\x00\x00\x00\x79\x04\x01\x03\x01\x03\x00\x00\x00\x00\x00\x00", /* PKI */
+ "\xA0\x00\x00\x00\x79\x04\x01\x04\x01\x04\x00\x00\x00\x00\x00\x00", /* PKI */
+ "\xA0\x00\x00\x00\x79\x04\x01\x05\x01\x05\x00\x00\x00\x00\x00\x00", /* PKI */
+ "\xA0\x00\x00\x00\x79\x04\x01\x06\x01\x06\x00\x00\x00\x00\x00\x00", /* PKI */
+ "\xA0\x00\x00\x00\x79\x04\x01\x07\x01\x07\x00\x00\x00\x00\x00\x00", /* PKI */
+ "\xA0\x00\x00\x00\x79\x04\x01\x08\x01\x08\x00\x00\x00\x00\x00\x00", /* PKI */
+ "\xA0\x00\x00\x00\x79\x04\x01\x09\x01\x09\x00\x00\x00\x00\x00\x00", /* PKI */
/*
* [ Empty for VM cards! ]
* [ RID 5B ][T ][ OID ][ AID ] [ P][AccessKeyInfo ][ K]
@@ -1171,7 +1178,7 @@ cac_new_ccc_applet_private(int cert_count)
unsigned char reg_data_model[] = "\x10";
unsigned char acr_table[] = "\x07\xA0\x00\x00\x00\x79\x03\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00\x00";
- static struct simpletlv_member buffer[26] = {
+ static struct simpletlv_member buffer[33] = {
{CAC_CCC_CARD_IDENTIFIER, 0x15, {/*.value = card_identifier*/},
SIMPLETLV_TYPE_LEAF},
{CAC_CCC_CAPABILITY_CONTAINER_VERSION, 1, {/*.value = cc_version*/},
@@ -1181,31 +1188,45 @@ cac_new_ccc_applet_private(int cert_count)
{CAC_CCC_APPLICATION_CARDURL, 16, {/*.value = cardurl[0]*/},
SIMPLETLV_TYPE_LEAF},
{CAC_CCC_APPLICATION_CARDURL, 16, {/*.value = cardurl[1]*/},
- SIMPLETLV_TYPE_NONE},
+ SIMPLETLV_TYPE_LEAF},
{CAC_CCC_APPLICATION_CARDURL, 16, {/*.value = cardurl[2]*/},
- SIMPLETLV_TYPE_NONE},
+ SIMPLETLV_TYPE_LEAF},
{CAC_CCC_APPLICATION_CARDURL, 16, {/*.value = cardurl[3]*/},
- SIMPLETLV_TYPE_NONE},
+ SIMPLETLV_TYPE_LEAF},
{CAC_CCC_APPLICATION_CARDURL, 16, {/*.value = cardurl[4]*/},
- SIMPLETLV_TYPE_NONE},
+ SIMPLETLV_TYPE_LEAF},
{CAC_CCC_APPLICATION_CARDURL, 16, {/*.value = cardurl[5]*/},
- SIMPLETLV_TYPE_NONE},
+ SIMPLETLV_TYPE_LEAF},
{CAC_CCC_APPLICATION_CARDURL, 16, {/*.value = cardurl[6]*/},
- SIMPLETLV_TYPE_NONE},
+ SIMPLETLV_TYPE_LEAF},
{CAC_CCC_APPLICATION_CARDURL, 16, {/*.value = cardurl[7]*/},
- SIMPLETLV_TYPE_NONE},
+ SIMPLETLV_TYPE_LEAF},
{CAC_CCC_APPLICATION_CARDURL, 16, {/*.value = cardurl[8]*/},
- SIMPLETLV_TYPE_NONE},
+ SIMPLETLV_TYPE_LEAF},
{CAC_CCC_APPLICATION_CARDURL, 16, {/*.value = cardurl[9]*/},
- SIMPLETLV_TYPE_NONE},
+ SIMPLETLV_TYPE_LEAF},
{CAC_CCC_APPLICATION_CARDURL, 16, {/*.value = cardurl[10]*/},
- SIMPLETLV_TYPE_NONE},
+ SIMPLETLV_TYPE_LEAF},
{CAC_CCC_APPLICATION_CARDURL, 16, {/*.value = cardurl[11]*/},
SIMPLETLV_TYPE_NONE},
{CAC_CCC_APPLICATION_CARDURL, 16, {/*.value = cardurl[12]*/},
SIMPLETLV_TYPE_NONE},
{CAC_CCC_APPLICATION_CARDURL, 16, {/*.value = cardurl[13]*/},
SIMPLETLV_TYPE_NONE},
+ {CAC_CCC_APPLICATION_CARDURL, 16, {/*.value = cardurl[14]*/},
+ SIMPLETLV_TYPE_NONE},
+ {CAC_CCC_APPLICATION_CARDURL, 16, {/*.value = cardurl[15]*/},
+ SIMPLETLV_TYPE_NONE},
+ {CAC_CCC_APPLICATION_CARDURL, 16, {/*.value = cardurl[16]*/},
+ SIMPLETLV_TYPE_NONE},
+ {CAC_CCC_APPLICATION_CARDURL, 16, {/*.value = cardurl[17]*/},
+ SIMPLETLV_TYPE_NONE},
+ {CAC_CCC_APPLICATION_CARDURL, 16, {/*.value = cardurl[18]*/},
+ SIMPLETLV_TYPE_NONE},
+ {CAC_CCC_APPLICATION_CARDURL, 16, {/*.value = cardurl[19]*/},
+ SIMPLETLV_TYPE_NONE},
+ {CAC_CCC_APPLICATION_CARDURL, 16, {/*.value = cardurl[20]*/},
+ SIMPLETLV_TYPE_NONE},
{CAC_CCC_PKCS15, 1, {/*.value = pkcs15 */},
SIMPLETLV_TYPE_LEAF},
{CAC_CCC_REGISTERED_DATA_MODEL_NUMBER, 1, {/*.value = reg_data_model */},
@@ -1236,7 +1257,10 @@ cac_new_ccc_applet_private(int cert_count)
buffer[0].value.value = card_identifier;
buffer[1].value.value = cc_version;
buffer[2].value.value = cg_version;
- buffer[3].value.value = cardurl[0]; /* ACA */
+ /* common CardURLs */
+ for (i = 0; i < 11; i++) {
+ buffer[3+i].value.value = cardurl[i];
+ }
if (cert_count > 10) {
// XXX too many objects for now
@@ -1245,17 +1269,13 @@ cac_new_ccc_applet_private(int cert_count)
}
/* Generate card URLs for PKI applets */
for (i = 0; i < cert_count; i++) {
- memcpy(cardurl[i+1], pki_cardurl, 16);
- cardurl[i+1][8] = i; /* adjust OID and AID */
- cardurl[i+1][10] = i;
- buffer[i+4].value.value = cardurl[i+1];
- buffer[i+4].type = SIMPLETLV_TYPE_LEAF;
+ buffer[i+14].value.value = cardurl[i+11];
+ buffer[i+14].type = SIMPLETLV_TYPE_LEAF;
}
- /* Skip unknown CardURLs for now */
- buffer[17].value.value = pkcs15;
- buffer[18].value.value = reg_data_model;
- buffer[19].value.value = acr_table;
+ buffer[24].value.value = pkcs15;
+ buffer[25].value.value = reg_data_model;
+ buffer[26].value.value = acr_table;
/* CCC Tag+Len buffer */
/* Ex:
* 34 00 Length of complete buffer
diff --git a/tests/libcacard.c b/tests/libcacard.c
index 9fc4462..650e2e7 100644
--- a/tests/libcacard.c
+++ b/tests/libcacard.c
@@ -502,7 +502,7 @@ static void read_buffer(VReader *reader, uint8_t type, int object_type)
}
}
if (object_type == TEST_CCC)
- g_assert_cmpint(card_urls, ==, 4);
+ g_assert_cmpint(card_urls, ==, 11 + 3);
}
g_free(data);
}
--
2.17.1
More information about the Spice-devel
mailing list