From b134223f91c8801d577cb72e92a37cb65fec717a Mon Sep 17 00:00:00 2001 From: Nick Pelly Date: Tue, 25 Jan 2011 07:45:07 -0800 Subject: [PATCH] Make Mifare Classic increment/decrement operands little endian Also make sure they are non-negative. This is not documented in Mifare Classic spec, but based on findings from NXP: - Operand should be stored in little-endian format in the transceive buffer - Tag ignores the sign bit on the operand, its effectively 31-bit unsigned - Overflow and underflow generates an error. Change-Id: Id3389b3894ded732c4b00d564ca53f5df651359e --- core/java/android/nfc/tech/MifareClassic.java | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/core/java/android/nfc/tech/MifareClassic.java b/core/java/android/nfc/tech/MifareClassic.java index 1b383f1168ef1..34fd7cf73a459 100644 --- a/core/java/android/nfc/tech/MifareClassic.java +++ b/core/java/android/nfc/tech/MifareClassic.java @@ -22,6 +22,7 @@ import android.os.RemoteException; import java.io.IOException; import java.nio.ByteBuffer; +import java.nio.ByteOrder; /** * Technology class representing MIFARE Classic tags (also known as MIFARE Standard). @@ -328,12 +329,14 @@ public final class MifareClassic extends BasicTagTechnology { */ public void increment(int blockIndex, int value) throws IOException { validateBlock(blockIndex); + validateValueOperand(value); checkConnected(); ByteBuffer cmd = ByteBuffer.allocate(6); + cmd.order(ByteOrder.LITTLE_ENDIAN); cmd.put( (byte) 0xC1 ); cmd.put( (byte) blockIndex ); - cmd.putInt(value); // ByteBuffer does the correct big endian translation + cmd.putInt(value); transceive(cmd.array(), false); } @@ -345,16 +348,24 @@ public final class MifareClassic extends BasicTagTechnology { */ public void decrement(int blockIndex, int value) throws IOException { validateBlock(blockIndex); + validateValueOperand(value); checkConnected(); ByteBuffer cmd = ByteBuffer.allocate(6); + cmd.order(ByteOrder.LITTLE_ENDIAN); cmd.put( (byte) 0xC0 ); cmd.put( (byte) blockIndex ); - cmd.putInt(value); // ByteBuffer does the correct big endian translation + cmd.putInt(value); transceive(cmd.array(), false); } + private void validateValueOperand(int value) { + if (value < 0) { + throw new IllegalArgumentException("value operand negative"); + } + } + /** * Copy from temporary memory to value block. * @param blockIndex