X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=src%2Frfid_proto_mifare_classic.c;h=a6e2e4f7fe66e6d6d57bb82016fcb5f5cfb896ab;hb=7ecbe0926b62d34c65106a92f546192be81acf5e;hp=003e8b088b387e6476de909d53858410068a4b46;hpb=fae52b7006b68f0d1b171d8e2ed20a81dcff02ba;p=librfid diff --git a/src/rfid_proto_mifare_classic.c b/src/rfid_proto_mifare_classic.c index 003e8b0..a6e2e4f 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; @@ -180,6 +187,14 @@ int mfcl_set_key(struct rfid_protocol_handle *ph, unsigned char *key) return ph->l2h->rh->reader->mifare_classic.setkey(ph->l2h->rh, key); } +int mfcl_set_key_ee(struct rfid_protocol_handle *ph, unsigned int addr) +{ + if (!ph->l2h->rh->reader->mifare_classic.setkey_ee) + return -ENODEV; + + return ph->l2h->rh->reader->mifare_classic.setkey_ee(ph->l2h->rh, addr); +} + int mfcl_auth(struct rfid_protocol_handle *ph, u_int8_t cmd, u_int8_t block) { u_int32_t serno = *((u_int32_t *)ph->l2h->uid);