iasecc: 'DELETE SDO' card ctl ...
to be used by Obertbur's IAS/ECC card. git-svn-id: https://www.opensc-project.org/svnp/opensc/trunk@5398 c6295689-39f2-0310-b995-f0e70906c6a9
This commit is contained in:
parent
346490b953
commit
c9bf9bc22c
|
@ -2282,6 +2282,40 @@ iasecc_sdo_create(struct sc_card *card, struct iasecc_sdo *sdo)
|
||||||
LOG_FUNC_RETURN(ctx, rv);
|
LOG_FUNC_RETURN(ctx, rv);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Oberthur's specific */
|
||||||
|
static int
|
||||||
|
iasecc_sdo_delete(struct sc_card *card, struct iasecc_sdo *sdo)
|
||||||
|
{
|
||||||
|
struct sc_context *ctx = card->ctx;
|
||||||
|
struct sc_apdu apdu;
|
||||||
|
unsigned char data[6] = {
|
||||||
|
0x70, 0x04, 0xBF, 0xFF, 0xFF, 0x00
|
||||||
|
};
|
||||||
|
int rv;
|
||||||
|
|
||||||
|
LOG_FUNC_CALLED(ctx);
|
||||||
|
if (sdo->magic != SC_CARDCTL_IASECC_SDO_MAGIC)
|
||||||
|
LOG_TEST_RET(ctx, SC_ERROR_INVALID_DATA, "Invalid SDO data");
|
||||||
|
|
||||||
|
data[2] = IASECC_SDO_TAG_HEADER;
|
||||||
|
data[3] = sdo->sdo_class | 0x80;
|
||||||
|
data[4] = sdo->sdo_ref;
|
||||||
|
sc_log(ctx, "delete SDO %02X%02X%02X", data[2], data[3], data[4]);
|
||||||
|
|
||||||
|
sc_format_apdu(card, &apdu, SC_APDU_CASE_3_SHORT, 0xDB, 0x3F, 0xFF);
|
||||||
|
apdu.data = data;
|
||||||
|
apdu.datalen = sizeof(data);
|
||||||
|
apdu.lc = sizeof(data);
|
||||||
|
apdu.flags |= SC_APDU_FLAGS_CHAINING;
|
||||||
|
|
||||||
|
rv = sc_transmit_apdu(card, &apdu);
|
||||||
|
LOG_TEST_RET(ctx, rv, "APDU transmit failed");
|
||||||
|
rv = sc_check_sw(card, apdu.sw1, apdu.sw2);
|
||||||
|
LOG_TEST_RET(ctx, rv, "delete SDO error");
|
||||||
|
|
||||||
|
LOG_FUNC_RETURN(ctx, rv);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
iasecc_sdo_put_data(struct sc_card *card, struct iasecc_sdo_update *update)
|
iasecc_sdo_put_data(struct sc_card *card, struct iasecc_sdo_update *update)
|
||||||
|
@ -2591,6 +2625,9 @@ iasecc_card_ctl(struct sc_card *card, unsigned long cmd, void *ptr)
|
||||||
case SC_CARDCTL_IASECC_SDO_CREATE:
|
case SC_CARDCTL_IASECC_SDO_CREATE:
|
||||||
sc_log(ctx, "CMD SC_CARDCTL_IASECC_SDO_CREATE: sdo_class %X", sdo->sdo_class);
|
sc_log(ctx, "CMD SC_CARDCTL_IASECC_SDO_CREATE: sdo_class %X", sdo->sdo_class);
|
||||||
return iasecc_sdo_create(card, (struct iasecc_sdo *) ptr);
|
return iasecc_sdo_create(card, (struct iasecc_sdo *) ptr);
|
||||||
|
case SC_CARDCTL_IASECC_SDO_DELETE:
|
||||||
|
sc_log(ctx, "CMD SC_CARDCTL_IASECC_SDO_DELETE: sdo_class %X", sdo->sdo_class);
|
||||||
|
return iasecc_sdo_delete(card, (struct iasecc_sdo *) ptr);
|
||||||
case SC_CARDCTL_IASECC_SDO_PUT_DATA:
|
case SC_CARDCTL_IASECC_SDO_PUT_DATA:
|
||||||
sc_log(ctx, "CMD SC_CARDCTL_IASECC_SDO_PUT_DATA: sdo_class %X", sdo->sdo_class);
|
sc_log(ctx, "CMD SC_CARDCTL_IASECC_SDO_PUT_DATA: sdo_class %X", sdo->sdo_class);
|
||||||
return iasecc_sdo_put_data(card, (struct iasecc_sdo_update *) ptr);
|
return iasecc_sdo_put_data(card, (struct iasecc_sdo_update *) ptr);
|
||||||
|
|
|
@ -228,6 +228,7 @@ enum {
|
||||||
SC_CARDCTL_IASECC_SDO_GET_DATA,
|
SC_CARDCTL_IASECC_SDO_GET_DATA,
|
||||||
SC_CARDCTL_IASECC_SDO_GENERATE,
|
SC_CARDCTL_IASECC_SDO_GENERATE,
|
||||||
SC_CARDCTL_IASECC_SDO_CREATE,
|
SC_CARDCTL_IASECC_SDO_CREATE,
|
||||||
|
SC_CARDCTL_IASECC_SDO_DELETE,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
|
|
Loading…
Reference in New Issue