import java.io.IOException;
-import android.os.Bundle;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.PendingIntent;
import android.util.Log;
import android.widget.Toast;
+import org.average.nfcauthcr.NFCAuthCRYubiNeo;
+
public class NFCAuthCRCheck extends Activity {
private final String TAG = getClass().getName();
Log.v(TAG, "Starting the work");
Intent intent = getIntent();
- Bundle extras = intent.getExtras();
setResult(RESULT_CANCELED);
- if(swipeDialog != null) {
+ if (swipeDialog != null) {
swipeDialog.dismiss();
swipeDialog = null;
}
- if(extras != null) {
- int slot = extras.getInt("slot");
- if (slot > 0) {
- swipeDialog = makeDialog();
- swipeDialog.show();
- enableDispatch(slot);
- }
+ int slot = intent.getIntExtra("slot", -1);
+ if (slot > 0) {
+ swipeDialog = makeDialog();
+ swipeDialog.show();
+ enableDispatch(slot);
}
}
public void onNewIntent(Intent intent) {
Log.v(TAG, "NFC Intent arrived");
int slot = intent.getIntExtra("slot", -1);
+ byte[] challenge = intent.getByteArrayExtra("challenge");
if (slot <= 0) return;
Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
if (tag == null) return;
IsoDep isoTag = IsoDep.get(tag);
- try {
- isoTag.connect();
- byte[] resp = isoTag.transceive(selectCommand);
- int length = resp.length;
- if (resp[length - 2] == (byte)0x90 &&
- resp[length - 1] == 0x00) {
- doChallengeYubiKey(isoTag, slot);
- } else {
- Toast.makeText(this, R.string.tag_error,
- Toast.LENGTH_LONG).show();
- }
- } catch (TagLostException e) {
- Toast.makeText(this,
- R.string.tag_lost, Toast.LENGTH_LONG).show();
- } catch (IOException e) {
- Toast.makeText(this,
- getText(R.string.tag_error) +
- e.getMessage(),
- Toast.LENGTH_LONG).show();
+ byte[] response = doChallengeYubiKey(isoTag, slot, challenge);
+ if (response != null) {
+ Intent data = getIntent();
+ data.putExtra("response", response);
+ setResult(RESULT_OK, data);
}
finish();
}
}
}
- private void doChallengeYubiKey(IsoDep isoTag, int slot)
- throws IOException {
- Intent data = getIntent();
- data.putExtra("response","<FIXME>real data here");
- setResult(RESULT_OK, data);
+ private byte[] doChallengeYubiKey(IsoDep isoTag, int slot,
+ byte[] challenge) {
+ try {
+ isoTag.connect();
+ byte[] resp = isoTag.transceive(selectCommand);
+ int length = resp.length;
+ if (resp[length - 2] == (byte)0x90 &&
+ resp[length - 1] == 0x00) {
+ return challenge;
+ } else {
+ Toast.makeText(this, R.string.tag_error,
+ Toast.LENGTH_LONG).show();
+ }
+ } catch (TagLostException e) {
+ Toast.makeText(this,
+ R.string.tag_lost, Toast.LENGTH_LONG).show();
+ } catch (IOException e) {
+ Toast.makeText(this,
+ getText(R.string.tag_error) +
+ e.getMessage(),
+ Toast.LENGTH_LONG).show();
+ }
+ return null;
}
}
package org.average.nfcauthcr;
+import java.util.Random;
+
import android.os.Bundle;
import android.app.Activity;
import android.app.AlertDialog;
public void onEnrollClicked(View view) {
Log.v(TAG, "Enroll clicked");
if (slot > 0) {
- runChallenge(slot);
+ runEnrollment(slot);
} else {
showEnrollResult("Must specify which slot to use");
}
Intent intent) {
Log.v(TAG, "Got activity result");
waitingForResult = false;
- if (resultCode == RESULT_OK) {
- String res = intent.getStringExtra("response");
- Log.v(TAG, "Response is \"" + res + "\"");
- } else {
+
+ if (resultCode != RESULT_OK) {
Log.v(TAG, "Error result code " + resultCode);
+ return;
}
+ byte[] challenge = intent.getByteArrayExtra("challenge");
+ Log.v(TAG, "Challenge is \"" + hex(challenge) + "\"");
+ byte[] response = intent.getByteArrayExtra("response");
+ Log.v(TAG, "Response is \"" + hex(response) + "\"");
}
private void showEnrollResult(final String msg) {
dialog.show();
}
- private void runChallenge(int slot) {
+ private void runEnrollment(int slot) {
+ Random rng = new Random();
+ byte[] challenge = new byte[63];
+ rng.nextBytes(challenge);
+ Log.v(TAG, "Random challenge: " + hex(challenge));
Log.v(TAG, "Launching challenging activity");
Intent crIntent = new Intent(this, NFCAuthCRCheck.class);
crIntent.putExtra("slot", slot);
+ crIntent.putExtra("challenge", challenge);
this.startActivityForResult(crIntent, 0);
waitingForResult = true;
}
+
+ private String hex(byte[] a) {
+ StringBuilder sb = new StringBuilder();
+ if (a == null) return "<null>";
+ for (byte b: a) sb.append(String.format("%02x", b&0xff));
+ return sb.toString();
+ }
}