diff options
author | laforge <laforge@e0336214-984f-0b4b-a45f-81c69e1f0ede> | 2008-02-07 16:17:18 +0000 |
---|---|---|
committer | laforge <laforge@e0336214-984f-0b4b-a45f-81c69e1f0ede> | 2008-02-07 16:17:18 +0000 |
commit | 621d27cc64f984e435d3ee66846d29ac5f052ba6 (patch) | |
tree | f46ed219710047a6a552064ead20b88eab0f5531 | |
parent | 9a7ba1f0d886fba6fff5da3e3340a986df23db0a (diff) |
add (preliminary?) SAK based detection of mifare mini.
git-svn-id: https://svn.gnumonks.org/trunk/librfid@2073 e0336214-984f-0b4b-a45f-81c69e1f0ede
-rw-r--r-- | include/librfid/rfid_layer2_iso14443a.h | 2 | ||||
-rw-r--r-- | src/rfid_layer2_iso14443a.c | 6 | ||||
-rw-r--r-- | src/rfid_proto_mifare_classic.c | 15 |
3 files changed, 19 insertions, 4 deletions
diff --git a/include/librfid/rfid_layer2_iso14443a.h b/include/librfid/rfid_layer2_iso14443a.h index a4af557..d38fb2e 100644 --- a/include/librfid/rfid_layer2_iso14443a.h +++ b/include/librfid/rfid_layer2_iso14443a.h @@ -6,6 +6,7 @@ enum rfid_14443a_opt { RFID_OPT_14443A_SPEED_TX = 0x00010002, RFID_OPT_14443A_ATQA = 0x00010003, RFID_OPT_14443A_WUPA = 0x00010004, + RFID_OPT_14443A_SAK = 0x00010005, }; enum rfid_14443_opt_speed { @@ -67,6 +68,7 @@ struct iso14443a_handle { unsigned int level; unsigned int tcl_capable; struct iso14443a_atqa atqa; + u_int8_t sak; }; enum iso14443a_level { diff --git a/src/rfid_layer2_iso14443a.c b/src/rfid_layer2_iso14443a.c index 281f709..90af0f2 100644 --- a/src/rfid_layer2_iso14443a.c +++ b/src/rfid_layer2_iso14443a.c @@ -250,6 +250,7 @@ cascade: h->level = ISO14443A_LEVEL_NONE; h->state = ISO14443A_STATE_SELECTED; + h->sak = sak[0]; if (sak[0] & 0x20) { DEBUGP("we have a T=CL compliant PICC\n"); @@ -323,9 +324,14 @@ iso14443a_getopt(struct rfid_layer2_handle *handle, int optname, int ret = -EINVAL; struct iso14443a_handle *h = &handle->priv.iso14443a; struct iso14443a_atqa *atqa = optval; + u_int8_t *opt_u8 = optval; int *wupa = optval; switch (optname) { + case RFID_OPT_14443A_SAK: + *opt_u8 = h->sak; + optlen = sizeof(*opt_u8); + break; case RFID_OPT_14443A_ATQA: *atqa = h->atqa; ret = 0; diff --git a/src/rfid_proto_mifare_classic.c b/src/rfid_proto_mifare_classic.c index 003e8b0..66e4287 100644 --- a/src/rfid_proto_mifare_classic.c +++ b/src/rfid_proto_mifare_classic.c @@ -115,7 +115,9 @@ mfcl_getopt(struct rfid_protocol_handle *ph, int optname, void *optval, { int ret = -EINVAL; u_int8_t atqa[2]; + u_int8_t sak; unsigned int atqa_size = sizeof(atqa); + unsigned int sak_size = sizeof(sak); unsigned int *size = optval; switch (optname) { @@ -126,10 +128,15 @@ 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) + rfid_layer2_getopt(ph->l2h, RFID_OPT_14443A_SAK, + &sak, &sak_size); + if (atqa[0] == 0x04 && atqa[1] == 0x00) { + if (sak == 0x09) { + /* mifare mini */ + *size = 320; + } else + *size = 1024; + } else if (atqa[0] == 0x02 && atqa[1] == 0x00) *size = 4096; else ret = -EIO; |