import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.content.DialogInterface;
+import android.text.Html;
import android.util.Log;
import android.view.View;
+import android.widget.TextView;
import android.widget.RadioButton;
import org.average.ykneocr.QueryCrToken;
protected void onResume() {
super.onResume();
setContentView(R.layout.main);
+ TextView tv = (TextView)findViewById(R.id.info);
+ tv.setText(Html.fromHtml(getString(R.string.info)));
slot = prefs.getInt("slot_number", -1);
Log.v(TAG, "found saved slot value " + slot);
RadioButton btn = null;
super.onResume();
Log.v(TAG, "Starting the work");
+ setResult(RESULT_CANCELED);
+ int slot = prefs.getInt("slot_number", -1);
+ if (slot != 1 && slot != 2) {
+ Log.e(TAG, "Slot " + slot + " cannot be used");
+ Toast.makeText(this, R.string.need_slot,
+ Toast.LENGTH_LONG).show();
+ finish();
+ }
new AlertDialog.Builder(this)
.setTitle(R.string.challenging)
.setMessage(R.string.swipe)
Intent intent = getIntent();
ArrayList<String> challenge =
intent.getStringArrayListExtra("challenge");
- int slot = prefs.getInt("slot_number", -1);
intent.putExtra("yubikey_neo_slot", slot);
- setResult(RESULT_CANCELED);
if (challenge != null) {
dispatch.onResume(challenge);
} else {
import java.lang.String;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Iterator;
import android.nfc.NfcAdapter;
import android.nfc.Tag;
public static ArrayList<String> doChalResp(IsoDep isoTag, int slot,
ArrayList<String> cset)
throws IOException, CRException {
- byte[] challenge = unhex(cset.get(0));
- if (challenge.length > 127) {
- throw new CRException(String.format(
- "NFC challenge size too big: %d",
- challenge.length));
- }
if (slot != 1 && slot != 2) {
throw new CRException(String.format(
"NFC Yubikey slot is %d, can be 1 or 2",
"NFC select error code: %02x:%02x",
resp[length - 2], resp[length - 1]));
}
- byte[] crApdu = new byte[6+challenge.length];
- crApdu[0] = 0x00; // CLA
- crApdu[1] = 0x01; // INS
- switch (slot) {
- case 1: crApdu[2] = SLOT_CHAL_HMAC1; break; // P1
- case 2: crApdu[2] = SLOT_CHAL_HMAC2; break; // P1
- }
- crApdu[3] = 0x00; // P2
- crApdu[4] = (byte)challenge.length; // Lc
- System.arraycopy(challenge, 0, crApdu, 5,
- challenge.length); // Payload
- crApdu[5+challenge.length] = 22; // Le
- resp = isoTag.transceive(crApdu);
- length = resp.length;
- if (resp[length - 2] != (byte)0x90 ||
- resp[length - 1] != 0x00) {
- throw new CRException(String.format(
- "NFC CR error code: %02x:%02x",
- resp[length - 2], resp[length - 1]));
- }
- if (length <= 2) {
- throw new CRException(String.format(
- "NFC wrong response size: only %d bytes",
- length-2));
- }
ArrayList<String> rset = new ArrayList<String>();
- rset.add(hex(Arrays.copyOf(resp, length-2)));
+
+ Iterator itr = cset.iterator();
+ while (itr.hasNext()) {
+ byte[] challenge = unhex((String)itr.next());
+ if (challenge.length > 127) {
+ throw new CRException(String.format(
+ "NFC challenge size too big: %d",
+ challenge.length));
+ }
+ byte[] crApdu = new byte[6+challenge.length];
+ crApdu[0] = 0x00; // CLA
+ crApdu[1] = 0x01; // INS
+ switch (slot) {
+ case 1: crApdu[2] = SLOT_CHAL_HMAC1; break; // P1
+ case 2: crApdu[2] = SLOT_CHAL_HMAC2; break; // P1
+ }
+ crApdu[3] = 0x00; // P2
+ crApdu[4] = (byte)challenge.length; // Lc
+ System.arraycopy(challenge, 0, crApdu, 5,
+ challenge.length); // Payload
+ crApdu[5+challenge.length] = 22; // Le
+ resp = isoTag.transceive(crApdu);
+ length = resp.length;
+ if (resp[length - 2] != (byte)0x90 ||
+ resp[length - 1] != 0x00) {
+ throw new CRException(String.format(
+ "NFC CR error code: %02x:%02x",
+ resp[length - 2], resp[length - 1]));
+ }
+ if (length <= 2) {
+ throw new CRException(String.format(
+ "NFC wrong response size: only %d bytes",
+ length-2));
+ }
+ rset.add(hex(Arrays.copyOf(resp, length-2)));
+ }
+
return rset;
}