* fix length of mifare classic block
authorHarald Welte <laforge@gnumonks.org>
Tue, 29 Jan 2008 15:05:22 +0000 (15:05 +0000)
committerHarald Welte <laforge@gnumonks.org>
Tue, 29 Jan 2008 15:05:22 +0000 (15:05 +0000)
* 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
src/rfid_proto_mifare_classic.c

index e50cd2f..bfa49ba 100644 (file)
 #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 */
index fa9b4e2..003e8b0 100644 (file)
@@ -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;
+}