From 764c55e0139d38627bfd10c95a80c70537b5391c Mon Sep 17 00:00:00 2001 From: Daniel Golle Date: Wed, 13 May 2015 12:58:16 +0200 Subject: [PATCH] opensc: update source, refresh patches Also import two new GnuK-related patches. Signed-off-by: Daniel Golle --- utils/opensc/Makefile | 4 +- ...penPGP-Detect-and-support-Gnuk-Token.patch | 63 +++++++------- ...P-Add-Gnuk-in-pkcs15-emulation-layer.patch | 25 +++--- ...private-DO-to-filesystem-at-driver-i.patch | 13 ++- ...-PKCS15-OpenPGP-Declare-DATA-objects.patch | 19 ++--- ...5-OpenPGP-Support-erasing-reset-card.patch | 31 ++++--- ...gp-tool-Support-deleting-key-in-Gnuk.patch | 17 ++-- ...building-Extended-Header-List-when-i.patch | 13 ++- ...penPGP-Read-some-empty-DOs-from-Gnuk.patch | 15 ++-- ...o-not-show-empty-DO-in-pkcs15-emu_in.patch | 13 ++- ...llow-to-store-data-to-pkcs15-data-ob.patch | 25 +++--- ...enough-buffer-to-read-pubkey-from-Gn.patch | 19 ++--- ...P-Support-write-certificate-for-Gnuk.patch | 19 ++--- ...hange-to-sc_put_data-instead-of-sc_u.patch | 13 ++- ...-the-restriction-of-even-data-length.patch | 15 ++-- ...-OpenPGP-Delete-key-as-file-for-Gnuk.patch | 17 ++-- ...6-OpenPGP-Correct-parameter-checking.patch | 17 ++-- .../0017-OpenPGP-Make-code-neater.patch | 15 ++-- ...018-Move-declaration-to-top-of-block.patch | 15 ++-- ...ake-indentation-consistent-space-tab.patch | 31 ++++--- ...PGP-Don-t-use-sc_log-in-openpgp-tool.patch | 19 ++--- ...implement-gnuk_delete_key-in-openpgp.patch | 17 ++-- ...ctly-binary-array-of-APDUs-for-ERASE.patch | 15 ++-- ...rivate-blob-type-to-avoid-confusing-.patch | 73 ++++++++--------- ...rash-after-accessing-inexistent-file.patch | 17 ++-- .../patches/0025-Replace-hardcode.patch | 23 +++--- .../0026-hardcode-defines-for-DO-s.patch | 17 ++-- ...e-unused-variables-and-fix-type-cast.patch | 82 +++++++++++++++++++ ...0028-openpgp-tool-Fix-wrong-operator.patch | 28 +++++++ 29 files changed, 361 insertions(+), 329 deletions(-) create mode 100644 utils/opensc/patches/0027-OpenPGP-Remove-unused-variables-and-fix-type-cast.patch create mode 100644 utils/opensc/patches/0028-openpgp-tool-Fix-wrong-operator.patch diff --git a/utils/opensc/Makefile b/utils/opensc/Makefile index a7b830149..adb249f82 100644 --- a/utils/opensc/Makefile +++ b/utils/opensc/Makefile @@ -8,7 +8,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=opensc -PKG_VERSION:=20141126 +PKG_VERSION:=20150513 PKG_RELEASE:=1 PKG_LICENSE:=LGPL-2.1+ PKG_LICENSE_FILES:=COPYING @@ -19,7 +19,7 @@ PKG_RELEASE=$(PKG_SOURCE_VERSION) PKG_SOURCE_PROTO:=git PKG_SOURCE_URL:=https://github.com/OpenSC/OpenSC.git PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION) -PKG_SOURCE_VERSION:=8aadbbd678730dbafb819382da553439887499fd +PKG_SOURCE_VERSION:=a09ca246a797230c14bc33a34f2dddc4a4dbff40 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz PKG_BUILD_DEPENDS:=+libpcsclite PKG_FIXUP:=libtool diff --git a/utils/opensc/patches/0001-OpenPGP-Detect-and-support-Gnuk-Token.patch b/utils/opensc/patches/0001-OpenPGP-Detect-and-support-Gnuk-Token.patch index 08b2a8324..3bd03a6f2 100644 --- a/utils/opensc/patches/0001-OpenPGP-Detect-and-support-Gnuk-Token.patch +++ b/utils/opensc/patches/0001-OpenPGP-Detect-and-support-Gnuk-Token.patch @@ -11,11 +11,11 @@ http://www.fsij.org/gnuk/ src/tools/openpgp-tool.c | 7 ++++- 3 files changed, 55 insertions(+), 14 deletions(-) -diff --git a/src/libopensc/card-openpgp.c b/src/libopensc/card-openpgp.c -index 6774fe1..c785a55 100644 ---- a/src/libopensc/card-openpgp.c -+++ b/src/libopensc/card-openpgp.c -@@ -43,6 +43,7 @@ +Index: opensc-20150513/src/libopensc/card-openpgp.c +=================================================================== +--- opensc-20150513.orig/src/libopensc/card-openpgp.c ++++ opensc-20150513/src/libopensc/card-openpgp.c +@@ -45,6 +45,7 @@ static struct sc_atr_table pgp_atrs[] = { { "3b:fa:13:00:ff:81:31:80:45:00:31:c1:73:c0:01:00:00:90:00:b1", NULL, "OpenPGP card v1.0/1.1", SC_CARD_TYPE_OPENPGP_V1, 0, NULL }, { "3b:da:18:ff:81:b1:fe:75:1f:03:00:31:c5:73:c0:01:40:00:90:00:0c", NULL, "CryptoStick v1.2 (OpenPGP v2.0)", SC_CARD_TYPE_OPENPGP_V2, 0, NULL }, @@ -23,16 +23,16 @@ index 6774fe1..c785a55 100644 { NULL, NULL, NULL, 0, 0, NULL } }; -@@ -307,6 +308,8 @@ pgp_init(sc_card_t *card) +@@ -309,6 +310,8 @@ pgp_init(sc_card_t *card) int r; - struct blob *child = NULL; + struct blob *child = NULL; + LOG_FUNC_CALLED(card->ctx); + priv = calloc (1, sizeof *priv); if (!priv) return SC_ERROR_OUT_OF_MEMORY; -@@ -315,11 +318,11 @@ pgp_init(sc_card_t *card) +@@ -317,11 +320,11 @@ pgp_init(sc_card_t *card) card->cla = 0x00; /* set pointer to correct list of card objects */ @@ -46,7 +46,7 @@ index 6774fe1..c785a55 100644 ? OPENPGP_CARD_2_0 : OPENPGP_CARD_1_1; /* select application "OpenPGP" */ -@@ -428,7 +431,8 @@ pgp_get_card_features(sc_card_t *card) +@@ -436,7 +439,8 @@ pgp_get_card_features(sc_card_t *card) if ((pgp_get_blob(card, blob73, 0x00c0, &blob) >= 0) && (blob->data != NULL) && (blob->len > 0)) { /* in v2.0 bit 0x04 in first byte means "algorithm attributes changeable */ @@ -56,7 +56,7 @@ index 6774fe1..c785a55 100644 priv->ext_caps |= EXT_CAP_ALG_ATTR_CHANGEABLE; /* bit 0x08 in first byte means "support for private use DOs" */ if (blob->data[0] & 0x08) -@@ -445,7 +449,8 @@ pgp_get_card_features(sc_card_t *card) +@@ -453,7 +457,8 @@ pgp_get_card_features(sc_card_t *card) priv->ext_caps |= EXT_CAP_GET_CHALLENGE; } /* in v2.0 bit 0x80 in first byte means "support Secure Messaging" */ @@ -66,7 +66,7 @@ index 6774fe1..c785a55 100644 priv->ext_caps |= EXT_CAP_SM; if ((priv->bcd_version >= OPENPGP_CARD_2_0) && (blob->len >= 10)) { -@@ -1057,12 +1062,18 @@ static int +@@ -1065,12 +1070,18 @@ static int pgp_get_pubkey(sc_card_t *card, unsigned int tag, u8 *buf, size_t buf_len) { sc_apdu_t apdu; @@ -86,7 +86,7 @@ index 6774fe1..c785a55 100644 apdu.lc = 2; apdu.data = ushort2bebytes(idbuf, tag); apdu.datalen = 2; -@@ -1154,6 +1165,7 @@ pgp_put_data(sc_card_t *card, unsigned int tag, const u8 *buf, size_t buf_len) +@@ -1162,6 +1173,7 @@ pgp_put_data(sc_card_t *card, unsigned i u8 ins = 0xDA; u8 p1 = tag >> 8; u8 p2 = tag & 0xFF; @@ -94,7 +94,7 @@ index 6774fe1..c785a55 100644 int r; LOG_FUNC_CALLED(card->ctx); -@@ -1195,13 +1207,17 @@ pgp_put_data(sc_card_t *card, unsigned int tag, const u8 *buf, size_t buf_len) +@@ -1203,13 +1215,17 @@ pgp_put_data(sc_card_t *card, unsigned i /* Build APDU */ if (buf != NULL && buf_len > 0) { @@ -114,7 +114,7 @@ index 6774fe1..c785a55 100644 apdu.datalen = buf_len; apdu.lc = buf_len; } -@@ -1328,6 +1344,7 @@ pgp_compute_signature(sc_card_t *card, const u8 *data, +@@ -1336,6 +1352,7 @@ pgp_compute_signature(sc_card_t *card, c struct pgp_priv_data *priv = DRVDATA(card); sc_security_env_t *env = &priv->sec_env; sc_apdu_t apdu; @@ -122,7 +122,7 @@ index 6774fe1..c785a55 100644 int r; LOG_FUNC_CALLED(card->ctx); -@@ -1336,14 +1353,19 @@ pgp_compute_signature(sc_card_t *card, const u8 *data, +@@ -1344,14 +1361,19 @@ pgp_compute_signature(sc_card_t *card, c LOG_TEST_RET(card->ctx, SC_ERROR_INVALID_ARGUMENTS, "invalid operation"); @@ -144,7 +144,7 @@ index 6774fe1..c785a55 100644 break; case 0x01: default: -@@ -1352,7 +1374,7 @@ pgp_compute_signature(sc_card_t *card, const u8 *data, +@@ -1360,7 +1382,7 @@ pgp_compute_signature(sc_card_t *card, c } apdu.lc = data_len; @@ -153,7 +153,7 @@ index 6774fe1..c785a55 100644 apdu.datalen = data_len; apdu.le = ((outlen >= 256) && !(card->caps & SC_CARD_CAP_APDU_EXT)) ? 256 : outlen; apdu.resp = out; -@@ -1376,6 +1398,7 @@ pgp_decipher(sc_card_t *card, const u8 *in, size_t inlen, +@@ -1384,6 +1406,7 @@ pgp_decipher(sc_card_t *card, const u8 * struct pgp_priv_data *priv = DRVDATA(card); sc_security_env_t *env = &priv->sec_env; sc_apdu_t apdu; @@ -161,7 +161,7 @@ index 6774fe1..c785a55 100644 u8 *temp = NULL; int r; -@@ -1400,7 +1423,7 @@ pgp_decipher(sc_card_t *card, const u8 *in, size_t inlen, +@@ -1408,7 +1431,7 @@ pgp_decipher(sc_card_t *card, const u8 * case 0x01: /* Decryption key */ case 0x02: /* authentication key */ /* PSO DECIPHER */ @@ -170,7 +170,7 @@ index 6774fe1..c785a55 100644 break; case 0x00: /* signature key */ default: -@@ -1409,8 +1432,13 @@ pgp_decipher(sc_card_t *card, const u8 *in, size_t inlen, +@@ -1417,8 +1440,13 @@ pgp_decipher(sc_card_t *card, const u8 * "invalid key reference"); } @@ -185,7 +185,7 @@ index 6774fe1..c785a55 100644 apdu.datalen = inlen; apdu.le = ((outlen >= 256) && !(card->caps & SC_CARD_CAP_APDU_EXT)) ? 256 : outlen; apdu.resp = out; -@@ -1794,6 +1822,11 @@ static int pgp_gen_key(sc_card_t *card, sc_cardctl_openpgp_keygen_info_t *key_in +@@ -1802,6 +1830,11 @@ static int pgp_gen_key(sc_card_t *card, LOG_FUNC_RETURN(card->ctx, SC_ERROR_INVALID_ARGUMENTS); } @@ -197,7 +197,7 @@ index 6774fe1..c785a55 100644 /* Set attributes for new-generated key */ r = pgp_update_new_algo_attr(card, key_info); LOG_TEST_RET(card->ctx, r, "Cannot set attributes for new-generated key"); -@@ -1801,7 +1834,9 @@ static int pgp_gen_key(sc_card_t *card, sc_cardctl_openpgp_keygen_info_t *key_in +@@ -1809,7 +1842,9 @@ static int pgp_gen_key(sc_card_t *card, /* Test whether we will need extended APDU. 1900 is an * arbitrary modulus length which for sure fits into a short APDU. * This idea is borrowed from GnuPG code. */ @@ -208,10 +208,10 @@ index 6774fe1..c785a55 100644 /* We won't store to apdu variable yet, because it will be reset in * sc_format_apdu() */ apdu_le = card->max_recv_size; -diff --git a/src/libopensc/cards.h b/src/libopensc/cards.h -index 7be6667..a3f3634 100644 ---- a/src/libopensc/cards.h -+++ b/src/libopensc/cards.h +Index: opensc-20150513/src/libopensc/cards.h +=================================================================== +--- opensc-20150513.orig/src/libopensc/cards.h ++++ opensc-20150513/src/libopensc/cards.h @@ -105,6 +105,7 @@ enum { SC_CARD_TYPE_OPENPGP_BASE = 9000, SC_CARD_TYPE_OPENPGP_V1, @@ -220,10 +220,10 @@ index 7be6667..a3f3634 100644 /* jcop driver */ SC_CARD_TYPE_JCOP_BASE = 10000, -diff --git a/src/tools/openpgp-tool.c b/src/tools/openpgp-tool.c -index f42e6d6..a24a395 100644 ---- a/src/tools/openpgp-tool.c -+++ b/src/tools/openpgp-tool.c +Index: opensc-20150513/src/tools/openpgp-tool.c +=================================================================== +--- opensc-20150513.orig/src/tools/openpgp-tool.c ++++ opensc-20150513/src/tools/openpgp-tool.c @@ -33,6 +33,7 @@ #include "libopensc/cards.h" #include "libopensc/cardctl.h" @@ -232,7 +232,7 @@ index f42e6d6..a24a395 100644 #include "util.h" #include "libopensc/log.h" -@@ -396,6 +397,8 @@ int do_genkey(sc_card_t *card, u8 key_id, unsigned int key_len) +@@ -396,6 +397,8 @@ int do_genkey(sc_card_t *card, u8 key_id sc_path_t path; sc_file_t *file; @@ -253,6 +253,3 @@ index f42e6d6..a24a395 100644 exit_status = EXIT_FAILURE; goto out; } --- -2.1.3 - diff --git a/utils/opensc/patches/0002-OpenPGP-Add-Gnuk-in-pkcs15-emulation-layer.patch b/utils/opensc/patches/0002-OpenPGP-Add-Gnuk-in-pkcs15-emulation-layer.patch index c08a6e0a3..2514c16df 100644 --- a/utils/opensc/patches/0002-OpenPGP-Add-Gnuk-in-pkcs15-emulation-layer.patch +++ b/utils/opensc/patches/0002-OpenPGP-Add-Gnuk-in-pkcs15-emulation-layer.patch @@ -9,11 +9,11 @@ Subject: [PATCH 02/26] OpenPGP: Add Gnuk in pkcs15 emulation layer. src/libopensc/pkcs15-syn.c | 1 + 2 files changed, 5 insertions(+), 2 deletions(-) -diff --git a/src/libopensc/pkcs15-openpgp.c b/src/libopensc/pkcs15-openpgp.c -index 4daaa98..fdf720a 100644 ---- a/src/libopensc/pkcs15-openpgp.c -+++ b/src/libopensc/pkcs15-openpgp.c -@@ -151,7 +151,8 @@ sc_pkcs15emu_openpgp_init(sc_pkcs15_card_t *p15card) +Index: opensc-20150513/src/libopensc/pkcs15-openpgp.c +=================================================================== +--- opensc-20150513.orig/src/libopensc/pkcs15-openpgp.c ++++ opensc-20150513/src/libopensc/pkcs15-openpgp.c +@@ -153,7 +153,8 @@ sc_pkcs15emu_openpgp_init(sc_pkcs15_card u8 c4data[10]; u8 c5data[70]; int r, i; @@ -23,7 +23,7 @@ index 4daaa98..fdf720a 100644 sc_path_t path; sc_file_t *file; -@@ -363,7 +364,8 @@ failed: sc_debug(card->ctx, SC_LOG_DEBUG_NORMAL, "Failed to initialize OpenPGP e +@@ -365,7 +366,8 @@ failed: sc_debug(card->ctx, SC_LOG_DEBUG static int openpgp_detect_card(sc_pkcs15_card_t *p15card) { @@ -33,11 +33,11 @@ index 4daaa98..fdf720a 100644 return SC_SUCCESS; else return SC_ERROR_WRONG_CARD; -diff --git a/src/libopensc/pkcs15-syn.c b/src/libopensc/pkcs15-syn.c -index ffbf642..d2c086c 100644 ---- a/src/libopensc/pkcs15-syn.c -+++ b/src/libopensc/pkcs15-syn.c -@@ -115,6 +115,7 @@ int sc_pkcs15_is_emulation_only(sc_card_t *card) +Index: opensc-20150513/src/libopensc/pkcs15-syn.c +=================================================================== +--- opensc-20150513.orig/src/libopensc/pkcs15-syn.c ++++ opensc-20150513/src/libopensc/pkcs15-syn.c +@@ -117,6 +117,7 @@ int sc_pkcs15_is_emulation_only(sc_card_ case SC_CARD_TYPE_GEMSAFEV1_PTEID: case SC_CARD_TYPE_OPENPGP_V1: case SC_CARD_TYPE_OPENPGP_V2: @@ -45,6 +45,3 @@ index ffbf642..d2c086c 100644 case SC_CARD_TYPE_SC_HSM: case SC_CARD_TYPE_DNIE_BASE: case SC_CARD_TYPE_DNIE_BLANK: --- -2.1.3 - diff --git a/utils/opensc/patches/0003-OpenPGP-Include-private-DO-to-filesystem-at-driver-i.patch b/utils/opensc/patches/0003-OpenPGP-Include-private-DO-to-filesystem-at-driver-i.patch index 9e96cfef6..49fce825b 100644 --- a/utils/opensc/patches/0003-OpenPGP-Include-private-DO-to-filesystem-at-driver-i.patch +++ b/utils/opensc/patches/0003-OpenPGP-Include-private-DO-to-filesystem-at-driver-i.patch @@ -12,11 +12,11 @@ leading to that we cannot read their data later, even if we verified PIN. src/libopensc/card-openpgp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) -diff --git a/src/libopensc/card-openpgp.c b/src/libopensc/card-openpgp.c -index c785a55..1cc3923 100644 ---- a/src/libopensc/card-openpgp.c -+++ b/src/libopensc/card-openpgp.c -@@ -357,7 +357,7 @@ pgp_init(sc_card_t *card) +Index: opensc-20150513/src/libopensc/card-openpgp.c +=================================================================== +--- opensc-20150513.orig/src/libopensc/card-openpgp.c ++++ opensc-20150513/src/libopensc/card-openpgp.c +@@ -365,7 +365,7 @@ pgp_init(sc_card_t *card) /* Populate MF - add matching blobs listed in the pgp_objects table. */ for (info = priv->pgp_objects; (info != NULL) && (info->id > 0); info++) { @@ -25,6 +25,3 @@ index c785a55..1cc3923 100644 (info->get_fn != NULL)) { child = pgp_new_blob(card, priv->mf, info->id, sc_file_new()); --- -2.1.3 - diff --git a/utils/opensc/patches/0004-PKCS15-OpenPGP-Declare-DATA-objects.patch b/utils/opensc/patches/0004-PKCS15-OpenPGP-Declare-DATA-objects.patch index b6408de7f..619ea8cc4 100644 --- a/utils/opensc/patches/0004-PKCS15-OpenPGP-Declare-DATA-objects.patch +++ b/utils/opensc/patches/0004-PKCS15-OpenPGP-Declare-DATA-objects.patch @@ -10,11 +10,11 @@ This object is used by TrueCrypt. src/libopensc/pkcs15-openpgp.c | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) -diff --git a/src/libopensc/pkcs15-openpgp.c b/src/libopensc/pkcs15-openpgp.c -index fdf720a..fea2805 100644 ---- a/src/libopensc/pkcs15-openpgp.c -+++ b/src/libopensc/pkcs15-openpgp.c -@@ -32,6 +32,7 @@ +Index: opensc-20150513/src/libopensc/pkcs15-openpgp.c +=================================================================== +--- opensc-20150513.orig/src/libopensc/pkcs15-openpgp.c ++++ opensc-20150513/src/libopensc/pkcs15-openpgp.c +@@ -34,6 +34,7 @@ #include "log.h" int sc_pkcs15emu_openpgp_init_ex(sc_pkcs15_card_t *, sc_pkcs15emu_opt_t *); @@ -22,7 +22,7 @@ index fdf720a..fea2805 100644 #define PGP_USER_PIN_FLAGS (SC_PKCS15_PIN_FLAG_CASE_SENSITIVE \ -@@ -41,6 +42,8 @@ int sc_pkcs15emu_openpgp_init_ex(sc_pkcs15_card_t *, sc_pkcs15emu_opt_t *); +@@ -43,6 +44,8 @@ int sc_pkcs15emu_openpgp_init_ex(sc_pkcs | SC_PKCS15_PIN_FLAG_UNBLOCK_DISABLED \ | SC_PKCS15_PIN_FLAG_SO_PIN) @@ -31,7 +31,7 @@ index fdf720a..fea2805 100644 typedef struct _pgp_pin_cfg { const char *label; int reference; -@@ -355,6 +358,9 @@ sc_pkcs15emu_openpgp_init(sc_pkcs15_card_t *p15card) +@@ -357,6 +360,9 @@ sc_pkcs15emu_openpgp_init(sc_pkcs15_card goto failed; } @@ -41,7 +41,7 @@ index fdf720a..fea2805 100644 return 0; failed: sc_debug(card->ctx, SC_LOG_DEBUG_NORMAL, "Failed to initialize OpenPGP emulation: %s\n", -@@ -362,6 +368,35 @@ failed: sc_debug(card->ctx, SC_LOG_DEBUG_NORMAL, "Failed to initialize OpenPGP e +@@ -364,6 +370,35 @@ failed: sc_debug(card->ctx, SC_LOG_DEBUG return r; } @@ -77,6 +77,3 @@ index fdf720a..fea2805 100644 static int openpgp_detect_card(sc_pkcs15_card_t *p15card) { if (p15card->card->type == SC_CARD_TYPE_OPENPGP_V1 || p15card->card->type == SC_CARD_TYPE_OPENPGP_V2 --- -2.1.3 - diff --git a/utils/opensc/patches/0005-OpenPGP-Support-erasing-reset-card.patch b/utils/opensc/patches/0005-OpenPGP-Support-erasing-reset-card.patch index 0dc495462..aa3c9d38b 100644 --- a/utils/opensc/patches/0005-OpenPGP-Support-erasing-reset-card.patch +++ b/utils/opensc/patches/0005-OpenPGP-Support-erasing-reset-card.patch @@ -10,11 +10,11 @@ Command: openpgp-tool --erase src/tools/openpgp-tool.c | 22 ++++++++++++++- 2 files changed, 85 insertions(+), 1 deletion(-) -diff --git a/src/libopensc/card-openpgp.c b/src/libopensc/card-openpgp.c -index 1cc3923..7349876 100644 ---- a/src/libopensc/card-openpgp.c -+++ b/src/libopensc/card-openpgp.c -@@ -2195,6 +2195,66 @@ out: +Index: opensc-20150513/src/libopensc/card-openpgp.c +=================================================================== +--- opensc-20150513.orig/src/libopensc/card-openpgp.c ++++ opensc-20150513/src/libopensc/card-openpgp.c +@@ -2206,6 +2206,66 @@ out: #endif /* ENABLE_OPENSSL */ @@ -81,7 +81,7 @@ index 1cc3923..7349876 100644 /* ABI: card ctl: perform special card-specific operations */ static int pgp_card_ctl(sc_card_t *card, unsigned long cmd, void *ptr) { -@@ -2219,6 +2279,10 @@ static int pgp_card_ctl(sc_card_t *card, unsigned long cmd, void *ptr) +@@ -2232,6 +2292,10 @@ static int pgp_card_ctl(sc_card_t *card, LOG_FUNC_RETURN(card->ctx, r); break; #endif /* ENABLE_OPENSSL */ @@ -92,12 +92,12 @@ index 1cc3923..7349876 100644 } LOG_FUNC_RETURN(card->ctx, SC_ERROR_NOT_SUPPORTED); -diff --git a/src/tools/openpgp-tool.c b/src/tools/openpgp-tool.c -index a24a395..de1c9d4 100644 ---- a/src/tools/openpgp-tool.c -+++ b/src/tools/openpgp-tool.c +Index: opensc-20150513/src/tools/openpgp-tool.c +=================================================================== +--- opensc-20150513.orig/src/tools/openpgp-tool.c ++++ opensc-20150513/src/tools/openpgp-tool.c @@ -78,6 +78,7 @@ static int opt_pin = 0; - static char *pin = NULL; + static const char *pin = NULL; static int opt_dump_do = 0; static u8 do_dump_idx; +static int opt_erase = 0; @@ -120,7 +120,7 @@ index a24a395..de1c9d4 100644 "Verify PIN (CHV1, CHV2, CHV3...)", "PIN string", /* d */ "Dump private data object number (i.e. PRIVATE-DO-)" -@@ -232,7 +235,7 @@ static int decode_options(int argc, char **argv) +@@ -232,7 +235,7 @@ static int decode_options(int argc, char { int c; @@ -129,7 +129,7 @@ index a24a395..de1c9d4 100644 switch (c) { case 'r': opt_reader = optarg; -@@ -296,6 +299,8 @@ static int decode_options(int argc, char **argv) +@@ -294,6 +297,8 @@ static int decode_options(int argc, char do_dump_idx = optarg[0] - '0'; opt_dump_do++; actions++; @@ -138,7 +138,7 @@ index a24a395..de1c9d4 100644 break; default: util_print_usage_and_die(app_name, options, option_help, NULL); -@@ -452,6 +457,18 @@ int do_verify(sc_card_t *card, char *type, char *pin) +@@ -452,6 +457,18 @@ int do_verify(sc_card_t *card, char *typ return r; } @@ -167,6 +167,3 @@ index a24a395..de1c9d4 100644 out: sc_unlock(card); sc_disconnect_card(card); --- -2.1.3 - diff --git a/utils/opensc/patches/0006-openpgp-tool-Support-deleting-key-in-Gnuk.patch b/utils/opensc/patches/0006-openpgp-tool-Support-deleting-key-in-Gnuk.patch index 915f6842c..4286e4604 100644 --- a/utils/opensc/patches/0006-openpgp-tool-Support-deleting-key-in-Gnuk.patch +++ b/utils/opensc/patches/0006-openpgp-tool-Support-deleting-key-in-Gnuk.patch @@ -8,10 +8,10 @@ Subject: [PATCH 06/26] openpgp-tool: Support deleting key in Gnuk. src/tools/openpgp-tool.c | 142 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 142 insertions(+) -diff --git a/src/tools/openpgp-tool.c b/src/tools/openpgp-tool.c -index de1c9d4..374819a 100644 ---- a/src/tools/openpgp-tool.c -+++ b/src/tools/openpgp-tool.c +Index: opensc-20150513/src/tools/openpgp-tool.c +=================================================================== +--- opensc-20150513.orig/src/tools/openpgp-tool.c ++++ opensc-20150513/src/tools/openpgp-tool.c @@ -41,6 +41,7 @@ #define OPT_PRETTY 257 #define OPT_VERIFY 258 @@ -20,7 +20,7 @@ index de1c9d4..374819a 100644 /* define structures */ struct ef_name_map { -@@ -79,6 +80,7 @@ static char *pin = NULL; +@@ -79,6 +80,7 @@ static const char *pin = NULL; static int opt_dump_do = 0; static u8 do_dump_idx; static int opt_erase = 0; @@ -44,7 +44,7 @@ index de1c9d4..374819a 100644 /* d */ "Dump private data object number (i.e. PRIVATE-DO-)" }; -@@ -302,6 +306,14 @@ static int decode_options(int argc, char **argv) +@@ -300,6 +304,14 @@ static int decode_options(int argc, char case 'E': opt_erase++; break; @@ -59,7 +59,7 @@ index de1c9d4..374819a 100644 default: util_print_usage_and_die(app_name, options, option_help, NULL); } -@@ -457,6 +469,133 @@ int do_verify(sc_card_t *card, char *type, char *pin) +@@ -457,6 +469,133 @@ int do_verify(sc_card_t *card, char *typ return r; } @@ -203,6 +203,3 @@ index de1c9d4..374819a 100644 if (opt_erase) exit_status != do_erase(card); --- -2.1.3 - diff --git a/utils/opensc/patches/0007-OpenPGP-Correct-building-Extended-Header-List-when-i.patch b/utils/opensc/patches/0007-OpenPGP-Correct-building-Extended-Header-List-when-i.patch index 7d8045679..f5b2cc045 100644 --- a/utils/opensc/patches/0007-OpenPGP-Correct-building-Extended-Header-List-when-i.patch +++ b/utils/opensc/patches/0007-OpenPGP-Correct-building-Extended-Header-List-when-i.patch @@ -9,11 +9,11 @@ Subject: [PATCH 07/26] OpenPGP: Correct building Extended Header List when src/libopensc/card-openpgp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) -diff --git a/src/libopensc/card-openpgp.c b/src/libopensc/card-openpgp.c -index 7349876..91c311b 100644 ---- a/src/libopensc/card-openpgp.c -+++ b/src/libopensc/card-openpgp.c -@@ -1977,7 +1977,7 @@ pgp_build_extended_header_list(sc_card_t *card, sc_cardctl_openpgp_keystore_info +Index: opensc-20150513/src/libopensc/card-openpgp.c +=================================================================== +--- opensc-20150513.orig/src/libopensc/card-openpgp.c ++++ opensc-20150513/src/libopensc/card-openpgp.c +@@ -1988,7 +1988,7 @@ pgp_build_extended_header_list(sc_card_t u8 *p = NULL; u8 *components[] = {key_info->e, key_info->p, key_info->q, key_info->n}; size_t componentlens[] = {key_info->e_len, key_info->p_len, key_info->q_len, key_info->n_len}; @@ -22,6 +22,3 @@ index 7349876..91c311b 100644 char *componentnames[] = { "public exponent", "prime p", --- -2.1.3 - diff --git a/utils/opensc/patches/0008-OpenPGP-Read-some-empty-DOs-from-Gnuk.patch b/utils/opensc/patches/0008-OpenPGP-Read-some-empty-DOs-from-Gnuk.patch index 17aaf92ca..9d942d0f5 100644 --- a/utils/opensc/patches/0008-OpenPGP-Read-some-empty-DOs-from-Gnuk.patch +++ b/utils/opensc/patches/0008-OpenPGP-Read-some-empty-DOs-from-Gnuk.patch @@ -10,11 +10,11 @@ So, we will consider them exist in driver. src/libopensc/card-openpgp.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) -diff --git a/src/libopensc/card-openpgp.c b/src/libopensc/card-openpgp.c -index 91c311b..e7b25c0 100644 ---- a/src/libopensc/card-openpgp.c -+++ b/src/libopensc/card-openpgp.c -@@ -815,6 +815,23 @@ pgp_get_blob(sc_card_t *card, struct blob *blob, unsigned int id, +Index: opensc-20150513/src/libopensc/card-openpgp.c +=================================================================== +--- opensc-20150513.orig/src/libopensc/card-openpgp.c ++++ opensc-20150513/src/libopensc/card-openpgp.c +@@ -823,6 +823,23 @@ pgp_get_blob(sc_card_t *card, struct blo } } @@ -38,7 +38,7 @@ index 91c311b..e7b25c0 100644 return SC_ERROR_FILE_NOT_FOUND; } -@@ -1149,6 +1166,14 @@ pgp_get_data(sc_card_t *card, unsigned int tag, u8 *buf, size_t buf_len) +@@ -1157,6 +1174,14 @@ pgp_get_data(sc_card_t *card, unsigned i LOG_TEST_RET(card->ctx, r, "APDU transmit failed"); r = sc_check_sw(card, apdu.sw1, apdu.sw2); @@ -53,6 +53,3 @@ index 91c311b..e7b25c0 100644 LOG_TEST_RET(card->ctx, r, "Card returned error"); LOG_FUNC_RETURN(card->ctx, apdu.resplen); --- -2.1.3 - diff --git a/utils/opensc/patches/0009-PKCS15-OpenPGP-Do-not-show-empty-DO-in-pkcs15-emu_in.patch b/utils/opensc/patches/0009-PKCS15-OpenPGP-Do-not-show-empty-DO-in-pkcs15-emu_in.patch index a75a2c2ce..16431a4d9 100644 --- a/utils/opensc/patches/0009-PKCS15-OpenPGP-Do-not-show-empty-DO-in-pkcs15-emu_in.patch +++ b/utils/opensc/patches/0009-PKCS15-OpenPGP-Do-not-show-empty-DO-in-pkcs15-emu_in.patch @@ -9,11 +9,11 @@ Subject: [PATCH 09/26] PKCS15-OpenPGP: Do not show empty DO in pkcs15 src/libopensc/pkcs15-openpgp.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) -diff --git a/src/libopensc/pkcs15-openpgp.c b/src/libopensc/pkcs15-openpgp.c -index fea2805..51a2032 100644 ---- a/src/libopensc/pkcs15-openpgp.c -+++ b/src/libopensc/pkcs15-openpgp.c -@@ -381,16 +381,34 @@ sc_pkcs15emu_openpgp_add_data(sc_pkcs15_card_t *p15card) +Index: opensc-20150513/src/libopensc/pkcs15-openpgp.c +=================================================================== +--- opensc-20150513.orig/src/libopensc/pkcs15-openpgp.c ++++ opensc-20150513/src/libopensc/pkcs15-openpgp.c +@@ -383,16 +383,34 @@ sc_pkcs15emu_openpgp_add_data(sc_pkcs15_ sc_pkcs15_object_t dat_obj; char name[8]; char path[9]; @@ -48,6 +48,3 @@ index fea2805..51a2032 100644 sc_log(ctx, "Add %s data object", name); r = sc_pkcs15emu_add_data_object(p15card, &dat_obj, &dat_info); } --- -2.1.3 - diff --git a/utils/opensc/patches/0010-PKCS15-OpenPGP-Allow-to-store-data-to-pkcs15-data-ob.patch b/utils/opensc/patches/0010-PKCS15-OpenPGP-Allow-to-store-data-to-pkcs15-data-ob.patch index 7b0f493cc..afcf9d598 100644 --- a/utils/opensc/patches/0010-PKCS15-OpenPGP-Allow-to-store-data-to-pkcs15-data-ob.patch +++ b/utils/opensc/patches/0010-PKCS15-OpenPGP-Allow-to-store-data-to-pkcs15-data-ob.patch @@ -11,11 +11,11 @@ Only one DO is supported now. src/pkcs15init/pkcs15-openpgp.c | 38 +++++++++++++++++++++++++++++++++++++- 2 files changed, 38 insertions(+), 2 deletions(-) -diff --git a/src/libopensc/pkcs15-openpgp.c b/src/libopensc/pkcs15-openpgp.c -index 51a2032..4cc1c39 100644 ---- a/src/libopensc/pkcs15-openpgp.c -+++ b/src/libopensc/pkcs15-openpgp.c -@@ -393,7 +393,7 @@ sc_pkcs15emu_openpgp_add_data(sc_pkcs15_card_t *p15card) +Index: opensc-20150513/src/libopensc/pkcs15-openpgp.c +=================================================================== +--- opensc-20150513.orig/src/libopensc/pkcs15-openpgp.c ++++ opensc-20150513/src/libopensc/pkcs15-openpgp.c +@@ -395,7 +395,7 @@ sc_pkcs15emu_openpgp_add_data(sc_pkcs15_ */ r = read_file(p15card->card, path, content, sizeof(content)); if (r <= 0 ) { @@ -24,11 +24,11 @@ index 51a2032..4cc1c39 100644 /* Skip */ continue; } -diff --git a/src/pkcs15init/pkcs15-openpgp.c b/src/pkcs15init/pkcs15-openpgp.c -index f3a4962..1455580 100755 ---- a/src/pkcs15init/pkcs15-openpgp.c -+++ b/src/pkcs15init/pkcs15-openpgp.c -@@ -236,13 +236,16 @@ static int openpgp_emu_update_tokeninfo(sc_profile_t *profile, sc_pkcs15_card_t +Index: opensc-20150513/src/pkcs15init/pkcs15-openpgp.c +=================================================================== +--- opensc-20150513.orig/src/pkcs15init/pkcs15-openpgp.c ++++ opensc-20150513/src/pkcs15init/pkcs15-openpgp.c +@@ -236,13 +236,16 @@ static int openpgp_emu_update_tokeninfo( } static int openpgp_store_data(struct sc_pkcs15_card *p15card, struct sc_profile *profile, @@ -46,7 +46,7 @@ index f3a4962..1455580 100755 int r; LOG_FUNC_CALLED(card->ctx); -@@ -282,6 +285,39 @@ static int openpgp_store_data(struct sc_pkcs15_card *p15card, struct sc_profile +@@ -282,6 +285,39 @@ static int openpgp_store_data(struct sc_ content->len, 0); break; @@ -86,6 +86,3 @@ index f3a4962..1455580 100755 default: r = SC_ERROR_NOT_IMPLEMENTED; } --- -2.1.3 - diff --git a/utils/opensc/patches/0011-OpenPGP-Provide-enough-buffer-to-read-pubkey-from-Gn.patch b/utils/opensc/patches/0011-OpenPGP-Provide-enough-buffer-to-read-pubkey-from-Gn.patch index d133e8059..a4c52621a 100644 --- a/utils/opensc/patches/0011-OpenPGP-Provide-enough-buffer-to-read-pubkey-from-Gn.patch +++ b/utils/opensc/patches/0011-OpenPGP-Provide-enough-buffer-to-read-pubkey-from-Gn.patch @@ -9,11 +9,11 @@ Subject: [PATCH 11/26] OpenPGP: Provide enough buffer to read pubkey from src/libopensc/card-openpgp.c | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) -diff --git a/src/libopensc/card-openpgp.c b/src/libopensc/card-openpgp.c -index e7b25c0..1913eca 100644 ---- a/src/libopensc/card-openpgp.c -+++ b/src/libopensc/card-openpgp.c -@@ -263,7 +263,12 @@ static struct do_info pgp2_objects[] = { /* OpenPGP card spec 2.0 */ +Index: opensc-20150513/src/libopensc/card-openpgp.c +=================================================================== +--- opensc-20150513.orig/src/libopensc/card-openpgp.c ++++ opensc-20150513/src/libopensc/card-openpgp.c +@@ -265,7 +265,12 @@ static struct do_info pgp2_objects[] = /* The DO holding X.509 certificate is constructed but does not contain child DO. * We should notice this when building fake file system later. */ @@ -27,7 +27,7 @@ index e7b25c0..1913eca 100644 #define DRVDATA(card) ((struct pgp_priv_data *) ((card)->drv_data)) struct pgp_priv_data { -@@ -731,6 +736,14 @@ pgp_read_blob(sc_card_t *card, struct blob *blob) +@@ -739,6 +744,14 @@ pgp_read_blob(sc_card_t *card, struct bl u8 buffer[2048]; size_t buf_len = (card->caps & SC_CARD_CAP_APDU_EXT) ? sizeof(buffer) : 256; @@ -42,7 +42,7 @@ index e7b25c0..1913eca 100644 int r = blob->info->get_fn(card, blob->id, buffer, buf_len); if (r < 0) { /* an error occurred */ -@@ -1828,6 +1841,7 @@ static int pgp_gen_key(sc_card_t *card, sc_cardctl_openpgp_keygen_info_t *key_in +@@ -1836,6 +1849,7 @@ static int pgp_gen_key(sc_card_t *card, u8 apdu_case; u8 *apdu_data; size_t apdu_le; @@ -50,7 +50,7 @@ index e7b25c0..1913eca 100644 int r = SC_SUCCESS; LOG_FUNC_CALLED(card->ctx); -@@ -1868,23 +1882,27 @@ static int pgp_gen_key(sc_card_t *card, sc_cardctl_openpgp_keygen_info_t *key_in +@@ -1876,23 +1890,27 @@ static int pgp_gen_key(sc_card_t *card, apdu_case = SC_APDU_CASE_4_EXT; } else { @@ -82,6 +82,3 @@ index e7b25c0..1913eca 100644 /* Send */ sc_log(card->ctx, "Waiting for the card to generate key..."); --- -2.1.3 - diff --git a/utils/opensc/patches/0012-OpenPGP-Support-write-certificate-for-Gnuk.patch b/utils/opensc/patches/0012-OpenPGP-Support-write-certificate-for-Gnuk.patch index 3a2526f4e..40c0c8541 100644 --- a/utils/opensc/patches/0012-OpenPGP-Support-write-certificate-for-Gnuk.patch +++ b/utils/opensc/patches/0012-OpenPGP-Support-write-certificate-for-Gnuk.patch @@ -8,11 +8,11 @@ Subject: [PATCH 12/26] OpenPGP: Support write certificate for Gnuk. src/libopensc/card-openpgp.c | 158 +++++++++++++++++++++++++++++++++---------- 1 file changed, 123 insertions(+), 35 deletions(-) -diff --git a/src/libopensc/card-openpgp.c b/src/libopensc/card-openpgp.c -index 1913eca..7cea84f 100644 ---- a/src/libopensc/card-openpgp.c -+++ b/src/libopensc/card-openpgp.c -@@ -727,6 +727,8 @@ pgp_iterate_blobs(struct blob *blob, int level, void (*func)()) +Index: opensc-20150513/src/libopensc/card-openpgp.c +=================================================================== +--- opensc-20150513.orig/src/libopensc/card-openpgp.c ++++ opensc-20150513/src/libopensc/card-openpgp.c +@@ -735,6 +735,8 @@ pgp_iterate_blobs(struct blob *blob, int static int pgp_read_blob(sc_card_t *card, struct blob *blob) { @@ -21,7 +21,7 @@ index 1913eca..7cea84f 100644 if (blob->data != NULL) return SC_SUCCESS; if (blob->info == NULL) -@@ -737,6 +739,11 @@ pgp_read_blob(sc_card_t *card, struct blob *blob) +@@ -745,6 +747,11 @@ pgp_read_blob(sc_card_t *card, struct bl size_t buf_len = (card->caps & SC_CARD_CAP_APDU_EXT) ? sizeof(buffer) : 256; @@ -33,7 +33,7 @@ index 1913eca..7cea84f 100644 /* Buffer length for Gnuk pubkey */ if (card->type == SC_CARD_TYPE_OPENPGP_GNUK && (blob->id == 0xa400 || blob->id == 0xb600 || blob->id == 0xb800 -@@ -1192,49 +1199,75 @@ pgp_get_data(sc_card_t *card, unsigned int tag, u8 *buf, size_t buf_len) +@@ -1200,49 +1207,75 @@ pgp_get_data(sc_card_t *card, unsigned i LOG_FUNC_RETURN(card->ctx, apdu.resplen); } @@ -143,7 +143,7 @@ index 1913eca..7cea84f 100644 /* Extended Header list (004D DO) needs a variant of PUT DATA command */ if (tag == 0x004D) { -@@ -1260,15 +1293,70 @@ pgp_put_data(sc_card_t *card, unsigned int tag, const u8 *buf, size_t buf_len) +@@ -1268,15 +1301,70 @@ pgp_put_data(sc_card_t *card, unsigned i apdu.lc = buf_len; } else { @@ -215,6 +215,3 @@ index 1913eca..7cea84f 100644 /* Instruct more in case of error */ if (r == SC_ERROR_SECURITY_STATUS_NOT_SATISFIED) { sc_debug(card->ctx, SC_LOG_DEBUG_VERBOSE, "Please verify PIN first."); --- -2.1.3 - diff --git a/utils/opensc/patches/0013-pkcs15-openpgp-Change-to-sc_put_data-instead-of-sc_u.patch b/utils/opensc/patches/0013-pkcs15-openpgp-Change-to-sc_put_data-instead-of-sc_u.patch index 48afb3739..c785a0dd5 100644 --- a/utils/opensc/patches/0013-pkcs15-openpgp-Change-to-sc_put_data-instead-of-sc_u.patch +++ b/utils/opensc/patches/0013-pkcs15-openpgp-Change-to-sc_put_data-instead-of-sc_u.patch @@ -9,11 +9,11 @@ Subject: [PATCH 13/26] pkcs15-openpgp: Change to sc_put_data instead of src/pkcs15init/pkcs15-openpgp.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) -diff --git a/src/pkcs15init/pkcs15-openpgp.c b/src/pkcs15init/pkcs15-openpgp.c -index 1455580..be1291e 100755 ---- a/src/pkcs15init/pkcs15-openpgp.c -+++ b/src/pkcs15init/pkcs15-openpgp.c -@@ -279,10 +279,9 @@ static int openpgp_store_data(struct sc_pkcs15_card *p15card, struct sc_profile +Index: opensc-20150513/src/pkcs15init/pkcs15-openpgp.c +=================================================================== +--- opensc-20150513.orig/src/pkcs15init/pkcs15-openpgp.c ++++ opensc-20150513/src/pkcs15init/pkcs15-openpgp.c +@@ -279,10 +279,9 @@ static int openpgp_store_data(struct sc_ r = sc_select_file(card, path, &file); LOG_TEST_RET(card->ctx, r, "Cannot select cert file"); r = sc_pkcs15init_authenticate(profile, p15card, file, SC_AC_OP_UPDATE); @@ -26,6 +26,3 @@ index 1455580..be1291e 100755 break; case SC_PKCS15_TYPE_DATA_OBJECT: --- -2.1.3 - diff --git a/utils/opensc/patches/0014-OpenPGP-Overcome-the-restriction-of-even-data-length.patch b/utils/opensc/patches/0014-OpenPGP-Overcome-the-restriction-of-even-data-length.patch index 0fa8f2c3d..884e4fa7d 100644 --- a/utils/opensc/patches/0014-OpenPGP-Overcome-the-restriction-of-even-data-length.patch +++ b/utils/opensc/patches/0014-OpenPGP-Overcome-the-restriction-of-even-data-length.patch @@ -10,11 +10,11 @@ When write certificate with odd length to Gnuk, we add zero padding to make it e src/libopensc/card-openpgp.c | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) -diff --git a/src/libopensc/card-openpgp.c b/src/libopensc/card-openpgp.c -index 7cea84f..7a77a71 100644 ---- a/src/libopensc/card-openpgp.c -+++ b/src/libopensc/card-openpgp.c -@@ -1208,6 +1208,10 @@ static int gnuk_write_certificate(sc_card_t *card, const u8 *buf, size_t length) +Index: opensc-20150513/src/libopensc/card-openpgp.c +=================================================================== +--- opensc-20150513.orig/src/libopensc/card-openpgp.c ++++ opensc-20150513/src/libopensc/card-openpgp.c +@@ -1216,6 +1216,10 @@ static int gnuk_write_certificate(sc_car sc_apdu_t apdu; u8 *part; size_t plen; @@ -25,7 +25,7 @@ index 7cea84f..7a77a71 100644 int r = SC_SUCCESS; LOG_FUNC_CALLED(ctx); -@@ -1238,8 +1242,20 @@ static int gnuk_write_certificate(sc_card_t *card, const u8 *buf, size_t length) +@@ -1246,8 +1250,20 @@ static int gnuk_write_certificate(sc_car sc_format_apdu(card, &apdu, SC_APDU_CASE_3_SHORT, 0xD6, i, 0); } apdu.flags |= SC_APDU_FLAGS_CHAINING; @@ -48,6 +48,3 @@ index 7cea84f..7a77a71 100644 r = sc_transmit_apdu(card, &apdu); LOG_TEST_RET(card->ctx, r, "APDU transmit failed"); --- -2.1.3 - diff --git a/utils/opensc/patches/0015-OpenPGP-Delete-key-as-file-for-Gnuk.patch b/utils/opensc/patches/0015-OpenPGP-Delete-key-as-file-for-Gnuk.patch index 2389cd109..e9ac9d343 100644 --- a/utils/opensc/patches/0015-OpenPGP-Delete-key-as-file-for-Gnuk.patch +++ b/utils/opensc/patches/0015-OpenPGP-Delete-key-as-file-for-Gnuk.patch @@ -8,11 +8,11 @@ Subject: [PATCH 15/26] OpenPGP: Delete key as file, for Gnuk. src/libopensc/card-openpgp.c | 51 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 50 insertions(+), 1 deletion(-) -diff --git a/src/libopensc/card-openpgp.c b/src/libopensc/card-openpgp.c -index 7a77a71..4d0500d 100644 ---- a/src/libopensc/card-openpgp.c -+++ b/src/libopensc/card-openpgp.c -@@ -2435,6 +2435,44 @@ static int pgp_card_ctl(sc_card_t *card, unsigned long cmd, void *ptr) +Index: opensc-20150513/src/libopensc/card-openpgp.c +=================================================================== +--- opensc-20150513.orig/src/libopensc/card-openpgp.c ++++ opensc-20150513/src/libopensc/card-openpgp.c +@@ -2448,6 +2448,44 @@ static int pgp_card_ctl(sc_card_t *card, LOG_FUNC_RETURN(card->ctx, SC_ERROR_NOT_SUPPORTED); } @@ -57,7 +57,7 @@ index 7a77a71..4d0500d 100644 /* ABI: DELETE FILE */ static int pgp_delete_file(sc_card_t *card, const sc_path_t *path) -@@ -2442,6 +2480,7 @@ pgp_delete_file(sc_card_t *card, const sc_path_t *path) +@@ -2455,6 +2493,7 @@ pgp_delete_file(sc_card_t *card, const s struct pgp_priv_data *priv = DRVDATA(card); struct blob *blob; sc_file_t *file; @@ -65,7 +65,7 @@ index 7a77a71..4d0500d 100644 int r; LOG_FUNC_CALLED(card->ctx); -@@ -2457,10 +2496,20 @@ pgp_delete_file(sc_card_t *card, const sc_path_t *path) +@@ -2470,10 +2509,20 @@ pgp_delete_file(sc_card_t *card, const s if (blob == priv->mf) LOG_FUNC_RETURN(card->ctx, SC_ERROR_NOT_SUPPORTED); @@ -87,6 +87,3 @@ index 7a77a71..4d0500d 100644 else { /* call pgp_put_data() with zero-sized NULL-buffer to zap the DO contents */ r = pgp_put_data(card, file->id, NULL, 0); --- -2.1.3 - diff --git a/utils/opensc/patches/0016-OpenPGP-Correct-parameter-checking.patch b/utils/opensc/patches/0016-OpenPGP-Correct-parameter-checking.patch index 76c8624e3..3f80a0602 100644 --- a/utils/opensc/patches/0016-OpenPGP-Correct-parameter-checking.patch +++ b/utils/opensc/patches/0016-OpenPGP-Correct-parameter-checking.patch @@ -8,11 +8,11 @@ Subject: [PATCH 16/26] OpenPGP: Correct parameter checking. src/libopensc/card-openpgp.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) -diff --git a/src/libopensc/card-openpgp.c b/src/libopensc/card-openpgp.c -index 4d0500d..beeee83 100644 ---- a/src/libopensc/card-openpgp.c -+++ b/src/libopensc/card-openpgp.c -@@ -1223,6 +1223,8 @@ static int gnuk_write_certificate(sc_card_t *card, const u8 *buf, size_t length) +Index: opensc-20150513/src/libopensc/card-openpgp.c +=================================================================== +--- opensc-20150513.orig/src/libopensc/card-openpgp.c ++++ opensc-20150513/src/libopensc/card-openpgp.c +@@ -1231,6 +1231,8 @@ static int gnuk_write_certificate(sc_car LOG_TEST_RET(card->ctx, r, "APDU transmit failed"); /* Check response */ r = sc_check_sw(card, apdu.sw1, apdu.sw2); @@ -21,7 +21,7 @@ index 4d0500d..beeee83 100644 LOG_FUNC_RETURN(card->ctx, length); } -@@ -2446,6 +2448,11 @@ gnuk_delete_key(sc_card_t *card, u8 key_id) +@@ -2459,6 +2461,11 @@ gnuk_delete_key(sc_card_t *card, u8 key_ LOG_FUNC_CALLED(ctx); @@ -33,7 +33,7 @@ index 4d0500d..beeee83 100644 /* Delete fingerprint */ sc_log(ctx, "Delete fingerprints"); r = pgp_put_data(card, 0xC6 + key_id, NULL, 0); -@@ -2464,8 +2471,6 @@ gnuk_delete_key(sc_card_t *card, u8 key_id) +@@ -2477,8 +2484,6 @@ gnuk_delete_key(sc_card_t *card, u8 key_ data = "\x4D\x02\xB8"; else if (key_id == 3) data = "\x4D\x02\xA4"; @@ -42,6 +42,3 @@ index 4d0500d..beeee83 100644 r = pgp_put_data(card, 0x4D, data, strlen(data) + 1); --- -2.1.3 - diff --git a/utils/opensc/patches/0017-OpenPGP-Make-code-neater.patch b/utils/opensc/patches/0017-OpenPGP-Make-code-neater.patch index 2bb6fccaf..25a23e235 100644 --- a/utils/opensc/patches/0017-OpenPGP-Make-code-neater.patch +++ b/utils/opensc/patches/0017-OpenPGP-Make-code-neater.patch @@ -8,11 +8,11 @@ Subject: [PATCH 17/26] OpenPGP: Make code neater src/libopensc/card-openpgp.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) -diff --git a/src/libopensc/card-openpgp.c b/src/libopensc/card-openpgp.c -index beeee83..ca0d01b 100644 ---- a/src/libopensc/card-openpgp.c -+++ b/src/libopensc/card-openpgp.c -@@ -1222,10 +1222,7 @@ static int gnuk_write_certificate(sc_card_t *card, const u8 *buf, size_t length) +Index: opensc-20150513/src/libopensc/card-openpgp.c +=================================================================== +--- opensc-20150513.orig/src/libopensc/card-openpgp.c ++++ opensc-20150513/src/libopensc/card-openpgp.c +@@ -1230,10 +1230,7 @@ static int gnuk_write_certificate(sc_car r = sc_transmit_apdu(card, &apdu); LOG_TEST_RET(card->ctx, r, "APDU transmit failed"); /* Check response */ @@ -24,7 +24,7 @@ index beeee83..ca0d01b 100644 } /* Ref: gnuk_put_binary_libusb.py and gnuk_token.py in Gnuk source tree */ -@@ -1262,8 +1259,7 @@ static int gnuk_write_certificate(sc_card_t *card, const u8 *buf, size_t length) +@@ -1270,8 +1267,7 @@ static int gnuk_write_certificate(sc_car r = sc_transmit_apdu(card, &apdu); LOG_TEST_RET(card->ctx, r, "APDU transmit failed"); /* Check response */ @@ -34,6 +34,3 @@ index beeee83..ca0d01b 100644 /* To next part */ i++; --- -2.1.3 - diff --git a/utils/opensc/patches/0018-Move-declaration-to-top-of-block.patch b/utils/opensc/patches/0018-Move-declaration-to-top-of-block.patch index 774ed58a1..2d617b597 100644 --- a/utils/opensc/patches/0018-Move-declaration-to-top-of-block.patch +++ b/utils/opensc/patches/0018-Move-declaration-to-top-of-block.patch @@ -8,11 +8,11 @@ Subject: [PATCH 18/26] Move declaration to top of block. src/libopensc/card-openpgp.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) -diff --git a/src/libopensc/card-openpgp.c b/src/libopensc/card-openpgp.c -index ca0d01b..037ef73 100644 ---- a/src/libopensc/card-openpgp.c -+++ b/src/libopensc/card-openpgp.c -@@ -738,6 +738,7 @@ pgp_read_blob(sc_card_t *card, struct blob *blob) +Index: opensc-20150513/src/libopensc/card-openpgp.c +=================================================================== +--- opensc-20150513.orig/src/libopensc/card-openpgp.c ++++ opensc-20150513/src/libopensc/card-openpgp.c +@@ -746,6 +746,7 @@ pgp_read_blob(sc_card_t *card, struct bl u8 buffer[2048]; size_t buf_len = (card->caps & SC_CARD_CAP_APDU_EXT) ? sizeof(buffer) : 256; @@ -20,7 +20,7 @@ index ca0d01b..037ef73 100644 /* Buffer length for certificate */ if (blob->id == DO_CERT && priv->max_cert_size > 0) { -@@ -751,7 +752,7 @@ pgp_read_blob(sc_card_t *card, struct blob *blob) +@@ -759,7 +760,7 @@ pgp_read_blob(sc_card_t *card, struct bl buf_len = MAXLEN_RESP_PUBKEY_GNUK; } @@ -29,6 +29,3 @@ index ca0d01b..037ef73 100644 if (r < 0) { /* an error occurred */ blob->status = r; --- -2.1.3 - diff --git a/utils/opensc/patches/0019-OpenPGP-Make-indentation-consistent-space-tab.patch b/utils/opensc/patches/0019-OpenPGP-Make-indentation-consistent-space-tab.patch index 3702d61be..6130fa451 100644 --- a/utils/opensc/patches/0019-OpenPGP-Make-indentation-consistent-space-tab.patch +++ b/utils/opensc/patches/0019-OpenPGP-Make-indentation-consistent-space-tab.patch @@ -9,11 +9,11 @@ Subject: [PATCH 19/26] OpenPGP: Make indentation consistent (space -> tab). src/tools/openpgp-tool.c | 56 ++++++++++++++++++++++---------------------- 2 files changed, 39 insertions(+), 39 deletions(-) -diff --git a/src/libopensc/card-openpgp.c b/src/libopensc/card-openpgp.c -index 037ef73..ae40940 100644 ---- a/src/libopensc/card-openpgp.c -+++ b/src/libopensc/card-openpgp.c -@@ -192,12 +192,12 @@ static struct do_info pgp1_objects[] = { /* OpenPGP card spec 1.1 */ +Index: opensc-20150513/src/libopensc/card-openpgp.c +=================================================================== +--- opensc-20150513.orig/src/libopensc/card-openpgp.c ++++ opensc-20150513/src/libopensc/card-openpgp.c +@@ -194,12 +194,12 @@ static struct do_info pgp1_objects[] = { 0x5f35, SIMPLE, READ_ALWAYS | WRITE_PIN3, NULL, sc_put_data }, { 0x5f50, SIMPLE, READ_ALWAYS | WRITE_PIN3, sc_get_data, sc_put_data }, { 0x7f49, CONSTRUCTED, READ_ALWAYS | WRITE_NEVER, NULL, NULL }, @@ -32,7 +32,7 @@ index 037ef73..ae40940 100644 { 0, 0, 0, NULL, NULL }, }; -@@ -253,11 +253,11 @@ static struct do_info pgp2_objects[] = { /* OpenPGP card spec 2.0 */ +@@ -255,11 +255,11 @@ static struct do_info pgp2_objects[] = /* The 0xA401, 0xB601, 0xB801 are just symbolic, it does not represent any real DO. * However, their R/W access condition may block the process of importing key in pkcs15init. * So we set their accesses condition as WRITE_PIN3 (writable). */ @@ -49,10 +49,10 @@ index 037ef73..ae40940 100644 { 0, 0, 0, NULL, NULL }, }; -diff --git a/src/tools/openpgp-tool.c b/src/tools/openpgp-tool.c -index 374819a..a0334ca 100644 ---- a/src/tools/openpgp-tool.c -+++ b/src/tools/openpgp-tool.c +Index: opensc-20150513/src/tools/openpgp-tool.c +=================================================================== +--- opensc-20150513.orig/src/tools/openpgp-tool.c ++++ opensc-20150513/src/tools/openpgp-tool.c @@ -37,11 +37,11 @@ #include "util.h" #include "libopensc/log.h" @@ -70,7 +70,7 @@ index 374819a..a0334ca 100644 /* define structures */ struct ef_name_map { -@@ -142,10 +142,10 @@ static const struct ef_name_map openpgp_data[] = { +@@ -142,10 +142,10 @@ static const struct ef_name_map openpgp_ static void show_version(void) { fprintf(stderr, @@ -85,7 +85,7 @@ index 374819a..a0334ca 100644 } -@@ -176,16 +176,16 @@ static char *prettify_language(char *str) +@@ -176,16 +176,16 @@ static char *prettify_language(char *str { if (str != NULL) { switch (strlen(str)) { @@ -121,7 +121,7 @@ index 374819a..a0334ca 100644 } } return NULL; -@@ -218,7 +218,7 @@ static void display_data(const struct ef_name_map *mapping, char *value) +@@ -218,7 +218,7 @@ static void display_data(const struct ef char *envvar; envvar = malloc(strlen(mapping->env_name) + @@ -130,7 +130,7 @@ index 374819a..a0334ca 100644 if (envvar != NULL) { strcpy(envvar, mapping->env_name); strcat(envvar, "="); -@@ -346,20 +346,20 @@ static int do_userinfo(sc_card_t *card) +@@ -344,20 +344,20 @@ static int do_userinfo(sc_card_t *card) if (!count) continue; @@ -177,6 +177,3 @@ index 374819a..a0334ca 100644 return EXIT_FAILURE; } --- -2.1.3 - diff --git a/utils/opensc/patches/0020-OpenPGP-Don-t-use-sc_log-in-openpgp-tool.patch b/utils/opensc/patches/0020-OpenPGP-Don-t-use-sc_log-in-openpgp-tool.patch index b73826fa2..dbd7bc0dc 100644 --- a/utils/opensc/patches/0020-OpenPGP-Don-t-use-sc_log-in-openpgp-tool.patch +++ b/utils/opensc/patches/0020-OpenPGP-Don-t-use-sc_log-in-openpgp-tool.patch @@ -8,11 +8,11 @@ Subject: [PATCH 20/26] OpenPGP: Don't use sc_log in openpgp-tool. src/tools/openpgp-tool.c | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) -diff --git a/src/tools/openpgp-tool.c b/src/tools/openpgp-tool.c -index a0334ca..505abd9 100644 ---- a/src/tools/openpgp-tool.c -+++ b/src/tools/openpgp-tool.c -@@ -414,8 +414,6 @@ int do_genkey(sc_card_t *card, u8 key_id, unsigned int key_len) +Index: opensc-20150513/src/tools/openpgp-tool.c +=================================================================== +--- opensc-20150513.orig/src/tools/openpgp-tool.c ++++ opensc-20150513/src/tools/openpgp-tool.c +@@ -414,8 +414,6 @@ int do_genkey(sc_card_t *card, u8 key_id sc_path_t path; sc_file_t *file; @@ -21,7 +21,7 @@ index a0334ca..505abd9 100644 if (key_id < 1 || key_id > 3) { printf("Unknown key ID %d.\n", key_id); return 1; -@@ -479,14 +477,14 @@ int delete_key_gnuk(sc_card_t *card, u8 key_id) +@@ -479,14 +477,14 @@ int delete_key_gnuk(sc_card_t *card, u8 u8 *data = NULL; /* Delete fingerprint */ @@ -39,7 +39,7 @@ index a0334ca..505abd9 100644 if (key_id == 1) data = "\x4D\x02\xB6"; -@@ -534,15 +532,18 @@ int delete_key_openpgp(sc_card_t *card, u8 key_id) +@@ -534,15 +532,18 @@ int delete_key_openpgp(sc_card_t *card, /* Build APDU from binary array */ r = sc_bytes2apdu(card->ctx, buf, len0, &apdu); if (r) { @@ -61,7 +61,7 @@ index a0334ca..505abd9 100644 } /* TODO: Rewrite Extended Header List. * Not support by OpenGPG v2 yet */ -@@ -557,7 +558,7 @@ int delete_key(sc_card_t *card, u8 key_id) +@@ -557,7 +558,7 @@ int delete_key(sc_card_t *card, u8 key_i LOG_FUNC_CALLED(ctx); /* Check key ID */ if (key_id < 1 || key_id > 3) { @@ -79,6 +79,3 @@ index a0334ca..505abd9 100644 exit_status = EXIT_FAILURE; goto out; } --- -2.1.3 - diff --git a/utils/opensc/patches/0021-OpenPGP-Don-t-reimplement-gnuk_delete_key-in-openpgp.patch b/utils/opensc/patches/0021-OpenPGP-Don-t-reimplement-gnuk_delete_key-in-openpgp.patch index dc8fe8499..c84ef8e97 100644 --- a/utils/opensc/patches/0021-OpenPGP-Don-t-reimplement-gnuk_delete_key-in-openpgp.patch +++ b/utils/opensc/patches/0021-OpenPGP-Don-t-reimplement-gnuk_delete_key-in-openpgp.patch @@ -9,11 +9,11 @@ Subject: [PATCH 21/26] OpenPGP: Don't reimplement gnuk_delete_key in src/tools/openpgp-tool.c | 64 ++++++------------------------------------------ 1 file changed, 8 insertions(+), 56 deletions(-) -diff --git a/src/tools/openpgp-tool.c b/src/tools/openpgp-tool.c -index 505abd9..a7796e7 100644 ---- a/src/tools/openpgp-tool.c -+++ b/src/tools/openpgp-tool.c -@@ -468,38 +468,6 @@ int do_verify(sc_card_t *card, char *type, char *pin) +Index: opensc-20150513/src/tools/openpgp-tool.c +=================================================================== +--- opensc-20150513.orig/src/tools/openpgp-tool.c ++++ opensc-20150513/src/tools/openpgp-tool.c +@@ -468,38 +468,6 @@ int do_verify(sc_card_t *card, char *typ } /** @@ -52,7 +52,7 @@ index 505abd9..a7796e7 100644 * Delete key, for OpenPGP card. * This function is not complete and is reserved for future version (> 2) of OpenPGP card. **/ -@@ -547,32 +515,13 @@ int delete_key_openpgp(sc_card_t *card, u8 key_id) +@@ -547,32 +515,13 @@ int delete_key_openpgp(sc_card_t *card, } /* TODO: Rewrite Extended Header List. * Not support by OpenGPG v2 yet */ @@ -87,7 +87,7 @@ index 505abd9..a7796e7 100644 int r = SC_SUCCESS; /* Currently, only Gnuk supports deleting keys */ -@@ -586,13 +535,16 @@ int do_delete_key(sc_card_t *card, u8 key_id) +@@ -586,13 +535,16 @@ int do_delete_key(sc_card_t *card, u8 ke return SC_ERROR_INVALID_ARGUMENTS; } if (key_id == 1 || key_id == 'a') { @@ -107,6 +107,3 @@ index 505abd9..a7796e7 100644 } return r; } --- -2.1.3 - diff --git a/utils/opensc/patches/0022-OpenPGP-Use-directly-binary-array-of-APDUs-for-ERASE.patch b/utils/opensc/patches/0022-OpenPGP-Use-directly-binary-array-of-APDUs-for-ERASE.patch index 6297783ec..20c66effe 100644 --- a/utils/opensc/patches/0022-OpenPGP-Use-directly-binary-array-of-APDUs-for-ERASE.patch +++ b/utils/opensc/patches/0022-OpenPGP-Use-directly-binary-array-of-APDUs-for-ERASE.patch @@ -10,11 +10,11 @@ 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(-) -diff --git a/src/libopensc/card-openpgp.c b/src/libopensc/card-openpgp.c -index ae40940..724fe73 100644 ---- a/src/libopensc/card-openpgp.c -+++ b/src/libopensc/card-openpgp.c -@@ -2347,24 +2347,27 @@ out: +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; @@ -56,7 +56,7 @@ index ae40940..724fe73 100644 LOG_FUNC_CALLED(ctx); -@@ -2376,17 +2379,17 @@ static int pgp_erase_card(sc_card_t *card) +@@ -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 */ @@ -82,6 +82,3 @@ index ae40940..724fe73 100644 if (r) { sc_log(ctx, "Failed to build APDU"); LOG_FUNC_RETURN(ctx, SC_ERROR_INTERNAL); --- -2.1.3 - diff --git a/utils/opensc/patches/0023-OpenPGP-Rename-private-blob-type-to-avoid-confusing-.patch b/utils/opensc/patches/0023-OpenPGP-Rename-private-blob-type-to-avoid-confusing-.patch index f859f7cf1..1eedf5fd6 100644 --- a/utils/opensc/patches/0023-OpenPGP-Rename-private-blob-type-to-avoid-confusing-.patch +++ b/utils/opensc/patches/0023-OpenPGP-Rename-private-blob-type-to-avoid-confusing-.patch @@ -11,11 +11,11 @@ type. src/libopensc/card-openpgp.c | 96 ++++++++++++++++++++++---------------------- 1 file changed, 49 insertions(+), 47 deletions(-) -diff --git a/src/libopensc/card-openpgp.c b/src/libopensc/card-openpgp.c -index 724fe73..ca3173c 100644 ---- a/src/libopensc/card-openpgp.c -+++ b/src/libopensc/card-openpgp.c -@@ -111,9 +111,9 @@ enum _card_state { +Index: opensc-20150513/src/libopensc/card-openpgp.c +=================================================================== +--- opensc-20150513.orig/src/libopensc/card-openpgp.c ++++ opensc-20150513/src/libopensc/card-openpgp.c +@@ -113,9 +113,9 @@ enum _card_state { CARD_STATE_ACTIVATED = 0x05 }; @@ -28,7 +28,7 @@ index 724fe73..ca3173c 100644 struct do_info *info; sc_file_t * file; -@@ -122,8 +122,8 @@ struct blob { +@@ -124,8 +124,8 @@ struct blob { unsigned char * data; unsigned int len; @@ -39,7 +39,7 @@ index 724fe73..ca3173c 100644 struct do_info { unsigned int id; /* ID of the DO in question */ -@@ -141,12 +141,12 @@ struct do_info { +@@ -143,12 +143,12 @@ struct do_info { static int pgp_get_card_features(sc_card_t *card); static int pgp_finish(sc_card_t *card); @@ -57,7 +57,7 @@ index 724fe73..ca3173c 100644 static int pgp_get_pubkey(sc_card_t *, unsigned int, u8 *, size_t); static int pgp_get_pubkey_pem(sc_card_t *, unsigned int, -@@ -272,8 +272,8 @@ static struct do_info pgp2_objects[] = { /* OpenPGP card spec 2.0 */ +@@ -274,8 +274,8 @@ static struct do_info pgp2_objects[] = #define DRVDATA(card) ((struct pgp_priv_data *) ((card)->drv_data)) struct pgp_priv_data { @@ -68,16 +68,16 @@ index 724fe73..ca3173c 100644 enum _version bcd_version; struct do_info *pgp_objects; -@@ -311,7 +311,7 @@ pgp_init(sc_card_t *card) +@@ -313,7 +313,7 @@ pgp_init(sc_card_t *card) sc_file_t *file = NULL; struct do_info *info; int r; -- struct blob *child = NULL; -+ pgp_blob_t *child = NULL; +- struct blob *child = NULL; ++ pgp_blob_t *child = NULL; LOG_FUNC_CALLED(card->ctx); -@@ -389,7 +389,7 @@ pgp_get_card_features(sc_card_t *card) +@@ -397,7 +397,7 @@ pgp_get_card_features(sc_card_t *card) unsigned char *hist_bytes = card->atr.value; size_t atr_len = card->atr.len; size_t i = 0; @@ -86,7 +86,7 @@ index 724fe73..ca3173c 100644 /* parse card capabilities from historical bytes */ while ((i < atr_len) && (hist_bytes[i] != 0x73)) -@@ -526,7 +526,7 @@ pgp_finish(sc_card_t *card) +@@ -534,7 +534,7 @@ pgp_finish(sc_card_t *card) /* internal: fill a blob's data */ static int @@ -95,7 +95,7 @@ index 724fe73..ca3173c 100644 { if (blob->data) free(blob->data); -@@ -620,16 +620,16 @@ pgp_attach_acl(sc_card_t *card, sc_file_t *file, struct do_info *info) +@@ -628,16 +628,16 @@ pgp_attach_acl(sc_card_t *card, sc_file_ } /* internal: append a blob to the list of children of a given parent blob */ @@ -116,7 +116,7 @@ index 724fe73..ca3173c 100644 struct pgp_priv_data *priv = DRVDATA (card); struct do_info *info; -@@ -643,7 +643,7 @@ pgp_new_blob(sc_card_t *card, struct blob *parent, unsigned int file_id, +@@ -651,7 +651,7 @@ pgp_new_blob(sc_card_t *card, struct blo blob->parent = parent; if (parent != NULL) { @@ -125,7 +125,7 @@ index 724fe73..ca3173c 100644 /* set file's path = parent's path + file's id */ blob->file->path = parent->file->path; -@@ -681,11 +681,11 @@ pgp_new_blob(sc_card_t *card, struct blob *parent, unsigned int file_id, +@@ -689,11 +689,11 @@ pgp_new_blob(sc_card_t *card, struct blo /* internal: free a blob including its content */ static void @@ -139,7 +139,7 @@ index 724fe73..ca3173c 100644 /* remove blob from list of parent's children */ for (p = &blob->parent->files; *p != NULL && *p != blob; p = &(*p)->next) -@@ -705,14 +705,14 @@ pgp_free_blob(struct blob *blob) +@@ -713,14 +713,14 @@ pgp_free_blob(struct blob *blob) /* internal: iterate through the blob tree, calling a function for each blob */ static void @@ -157,7 +157,7 @@ index 724fe73..ca3173c 100644 pgp_iterate_blobs(child, level-1, func); child = next; -@@ -725,7 +725,7 @@ pgp_iterate_blobs(struct blob *blob, int level, void (*func)()) +@@ -733,7 +733,7 @@ pgp_iterate_blobs(struct blob *blob, int /* internal: read a blob's contents from card */ static int @@ -166,7 +166,7 @@ index 724fe73..ca3173c 100644 { struct pgp_priv_data *priv = DRVDATA (card); -@@ -772,7 +772,7 @@ pgp_read_blob(sc_card_t *card, struct blob *blob) +@@ -780,7 +780,7 @@ pgp_read_blob(sc_card_t *card, struct bl * The OpenPGP card has a TLV encoding according ASN.1 BER-encoding rules. */ static int @@ -175,7 +175,7 @@ index 724fe73..ca3173c 100644 { const u8 *in; int r; -@@ -789,7 +789,7 @@ pgp_enumerate_blob(sc_card_t *card, struct blob *blob) +@@ -797,7 +797,7 @@ pgp_enumerate_blob(sc_card_t *card, stru unsigned int cla, tag, tmptag; size_t len; const u8 *data = in; @@ -184,7 +184,7 @@ index 724fe73..ca3173c 100644 r = sc_asn1_read_tag(&data, blob->len - (in - blob->data), &cla, &tag, &len); -@@ -819,10 +819,10 @@ pgp_enumerate_blob(sc_card_t *card, struct blob *blob) +@@ -827,10 +827,10 @@ pgp_enumerate_blob(sc_card_t *card, stru /* internal: find a blob by ID below a given parent, filling its contents when necessary */ static int @@ -198,7 +198,7 @@ index 724fe73..ca3173c 100644 int r; if ((r = pgp_enumerate_blob(card, blob)) < 0) -@@ -858,10 +858,10 @@ pgp_get_blob(sc_card_t *card, struct blob *blob, unsigned int id, +@@ -866,10 +866,10 @@ pgp_get_blob(sc_card_t *card, struct blo /* Internal: search recursively for a blob by ID below a given root */ static int @@ -212,7 +212,7 @@ index 724fe73..ca3173c 100644 int r; if ((r = pgp_get_blob(card, root, id, ret)) == 0) -@@ -883,11 +883,11 @@ pgp_seek_blob(sc_card_t *card, struct blob *root, unsigned int id, +@@ -891,11 +891,11 @@ pgp_seek_blob(sc_card_t *card, struct bl } /* internal: find a blob by tag - pgp_seek_blob with optimizations */ @@ -226,7 +226,7 @@ index 724fe73..ca3173c 100644 int r; /* Check if current selected blob is which we want to test*/ -@@ -941,7 +941,7 @@ static int +@@ -949,7 +949,7 @@ static int pgp_select_file(sc_card_t *card, const sc_path_t *path, sc_file_t **ret) { struct pgp_priv_data *priv = DRVDATA(card); @@ -235,7 +235,7 @@ index 724fe73..ca3173c 100644 unsigned int path_start = 0; unsigned int n; sc_path_t dummy_path; -@@ -1022,7 +1022,7 @@ static int +@@ -1030,7 +1030,7 @@ static int pgp_list_files(sc_card_t *card, u8 *buf, size_t buflen) { struct pgp_priv_data *priv = DRVDATA(card); @@ -244,7 +244,7 @@ index 724fe73..ca3173c 100644 unsigned int k; int r; -@@ -1058,7 +1058,7 @@ pgp_read_binary(sc_card_t *card, unsigned int idx, +@@ -1066,7 +1066,7 @@ pgp_read_binary(sc_card_t *card, unsigne u8 *buf, size_t count, unsigned long flags) { struct pgp_priv_data *priv = DRVDATA(card); @@ -253,7 +253,7 @@ index 724fe73..ca3173c 100644 int r; LOG_FUNC_CALLED(card->ctx); -@@ -1134,7 +1134,7 @@ static int +@@ -1142,7 +1142,7 @@ static int pgp_get_pubkey_pem(sc_card_t *card, unsigned int tag, u8 *buf, size_t buf_len) { struct pgp_priv_data *priv = DRVDATA(card); @@ -262,7 +262,7 @@ index 724fe73..ca3173c 100644 sc_pkcs15_pubkey_t pubkey; u8 *data; size_t len; -@@ -1329,7 +1329,7 @@ static int +@@ -1337,7 +1337,7 @@ static int pgp_put_data(sc_card_t *card, unsigned int tag, const u8 *buf, size_t buf_len) { struct pgp_priv_data *priv = DRVDATA(card); @@ -271,7 +271,7 @@ index 724fe73..ca3173c 100644 struct do_info *dinfo = NULL; int r; -@@ -1603,7 +1603,7 @@ static int +@@ -1611,7 +1611,7 @@ static int pgp_update_new_algo_attr(sc_card_t *card, sc_cardctl_openpgp_keygen_info_t *key_info) { struct pgp_priv_data *priv = DRVDATA(card); @@ -280,7 +280,7 @@ index 724fe73..ca3173c 100644 unsigned int old_modulus_len; /* Measured in bit */ unsigned int old_exponent_len; const unsigned int tag = 0x00C0 | key_info->keytype; -@@ -1708,7 +1708,7 @@ pgp_calculate_and_store_fingerprint(sc_card_t *card, time_t ctime, +@@ -1716,7 +1716,7 @@ pgp_calculate_and_store_fingerprint(sc_c u8 *p; /* Use this pointer to set fp_buffer content */ size_t pk_packet_len; unsigned int tag; @@ -289,7 +289,7 @@ index 724fe73..ca3173c 100644 u8 *newdata; int r; -@@ -1797,7 +1797,7 @@ pgp_update_pubkey_blob(sc_card_t *card, u8* modulus, size_t modulus_len, +@@ -1805,7 +1805,7 @@ pgp_update_pubkey_blob(sc_card_t *card, u8* exponent, size_t exponent_len, u8 key_id) { struct pgp_priv_data *priv = DRVDATA(card); @@ -298,7 +298,7 @@ index 724fe73..ca3173c 100644 unsigned int blob_id; sc_pkcs15_pubkey_t pubkey; u8 *data = NULL; -@@ -1939,6 +1939,8 @@ static int pgp_update_card_algorithms(sc_card_t *card, sc_cardctl_openpgp_keygen +@@ -1947,6 +1947,8 @@ static int pgp_update_card_algorithms(sc **/ static int pgp_gen_key(sc_card_t *card, sc_cardctl_openpgp_keygen_info_t *key_info) { @@ -307,7 +307,7 @@ index 724fe73..ca3173c 100644 sc_apdu_t apdu; /* Temporary variables to hold APDU params */ u8 apdu_case; -@@ -2132,7 +2134,7 @@ pgp_build_extended_header_list(sc_card_t *card, sc_cardctl_openpgp_keystore_info +@@ -2143,7 +2145,7 @@ pgp_build_extended_header_list(sc_card_t }; size_t comp_to_add = 3; size_t req_e_len = 0; /* The exponent length specified in Algorithm Attributes */ @@ -316,7 +316,7 @@ index 724fe73..ca3173c 100644 u8 i; int r; -@@ -2483,7 +2485,7 @@ static int +@@ -2496,7 +2498,7 @@ static int pgp_delete_file(sc_card_t *card, const sc_path_t *path) { struct pgp_priv_data *priv = DRVDATA(card); @@ -325,7 +325,7 @@ index 724fe73..ca3173c 100644 sc_file_t *file; u8 key_id; int r; -@@ -2533,7 +2535,7 @@ pgp_update_binary(sc_card_t *card, unsigned int idx, +@@ -2546,7 +2548,7 @@ pgp_update_binary(sc_card_t *card, unsig const u8 *buf, size_t count, unsigned long flags) { struct pgp_priv_data *priv = DRVDATA(card); @@ -334,6 +334,3 @@ index 724fe73..ca3173c 100644 int r = SC_SUCCESS; LOG_FUNC_CALLED(card->ctx); --- -2.1.3 - diff --git a/utils/opensc/patches/0024-OpenPGP-Fix-crash-after-accessing-inexistent-file.patch b/utils/opensc/patches/0024-OpenPGP-Fix-crash-after-accessing-inexistent-file.patch index 7d8a0ffc1..22ae5f43f 100644 --- a/utils/opensc/patches/0024-OpenPGP-Fix-crash-after-accessing-inexistent-file.patch +++ b/utils/opensc/patches/0024-OpenPGP-Fix-crash-after-accessing-inexistent-file.patch @@ -8,11 +8,11 @@ Subject: [PATCH 24/26] OpenPGP: Fix crash after accessing inexistent file. src/libopensc/card-openpgp.c | 3 --- 1 file changed, 3 deletions(-) -diff --git a/src/libopensc/card-openpgp.c b/src/libopensc/card-openpgp.c -index ca3173c..94c69ae 100644 ---- a/src/libopensc/card-openpgp.c -+++ b/src/libopensc/card-openpgp.c -@@ -973,7 +973,6 @@ pgp_select_file(sc_card_t *card, const sc_path_t *path, sc_file_t **ret) +Index: opensc-20150513/src/libopensc/card-openpgp.c +=================================================================== +--- opensc-20150513.orig/src/libopensc/card-openpgp.c ++++ opensc-20150513/src/libopensc/card-openpgp.c +@@ -981,7 +981,6 @@ pgp_select_file(sc_card_t *card, const s * So we set its size to be the same as max certificate size the card supports. */ (*ret)->size = priv->max_cert_size; } @@ -20,7 +20,7 @@ index ca3173c..94c69ae 100644 LOG_FUNC_RETURN(card->ctx, SC_SUCCESS); } -@@ -990,7 +989,6 @@ pgp_select_file(sc_card_t *card, const sc_path_t *path, sc_file_t **ret) +@@ -998,7 +997,6 @@ pgp_select_file(sc_card_t *card, const s /* This file ID is refered when importing key&certificate via pkcs15init, like above. * We pretend to successfully find this inexistent file. */ if (id == 0x4402 || id == 0x5f48) { @@ -28,7 +28,7 @@ index ca3173c..94c69ae 100644 if (ret == NULL) /* No need to return file */ LOG_FUNC_RETURN(card->ctx, SC_SUCCESS); -@@ -1002,7 +1000,6 @@ pgp_select_file(sc_card_t *card, const sc_path_t *path, sc_file_t **ret) +@@ -1010,7 +1008,6 @@ pgp_select_file(sc_card_t *card, const s } if (r < 0) { /* failure */ @@ -36,6 +36,3 @@ index ca3173c..94c69ae 100644 LOG_FUNC_RETURN(card->ctx, r); } } --- -2.1.3 - diff --git a/utils/opensc/patches/0025-Replace-hardcode.patch b/utils/opensc/patches/0025-Replace-hardcode.patch index 0eb750c34..002bec3d9 100644 --- a/utils/opensc/patches/0025-Replace-hardcode.patch +++ b/utils/opensc/patches/0025-Replace-hardcode.patch @@ -8,11 +8,11 @@ Subject: [PATCH 25/26] Replace hardcode. src/libopensc/card-openpgp.c | 72 +++++++++++++++++++++++++------------------- 1 file changed, 41 insertions(+), 31 deletions(-) -diff --git a/src/libopensc/card-openpgp.c b/src/libopensc/card-openpgp.c -index 94c69ae..1e6e338 100644 ---- a/src/libopensc/card-openpgp.c -+++ b/src/libopensc/card-openpgp.c -@@ -152,6 +152,24 @@ static int pgp_get_pubkey(sc_card_t *, unsigned int, +Index: opensc-20150513/src/libopensc/card-openpgp.c +=================================================================== +--- opensc-20150513.orig/src/libopensc/card-openpgp.c ++++ opensc-20150513/src/libopensc/card-openpgp.c +@@ -154,6 +154,24 @@ static int pgp_get_pubkey(sc_card_t *, static int pgp_get_pubkey_pem(sc_card_t *, unsigned int, u8 *, size_t); @@ -37,7 +37,7 @@ index 94c69ae..1e6e338 100644 static struct do_info pgp1_objects[] = { /* OpenPGP card spec 1.1 */ { 0x004f, SIMPLE, READ_ALWAYS | WRITE_NEVER, NULL, NULL }, { 0x005b, SIMPLE, READ_ALWAYS | WRITE_PIN3, NULL, sc_put_data }, -@@ -192,12 +210,12 @@ static struct do_info pgp1_objects[] = { /* OpenPGP card spec 1.1 */ +@@ -194,12 +212,12 @@ static struct do_info pgp1_objects[] = { 0x5f35, SIMPLE, READ_ALWAYS | WRITE_PIN3, NULL, sc_put_data }, { 0x5f50, SIMPLE, READ_ALWAYS | WRITE_PIN3, sc_get_data, sc_put_data }, { 0x7f49, CONSTRUCTED, READ_ALWAYS | WRITE_NEVER, NULL, NULL }, @@ -56,7 +56,7 @@ index 94c69ae..1e6e338 100644 { 0, 0, 0, NULL, NULL }, }; -@@ -246,30 +264,21 @@ static struct do_info pgp2_objects[] = { /* OpenPGP card spec 2.0 */ +@@ -248,30 +266,21 @@ static struct do_info pgp2_objects[] = { 0x5f52, SIMPLE, READ_ALWAYS | WRITE_NEVER, sc_get_data, NULL }, /* The 7F21 is constructed DO in spec, but in practice, its content can be retrieved * as simple DO (no need to parse TLV). */ @@ -94,7 +94,7 @@ index 94c69ae..1e6e338 100644 #define DRVDATA(card) ((struct pgp_priv_data *) ((card)->drv_data)) struct pgp_priv_data { pgp_blob_t * mf; -@@ -747,8 +756,9 @@ pgp_read_blob(sc_card_t *card, pgp_blob_t *blob) +@@ -755,8 +764,9 @@ pgp_read_blob(sc_card_t *card, pgp_blob_ /* Buffer length for Gnuk pubkey */ if (card->type == SC_CARD_TYPE_OPENPGP_GNUK && @@ -106,7 +106,7 @@ index 94c69ae..1e6e338 100644 buf_len = MAXLEN_RESP_PUBKEY_GNUK; } -@@ -1804,11 +1814,11 @@ pgp_update_pubkey_blob(sc_card_t *card, u8* modulus, size_t modulus_len, +@@ -1812,11 +1822,11 @@ pgp_update_pubkey_blob(sc_card_t *card, LOG_FUNC_CALLED(card->ctx); if (key_id == SC_OPENPGP_KEY_SIGN) @@ -121,7 +121,7 @@ index 94c69ae..1e6e338 100644 else { sc_log(card->ctx, "Unknown key id %X.", key_id); LOG_FUNC_RETURN(card->ctx, SC_ERROR_INVALID_ARGUMENTS); -@@ -2501,17 +2511,17 @@ pgp_delete_file(sc_card_t *card, const sc_path_t *path) +@@ -2514,17 +2524,17 @@ pgp_delete_file(sc_card_t *card, const s LOG_FUNC_RETURN(card->ctx, SC_ERROR_NOT_SUPPORTED); if (card->type != SC_CARD_TYPE_OPENPGP_GNUK && @@ -143,6 +143,3 @@ index 94c69ae..1e6e338 100644 r = gnuk_delete_key(card, 3); } else { --- -2.1.3 - diff --git a/utils/opensc/patches/0026-hardcode-defines-for-DO-s.patch b/utils/opensc/patches/0026-hardcode-defines-for-DO-s.patch index d106e868c..6931aa64a 100644 --- a/utils/opensc/patches/0026-hardcode-defines-for-DO-s.patch +++ b/utils/opensc/patches/0026-hardcode-defines-for-DO-s.patch @@ -7,11 +7,11 @@ Subject: [PATCH 26/26] hardcode->defines for DO's src/libopensc/card-openpgp.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) -diff --git a/src/libopensc/card-openpgp.c b/src/libopensc/card-openpgp.c -index 1e6e338..8464914 100644 ---- a/src/libopensc/card-openpgp.c -+++ b/src/libopensc/card-openpgp.c -@@ -164,6 +164,18 @@ static int pgp_get_pubkey_pem(sc_card_t *, unsigned int, +Index: opensc-20150513/src/libopensc/card-openpgp.c +=================================================================== +--- opensc-20150513.orig/src/libopensc/card-openpgp.c ++++ opensc-20150513/src/libopensc/card-openpgp.c +@@ -166,6 +166,18 @@ static int pgp_get_pubkey_pem(sc_card_t #define DO_SIGN_SYM 0xb601 #define DO_ENCR_SYM 0xb801 #define DO_AUTH_SYM 0xa401 @@ -30,7 +30,7 @@ index 1e6e338..8464914 100644 /* Maximum length for response buffer when reading pubkey. This value is calculated with * 4096-bit key length */ #define MAXLEN_RESP_PUBKEY 527 -@@ -851,7 +863,7 @@ pgp_get_blob(sc_card_t *card, pgp_blob_t *blob, unsigned int id, +@@ -859,7 +871,7 @@ pgp_get_blob(sc_card_t *card, pgp_blob_t /* Special case: * Gnuk does not have default value for children of DO 65 (DOs 5B, 5F2D, 5F35) * So, if these blob was not found, we create it. */ @@ -39,7 +39,7 @@ index 1e6e338..8464914 100644 sc_log(card->ctx, "Create blob %X under %X", id, blob->id); child = pgp_new_blob(card, blob, id, sc_file_new()); if (child) { -@@ -1198,7 +1210,7 @@ pgp_get_data(sc_card_t *card, unsigned int tag, u8 *buf, size_t buf_len) +@@ -1206,7 +1218,7 @@ pgp_get_data(sc_card_t *card, unsigned i /* For Gnuk card, if there is no certificate, it returns error instead of empty data. * So, for this case, we ignore error and consider success */ if (r == SC_ERROR_DATA_OBJECT_NOT_FOUND && card->type == SC_CARD_TYPE_OPENPGP_GNUK @@ -48,6 +48,3 @@ index 1e6e338..8464914 100644 r = SC_SUCCESS; apdu.resplen = 0; } --- -2.1.3 - diff --git a/utils/opensc/patches/0027-OpenPGP-Remove-unused-variables-and-fix-type-cast.patch b/utils/opensc/patches/0027-OpenPGP-Remove-unused-variables-and-fix-type-cast.patch new file mode 100644 index 000000000..742f76ac9 --- /dev/null +++ b/utils/opensc/patches/0027-OpenPGP-Remove-unused-variables-and-fix-type-cast.patch @@ -0,0 +1,82 @@ +From 99b5cb53e1da2f0d7692f28dceff8485d4b74daf Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Nguy=E1=BB=85n=20H=E1=BB=93ng=20Qu=C3=A2n?= + +Date: Wed, 10 Dec 2014 03:59:54 +0800 +Subject: [PATCH 1/2] OpenPGP: Remove unused variables and fix type cast. + +--- + src/libopensc/card-openpgp.c | 10 +++------- + src/tools/openpgp-tool.c | 4 +--- + 2 files changed, 4 insertions(+), 10 deletions(-) + +Index: opensc-20150513/src/libopensc/card-openpgp.c +=================================================================== +--- opensc-20150513.orig/src/libopensc/card-openpgp.c ++++ opensc-20150513/src/libopensc/card-openpgp.c +@@ -1966,8 +1966,6 @@ static int pgp_update_card_algorithms(sc + **/ + static int pgp_gen_key(sc_card_t *card, sc_cardctl_openpgp_keygen_info_t *key_info) + { +- struct pgp_priv_data *priv = DRVDATA(card); +- pgp_blob_t *algo_blob; + sc_apdu_t apdu; + /* Temporary variables to hold APDU params */ + u8 apdu_case; +@@ -2396,10 +2394,9 @@ static int pgp_erase_card(sc_card_t *car + {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; +- int i, l, r; ++ u8 i, l, r; + + LOG_FUNC_CALLED(ctx); + +@@ -2478,7 +2475,7 @@ gnuk_delete_key(sc_card_t *card, u8 key_ + { + sc_context_t *ctx = card->ctx; + int r = SC_SUCCESS; +- u8 *data = NULL; ++ char *data = NULL; + + LOG_FUNC_CALLED(ctx); + +@@ -2506,7 +2503,7 @@ gnuk_delete_key(sc_card_t *card, u8 key_ + else if (key_id == 3) + data = "\x4D\x02\xA4"; + +- r = pgp_put_data(card, 0x4D, data, strlen(data) + 1); ++ r = pgp_put_data(card, 0x4D, (const u8 *)data, strlen((const char *)data) + 1); + + LOG_FUNC_RETURN(ctx, r); + } +@@ -2519,7 +2516,6 @@ pgp_delete_file(sc_card_t *card, const s + struct pgp_priv_data *priv = DRVDATA(card); + pgp_blob_t *blob; + sc_file_t *file; +- u8 key_id; + int r; + + LOG_FUNC_CALLED(card->ctx); +Index: opensc-20150513/src/tools/openpgp-tool.c +=================================================================== +--- opensc-20150513.orig/src/tools/openpgp-tool.c ++++ opensc-20150513/src/tools/openpgp-tool.c +@@ -473,7 +473,6 @@ int do_verify(sc_card_t *card, char *typ + **/ + int delete_key_openpgp(sc_card_t *card, u8 key_id) + { +- sc_context_t *ctx = card->ctx; + char *del_fingerprint = "00:DA:00:C6:14:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00"; + char *del_creationtime = "00:DA:00:CD:04:00:00:00:00"; + /* We need to replace the 4th byte later */ +@@ -520,7 +519,6 @@ int delete_key_openpgp(sc_card_t *card, + + int do_delete_key(sc_card_t *card, u8 key_id) + { +- sc_context_t *ctx = card->ctx; + sc_path_t path; + int r = SC_SUCCESS; + diff --git a/utils/opensc/patches/0028-openpgp-tool-Fix-wrong-operator.patch b/utils/opensc/patches/0028-openpgp-tool-Fix-wrong-operator.patch new file mode 100644 index 000000000..e423e1703 --- /dev/null +++ b/utils/opensc/patches/0028-openpgp-tool-Fix-wrong-operator.patch @@ -0,0 +1,28 @@ +From c71a453ff1e19721a9245b8a2d637eabd9f12e54 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Nguy=E1=BB=85n=20H=E1=BB=93ng=20Qu=C3=A2n?= + +Date: Thu, 11 Dec 2014 12:51:15 +0800 +Subject: [PATCH 2/2] openpgp-tool: Fix wrong operator + +Used "!=" instead of "|=" +--- + src/tools/openpgp-tool.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +Index: opensc-20150513/src/tools/openpgp-tool.c +=================================================================== +--- opensc-20150513.orig/src/tools/openpgp-tool.c ++++ opensc-20150513/src/tools/openpgp-tool.c +@@ -639,10 +639,10 @@ int main(int argc, char **argv) + } + + if (opt_delkey) +- exit_status != do_delete_key(card, key_id); ++ exit_status |= do_delete_key(card, key_id); + + if (opt_erase) +- exit_status != do_erase(card); ++ exit_status |= do_erase(card); + + out: + sc_unlock(card);