openwrt-packages/utils/opensc/patches/0022-OpenPGP-Use-directly-b...

85 lines
3.2 KiB
Diff

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);