From 4c1a692838064c0f3b7308f0b7372c876c9b28e8 Mon Sep 17 00:00:00 2001 From: Klas Lindfors Date: Fri, 7 Feb 2014 17:11:56 +0100 Subject: [PATCH] let generate use chaining with transfer_data() --- yubico-piv-tool.c | 32 ++++++++++---------------------- 1 file changed, 10 insertions(+), 22 deletions(-) diff --git a/yubico-piv-tool.c b/yubico-piv-tool.c index 89dd42f..c339044 100644 --- a/yubico-piv-tool.c +++ b/yubico-piv-tool.c @@ -259,8 +259,9 @@ static void print_version(SCARDHANDLE *card, int verbose) { static bool generate_key(SCARDHANDLE *card, const char *slot, enum enum_algorithm algorithm, const char *output_file_name, enum enum_key_format key_format, int verbose) { APDU apdu; + unsigned char in_data[5]; unsigned char data[1024]; - unsigned long recv_len = 0xff; + unsigned long recv_len = sizeof(data); unsigned long received = 0; int sw; int key = 0; @@ -288,20 +289,19 @@ static bool generate_key(SCARDHANDLE *card, const char *slot, enum enum_algorith memset(apdu.raw, 0, sizeof(apdu)); apdu.st.ins = 0x47; apdu.st.p2 = key; - apdu.st.lc = 5; - apdu.st.data[0] = 0xac; - apdu.st.data[1] = 3; - apdu.st.data[2] = 0x80; - apdu.st.data[3] = 1; + in_data[0] = 0xac; + in_data[1] = 3; + in_data[2] = 0x80; + in_data[3] = 1; switch(algorithm) { case algorithm_arg_RSA2048: - apdu.st.data[4] = 0x07; + in_data[4] = 0x07; break; case algorithm_arg_RSA1024: - apdu.st.data[4] = 0x06; + in_data[4] = 0x06; break; case algorithm_arg_ECCP256: - apdu.st.data[4] = 0x11; + in_data[4] = 0x11; break; case algorithm__NULL: default: @@ -309,16 +309,8 @@ static bool generate_key(SCARDHANDLE *card, const char *slot, enum enum_algorith ret = false; goto generate_out; } - sw = send_data(card, &apdu, data, &recv_len, verbose); + sw = transfer_data(card, &apdu, in_data, sizeof(in_data), data, &recv_len, verbose); - /* chained response */ - if((sw & 0x6100) == 0x6100) { - received += recv_len - 2; - recv_len = 0xff; - memset(apdu.raw, 0, sizeof(apdu)); - apdu.st.ins = 0xc0; - sw = send_data(card, &apdu, data + received, &recv_len, verbose); - } if(sw != 0x9000) { fprintf(stderr, "Failed to generate new key.\n"); ret = false; @@ -989,10 +981,6 @@ static bool request_certificate(SCARDHANDLE *card, enum enum_key_format key_form M_ASN1_BIT_STRING_set(sig, dataptr, len); req->signature = sig; - fprintf(stderr, "Whole data is: "); - dump_hex(dataptr, len); - fprintf(stderr, "\n"); - if(key_format == key_format_arg_PEM) { PEM_write_X509_REQ(output_file, req); } else {