package org.average.nfcauthcr;
+import java.lang.String;
import java.io.IOException;
import java.util.Arrays;
import android.nfc.Tag;
import android.nfc.TagLostException;
import android.nfc.tech.IsoDep;
-//import android.util.Log;
+
+import org.average.nfcauthcr.CRException;
public class YkNeo {
private static final byte SLOT_CHAL_HMAC2 = 0x38;
public static final byte[] doChallengeYubiKey(IsoDep isoTag, int slot,
- byte[] challenge) {
+ byte[] challenge)
+ throws CRException {
try {
isoTag.connect();
byte[] resp = isoTag.transceive(selectApdu);
int length = resp.length;
- //Log.v(TAG, "response to select length is " + length);
if (resp[length - 2] != (byte)0x90 ||
resp[length - 1] != 0x00) {
- //Log.v(TAG, "Wrong response to select");
- //Toast.makeText(this, R.string.tag_error,
- // Toast.LENGTH_LONG).show();
- return null;
+ throw new CRException(String.format(
+ "NFC select error code: %02x:%02x",
+ resp[length - 2], resp[length - 1]));
}
byte[] crApdu = new byte[69];
crApdu[0] = 0x00; // CLA
length = resp.length;
if (resp[length - 2] != (byte)0x90 ||
resp[length - 1] != 0x00) {
- //Log.v(TAG, "Wrong response to challenge");
- //Toast.makeText(this, R.string.tag_error,
- // Toast.LENGTH_LONG).show();
- return null;
+ throw new CRException(String.format(
+ "NFC CR error code: %02x:%02x",
+ resp[length - 2], resp[length - 1]));
+ }
+ if (length != 22) {
+ throw new CRException(String.format(
+ "NFC wrong response size: got %d, need 20",
+ length-2));
}
- //Log.v(TAG, "response to challenge length is " + length);
return Arrays.copyOf(resp, length-2);
} catch (TagLostException e) {
- //Log.v(TAG, e.getMessage());
- //Toast.makeText(this,
- // R.string.tag_lost, Toast.LENGTH_LONG).show();
+ throw new CRException("NFC connection lost", e);
} catch (IOException e) {
- //Log.v(TAG, e.getMessage());
- //Toast.makeText(this,
- // getText(R.string.tag_error) +
- // e.getMessage(),
- // Toast.LENGTH_LONG).show();
+ throw new CRException("NFC I/O: " + e.getMessage(), e);
}
- return null;
}
}