|
From 0cd2a488d86006bb2740a4e73e7a0d859e1bf33c Mon Sep 17 00:00:00 2001
|
|
From: =?UTF-8?q?Nguy=E1=BB=85n=20H=E1=BB=93ng=20Qu=C3=A2n?=
|
|
<ng.hong.quan@gmail.com>
|
|
Date: Sun, 13 Jul 2014 17:37:59 +0800
|
|
Subject: [PATCH 22/26] OpenPGP: Use directly binary array of APDUs for ERASE
|
|
command.
|
|
|
|
I used a string presentation before and it needed an extra conversion step.
|
|
---
|
|
src/libopensc/card-openpgp.c | 47 +++++++++++++++++++++++---------------------
|
|
1 file changed, 25 insertions(+), 22 deletions(-)
|
|
|
|
Index: opensc-20150513/src/libopensc/card-openpgp.c
|
|
===================================================================
|
|
--- opensc-20150513.orig/src/libopensc/card-openpgp.c
|
|
+++ opensc-20150513/src/libopensc/card-openpgp.c
|
|
@@ -2358,24 +2358,27 @@ out:
|
|
static int pgp_erase_card(sc_card_t *card)
|
|
{
|
|
sc_context_t *ctx = card->ctx;
|
|
- u8 *apdustring[10] = {
|
|
- "00:20:00:81:08:40:40:40:40:40:40:40:40",
|
|
- "00:20:00:81:08:40:40:40:40:40:40:40:40",
|
|
- "00:20:00:81:08:40:40:40:40:40:40:40:40",
|
|
- "00:20:00:81:08:40:40:40:40:40:40:40:40",
|
|
- "00:20:00:83:08:40:40:40:40:40:40:40:40",
|
|
- "00:20:00:83:08:40:40:40:40:40:40:40:40",
|
|
- "00:20:00:83:08:40:40:40:40:40:40:40:40",
|
|
- "00:20:00:83:08:40:40:40:40:40:40:40:40",
|
|
- "00:e6:00:00",
|
|
- "00:44:00:00"
|
|
+ /* Special series of commands to erase OpenPGP card,
|
|
+ * according to https://www.crypto-stick.com/en/faq
|
|
+ * (How to reset a Crypto Stick? question).
|
|
+ * Gnuk is known not to support this feature. */
|
|
+ u8 apdu_binaries[10][13] = {
|
|
+ {0, 0x20, 0, 0x81, 0x08, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40},
|
|
+ {0, 0x20, 0, 0x81, 0x08, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40},
|
|
+ {0, 0x20, 0, 0x81, 0x08, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40},
|
|
+ {0, 0x20, 0, 0x81, 0x08, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40},
|
|
+ {0, 0x20, 0, 0x83, 0x08, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40},
|
|
+ {0, 0x20, 0, 0x83, 0x08, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40},
|
|
+ {0, 0x20, 0, 0x83, 0x08, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40},
|
|
+ {0, 0x20, 0, 0x83, 0x08, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40},
|
|
+ {0, 0xe6, 0, 0},
|
|
+ {0, 0x44, 0, 0}
|
|
};
|
|
+ u8 apdu_lens[10] = {13, 13, 13, 13, 13, 13, 13, 13, 4, 4};
|
|
u8 buf[SC_MAX_APDU_BUFFER_SIZE];
|
|
u8 rbuf[SC_MAX_APDU_BUFFER_SIZE];
|
|
sc_apdu_t apdu;
|
|
- size_t len0;
|
|
- int commandsnum = 10;
|
|
- int i, r;
|
|
+ int i, l, r;
|
|
|
|
LOG_FUNC_CALLED(ctx);
|
|
|
|
@@ -2387,17 +2390,17 @@ static int pgp_erase_card(sc_card_t *car
|
|
sc_log(ctx, "Card is OpenPGP v2. Erase card.");
|
|
|
|
/* Iterate over 10 commands above */
|
|
- for (i = 0; i < commandsnum; i++) {
|
|
- /* Convert the string to binary array */
|
|
- len0 = sizeof(buf);
|
|
- sc_hex_to_bin(apdustring[i], buf, &len0);
|
|
- printf("Sending: ");
|
|
- for (r = 0; r < len0; r++)
|
|
- printf("%02X ", buf[r]);
|
|
+ for (i = 0; i < sizeof(apdu_lens); i++) {
|
|
+ /* Length of the binary array of the current command */
|
|
+ l = apdu_lens[i];
|
|
+ /* Print the command to console */
|
|
+ printf("Sending %d: ", i);
|
|
+ for (r = 0; r < l; r++)
|
|
+ printf("%02X ", apdu_binaries[i][r]);
|
|
printf("\n");
|
|
|
|
/* Build APDU from binary array */
|
|
- r = sc_bytes2apdu(card->ctx, buf, len0, &apdu);
|
|
+ r = sc_bytes2apdu(card->ctx, apdu_binaries[i], l, &apdu);
|
|
if (r) {
|
|
sc_log(ctx, "Failed to build APDU");
|
|
LOG_FUNC_RETURN(ctx, SC_ERROR_INTERNAL);
|