[pkg-opensc-commit] [opensc] 259/295: sc-hsm: fixed forcing a card driver via opensc.conf
Eric Dorland
eric at moszumanska.debian.org
Sat Jun 24 21:11:38 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 b7de5888a0d9012c99e5f624bab1b98671fc7446
Author: Frank Morgner <frankmorgner at gmail.com>
Date: Thu May 4 13:53:50 2017 +0200
sc-hsm: fixed forcing a card driver via opensc.conf
- don't use private data on card matching
- instead, return 1 for every known ATR and only select the applet if the ATR is unknown.
- card initialization always selects the applet.
Advantage: decouples memeory management in matching from initializing the card.
Disadvantage: Applet is selected twice in case of an unknown ATR (once for matching and a second time for initializing the card).
Fixes https://github.com/OpenSC/OpenSC/issues/1042
---
src/libopensc/card-sc-hsm.c | 63 ++++++++++++++-------------------------------
1 file changed, 19 insertions(+), 44 deletions(-)
diff --git a/src/libopensc/card-sc-hsm.c b/src/libopensc/card-sc-hsm.c
index 0ff9358..b23c8f7 100644
--- a/src/libopensc/card-sc-hsm.c
+++ b/src/libopensc/card-sc-hsm.c
@@ -72,7 +72,8 @@ static struct sc_atr_table sc_hsm_jc_atrs[] = {
/* standard version */
{"3b:f8:13:00:00:81:31:fe:45:4a:43:4f:50:76:32:34:31:b7", NULL, NULL, SC_CARD_TYPE_SC_HSM, 0, NULL}, // JCOP 2.4.1 Default ATR contact based
{"3b:88:80:01:4a:43:4f:50:76:32:34:31:5e", NULL, NULL, SC_CARD_TYPE_SC_HSM, 0, NULL}, // JCOP 2.4.1 Default ATR contactless
- {"3B:80:80:01:01", NULL, NULL, SC_CARD_TYPE_SC_HSM_SOC, 0, NULL}, // SoC Sample Card
+ /* SoC Sample Card */
+ {"3B:80:80:01:01", NULL, NULL, SC_CARD_TYPE_SC_HSM_SOC, 0, NULL},
{NULL, NULL, NULL, 0, 0, NULL}
};
@@ -120,15 +121,17 @@ static int sc_hsm_select_file_ex(sc_card_t *card,
&& in_path->len == 0
&& in_path->aid.len == sc_hsm_aid.len
&& !memcmp(in_path->aid.value, sc_hsm_aid.value, sc_hsm_aid.len))) {
- if ((priv->dffcp == NULL) || forceselect) {
+ if (!priv || (priv->dffcp == NULL) || forceselect) {
rv = (*iso_ops->select_file)(card, in_path, file_out);
LOG_TEST_RET(card->ctx, rv, "Could not select SmartCard-HSM application");
- if (priv->dffcp != NULL) {
- sc_file_free(priv->dffcp);
+ if (priv) {
+ if (priv->dffcp != NULL) {
+ sc_file_free(priv->dffcp);
+ }
+ // Cache the FCP returned when selecting the applet
+ sc_file_dup(&priv->dffcp, *file_out);
}
- // Cache the FCP returned when selecting the applet
- sc_file_dup(&priv->dffcp, *file_out);
} else {
sc_file_dup(file_out, priv->dffcp);
rv = SC_SUCCESS;
@@ -173,7 +176,6 @@ static int sc_hsm_select_file(sc_card_t *card,
static int sc_hsm_match_card(struct sc_card *card)
{
- sc_hsm_private_data_t *priv;
sc_path_t path;
int i, r;
@@ -182,47 +184,13 @@ static int sc_hsm_match_card(struct sc_card *card)
return 1;
i = _sc_match_atr(card, sc_hsm_jc_atrs, &card->type);
- if (i < 0)
- return 0;
-
- priv = calloc(1, sizeof(sc_hsm_private_data_t));
- if (!priv)
- LOG_FUNC_RETURN(card->ctx, SC_ERROR_OUT_OF_MEMORY);
-
- card->drv_data = priv;
+ if (i >= 0)
+ return 1;
sc_path_set(&path, SC_PATH_TYPE_DF_NAME, sc_hsm_aid.value, sc_hsm_aid.len, 0, 0);
- r = (*iso_ops->select_file)(card, &path, &priv->dffcp);
+ r = sc_hsm_select_file(card, &path, NULL);
LOG_TEST_RET(card->ctx, r, "Could not select SmartCard-HSM application");
- if (priv->dffcp) {
- if (priv->dffcp->prop_attr && priv->dffcp->prop_attr_len >= 5) {
- static char card_name[SC_MAX_APDU_BUFFER_SIZE];
- u8 type = priv->dffcp->prop_attr[2];
- u8 major = priv->dffcp->prop_attr[3];
- u8 minor = priv->dffcp->prop_attr[4];
- char p00[] = "SmartCard-HSM Applet for JCOP";
- char p01[] = "SmartCard-HSM Demo Applet for JCOP";
- char *p = "SmartCard-HSM";
- switch (type) {
- case 0x00:
- p = p00;
- break;
- case 0x01:
- p = p01;
- break;
- default:
- break;
- }
- snprintf(card_name, sizeof card_name, "%s version %u.%u", p, major, minor);
- card->name = card_name;
-
- if (priv->dffcp->prop_attr[1] & 0x04) {
- card->caps |= SC_CARD_CAP_SESSION_PIN;
- }
- }
- }
-
// Select Applet to be sure
return 1;
}
@@ -1480,6 +1448,13 @@ static int sc_hsm_init(struct sc_card *card)
LOG_FUNC_CALLED(card->ctx);
+ if (!priv) {
+ priv = calloc(1, sizeof(sc_hsm_private_data_t));
+ if (!priv)
+ LOG_FUNC_RETURN(card->ctx, SC_ERROR_OUT_OF_MEMORY);
+ card->drv_data = priv;
+ }
+
flags = SC_ALGORITHM_RSA_RAW|SC_ALGORITHM_ONBOARD_KEY_GEN;
_sc_card_add_rsa_alg(card, 1024, flags, 0);
--
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