summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/librfid/rfid_protocol_mifare_classic.h10
-rw-r--r--src/rfid_proto_mifare_classic.c33
2 files changed, 41 insertions, 2 deletions
diff --git a/include/librfid/rfid_protocol_mifare_classic.h b/include/librfid/rfid_protocol_mifare_classic.h
index e50cd2f..bfa49ba 100644
--- a/include/librfid/rfid_protocol_mifare_classic.h
+++ b/include/librfid/rfid_protocol_mifare_classic.h
@@ -12,11 +12,16 @@
#define MIFARE_CL_KEY_LEN (sizeof(MIFARE_CL_KEYA_DEFAULT)-1)
#define MIFARE_CL_PAGE_MAX 0xff
-#define MIFARE_CL_PAGE_SIZE 20
+#define MIFARE_CL_PAGE_SIZE 0x10
#define RFID_CMD_MIFARE_AUTH1A 0x60
#define RFID_CMD_MIFARE_AUTH1B 0x61
+#define MIFARE_CL_BLOCKS_P_SECTOR_1k 4
+#define MIFARE_CL_BLOCKS_P_SECTOR_4k 16
+#define MIFARE_CL_SMALL_SECTORS 32
+#define MIFARE_CL_LARGE_SECTORS 4
+
enum rfid_proto_mfcl_opt {
RFID_OPT_P_MFCL_SIZE = 0x10000001,
};
@@ -37,5 +42,8 @@ extern const struct rfid_protocol rfid_protocol_mfcl;
extern int mfcl_set_key(struct rfid_protocol_handle *ph, unsigned char *key);
extern int mfcl_auth(struct rfid_protocol_handle *ph, u_int8_t cmd, u_int8_t block);
+extern int mfcl_sector2block(u_int8_t sector);
+extern int mfcl_block2sector(u_int8_t block);
+extern int mfcl_sector_blocks(u_int8_t sector);
#endif /* _MIFARE_CLASSIC_H */
diff --git a/src/rfid_proto_mifare_classic.c b/src/rfid_proto_mifare_classic.c
index fa9b4e2..003e8b0 100644
--- a/src/rfid_proto_mifare_classic.c
+++ b/src/rfid_proto_mifare_classic.c
@@ -1,7 +1,7 @@
/* Mifare Classic implementation, PCD side.
*
- * (C) 2005-2006 by Harald Welte <laforge@gnumonks.org>
+ * (C) 2005-2008 by Harald Welte <laforge@gnumonks.org>
*
*/
@@ -126,6 +126,7 @@ mfcl_getopt(struct rfid_protocol_handle *ph, int optname, void *optval,
ret = 0;
rfid_layer2_getopt(ph->l2h, RFID_OPT_14443A_ATQA,
atqa, &atqa_size);
+ /* FIXME: ATQA of mifare mini */
if (atqa[0] == 0x04 && atqa[1] == 0x00)
*size = 1024;
else if (atqa[0] == 0x02 && atqa[1] == 0x00)
@@ -189,3 +190,33 @@ int mfcl_auth(struct rfid_protocol_handle *ph, u_int8_t cmd, u_int8_t block)
return ph->l2h->rh->reader->mifare_classic.auth(ph->l2h->rh, cmd,
serno, block);
}
+
+int mfcl_block2sector(u_int8_t block)
+{
+ if (block < MIFARE_CL_SMALL_SECTORS * MIFARE_CL_BLOCKS_P_SECTOR_1k)
+ return block/MIFARE_CL_BLOCKS_P_SECTOR_1k;
+ else
+ return (block - MIFARE_CL_SMALL_SECTORS * MIFARE_CL_BLOCKS_P_SECTOR_1k)
+ / MIFARE_CL_BLOCKS_P_SECTOR_4k;
+}
+
+int mfcl_sector2block(u_int8_t sector)
+{
+ if (sector < MIFARE_CL_SMALL_SECTORS)
+ return sector * MIFARE_CL_BLOCKS_P_SECTOR_1k;
+ else if (sector < MIFARE_CL_SMALL_SECTORS + MIFARE_CL_LARGE_SECTORS)
+ return MIFARE_CL_SMALL_SECTORS * MIFARE_CL_BLOCKS_P_SECTOR_1k +
+ (sector - MIFARE_CL_SMALL_SECTORS) * MIFARE_CL_BLOCKS_P_SECTOR_4k;
+ else
+ return -EINVAL;
+}
+
+int mfcl_sector_blocks(u_int8_t sector)
+{
+ if (sector < MIFARE_CL_SMALL_SECTORS)
+ return MIFARE_CL_BLOCKS_P_SECTOR_1k;
+ else if (sector < MIFARE_CL_SMALL_SECTORS + MIFARE_CL_LARGE_SECTORS)
+ return MIFARE_CL_BLOCKS_P_SECTOR_4k;
+ else
+ return -EINVAL;
+}
personal git repositories of Harald Welte. Your mileage may vary