aboutsummaryrefslogtreecommitdiffstats
path: root/OpenKeychain
diff options
context:
space:
mode:
authorVincent Breitmoser <valodim@mugenguild.com>2014-09-30 01:46:16 +0200
committerVincent Breitmoser <valodim@mugenguild.com>2014-09-30 01:46:16 +0200
commitdabdda36cfceea90498e577d0fdf81d2a1a53cf4 (patch)
treec5e5a6cbf23193342d381ce2ae282318bb09ec27 /OpenKeychain
parentde5dd482e1716c873b4e9c47213d4ec35d28109d (diff)
downloadopen-keychain-dabdda36cfceea90498e577d0fdf81d2a1a53cf4.tar.gz
open-keychain-dabdda36cfceea90498e577d0fdf81d2a1a53cf4.tar.bz2
open-keychain-dabdda36cfceea90498e577d0fdf81d2a1a53cf4.zip
revamp fingerprint and keyid methods in NfcActivity
Diffstat (limited to 'OpenKeychain')
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/NfcActivity.java65
1 files changed, 47 insertions, 18 deletions
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/NfcActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/NfcActivity.java
index 20283fc96..d8a474e94 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/NfcActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/NfcActivity.java
@@ -23,9 +23,12 @@ import org.spongycastle.bcpg.HashAlgorithmTags;
import org.spongycastle.util.encoders.Hex;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
+import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
+import org.sufficientlysecure.keychain.util.Iso7816TLV;
import org.sufficientlysecure.keychain.util.Log;
import java.io.IOException;
+import java.nio.ByteBuffer;
import java.util.Locale;
/**
@@ -257,33 +260,59 @@ public class NfcActivity extends ActionBarActivity {
return getName(card(info)) + " <" + (new String(Hex.decode(getDataField(card(data))))) + ">";
}
- /**
- * Gets the long key ID
+ /** Return the key id from application specific data stored on tag, or null
+ * if it doesn't exist.
*
- * @return the long key id (last 16 bytes of the fingerprint)
- * @throws java.io.IOException
+ * @param idx Index of the key to return the fingerprint from.
+ * @return The long key id of the requested key, or null if not found.
*/
- public long getKeyId() throws IOException {
- String keyId = getFingerprint().substring(24);
- Log.d(Constants.TAG, "keyId: " + keyId);
- return Long.parseLong(keyId, 16);
+ public static Long nfcGetKeyId(IsoDep isoDep, int idx) throws IOException {
+ byte[] fp = nfcGetFingerprint(isoDep, idx);
+ if (fp == null) {
+ return null;
+ }
+ ByteBuffer buf = ByteBuffer.wrap(fp);
+ // skip first 12 bytes of the fingerprint
+ buf.position(12);
+ // the last eight bytes are the key id (big endian, which is default order in ByteBuffer)
+ return buf.getLong();
}
- /**
- * Gets the fingerprint of the signature key
+ /** Return fingerprints of all keys from application specific data stored
+ * on tag, or null if data not available.
*
- * @return the fingerprint
- * @throws java.io.IOException
+ * @return The fingerprints of all subkeys in a contiguous byte array.
*/
- public String getFingerprint() throws IOException {
+ public static byte[] nfcGetFingerprints(IsoDep isoDep) throws IOException {
String data = "00CA006E00";
- String fingerprint = card(data);
- fingerprint = fingerprint.toLowerCase(Locale.ENGLISH); // better enforce lower case
- fingerprint = fingerprint.substring(fingerprint.indexOf("c5") + 4, fingerprint.indexOf("c5") + 44);
+ byte[] buf = isoDep.transceive(Hex.decode(data));
+
+ Iso7816TLV tlv = Iso7816TLV.readSingle(buf, true);
+ Log.d(Constants.TAG, "nfc tlv data:\n" + tlv.prettyPrint());
+
+ Iso7816TLV fptlv = Iso7816TLV.findRecursive(tlv, 0xc5);
+ if (fptlv == null) {
+ return null;
+ }
+
+ return fptlv.mV;
+ }
+
+ /** Return the fingerprint from application specific data stored on tag, or
+ * null if it doesn't exist.
+ *
+ * @param idx Index of the key to return the fingerprint from.
+ * @return The fingerprint of the requested key, or null if not found.
+ */
+ public static byte[] nfcGetFingerprint(IsoDep isoDep, int idx) throws IOException {
+ byte[] data = nfcGetFingerprints(isoDep);
- Log.d(Constants.TAG, "fingerprint: " + fingerprint);
+ // return the master key fingerprint
+ ByteBuffer fpbuf = ByteBuffer.wrap(data);
+ byte[] fp = new byte[20];
+ fpbuf.get(fp, 20*idx, 20);
- return fingerprint;
+ return fp;
}
/**