Have process_fci() as a card operation instead of being called internally by iso7816_select_file(). This way card drivers can implement a select_file() and process_fci() independently

git-svn-id: https://www.opensc-project.org/svnp/opensc/trunk@1263 c6295689-39f2-0310-b995-f0e70906c6a9
This commit is contained in:
sth 2003-07-14 17:39:19 +00:00
parent e8cf96af9f
commit 0a05d8340c
2 changed files with 10 additions and 2 deletions

View File

@ -274,9 +274,10 @@ static int iso7816_update_binary(struct sc_card *card,
SC_FUNC_RETURN(card->ctx, 3, count);
}
static void process_fci(struct sc_context *ctx, struct sc_file *file,
int iso7816_process_fci(struct sc_card *card, struct sc_file *file,
const u8 *buf, size_t buflen)
{
struct sc_context *ctx = card->ctx;
size_t taglen, len = buflen;
const u8 *tag = NULL, *p = buf;
@ -373,6 +374,8 @@ static void process_fci(struct sc_context *ctx, struct sc_file *file,
sc_file_set_sec_attr(file, tag, taglen);
}
file->magic = SC_FILE_MAGIC;
return 0;
}
static int iso7816_select_file(struct sc_card *card,
@ -448,8 +451,10 @@ static int iso7816_select_file(struct sc_card *card,
if (file == NULL)
SC_FUNC_RETURN(card->ctx, 0, SC_ERROR_OUT_OF_MEMORY);
file->path = *in_path;
if (card->ops->process_fci == NULL)
SC_FUNC_RETURN(card->ctx, 2, SC_ERROR_NOT_SUPPORTED);
if (apdu.resp[1] <= apdu.resplen)
process_fci(card->ctx, file, apdu.resp+2, apdu.resp[1]);
card->ops->process_fci(card, file, apdu.resp+2, apdu.resp[1]);
*file_out = file;
break;
case 0x00: /* proprietary coding */
@ -967,6 +972,7 @@ struct sc_card_driver * sc_get_iso7816_driver(void)
iso_ops.check_sw = iso7816_check_sw;
iso_ops.pin_cmd = iso7816_pin_cmd;
iso_ops.logout = iso7816_logout;
iso_ops.process_fci = iso7816_process_fci;
}
return &iso_driver;
}

View File

@ -553,6 +553,8 @@ struct sc_card_operations {
int (*check_sw)(struct sc_card *card, int sw1, int sw2);
int (*card_ctl)(struct sc_card *card, unsigned long request,
void *data);
int (*process_fci)(struct sc_card *card, struct sc_file *file,
const u8 *buf, size_t buflen);
/* pin_cmd: verify/change/unblock command; optionally using the
* card's pin pad if supported.