From a2012126cd51bd254474b7ebc5ae7ecaf904e816 Mon Sep 17 00:00:00 2001 From: frankmorgner Date: Fri, 25 Jun 2010 21:31:36 +0000 Subject: [PATCH] - Replaced references to sc_get_pin* with its OpenSSL counter parts (untested) - UI functionality and maybe more is no longer shipped in opensc>=0.12. This and the fact that linking against libopensc in general is discouraged might be a reason to abandon opensc in future releases. git-svn-id: https://vsmartcard.svn.sourceforge.net/svnroot/vsmartcard@170 96b47cad-a561-4643-ad3b-153ac7d7599c --- ccid/src/ccid.c | 86 +++++++++++++++++++------------------------------ ccid/src/pace.c | 50 +++++++++++++++------------- ccid/src/pace.h | 3 ++ 3 files changed, 64 insertions(+), 75 deletions(-) diff --git a/ccid/src/ccid.c b/ccid/src/ccid.c index b1c04c6..bea0b32 100644 --- a/ccid/src/ccid.c +++ b/ccid/src/ccid.c @@ -23,7 +23,7 @@ #include #include #include -#include +#include #include #include "ccid.h" @@ -775,7 +775,6 @@ perform_PC_to_RDR_Secure(const __u8 *in, size_t inlen, __u8** out, size_t *outle int sc_result, r; struct sc_pin_cmd_pin curr_pin, new_pin; sc_apdu_t apdu; - sc_ui_hints_t hints; const PC_to_RDR_Secure_t *request = (PC_to_RDR_Secure_t *) in; const __u8* abData = in + sizeof *request; size_t abDatalen = inlen - sizeof *request; @@ -792,7 +791,6 @@ perform_PC_to_RDR_Secure(const __u8 *in, size_t inlen, __u8** out, size_t *outle if (request->bMessageType != 0x69) sc_debug(ctx, "warning: malformed PC_to_RDR_Secure"); - memset(&hints, 0, sizeof(hints)); memset(&curr_pin, 0, sizeof(curr_pin)); memset(&new_pin, 0, sizeof(new_pin)); @@ -923,58 +921,42 @@ perform_PC_to_RDR_Secure(const __u8 *in, size_t inlen, __u8** out, size_t *outle modify ? "bytes" : "system units"); /* get the PIN */ - hints.dialog_name = "ccid.PC_to_RDR_Secure"; - hints.card = card_in_slot[request->bSlot]; - if (bNumberMessage == CCID_PIN_MSG_DEFAULT - || bNumberMessage == CCID_PIN_MSG_REF - || bNumberMessage == CCID_PIN_NO_MSG) { - /* don't interprete bMsgIndex*, just use defaults */ - if (verify) - hints.usage = SC_UI_USAGE_OTHER; - else - hints.usage = SC_UI_USAGE_CHANGE_PIN; - } else if (bNumberMessage == CCID_PIN_MSG1) - hints.usage = SC_UI_USAGE_OTHER; - else if (bNumberMessage == CCID_PIN_MSG2) - hints.usage = SC_UI_USAGE_NEW_PIN; - else { - sc_result = SC_ERROR_INVALID_ARGUMENTS; - goto err; - } if (verify) { - hints.prompt = "PIN Verification"; - sc_result = sc_ui_get_pin(&hints, (char **) &curr_pin.data); - } else { - hints.prompt = "PIN Modification"; - if (modify->bConfirmPIN & CCID_PIN_CONFIRM_NEW) - hints.flags |= SC_UI_PIN_RETYPE; - if (modify->bConfirmPIN & CCID_PIN_INSERT_OLD) { - sc_result = sc_ui_get_pin_pair(&hints, (char **) &curr_pin.data, - (char **) &new_pin.data); - } else { - /* if only the new pin is requested, it is stored in curr_pin */ - sc_result = sc_ui_get_pin(&hints, (char **) &curr_pin.data); - } - } - if (sc_result < 0) - goto err; - - /* set and check length of PIN */ - curr_pin.len = strlen((char *) curr_pin.data); - if ((curr_pin.max_length && curr_pin.len > curr_pin.max_length) - || curr_pin.len < curr_pin.min_length) { - sc_result = SC_ERROR_PIN_CODE_INCORRECT; - sc_error(ctx, "PIN request required a longer or shorter PIN"); - goto err; - } - if (modify) { - new_pin.len = strlen((char *) new_pin.data); - if ((new_pin.max_length && new_pin.len > new_pin.max_length) - || new_pin.len < new_pin.min_length) { - sc_error(ctx, "PIN request required a longer or shorter PIN"); - sc_result = SC_ERROR_PIN_CODE_INCORRECT; + if (0 > EVP_read_pw_string_min((char *) curr_pin.data, + curr_pin.min_length, curr_pin.max_length, + "Please enter your PIN for verification", + 0)) { + sc_result = SC_ERROR_INTERNAL; + sc_error(ctx, "Could not read PIN.\n"); goto err; } + } else { + if (modify->bConfirmPIN & CCID_PIN_INSERT_OLD) { + /* if only the new pin is requested, it is stored in curr_pin */ + if (0 > EVP_read_pw_string_min((char *) curr_pin.data, + curr_pin.min_length, curr_pin.max_length, + "Please enter your current PIN for modification", + 0)) { + sc_result = SC_ERROR_INTERNAL; + sc_error(ctx, "Could not read current PIN.\n"); + goto err; + } + } + + if (0 > EVP_read_pw_string_min((char *) new_pin.data, + new_pin.min_length, new_pin.max_length, + "Please enter your new PIN for modification", + modify->bConfirmPIN & CCID_PIN_CONFIRM_NEW)) { + sc_result = SC_ERROR_INTERNAL; + sc_error(ctx, "Could not read new PIN.\n"); + goto err; + } + } + + /* set length of PIN */ + curr_pin.len = strlen((char *) curr_pin.data); + if (modify) { + new_pin.len = strlen((char *) new_pin.data); } /* Note: pin.offset and pin.length_offset are relative to the first diff --git a/ccid/src/pace.c b/ccid/src/pace.c index 58c3c11..f717112 100644 --- a/ccid/src/pace.c +++ b/ccid/src/pace.c @@ -23,7 +23,7 @@ #include #include #include -#include +#include #include #include #include @@ -591,22 +591,21 @@ pace_reset_retry_counter(struct sm_ctx *ctx, sc_card_t *card, const char *new, size_t new_len) { sc_apdu_t apdu; - sc_ui_hints_t hints; char *p = NULL; int r; if (ask_for_secret && (!new || !new_len)) { - memset(&hints, 0, sizeof(hints)); - hints.dialog_name = "ccid.PACE"; - hints.card = card; - hints.prompt = NULL; - hints.obj_label = pace_secret_name(PACE_PIN); - hints.usage = SC_UI_USAGE_NEW_PIN; - r = sc_ui_get_pin(&hints, &p); - if (r < 0) { - sc_error(card->ctx, "Could not read new %s (%s).\n", - hints.obj_label, sc_strerror(r)); - return r; + p = malloc(MAX_PIN_LEN+1); + if (!p) { + sc_error(card->ctx, "Not enough memory for new PIN.\n"); + return SC_ERROR_OUT_OF_MEMORY; + } + if (0 > EVP_read_pw_string_min(p, + MIN_PIN_LEN, MAX_PIN_LEN+1, + "Please enter your new PIN for modification", 0)) { + sc_error(card->ctx, "Could not read new PIN.\n"); + free(p); + return SC_ERROR_INTERNAL; } new_len = strlen(p); new = p; @@ -641,22 +640,27 @@ pace_reset_retry_counter(struct sm_ctx *ctx, sc_card_t *card, static PACE_SEC * get_psec(sc_card_t *card, const char *pin, size_t length_pin, enum s_type pin_id) { - sc_ui_hints_t hints; char *p = NULL; PACE_SEC *r; int sc_result; + char buf[32]; /* XXX max size of mrz */ if (!length_pin || !pin) { - memset(&hints, 0, sizeof(hints)); - hints.dialog_name = "ccid.PACE"; - hints.card = card; - hints.prompt = NULL; - hints.obj_label = pace_secret_name(pin_id); - hints.usage = SC_UI_USAGE_OTHER; - sc_result = sc_ui_get_pin(&hints, &p); - if (sc_result < 0) { + if (0 > snprintf(buf, sizeof buf, "Please enter your %s", + pace_secret_name(pin_id))) { + sc_error(card->ctx, "Could not create password prompt.\n"); + return NULL; + } + p = malloc(MAX_MRZ_LEN); + if (!p) { + sc_error(card->ctx, "Not enough memory for %s.\n", + pace_secret_name(pin_id)); + return NULL; + } + if (0 > EVP_read_pw_string_min(p, 0, MAX_MRZ_LEN, + "Please enter your new PIN for modification", 0)) { sc_error(card->ctx, "Could not read %s (%s).\n", - pace_secret_name(pin_id), sc_strerror(sc_result)); + pace_secret_name(pin_id)); return NULL; } length_pin = strlen(p); diff --git a/ccid/src/pace.h b/ccid/src/pace.h index 09c644c..2c53c52 100644 --- a/ccid/src/pace.h +++ b/ccid/src/pace.h @@ -42,6 +42,9 @@ extern "C" { #define FID_EF_CARDACCESS 0x011C #define MAX_EF_CARDACCESS 2048 +#define MAX_PIN_LEN 6 +#define MIN_PIN_LEN 6 +#define MAX_MRZ_LEN 128 int increment_ssc(struct pace_sm_ctx *psmctx); int decrement_ssc(struct pace_sm_ctx *psmctx);