</intent-filter>
</activity>
- <receiver android:name=".Autostart">
- <intent-filter>
- <action android:name="android.intent.action.USER_PRESENT" />
- </intent-filter>
- </receiver>
- <receiver android:name=".Autostop">
- <intent-filter>
- <action android:name="android.intent.action.SCREEN_OFF" />
- </intent-filter>
- </receiver>
-
- <service android:name=".Check"
- android:label="@string/app_name">
- </service>
+ <activity android:name=".TagEvent"
+ android:label="@string/app_name">
+ </activity>
</application>
</manifest>
+++ /dev/null
-package org.average.nfcauthcr;
-
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.util.Log;
-
-import org.average.nfcauthcr.TagEvent;
-
-public class Autostart extends BroadcastReceiver {
-
- final String TAG = getClass().getName();
-
- @Override
- public void onReceive(Context context, Intent intent) {
- Log.v(TAG, "Autostart called");
- Intent i = new Intent(context, TagEvent.class);
- i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- context.startService(i);
- }
-}
+++ /dev/null
-package org.average.nfcauthcr;
-
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.util.Log;
-
-import org.average.nfcauthcr.TagEvent;
-
-public class Autostop extends BroadcastReceiver {
-
- final String TAG = getClass().getName();
-
- @Override
- public void onReceive(Context context, Intent intent) {
- Log.v(TAG, "Autostop called");
- Intent i = new Intent(context, TagEvent.class);
- context.stopService(i);
- }
-}
private static boolean waitingForResult = false;
private static SharedPreferences prefs;
private static int slot;
- private AlertDialog swipeDialog;
@Override
protected void onCreate(Bundle savedInstanceState)
@Override
protected void onPause() {
super.onPause();
- Log.v(TAG, "Going inactive, try to stop");
- if (!waitingForResult) { finish(); }
}
@Override
Intent intent) {
Log.v(TAG, "Got activity result");
waitingForResult = false;
- if(swipeDialog != null) {
- swipeDialog.dismiss();
- swipeDialog = null;
- }
if (resultCode != RESULT_OK) {
Log.v(TAG, "Error result code " + resultCode);
rng.nextBytes(challenge);
Log.v(TAG, "Random challenge: " + hex(challenge));
Intent crIntent = new Intent(this, TagEvent.class);
- crIntent.putExtra("slot", slot);
+ crIntent.putExtra("yubikey_neo_slot", slot);
crIntent.putExtra("challenge", challenge);
- this.startActivityForResult(crIntent, 0);
waitingForResult = true;
- if (swipeDialog != null) swipeDialog.dismiss();
- swipeDialog = makeDialog();
- swipeDialog.show();
- }
-
- private AlertDialog makeDialog() {
- AlertDialog.Builder builder = new AlertDialog.Builder(this);
- builder.setTitle(R.string.challenging);
- builder.setMessage(R.string.swipe);
- builder.setOnCancelListener(
- new DialogInterface.OnCancelListener() {
- public void onCancel(DialogInterface dialog) {
- Log.v(TAG, "unbind service FIXME");
- }
- });
- return builder.create();
+ this.startActivityForResult(crIntent, 0);
}
private String hex(byte[] a) {
--- /dev/null
+package org.average.nfcauthcr;
+
+import android.app.Activity;
+import android.app.PendingIntent;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.nfc.NfcAdapter;
+import android.nfc.Tag;
+import android.nfc.TagLostException;
+import android.nfc.tech.IsoDep;
+import android.util.Log;
+import android.widget.Toast;
+
+import org.average.nfcauthcr.YkNeo;
+import org.average.nfcauthcr.CRException;
+
+public class NfcCRdispatch {
+
+ private final String TAG = getClass().getName();
+
+ private Activity activity = null;
+ private PendingIntent tagIntent = null;
+ private byte[] challenge;
+
+ NfcCRdispatch(Activity activity) {
+ Log.v(TAG, "new NfcCRdispatch, activity=" + activity);
+ this.activity = activity;
+ }
+
+ public byte[] onNewIntent(Intent intent) {
+ Log.v(TAG, "NFC Intent arrived");
+ Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
+ if (tag == null) return null;
+ IsoDep isoTag = IsoDep.get(tag);
+ try {
+ int slot = intent.getIntExtra("yubikey_neo_slot", -1);
+ return YkNeo.doChalResp(isoTag, slot, challenge);
+ } catch (CRException e) {
+ Log.v(TAG, e.getMessage());
+ Toast.makeText(activity, e.getMessage(),
+ Toast.LENGTH_LONG).show();
+ return null;
+ }
+ }
+
+ public void onResume(byte[] challenge) {
+ this.challenge = challenge;
+ Intent intent = activity.getIntent();
+ intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
+ tagIntent = PendingIntent.getActivity(activity, 0, intent, 0);
+ IntentFilter iso =
+ new IntentFilter(NfcAdapter.ACTION_TECH_DISCOVERED);
+ String[] techs =
+ new String[] {IsoDep.class.getName()};
+ NfcAdapter adapter = NfcAdapter.getDefaultAdapter(activity);
+ if (adapter == null) {
+ Toast.makeText(activity, R.string.no_nfc,
+ Toast.LENGTH_LONG).show();
+ return;
+ }
+ if (!adapter.isEnabled()) {
+ Toast.makeText(activity, R.string.nfc_disabled,
+ Toast.LENGTH_LONG).show();
+ return;
+ }
+ adapter.enableForegroundDispatch(activity, tagIntent,
+ new IntentFilter[] {iso},
+ new String[][] {techs});
+ }
+
+ public void onPause() {
+ if (tagIntent != null) {
+ tagIntent.cancel();
+ tagIntent = null;
+ }
+ NfcAdapter adapter = NfcAdapter.getDefaultAdapter(activity);
+ if (adapter != null) {
+ adapter.disableForegroundDispatch(activity);
+ }
+ }
+}
import android.util.Log;
import android.widget.Toast;
-import org.average.nfcauthcr.YkNeo;
-import org.average.nfcauthcr.CRException;
+import org.average.nfcauthcr.NfcCRdispatch;
public class TagEvent extends Activity {
private final String TAG = getClass().getName();
- private PendingIntent tagIntent;
+ private NfcCRdispatch dispatch = new NfcCRdispatch((Activity)this);
@Override
protected void onResume() {
super.onResume();
Log.v(TAG, "Starting the work");
+ new AlertDialog.Builder(this)
+ .setTitle(R.string.challenging)
+ .setMessage(R.string.swipe)
+ .setOnCancelListener(
+ new DialogInterface.OnCancelListener() {
+ public void onCancel(DialogInterface dialog) {
+ Log.v(TAG, "Cancel");
+ finish();
+ }
+ })
+ .create().show();
+
Intent intent = getIntent();
setResult(RESULT_CANCELED);
- int slot = intent.getIntExtra("slot", -1);
- if (slot > 0) {
- enableDispatch(slot);
- }
+ byte[] challenge = intent.getByteArrayExtra("challenge");
+ dispatch.onResume(challenge);
}
@Override
super.onPause();
Log.v(TAG, "Finished the work");
- disableDispatch();
+ dispatch.onPause();
}
- public void onNewIntent(Intent intent) {
+ public void onNewIntent(Intent newintent) {
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 {
- byte[] response = YkNeo.doChallengeYubiKey(
- isoTag, slot, challenge);
- Intent data = getIntent();
- data.putExtra("response", response);
- setResult(RESULT_OK, data);
- } catch (CRException e) {
- Log.v(TAG, e.getMessage());
- Toast.makeText(this, e.getMessage(),
- Toast.LENGTH_LONG).show();
- }
- finish();
- }
-
-/*
-<receiver android:name=".IsoDepReceiver"
- android:label="IsoDepReceiver">
- <intent-filter>
- <action android:name="android.nfc.action.TECH_DISCOVERED" />
- </intent-filter>
-
- <meta-data android:name="android.nfc.action.TECH_DISCOVERED"
- android:resource="@xml/filter_nfc"
- />
- </receiver>
-
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- capture anything using IsoDep -->
- <tech-list>
- <tech>android.nfc.tech.IsoDep</tech>
- </tech-list>
- </resources>
-*/
-
- private void enableDispatch(int slot) {
- Intent intent = getIntent();
- intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
- intent.putExtra("slot", slot);
- tagIntent = PendingIntent.getActivity(this, 0, intent, 0);
- IntentFilter iso =
- new IntentFilter(NfcAdapter.ACTION_TECH_DISCOVERED);
- NfcAdapter adapter = NfcAdapter.getDefaultAdapter(this);
- if (adapter == null) {
- Toast.makeText(this, R.string.no_nfc,
- Toast.LENGTH_LONG).show();
- finish();
- }
- if (! adapter.isEnabled()) {
- Toast.makeText(this, R.string.nfc_disabled,
- Toast.LENGTH_LONG).show();
+ byte[] response = dispatch.onNewIntent(newintent);
+ if (response != null) {
+ Intent masterintent = getIntent();
+ masterintent.putExtra("response", response);
+ setResult(RESULT_OK, masterintent);
finish();
}
- adapter.enableForegroundDispatch(
- this, tagIntent, new IntentFilter[] {iso},
- new String[][] {new String[] {IsoDep.class.getName()}});
- }
-
- private void disableDispatch() {
- if (tagIntent != null) {
- tagIntent.cancel();
- tagIntent = null;
- }
- NfcAdapter adapter = NfcAdapter.getDefaultAdapter(this);
- if (adapter != null) {
- adapter.disableForegroundDispatch(this);
- }
}
}
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)
- throws CRException {
+ public static byte[] doChalResp(IsoDep isoTag, int slot,
+ byte[] challenge) throws CRException {
try {
isoTag.connect();
byte[] resp = isoTag.transceive(selectApdu);