X-Git-Url: http://average.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Forg%2Faverage%2Fnfcauthcr%2FNFCAuthCRYubiNeo.java;fp=src%2Forg%2Faverage%2Fnfcauthcr%2FNFCAuthCRYubiNeo.java;h=67596e603993d481cc226da9c54dba4495e40d39;hb=bdfe828f712fa2a187a424923c6594f12e965a5d;hp=0000000000000000000000000000000000000000;hpb=d68162938933f84fdde11f7a4ae5b919ccc469a1;p=YkNeoCR.git diff --git a/src/org/average/nfcauthcr/NFCAuthCRYubiNeo.java b/src/org/average/nfcauthcr/NFCAuthCRYubiNeo.java new file mode 100644 index 0000000..67596e6 --- /dev/null +++ b/src/org/average/nfcauthcr/NFCAuthCRYubiNeo.java @@ -0,0 +1,83 @@ +package org.average.nfcauthcr; + +import java.io.IOException; +import java.util.Arrays; + +import android.nfc.NfcAdapter; +import android.nfc.Tag; +import android.nfc.TagLostException; +import android.nfc.tech.IsoDep; +import android.util.Log; + +import org.average.nfcauthcr.NFCAuthCRYubiNeo; + +public class NFCAuthCRYubiNeo { + + private static final String TAG = "NFCAuthCRYubiNeo"; + + // Is it CCID APDU? ISO 7816-4? + + // 00 A4 04 00 xx AID - GlobalPlatform - SELECT + // Le send data = 07: A0 00 00 05 27 20 01 + // Le recv data = 00 + private static final byte[] selectCommand = + {0x00, (byte) 0xA4, 0x04, 0x00, 0x07, (byte) 0xA0, + 0x00, 0x00, 0x05, 0x27, 0x20, 0x01, 0x00}; + + private static final byte[] crCommand = + {0x00, 0x01, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00}; + + private static final byte SLOT_CHAL_HMAC1 = 0x30; + private static final byte SLOT_CHAL_HMAC2 = 0x38; + + public static final byte[] doChallengeYubiKey(IsoDep isoTag, int slot, + byte[] challenge) { + try { + isoTag.connect(); + byte[] resp = isoTag.transceive(selectCommand); + 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; + } + byte[] apdu = new byte[69]; + apdu[0] = 0x00; // CLA + apdu[1] = 0x01; // INS + switch (slot) { + case 1: apdu[2] = SLOT_CHAL_HMAC1; break; // P1 + case 2: apdu[2] = SLOT_CHAL_HMAC2; break; // P1 + } + apdu[3] = 0x00; // P2 + apdu[4] = 63; // Lc + System.arraycopy(challenge, 0, apdu, 5, + challenge.length); + apdu[apdu.length-1] = 22; + resp = isoTag.transceive(apdu); + 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; + } + 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(); + } catch (IOException e) { + Log.v(TAG, e.getMessage()); + //Toast.makeText(this, + // getText(R.string.tag_error) + + // e.getMessage(), + // Toast.LENGTH_LONG).show(); + } + return null; + } +}