From 08e25747da20e399096a2e0c1c4afcce67898718 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Sch=C3=BCrmann?= Date: Sat, 22 Aug 2015 03:13:04 +0200 Subject: Fix crashes with Fluffys PGP applet --- .../keychain/pgp/PgpSecurityConstants.java | 2 +- .../keychain/ui/CreateKeyActivity.java | 10 ++++--- .../keychain/ui/NfcOperationActivity.java | 6 ++-- .../keychain/ui/base/BaseNfcActivity.java | 34 +++++++++++++--------- 4 files changed, 32 insertions(+), 20 deletions(-) (limited to 'OpenKeychain/src/main/java/org') diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpSecurityConstants.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpSecurityConstants.java index cbd8ce47a..ee7e3b3eb 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpSecurityConstants.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpSecurityConstants.java @@ -206,7 +206,7 @@ public class PgpSecurityConstants { * TODO: Ed25519 * CITE: zooko's hash function table CITE: distinguishers on SHA-256 */ - public static final int DEFAULT_HASH_ALGORITHM = HashAlgorithmTags.SHA512; + public static final int DEFAULT_HASH_ALGORITHM = HashAlgorithmTags.SHA256; public interface OpenKeychainHashAlgorithmTags extends HashAlgorithmTags { int USE_DEFAULT = -1; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyActivity.java index e56652d5f..bd355da19 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyActivity.java @@ -187,15 +187,17 @@ public class CreateKeyActivity extends BaseNfcActivity { } private boolean containsKeys(byte[] scannedFingerprints) { + if (scannedFingerprints == null) { + return false; + } + // If all fingerprint bytes are 0, the card contains no keys. - boolean cardContainsKeys = false; for (byte b : scannedFingerprints) { if (b != 0) { - cardContainsKeys = true; - break; + return true; } } - return cardContainsKeys; + return false; } @Override diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/NfcOperationActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/NfcOperationActivity.java index b811b218e..1ff87541a 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/NfcOperationActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/NfcOperationActivity.java @@ -294,9 +294,11 @@ public class NfcOperationActivity extends BaseNfcActivity { private boolean shouldPutKey(byte[] fingerprint, int idx) throws IOException { byte[] cardFingerprint = nfcGetFingerprint(idx); + // Slot is empty, or contains this key already. PUT KEY operation is safe - if (Arrays.equals(cardFingerprint, BLANK_FINGERPRINT) || - Arrays.equals(cardFingerprint, fingerprint)) { + if (cardFingerprint == null || + Arrays.equals(cardFingerprint, BLANK_FINGERPRINT) || + Arrays.equals(cardFingerprint, fingerprint)) { return true; } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/base/BaseNfcActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/base/BaseNfcActivity.java index 972421abe..813ed07fc 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/base/BaseNfcActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/base/BaseNfcActivity.java @@ -147,8 +147,6 @@ public abstract class BaseNfcActivity extends BaseActivity { protected Exception doInBackground(Void... params) { try { handleTagDiscoveredIntent(intent); - } catch (CardException e) { - return e; } catch (IOException e) { return e; } @@ -406,6 +404,10 @@ public abstract class BaseNfcActivity extends BaseActivity { // Connect to the detected tag, setting a couple of settings mIsoDep = IsoDep.get(detectedTag); + if (mIsoDep == null) { + // TODO: better exception? + throw new IOException("Tag does not support ISO-DEP (ISO 14443-4)!"); + } mIsoDep.setTimeout(TIMEOUT); // timeout is set to 100 seconds to avoid cancellation during calculation mIsoDep.connect(); @@ -496,6 +498,9 @@ public abstract class BaseNfcActivity extends BaseActivity { */ public byte[] nfcGetFingerprint(int idx) throws IOException { byte[] data = nfcGetFingerprints(); + if (data == null) { + return null; + } // return the master key fingerprint ByteBuffer fpbuf = ByteBuffer.wrap(data); @@ -507,14 +512,11 @@ public abstract class BaseNfcActivity extends BaseActivity { } public byte[] nfcGetAid() throws IOException { - String info = "00CA004F00"; return mIsoDep.transceive(Hex.decode(info)); - } public String nfcGetUserId() throws IOException { - String info = "00CA006500"; return nfcGetHolderName(nfcCommunicate(info)); } @@ -952,14 +954,20 @@ public abstract class BaseNfcActivity extends BaseActivity { } public String nfcGetHolderName(String name) { - String slength; - int ilength; - name = name.substring(6); - slength = name.substring(0, 2); - ilength = Integer.parseInt(slength, 16) * 2; - name = name.substring(2, ilength + 2); - name = (new String(Hex.decode(name))).replace('<', ' '); - return (name); + try { + String slength; + int ilength; + name = name.substring(6); + slength = name.substring(0, 2); + ilength = Integer.parseInt(slength, 16) * 2; + name = name.substring(2, ilength + 2); + name = (new String(Hex.decode(name))).replace('<', ' '); + return name; + } catch (IndexOutOfBoundsException e) { + Log.e(Constants.TAG, "couldn't get holder name", e); + // try-catch for https://github.com/FluffyKaon/OpenPGP-Card + return ""; + } } private String nfcGetDataField(String output) { -- cgit v1.2.3