diff options
author | Dominik Schürmann <dominik@dominikschuermann.de> | 2014-04-17 17:55:52 +0200 |
---|---|---|
committer | Dominik Schürmann <dominik@dominikschuermann.de> | 2014-04-17 17:55:52 +0200 |
commit | a67854ca6ae6be262726e989bf9a79da32dcdd1d (patch) | |
tree | b304210142c109211fffe0657aac59c3d936810d /OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp | |
parent | 15b9789b976df256cff51461662225f04bf69c4b (diff) | |
parent | 8714f56cdc71aec3d3df0a350c085b236cb11921 (diff) | |
download | open-keychain-a67854ca6ae6be262726e989bf9a79da32dcdd1d.tar.gz open-keychain-a67854ca6ae6be262726e989bf9a79da32dcdd1d.tar.bz2 open-keychain-a67854ca6ae6be262726e989bf9a79da32dcdd1d.zip |
Merge branch 'master' of github.com:open-keychain/open-keychain
Diffstat (limited to 'OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp')
3 files changed, 46 insertions, 52 deletions
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpDecryptVerify.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpDecryptVerify.java index 8b18f3fe2..8d228ec96 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpDecryptVerify.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpDecryptVerify.java @@ -67,6 +67,7 @@ import java.io.InputStream; import java.io.OutputStream; import java.security.SignatureException; import java.util.Iterator; +import java.util.Map; import java.util.Set; /** @@ -410,11 +411,18 @@ public class PgpDecryptVerify { // go through all signatures // and find out for which signature we have a key in our database Long masterKeyId = null; + String primaryUserId = null; for (int i = 0; i < sigList.size(); ++i) { try { Uri uri = KeyRings.buildUnifiedKeyRingsFindBySubkeyUri( Long.toString(sigList.get(i).getKeyID())); - masterKeyId = mProviderHelper.getMasterKeyId(uri); + Map<String, Object> data = mProviderHelper.getGenericData(uri, + new String[] { KeyRings.MASTER_KEY_ID, KeyRings.USER_ID }, + new int[] { ProviderHelper.FIELD_TYPE_INTEGER, + ProviderHelper.FIELD_TYPE_STRING } + ); + masterKeyId = (Long) data.get(KeyRings.MASTER_KEY_ID); + primaryUserId = (String) data.get(KeyRings.USER_ID); signatureIndex = i; } catch (ProviderHelper.NotFoundException e) { Log.d(Constants.TAG, "key not found!"); @@ -439,9 +447,8 @@ public class PgpDecryptVerify { signatureResultBuilder.signatureAvailable(true); signatureResultBuilder.knownKey(true); - // TODO: uses the first user id not primary user id - signatureResultBuilder.userId(PgpKeyHelper.getMainUserId(publicKeyRing.getPublicKey())); - signatureResultBuilder.keyId(publicKeyRing.getPublicKey().getKeyID()); + signatureResultBuilder.userId(primaryUserId); + signatureResultBuilder.keyId(masterKeyId); JcaPGPContentVerifierBuilderProvider contentVerifierBuilderProvider = new JcaPGPContentVerifierBuilderProvider() @@ -449,11 +456,16 @@ public class PgpDecryptVerify { signature.init(contentVerifierBuilderProvider, signatureKey); // get certification status of this key - Object data = mProviderHelper.getGenericData( - KeychainContract.KeyRings.buildUnifiedKeyRingUri(Long.toString(masterKeyId)), - KeyRings.VERIFIED, - ProviderHelper.FIELD_TYPE_INTEGER); - boolean isSignatureKeyCertified = ((Long) data > 0); + boolean isSignatureKeyCertified; + try { + Object data = mProviderHelper.getGenericData( + KeychainContract.KeyRings.buildUnifiedKeyRingUri(Long.toString(masterKeyId)), + KeyRings.VERIFIED, + ProviderHelper.FIELD_TYPE_INTEGER); + isSignatureKeyCertified = ((Long) data > 0); + } catch (ProviderHelper.NotFoundException e) { + isSignatureKeyCertified = false; + } signatureResultBuilder.signatureKeyCertified(isSignatureKeyCertified); } else { // no key in our database -> return "unknown pub key" status including the first key id @@ -608,12 +620,19 @@ public class PgpDecryptVerify { // go through all signatures // and find out for which signature we have a key in our database Long masterKeyId = null; + String primaryUserId = null; int signatureIndex = 0; for (int i = 0; i < sigList.size(); ++i) { try { Uri uri = KeyRings.buildUnifiedKeyRingsFindBySubkeyUri( Long.toString(sigList.get(i).getKeyID())); - masterKeyId = mProviderHelper.getMasterKeyId(uri); + Map<String, Object> data = mProviderHelper.getGenericData(uri, + new String[] { KeyRings.MASTER_KEY_ID, KeyRings.USER_ID }, + new int[] { ProviderHelper.FIELD_TYPE_INTEGER, + ProviderHelper.FIELD_TYPE_STRING } + ); + masterKeyId = (Long) data.get(KeyRings.MASTER_KEY_ID); + primaryUserId = (String) data.get(KeyRings.USER_ID); signatureIndex = i; } catch (ProviderHelper.NotFoundException e) { Log.d(Constants.TAG, "key not found!"); @@ -640,9 +659,8 @@ public class PgpDecryptVerify { signatureResultBuilder.signatureAvailable(true); signatureResultBuilder.knownKey(true); - // TODO: uses the first user id not primary user id - signatureResultBuilder.userId(PgpKeyHelper.getMainUserId(publicKeyRing.getPublicKey())); - signatureResultBuilder.keyId(publicKeyRing.getPublicKey().getKeyID()); + signatureResultBuilder.userId(primaryUserId); + signatureResultBuilder.keyId(masterKeyId); JcaPGPContentVerifierBuilderProvider contentVerifierBuilderProvider = new JcaPGPContentVerifierBuilderProvider() @@ -650,11 +668,16 @@ public class PgpDecryptVerify { signature.init(contentVerifierBuilderProvider, signatureKey); // get certification status of this key - Object data = mProviderHelper.getGenericData( - KeychainContract.KeyRings.buildUnifiedKeyRingUri(Long.toString(masterKeyId)), - KeyRings.VERIFIED, - ProviderHelper.FIELD_TYPE_INTEGER); - boolean isSignatureKeyCertified = ((Long) data > 0); + boolean isSignatureKeyCertified; + try { + Object data = mProviderHelper.getGenericData( + KeychainContract.KeyRings.buildUnifiedKeyRingUri(Long.toString(masterKeyId)), + KeyRings.VERIFIED, + ProviderHelper.FIELD_TYPE_INTEGER); + isSignatureKeyCertified = ((Long) data > 0); + } catch (ProviderHelper.NotFoundException e) { + isSignatureKeyCertified = false; + } signatureResultBuilder.signatureKeyCertified(isSignatureKeyCertified); } else { // no key in our database -> return "unknown pub key" status including the first key id diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpKeyHelper.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpKeyHelper.java index 6450ad63d..77a11165d 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpKeyHelper.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpKeyHelper.java @@ -225,38 +225,6 @@ public class PgpKeyHelper { return signingKeys.get(0); } - @SuppressWarnings("unchecked") - public static String getMainUserId(PGPPublicKey key) { - for (String userId : new IterableIterator<String>(key.getUserIDs())) { - return userId; - } - return null; - } - - @SuppressWarnings("unchecked") - public static String getMainUserId(PGPSecretKey key) { - for (String userId : new IterableIterator<String>(key.getUserIDs())) { - return userId; - } - return null; - } - - public static String getMainUserIdSafe(Context context, PGPPublicKey key) { - String userId = getMainUserId(key); - if (userId == null || userId.equals("")) { - userId = context.getString(R.string.user_id_no_name); - } - return userId; - } - - public static String getMainUserIdSafe(Context context, PGPSecretKey key) { - String userId = getMainUserId(key); - if (userId == null || userId.equals("")) { - userId = context.getString(R.string.user_id_no_name); - } - return userId; - } - public static int getKeyUsage(PGPSecretKey key) { return getKeyUsage(key.getPublicKey()); } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpSignEncrypt.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpSignEncrypt.java index c61223fe2..2437cb0f0 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpSignEncrypt.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpSignEncrypt.java @@ -42,6 +42,7 @@ import org.spongycastle.openpgp.operator.jcajce.JcePGPDataEncryptorBuilder; import org.spongycastle.openpgp.operator.jcajce.JcePublicKeyKeyEncryptionMethodGenerator; import org.sufficientlysecure.keychain.Constants; import org.sufficientlysecure.keychain.R; +import org.sufficientlysecure.keychain.provider.KeychainContract; import org.sufficientlysecure.keychain.provider.ProviderHelper; import org.sufficientlysecure.keychain.util.InputData; import org.sufficientlysecure.keychain.util.Log; @@ -281,9 +282,12 @@ public class PgpSignEncrypt { PGPSecretKey signingKey = null; PGPSecretKeyRing signingKeyRing = null; PGPPrivateKey signaturePrivateKey = null; + String signingUserId = null; if (enableSignature) { try { signingKeyRing = mProviderHelper.getPGPSecretKeyRing(mSignatureMasterKeyId); + signingUserId = (String) mProviderHelper.getUnifiedData(mSignatureMasterKeyId, + KeychainContract.KeyRings.USER_ID, ProviderHelper.FIELD_TYPE_STRING); } catch (ProviderHelper.NotFoundException e) { throw new NoSigningKeyException(); } @@ -369,9 +373,8 @@ public class PgpSignEncrypt { signatureGenerator = new PGPSignatureGenerator(contentSignerBuilder); signatureGenerator.init(signatureType, signaturePrivateKey); - String userId = PgpKeyHelper.getMainUserId(signingKeyRing.getSecretKey()); PGPSignatureSubpacketGenerator spGen = new PGPSignatureSubpacketGenerator(); - spGen.setSignerUserID(false, userId); + spGen.setSignerUserID(false, signingUserId); signatureGenerator.setHashedSubpackets(spGen.generate()); } } |