protected void MifareAuthenticate(byte command, byte blockNumber, Uid uid, byte[] key) { // Put reader in Idle mode WriteRegister(Registers.Command, PcdCommands.Idle); // Clear the FIFO SetRegisterBits(Registers.FifoLevel, 0x80); // Create Authentication packet var data = new byte[12]; data[0] = command; data[1] = (byte)(blockNumber & 0xFF); key.CopyTo(data, 2); uid.Bytes.CopyTo(data, 8); WriteToFifo(data); // Put reader in MfAuthent mode WriteRegister(Registers.Command, PcdCommands.MifareAuthenticate); // Wait for (a generous) 25 ms System.Threading.Tasks.Task.Delay(25).Wait(); }
internal byte[] ReadBlock(byte blockNumber, Uid uid, byte[] keyA = null, byte[] keyB = null) { if (keyA != null) MifareAuthenticate(PiccCommands.AuthenticateKeyA, blockNumber, uid, keyA); else if (keyB != null) MifareAuthenticate(PiccCommands.AuthenticateKeyB, blockNumber, uid, keyB); else return null; // Read block Transceive(true, PiccCommands.Read, blockNumber); return ReadFromFifo(16); }
internal bool WriteBlock(byte blockNumber, Uid uid, byte[] data, byte[] keyA = null, byte[] keyB = null) { if (keyA != null) MifareAuthenticate(PiccCommands.AuthenticateKeyA, blockNumber, uid, keyA); else if (keyB != null) MifareAuthenticate(PiccCommands.AuthenticateKeyB, blockNumber, uid, keyB); else return false; // Write block Transceive(true, PiccCommands.Write, blockNumber); if (ReadFromFifo() != PiccResponses.Acknowledge) return false; // Make sure we write only 16 bytes var buffer = new byte[16]; data.CopyTo(buffer, 0); Transceive(true, buffer); return ReadFromFifo() == PiccResponses.Acknowledge; }
public bool SelectTag(Uid uid) { // Send Select command to tag var data = new byte[7]; data[0] = PiccCommands.Select_1; data[1] = PiccCommands.Select_2; uid.FullUid.CopyTo(data, 2); Transceive(true, data); return GetFifoLevel() == 1 && ReadFromFifo() == PiccResponses.SelectAcknowledge; }