[pkg-opensc-commit] [opensc] 171/295: login state preservation for JPKI card
Eric Dorland
eric at moszumanska.debian.org
Sat Jun 24 21:11:28 UTC 2017
This is an automated email from the git hooks/post-receive script.
eric pushed a commit to branch master
in repository opensc.
commit 76a524544ab214db1a91651b01993ee255616a86
Author: HAMANO Tsukasa <code at cuspy.org>
Date: Sun Feb 5 15:43:48 2017 +0900
login state preservation for JPKI card
also set pin1.logged_in and pin1.tries_left
set correct max_tries
---
src/libopensc/card-jpki.c | 18 ++++++++++++++++--
src/libopensc/jpki.h | 3 +++
src/libopensc/pkcs15-jpki.c | 5 ++++-
3 files changed, 23 insertions(+), 3 deletions(-)
diff --git a/src/libopensc/card-jpki.c b/src/libopensc/card-jpki.c
index 137d12c..90d7b42 100644
--- a/src/libopensc/card-jpki.c
+++ b/src/libopensc/card-jpki.c
@@ -214,11 +214,13 @@ jpki_read_binary(sc_card_t * card, unsigned int idx,
}
static int
-jpki_pin_cmd(sc_card_t * card, struct sc_pin_cmd_data *data, int *tries_left)
+jpki_pin_cmd(sc_card_t *card, struct sc_pin_cmd_data *data, int *tries_left)
{
int rc;
sc_path_t path;
sc_apdu_t apdu;
+ struct jpki_private_data *priv = JPKI_DRVDATA(card);
+ int max_tries = 0;
LOG_FUNC_CALLED(card->ctx);
@@ -231,11 +233,13 @@ jpki_pin_cmd(sc_card_t * card, struct sc_pin_cmd_data *data, int *tries_left)
sc_format_path(JPKI_AUTH_PIN, &path);
path.type = SC_PATH_TYPE_FILE_ID;
rc = sc_select_file(card, &path, NULL);
+ max_tries = JPKI_AUTH_PIN_MAX_TRIES;
break;
case 2:
sc_format_path(JPKI_SIGN_PIN, &path);
path.type = SC_PATH_TYPE_FILE_ID;
rc = sc_select_file(card, &path, NULL);
+ max_tries = JPKI_SIGN_PIN_MAX_TRIES;
break;
default:
sc_log(card->ctx, "Unknown PIN reference: %d", data->pin_reference);
@@ -252,6 +256,14 @@ jpki_pin_cmd(sc_card_t * card, struct sc_pin_cmd_data *data, int *tries_left)
rc = sc_transmit_apdu(card, &apdu);
LOG_TEST_RET(card->ctx, rc, "APDU transmit failed");
rc = sc_check_sw(card, apdu.sw1, apdu.sw2);
+ if (rc == SC_SUCCESS) {
+ data->pin1.logged_in = SC_PIN_STATE_LOGGED_IN;
+ data->pin1.tries_left = max_tries;
+ } else {
+ data->pin1.logged_in = SC_PIN_STATE_LOGGED_OUT;
+ data->pin1.tries_left = apdu.sw2 & 0xF;
+ }
+ priv->logged_in = data->pin1.logged_in;
LOG_TEST_RET(card->ctx, rc, "VERIFY failed");
break;
case SC_PIN_CMD_GET_INFO:
@@ -262,8 +274,10 @@ jpki_pin_cmd(sc_card_t * card, struct sc_pin_cmd_data *data, int *tries_left)
sc_log(card->ctx, "VERIFY GET_INFO error");
LOG_FUNC_RETURN(card->ctx, SC_ERROR_CARD_CMD_FAILED);
}
+ data->pin1.logged_in = priv->logged_in;
+ data->pin1.tries_left = apdu.sw2 & 0xF;
if (tries_left) {
- *tries_left = apdu.sw2 - 0xC0;
+ *tries_left = data->pin1.tries_left;
}
break;
default:
diff --git a/src/libopensc/jpki.h b/src/libopensc/jpki.h
index 79aad6a..7d9c22c 100644
--- a/src/libopensc/jpki.h
+++ b/src/libopensc/jpki.h
@@ -27,15 +27,18 @@
#define AID_JPKI "D392f000260100000001"
#define JPKI_AUTH_KEY "0017"
#define JPKI_AUTH_PIN "0018"
+#define JPKI_AUTH_PIN_MAX_TRIES 3
#define JPKI_SIGN_KEY "001A"
#define JPKI_SIGN_PIN "001B"
+#define JPKI_SIGN_PIN_MAX_TRIES 5
#define JPKI_DRVDATA(card) ((struct jpki_private_data *) ((card)->drv_data))
struct jpki_private_data {
sc_file_t *mf;
int selected;
+ int logged_in;
};
int jpki_select_ap(struct sc_card *card);
diff --git a/src/libopensc/pkcs15-jpki.c b/src/libopensc/pkcs15-jpki.c
index c113b87..fa09408 100644
--- a/src/libopensc/pkcs15-jpki.c
+++ b/src/libopensc/pkcs15-jpki.c
@@ -99,7 +99,10 @@ sc_pkcs15emu_jpki_init(sc_pkcs15_card_t * p15card)
static const int jpki_pin_ref[2] = { 1, 2 };
static const int jpki_pin_authid[2] = { 1, 2 };
static const int jpki_pin_flags[2] = { 0, 0 };
- static const int jpki_pin_max_tries[2] = { 5, 3 };
+ static const int jpki_pin_max_tries[2] = {
+ JPKI_AUTH_PIN_MAX_TRIES,
+ JPKI_SIGN_PIN_MAX_TRIES
+ };
struct sc_pkcs15_auth_info pin_info;
struct sc_pkcs15_object pin_obj;
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-opensc/opensc.git
More information about the pkg-opensc-commit
mailing list