aboutsummaryrefslogtreecommitdiffstats
path: root/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/UncachedKeyRing.java
diff options
context:
space:
mode:
authorVincent Breitmoser <valodim@mugenguild.com>2014-09-28 03:34:25 +0200
committerVincent Breitmoser <valodim@mugenguild.com>2014-09-28 03:34:25 +0200
commit1c3d0a58eaaf7bb56d8b274f869d99b318e3daac (patch)
treeb4998d6ede096715bcbc3a149d23804471d4a9d7 /OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/UncachedKeyRing.java
parent1a2ec1eb328cf8aa828232a1cf66294b8a0fc77b (diff)
downloadopen-keychain-1c3d0a58eaaf7bb56d8b274f869d99b318e3daac.tar.gz
open-keychain-1c3d0a58eaaf7bb56d8b274f869d99b318e3daac.tar.bz2
open-keychain-1c3d0a58eaaf7bb56d8b274f869d99b318e3daac.zip
Reject subkeys with no key flags and no primary key binding certificate
Closes #899
Diffstat (limited to 'OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/UncachedKeyRing.java')
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/UncachedKeyRing.java62
1 files changed, 35 insertions, 27 deletions
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/UncachedKeyRing.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/UncachedKeyRing.java
index 7bf16791d..99a0ef94e 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/UncachedKeyRing.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/UncachedKeyRing.java
@@ -616,43 +616,51 @@ public class UncachedKeyRing {
continue;
}
+ boolean needsPrimaryBinding = false;
+
// if this certificate says it allows signing for the key
if (zert.getHashedSubPackets() != null &&
zert.getHashedSubPackets().hasSubpacket(SignatureSubpacketTags.KEY_FLAGS)) {
-
int flags = ((KeyFlags) zert.getHashedSubPackets()
.getSubpacket(SignatureSubpacketTags.KEY_FLAGS)).getFlags();
if ((flags & PGPKeyFlags.CAN_SIGN) == PGPKeyFlags.CAN_SIGN) {
- boolean ok = false;
- // it MUST have an embedded primary key binding signature
- try {
- PGPSignatureList list = zert.getUnhashedSubPackets().getEmbeddedSignatures();
- for (int i = 0; i < list.size(); i++) {
- WrappedSignature subsig = new WrappedSignature(list.get(i));
- if (subsig.getSignatureType() == PGPSignature.PRIMARYKEY_BINDING) {
- subsig.init(key);
- if (subsig.verifySignature(masterKey, key)) {
- ok = true;
- } else {
- log.add(LogType.MSG_KC_SUB_PRIMARY_BAD, indent);
- badCerts += 1;
- continue uids;
- }
+ needsPrimaryBinding = true;
+ }
+ } else {
+ // If there are no key flags, we STILL require this because the key can sign!
+ needsPrimaryBinding = true;
+ }
+
+ // If this key can sign, it MUST have a primary key binding certificate
+ if (needsPrimaryBinding) {
+ boolean ok = false;
+ if (zert.getUnhashedSubPackets() != null) try {
+ // Check all embedded signatures, if any of them fits
+ PGPSignatureList list = zert.getUnhashedSubPackets().getEmbeddedSignatures();
+ for (int i = 0; i < list.size(); i++) {
+ WrappedSignature subsig = new WrappedSignature(list.get(i));
+ if (subsig.getSignatureType() == PGPSignature.PRIMARYKEY_BINDING) {
+ subsig.init(key);
+ if (subsig.verifySignature(masterKey, key)) {
+ ok = true;
+ } else {
+ log.add(LogType.MSG_KC_SUB_PRIMARY_BAD, indent);
+ badCerts += 1;
+ continue uids;
}
}
- } catch (Exception e) {
- log.add(LogType.MSG_KC_SUB_PRIMARY_BAD_ERR, indent);
- badCerts += 1;
- continue;
- }
- // if it doesn't, get rid of this!
- if (!ok) {
- log.add(LogType.MSG_KC_SUB_PRIMARY_NONE, indent);
- badCerts += 1;
- continue;
}
+ } catch (Exception e) {
+ log.add(LogType.MSG_KC_SUB_PRIMARY_BAD_ERR, indent);
+ badCerts += 1;
+ continue;
+ }
+ // if it doesn't, get rid of this!
+ if (!ok) {
+ log.add(LogType.MSG_KC_SUB_PRIMARY_NONE, indent);
+ badCerts += 1;
+ continue;
}
-
}
// if we already have a cert, and this one is older: skip it