ReadLazoFullKeyA.ino 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. /**
  2. * Typical pin layout used:
  3. * -----------------------------------------------------------------------------------------
  4. * MFRC522 Arduino Arduino Arduino Arduino Arduino
  5. * Reader/PCD Uno/101 Mega Nano v3 Leonardo/Micro Pro Micro
  6. * Signal Pin Pin Pin Pin Pin Pin
  7. * -----------------------------------------------------------------------------------------
  8. * RST/Reset RST 9 5 D9 RESET/ICSP-5 RST
  9. * SPI SS SDA(SS) 10 53 D10 10 10
  10. * SPI MOSI MOSI 11 / ICSP-4 51 D11 ICSP-4 16
  11. * SPI MISO MISO 12 / ICSP-1 50 D12 ICSP-1 14
  12. * SPI SCK SCK 13 / ICSP-3 52 D13 ICSP-3 15
  13. *
  14. * For arduino uno
  15. */
  16. #include <SPI.h>
  17. #include <MFRC522.h>
  18. #define RST_PIN 9
  19. #define SS_PIN 10
  20. MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance.
  21. MFRC522::MIFARE_Key keyB;
  22. MFRC522::MIFARE_Key keyA;
  23. byte LazoAKeys[64][6] = {
  24. { 0x4E, 0x30, 0x3D, 0x40, 0x2F, 0x20 },
  25. { 0x4E, 0x30, 0x3D, 0x40, 0x2F, 0x20 },
  26. { 0x4E, 0x30, 0x3D, 0x40, 0x2F, 0x20 },
  27. { 0x4E, 0x30, 0x3D, 0x40, 0x2F, 0x20 },
  28. { 0x4E, 0x30, 0x3D, 0x40, 0x2F, 0x20 },
  29. { 0x4E, 0x30, 0x3D, 0x40, 0x2F, 0x20 },
  30. { 0x4E, 0x30, 0x3D, 0x40, 0x2F, 0x20 },
  31. { 0x4E, 0x30, 0x3D, 0x40, 0x2F, 0x20 },
  32. { 0x4E, 0x30, 0x3D, 0x40, 0x2F, 0x20 },
  33. { 0x4E, 0x30, 0x3D, 0x40, 0x2F, 0x20 },
  34. { 0x4E, 0x30, 0x3D, 0x40, 0x2F, 0x20 },
  35. { 0x4E, 0x30, 0x3D, 0x40, 0x2F, 0x20 },
  36. { 0x4E, 0x30, 0x3D, 0x40, 0x2F, 0x20 },
  37. { 0x4E, 0x30, 0x3D, 0x40, 0x2F, 0x20 },
  38. { 0x4E, 0x30, 0x3D, 0x40, 0x2F, 0x20 },
  39. { 0x4E, 0x30, 0x3D, 0x40, 0x2F, 0x20 },
  40. { 0x4E, 0x30, 0x3D, 0x40, 0x2F, 0x20 },
  41. { 0x4E, 0x30, 0x3D, 0x40, 0x2F, 0x20 },
  42. { 0x4E, 0x30, 0x3D, 0x40, 0x2F, 0x20 },
  43. { 0x4E, 0x30, 0x3D, 0x40, 0x2F, 0x20 },
  44. { 0x4E, 0x30, 0x3D, 0x40, 0x2F, 0x20 },
  45. { 0x4E, 0x30, 0x3D, 0x40, 0x2F, 0x20 },
  46. { 0x4E, 0x30, 0x3D, 0x40, 0x2F, 0x20 },
  47. { 0x4E, 0x30, 0x3D, 0x40, 0x2F, 0x20 },
  48. { 0x4E, 0x30, 0x3D, 0x40, 0x2F, 0x20 },
  49. { 0x4E, 0x30, 0x3D, 0x40, 0x2F, 0x20 },
  50. { 0x4E, 0x30, 0x3D, 0x40, 0x2F, 0x20 },
  51. { 0x4E, 0x30, 0x3D, 0x40, 0x2F, 0x20 },
  52. { 0x4E, 0x30, 0x3D, 0x40, 0x2F, 0x20 },
  53. { 0x4E, 0x30, 0x3D, 0x40, 0x2F, 0x20 },
  54. { 0x4E, 0x30, 0x3D, 0x40, 0x2F, 0x20 },
  55. { 0x4E, 0x30, 0x3D, 0x40, 0x2F, 0x20 },
  56. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
  57. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
  58. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
  59. { 0x21, 0x6F, 0x5B, 0x21, 0x2A, 0x7A },
  60. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
  61. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
  62. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
  63. { 0x51, 0x48, 0x75, 0x5C, 0x34, 0x27 },
  64. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
  65. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
  66. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
  67. { 0x5C, 0x7A, 0x37, 0x5C, 0x29, 0x5A },
  68. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
  69. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
  70. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
  71. { 0x52, 0x46, 0x61, 0x2E, 0x7C, 0x4B },
  72. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
  73. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
  74. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
  75. { 0x35, 0x4B, 0x39, 0x45, 0x48, 0x61 },
  76. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
  77. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
  78. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
  79. { 0x45, 0x5D, 0x73, 0x2C, 0x38, 0x5F },
  80. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
  81. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
  82. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
  83. { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
  84. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
  85. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
  86. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
  87. { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }
  88. };
  89. /**
  90. * Initialize.
  91. */
  92. void setup() {
  93. Serial.begin(9600); // Initialize serial communications with the PC
  94. while (!Serial)
  95. ; // Do nothing if no serial port is opened (added for Arduinos based on ATMEGA32U4)
  96. SPI.begin(); // Init SPI bus
  97. mfrc522.PCD_Init(); // Init MFRC522 card
  98. // Prepare the key (used both as key A and as key B)
  99. // using FFFFFFFFFFFFh which is the default at chip delivery from the factory
  100. Serial.println(F("Scan a MIFARE Classic PICC to demonstrate read and write."));
  101. Serial.print(F("Using key (for A and B):"));
  102. dump_byte_array(keyB.keyByte, MFRC522::MF_KEY_SIZE);
  103. Serial.println();
  104. Serial.println(F("BEWARE: Data will be written to the PICC, in sector #1"));
  105. }
  106. /**
  107. * Main loop.
  108. */
  109. void loop() {
  110. // Look for new cards
  111. if (!mfrc522.PICC_IsNewCardPresent())
  112. return;
  113. // Select one of the cards
  114. if (!mfrc522.PICC_ReadCardSerial())
  115. return;
  116. // Show some details of the PICC (that is: the tag/card)
  117. Serial.print(F("Card UID:"));
  118. dump_byte_array(mfrc522.uid.uidByte, mfrc522.uid.size);
  119. Serial.println();
  120. Serial.print(F("PICC type: "));
  121. MFRC522::PICC_Type piccType = mfrc522.PICC_GetType(mfrc522.uid.sak);
  122. Serial.println(mfrc522.PICC_GetTypeName(piccType));
  123. // Check for compatibility
  124. if (piccType != MFRC522::PICC_TYPE_MIFARE_MINI
  125. && piccType != MFRC522::PICC_TYPE_MIFARE_1K
  126. && piccType != MFRC522::PICC_TYPE_MIFARE_4K) {
  127. Serial.println(F("This sample only works with MIFARE Classic cards."));
  128. return;
  129. }
  130. if (piccType == MFRC522::PICC_TYPE_MIFARE_1K) {
  131. Serial.println(F("Type: mifare classic 1K"));
  132. keyA.keyByte[0] = 0x04;
  133. keyA.keyByte[1] = 0x00;
  134. keyA.keyByte[2] = 0x0C;
  135. keyA.keyByte[3] = 0x0F;
  136. keyA.keyByte[4] = 0x09;
  137. keyA.keyByte[5] = 0x03;
  138. keyB.keyByte[0] = 0x04;
  139. keyB.keyByte[1] = 0x00;
  140. keyB.keyByte[2] = 0x0C;
  141. keyB.keyByte[3] = 0x0F;
  142. keyB.keyByte[4] = 0x09;
  143. keyB.keyByte[5] = 0x03;
  144. }
  145. if (piccType == MFRC522::PICC_TYPE_MIFARE_4K) {
  146. Serial.println(F("Type: mifare classic 4K"));
  147. //keyA.keyByte[0] = 0x4E;
  148. //keyA.keyByte[1] = 0x30;
  149. //keyA.keyByte[2] = 0x3D;
  150. //keyA.keyByte[3] = 0x40;
  151. //keyA.keyByte[4] = 0x2F;
  152. //keyA.keyByte[5] = 0x20;
  153. keyB.keyByte[0] = 0x24;
  154. keyB.keyByte[1] = 0x33;
  155. keyB.keyByte[2] = 0x72;
  156. keyB.keyByte[3] = 0x40;
  157. keyB.keyByte[4] = 0x7C;
  158. keyB.keyByte[5] = 0x2E;
  159. }
  160. // In this sample we use the second sector,
  161. // that is: sector #1, covering block #4 up to and including block #7
  162. MFRC522::StatusCode status;
  163. byte buffer[18];
  164. byte size = sizeof(buffer);
  165. // Authenticate using key A
  166. //Serial.println(F("Authenticating using key B..."));
  167. //status = (MFRC522::StatusCode)mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_B, trailerBlock, &keyB, &(mfrc522.uid));
  168. //if (status != MFRC522::STATUS_OK) {
  169. // Serial.print(F("PCD_Authenticate() failed en auth B: "));
  170. // Serial.println(mfrc522.GetStatusCodeName(status));
  171. //}
  172. //Serial.println(F("Autenticado con clave B "));
  173. for (int sector = 15; sector >= 0; sector--) {
  174. if (sector == 11 || sector == 12 || sector == 13 || sector == 14 || sector == 15 ) {
  175. Serial.print(F("Unable to read:"));
  176. Serial.println(sector);
  177. } else {
  178. for (byte i = 0; i < 6; i++) {
  179. keyA.keyByte[i] = LazoAKeys[sector][i];
  180. }
  181. int trailerBlock = sector * 4 - 1;
  182. if (sector == 0){
  183. trailerBlock = 3;
  184. }
  185. status = (MFRC522::StatusCode)mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, trailerBlock, &keyA, &(mfrc522.uid));
  186. if (status != MFRC522::STATUS_OK) {
  187. Serial.print(F("PCD_Authenticate() failed in blcks: "));
  188. Serial.println(mfrc522.GetStatusCodeName(status));
  189. return;
  190. break;
  191. }
  192. if (status == MFRC522::STATUS_OK) {
  193. // Show the whole sector as it currently is
  194. mfrc522.PICC_DumpMifareClassicSectorToSerial(&(mfrc522.uid), &keyA, sector);
  195. Serial.println();
  196. // Halt PICC
  197. }
  198. }
  199. }
  200. mfrc522.PICC_HaltA();
  201. // Stop encryption on PCD
  202. mfrc522.PCD_StopCrypto1();
  203. }
  204. /**
  205. * Helper routine to dump a byte array as hex values to Serial.
  206. */
  207. void dump_byte_array(byte *buffer, byte bufferSize) {
  208. for (byte i = 0; i < bufferSize; i++) {
  209. Serial.print(buffer[i] < 0x10 ? " 0" : " ");
  210. Serial.print(buffer[i], HEX);
  211. }
  212. }