From 250ec57a11e661508385a96b2b4a8db2fae20572 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thorsten=20Vo=C3=9F?= Date: Sat, 26 Jan 2019 20:56:10 +0100 Subject: [PATCH] =?UTF-8?q?Support=20f=C3=BCr=20Mifare=20Ultralight=20und?= =?UTF-8?q?=20NTAG=20hinzugef=C3=BCgt=20-=20Danke=20an=20@ASealion!?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Tonuino.ino | 140 ++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 120 insertions(+), 20 deletions(-) diff --git a/Tonuino.ino b/Tonuino.ino index 5e446f0..e1e119b 100644 --- a/Tonuino.ino +++ b/Tonuino.ino @@ -932,7 +932,7 @@ void setupCard() { writeCard(myCard); } -bool readCard(nfcTagObject * nfcTag) { +bool readCard(nfcTagObject *nfcTag) { bool returnValue = true; // Show some details of the PICC (that is: the tag/card) Serial.print(F("Card UID:")); @@ -946,9 +946,23 @@ bool readCard(nfcTagObject * nfcTag) { byte size = sizeof(buffer); // Authenticate using key A - Serial.println(F("Authenticating using key A...")); - status = (MFRC522::StatusCode)mfrc522.PCD_Authenticate( - MFRC522::PICC_CMD_MF_AUTH_KEY_A, trailerBlock, &key, &(mfrc522.uid)); + if ((piccType == MFRC522::PICC_TYPE_MIFARE_MINI ) || + (piccType == MFRC522::PICC_TYPE_MIFARE_1K ) || + (piccType == MFRC522::PICC_TYPE_MIFARE_4K ) ) + { + Serial.println(F("Authenticating Classic using key A...")); + status = mfrc522.PCD_Authenticate( + MFRC522::PICC_CMD_MF_AUTH_KEY_A, trailerBlock, &key, &(mfrc522.uid)); + } + else if (piccType == MFRC522::PICC_TYPE_MIFARE_UL ) + { + byte pACK[] = {0, 0}; //16 bit PassWord ACK returned by the NFCtag + + // Authenticate using key A + Serial.println(F("Authenticating MIFARE UL...")); + status = mfrc522.PCD_NTAG216_AUTH(key.keyByte, pACK); + } + if (status != MFRC522::STATUS_OK) { returnValue = false; Serial.print(F("PCD_Authenticate() failed: ")); @@ -957,20 +971,63 @@ bool readCard(nfcTagObject * nfcTag) { } // Show the whole sector as it currently is - Serial.println(F("Current data in sector:")); - mfrc522.PICC_DumpMifareClassicSectorToSerial(&(mfrc522.uid), &key, sector); - Serial.println(); + // Serial.println(F("Current data in sector:")); + // mfrc522.PICC_DumpMifareClassicSectorToSerial(&(mfrc522.uid), &key, sector); + // Serial.println(); // Read data from the block - Serial.print(F("Reading data from block ")); - Serial.print(blockAddr); - Serial.println(F(" ...")); - status = (MFRC522::StatusCode)mfrc522.MIFARE_Read(blockAddr, buffer, &size); - if (status != MFRC522::STATUS_OK) { - returnValue = false; - Serial.print(F("MIFARE_Read() failed: ")); - Serial.println(mfrc522.GetStatusCodeName(status)); + if ((piccType == MFRC522::PICC_TYPE_MIFARE_MINI ) || + (piccType == MFRC522::PICC_TYPE_MIFARE_1K ) || + (piccType == MFRC522::PICC_TYPE_MIFARE_4K ) ) + { + Serial.print(F("Reading data from block ")); + Serial.print(blockAddr); + Serial.println(F(" ...")); + status = (MFRC522::StatusCode)mfrc522.MIFARE_Read(blockAddr, buffer, &size); + if (status != MFRC522::STATUS_OK) { + returnValue = false; + Serial.print(F("MIFARE_Read() failed: ")); + Serial.println(mfrc522.GetStatusCodeName(status)); + } } + else if (piccType == MFRC522::PICC_TYPE_MIFARE_UL ) + { + byte buffer2[18]; + byte size2 = sizeof(buffer2); + + status = (MFRC522::StatusCode)mfrc522.MIFARE_Read(8, buffer2, &size2); + if (status != MFRC522::STATUS_OK) { + returnValue = false; + Serial.print(F("MIFARE_Read_1() failed: ")); + Serial.println(mfrc522.GetStatusCodeName(status)); + } + memcpy(buffer, buffer2, 4); + + status = (MFRC522::StatusCode)mfrc522.MIFARE_Read(9, buffer2, &size2); + if (status != MFRC522::STATUS_OK) { + returnValue = false; + Serial.print(F("MIFARE_Read_2() failed: ")); + Serial.println(mfrc522.GetStatusCodeName(status)); + } + memcpy(buffer + 4, buffer2, 4); + + status = (MFRC522::StatusCode)mfrc522.MIFARE_Read(10, buffer2, &size2); + if (status != MFRC522::STATUS_OK) { + returnValue = false; + Serial.print(F("MIFARE_Read_3() failed: ")); + Serial.println(mfrc522.GetStatusCodeName(status)); + } + memcpy(buffer + 8, buffer2, 4); + + status = (MFRC522::StatusCode)mfrc522.MIFARE_Read(11, buffer2, &size2); + if (status != MFRC522::STATUS_OK) { + returnValue = false; + Serial.print(F("MIFARE_Read_4() failed: ")); + Serial.println(mfrc522.GetStatusCodeName(status)); + } + memcpy(buffer + 12, buffer2, 4); + } + Serial.print(F("Data in block ")); Serial.print(blockAddr); Serial.println(F(":")); @@ -991,7 +1048,6 @@ bool readCard(nfcTagObject * nfcTag) { nfcTag->nfcFolderSettings.special = buffer[7]; nfcTag->nfcFolderSettings.special2 = buffer[8]; - myFolder = &nfcTag->nfcFolderSettings; return returnValue; } @@ -1012,9 +1068,24 @@ void writeCard(nfcTagObject nfcTag) { mifareType = mfrc522.PICC_GetType(mfrc522.uid.sak); // Authenticate using key B - Serial.println(F("Authenticating again using key B...")); - status = (MFRC522::StatusCode)mfrc522.PCD_Authenticate( - MFRC522::PICC_CMD_MF_AUTH_KEY_B, trailerBlock, &key, &(mfrc522.uid)); + //authentificate with the card and set card specific parameters + if ((mifareType == MFRC522::PICC_TYPE_MIFARE_MINI ) || + (mifareType == MFRC522::PICC_TYPE_MIFARE_1K ) || + (mifareType == MFRC522::PICC_TYPE_MIFARE_4K ) ) + { + Serial.println(F("Authenticating again using key B...")); + status = mfrc522.PCD_Authenticate( + MFRC522::PICC_CMD_MF_AUTH_KEY_B, trailerBlock, &key, &(mfrc522.uid)); + } + else if (mifareType == MFRC522::PICC_TYPE_MIFARE_UL ) + { + byte pACK[] = {0, 0}; //16 bit PassWord ACK returned by the NFCtag + + // Authenticate using key A + Serial.println(F("Authenticating UL...")); + status = mfrc522.PCD_NTAG216_AUTH(key.keyByte, pACK); + } + if (status != MFRC522::STATUS_OK) { Serial.print(F("PCD_Authenticate() failed: ")); Serial.println(mfrc522.GetStatusCodeName(status)); @@ -1028,7 +1099,35 @@ void writeCard(nfcTagObject nfcTag) { Serial.println(F(" ...")); dump_byte_array(buffer, 16); Serial.println(); - status = (MFRC522::StatusCode)mfrc522.MIFARE_Write(blockAddr, buffer, 16); + + if ((mifareType == MFRC522::PICC_TYPE_MIFARE_MINI ) || + (mifareType == MFRC522::PICC_TYPE_MIFARE_1K ) || + (mifareType == MFRC522::PICC_TYPE_MIFARE_4K ) ) + { + status = (MFRC522::StatusCode)mfrc522.MIFARE_Write(blockAddr, buffer, 16); + } + else if (mifareType == MFRC522::PICC_TYPE_MIFARE_UL ) + { + byte buffer2[16]; + byte size2 = sizeof(buffer2); + + memset(buffer2, 0, size2); + memcpy(buffer2, buffer, 4); + status = (MFRC522::StatusCode)mfrc522.MIFARE_Write(8, buffer2, 16); + + memset(buffer2, 0, size2); + memcpy(buffer2, buffer + 4, 4); + status = (MFRC522::StatusCode)mfrc522.MIFARE_Write(9, buffer2, 16); + + memset(buffer2, 0, size2); + memcpy(buffer2, buffer + 8, 4); + status = (MFRC522::StatusCode)mfrc522.MIFARE_Write(10, buffer2, 16); + + memset(buffer2, 0, size2); + memcpy(buffer2, buffer + 12, 4); + status = (MFRC522::StatusCode)mfrc522.MIFARE_Write(11, buffer2, 16); + } + if (status != MFRC522::STATUS_OK) { Serial.print(F("MIFARE_Write() failed: ")); Serial.println(mfrc522.GetStatusCodeName(status)); @@ -1041,6 +1140,7 @@ void writeCard(nfcTagObject nfcTag) { } + /** Helper routine to dump a byte array as hex values to Serial. */