diff options
author | Dominik Schürmann <dominik@dominikschuermann.de> | 2015-08-22 03:13:04 +0200 |
---|---|---|
committer | Dominik Schürmann <dominik@dominikschuermann.de> | 2015-09-30 12:45:15 +0200 |
commit | 08e25747da20e399096a2e0c1c4afcce67898718 (patch) | |
tree | c401bc0bf18a90838e5461a5fc08ac31a342fb17 /OpenKeychain/src/main/java/org/sufficientlysecure/keychain | |
parent | 1d0e9bf60a958dce3ee4605dd08c660331e2d171 (diff) | |
download | open-keychain-08e25747da20e399096a2e0c1c4afcce67898718.tar.gz open-keychain-08e25747da20e399096a2e0c1c4afcce67898718.tar.bz2 open-keychain-08e25747da20e399096a2e0c1c4afcce67898718.zip |
Fix crashes with Fluffys PGP applet
Diffstat (limited to 'OpenKeychain/src/main/java/org/sufficientlysecure/keychain')
4 files changed, 32 insertions, 20 deletions
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) { |