aboutsummaryrefslogtreecommitdiffstats
path: root/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/affirmation/AffirmationResource.java
diff options
context:
space:
mode:
authorVincent Breitmoser <valodim@mugenguild.com>2015-01-12 19:27:46 +0100
committerVincent Breitmoser <valodim@mugenguild.com>2015-01-12 19:27:46 +0100
commite0847cafaf53eac9b364343c1f5e74554b51053d (patch)
treec1ac24aeca5a3d090be8d1773f710e2e4ecdc0fd /OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/affirmation/AffirmationResource.java
parent5faeb5f5f060e049000e804deca5445d281f8611 (diff)
downloadopen-keychain-e0847cafaf53eac9b364343c1f5e74554b51053d.tar.gz
open-keychain-e0847cafaf53eac9b364343c1f5e74554b51053d.tar.bz2
open-keychain-e0847cafaf53eac9b364343c1f5e74554b51053d.zip
even more intermediate result
Diffstat (limited to 'OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/affirmation/AffirmationResource.java')
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/affirmation/AffirmationResource.java77
1 files changed, 71 insertions, 6 deletions
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/affirmation/AffirmationResource.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/affirmation/AffirmationResource.java
index e356ccb8e..45919a89a 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/affirmation/AffirmationResource.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/affirmation/AffirmationResource.java
@@ -1,12 +1,21 @@
package org.sufficientlysecure.keychain.pgp.affirmation;
+import android.content.Context;
+
+import org.sufficientlysecure.keychain.Constants;
+import org.sufficientlysecure.keychain.operations.results.LinkedVerifyResult;
+import org.sufficientlysecure.keychain.operations.results.OperationResult.LogType;
+import org.sufficientlysecure.keychain.operations.results.OperationResult.OperationLog;
import org.sufficientlysecure.keychain.pgp.affirmation.resources.GenericHttpsResource;
import org.sufficientlysecure.keychain.pgp.affirmation.resources.UnknownResource;
+import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
+import org.sufficientlysecure.keychain.util.Log;
import java.net.URI;
-import java.security.SecureRandom;
import java.util.HashMap;
import java.util.Set;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
public abstract class AffirmationResource {
@@ -14,13 +23,73 @@ public abstract class AffirmationResource {
protected final Set<String> mFlags;
protected final HashMap<String,String> mParams;
+ static Pattern magicPattern =
+ Pattern.compile("\\[Verifying my PGP key: pgpid\\+cookie:([a-zA-Z0-9]+)#([a-zA-Z0-9]+)\\]");
+
protected AffirmationResource(Set<String> flags, HashMap<String,String> params, URI uri) {
mFlags = flags;
mParams = params;
mUri = uri;
}
- public abstract boolean verify();
+ public static String generate (Context context, byte[] fingerprint, String nonce) {
+
+ return "[Verifying my PGP key: pgpid+cookie:"
+ + KeyFormattingUtils.convertFingerprintToHex(fingerprint) + "#" + nonce + "]";
+
+ }
+
+ public LinkedVerifyResult verify(byte[] fingerprint, String nonce) {
+
+ OperationLog log = new OperationLog();
+ log.add(LogType.MSG_LV, 0);
+
+ // Try to fetch resource. Logs for itself
+ String res = fetchResource(log, 1);
+ if (res == null) {
+ // if this is null, an error was recorded in fetchResource above
+ return new LinkedVerifyResult(LinkedVerifyResult.RESULT_ERROR, log);
+ }
+
+ Log.d(Constants.TAG, res);
+
+ return verifyString(log, 1, res, nonce, fingerprint);
+
+ }
+
+ protected abstract String fetchResource (OperationLog log, int indent);
+
+ protected LinkedVerifyResult verifyString (OperationLog log, int indent,
+ String res,
+ String nonce, byte[] fingerprint) {
+
+ log.add(LogType.MSG_LV_MATCH, indent);
+ Matcher match = magicPattern.matcher(res);
+ if (!match.find()) {
+ log.add(LogType.MSG_LV_MATCH_ERROR, 2);
+ return new LinkedVerifyResult(LinkedVerifyResult.RESULT_ERROR, log);
+ }
+
+ String candidateFp = match.group(1);
+ String nonceCandidate = match.group(2);
+
+ String fp = KeyFormattingUtils.convertFingerprintToHex(fingerprint);
+
+ if (!fp.equals(candidateFp)) {
+ log.add(LogType.MSG_LV_FP_ERROR, indent);
+ return new LinkedVerifyResult(LinkedVerifyResult.RESULT_ERROR, log);
+ }
+ log.add(LogType.MSG_LV_FP_OK, indent);
+
+ if (!nonce.equals(nonceCandidate)) {
+ log.add(LogType.MSG_LV_NONCE_ERROR, indent);
+ return new LinkedVerifyResult(LinkedVerifyResult.RESULT_ERROR, log);
+ }
+
+ log.add(LogType.MSG_LV_NONCE_OK, indent);
+ return new LinkedVerifyResult(LinkedVerifyResult.RESULT_OK, log);
+
+ }
public static AffirmationResource findResourceType
(Set<String> flags, HashMap<String,String> params, URI uri) {
@@ -36,8 +105,4 @@ public abstract class AffirmationResource {
}
- public static long generateNonce() {
- return 1234567890L; // new SecureRandom().nextLong();
- }
-
}