diff --git a/src/libopensc/card-iasecc.c b/src/libopensc/card-iasecc.c index 716051cb..c12f3de4 100644 --- a/src/libopensc/card-iasecc.c +++ b/src/libopensc/card-iasecc.c @@ -2282,6 +2282,40 @@ iasecc_sdo_create(struct sc_card *card, struct iasecc_sdo *sdo) 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 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: sc_log(ctx, "CMD SC_CARDCTL_IASECC_SDO_CREATE: sdo_class %X", sdo->sdo_class); 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: 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); diff --git a/src/libopensc/cardctl.h b/src/libopensc/cardctl.h index 365c1fef..b01e7553 100644 --- a/src/libopensc/cardctl.h +++ b/src/libopensc/cardctl.h @@ -228,6 +228,7 @@ enum { SC_CARDCTL_IASECC_SDO_GET_DATA, SC_CARDCTL_IASECC_SDO_GENERATE, SC_CARDCTL_IASECC_SDO_CREATE, + SC_CARDCTL_IASECC_SDO_DELETE, }; enum {