From 591a1b00c180e176dd03d9d05ed8fa4964a74765 Mon Sep 17 00:00:00 2001 From: laforge Date: Tue, 29 Jan 2008 15:05:22 +0000 Subject: * fix length of mifare classic block * add mifare classic block/sector conversion functions git-svn-id: https://svn.gnumonks.org/trunk/librfid@2062 e0336214-984f-0b4b-a45f-81c69e1f0ede --- include/librfid/rfid_protocol_mifare_classic.h | 10 +++++++- src/rfid_proto_mifare_classic.c | 33 +++++++++++++++++++++++++- 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 + * (C) 2005-2008 by Harald Welte * */ @@ -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; +} -- cgit v1.2.3