int explain_tag (MifareTag tag) { bool aborting = false; mifare_desfire_connect (tag); MifareDESFireAID ucard_info_aid = mifare_desfire_aid_new (UCARD_INFO_AID); if (mifare_desfire_select_application (tag, ucard_info_aid) < 0) { freefare_perror (tag, "mifare_desfire_select_application"); return -1; } free (ucard_info_aid); MifareDESFireKey key = mifare_desfire_aes_key_new (admin_key_data); if (mifare_desfire_authenticate_aes (tag, 0, key) < 0) { freefare_perror (tag, "mifare_desfire_authenticate_aes"); return -1; } uint8_t records[(3+16)*32]; int records_length; records_length = mifare_desfire_read_records_ex (tag, USER_KEYRING_FILENO, 0, 0, records, USER_KEYRING_COMMUNICATION_MODE); if (records_length < 0) { if (BOUNDARY_ERROR == mifare_desfire_last_picc_error (tag)) { warnx ("Card is empty"); return 0; } freefare_perror (tag, "mifare_desfire_read_records_ex"); return -1; } for (int i = 0; (!aborting) && (i < records_length); i += (3+16)) { uint32_t raw_aid = records[i] << 16 | records[i+1] << 8 | records[i+2]; MifareDESFireAID aid = mifare_desfire_aid_new (raw_aid); MifareDESFireKey key = mifare_desfire_des_key_new (records + i + 3); if (explain_application (tag, aid, key) < 0) aborting = true; mifare_desfire_key_free (key); free (aid); } mifare_desfire_disconnect (tag); return (aborting) ? -1 : 0; }
ssize_t mifare_desfire_read_records (MifareTag tag, uint8_t file_no, off_t offset, size_t length, void *data) { return mifare_desfire_read_records_ex (tag, file_no, offset, length, data, madame_soleil_get_read_communication_settings (tag, file_no)); }