aboutsummaryrefslogtreecommitdiffstats
path: root/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/CanonicalizedPublicKey.java
diff options
context:
space:
mode:
authorVincent Breitmoser <valodim@mugenguild.com>2014-09-28 14:40:49 +0200
committerVincent Breitmoser <valodim@mugenguild.com>2014-09-28 14:50:52 +0200
commit8131daa6380ed752c4d31cd6a40650d9ac5b9817 (patch)
tree3a6ef98bff046d9bb01e36fbd9ce0ca7e780a333 /OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/CanonicalizedPublicKey.java
parent706e60474d15f833ad5ead519518775812978bac (diff)
downloadopen-keychain-8131daa6380ed752c4d31cd6a40650d9ac5b9817.tar.gz
open-keychain-8131daa6380ed752c4d31cd6a40650d9ac5b9817.tar.bz2
open-keychain-8131daa6380ed752c4d31cd6a40650d9ac5b9817.zip
move can.*() methods to CanonicalizedPublicKey, where they belong
Diffstat (limited to 'OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/CanonicalizedPublicKey.java')
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/CanonicalizedPublicKey.java83
1 files changed, 79 insertions, 4 deletions
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/CanonicalizedPublicKey.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/CanonicalizedPublicKey.java
index 7a63a7a42..d0808d446 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/CanonicalizedPublicKey.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/CanonicalizedPublicKey.java
@@ -18,7 +18,11 @@
package org.sufficientlysecure.keychain.pgp;
+import org.spongycastle.bcpg.SignatureSubpacketTags;
+import org.spongycastle.bcpg.sig.KeyFlags;
import org.spongycastle.openpgp.PGPPublicKey;
+import org.spongycastle.openpgp.PGPSignature;
+import org.spongycastle.openpgp.PGPSignatureSubpacketVector;
import org.spongycastle.openpgp.operator.jcajce.JcePublicKeyKeyEncryptionMethodGenerator;
import org.sufficientlysecure.keychain.util.IterableIterator;
@@ -36,6 +40,7 @@ public class CanonicalizedPublicKey extends UncachedPublicKey {
// this is the parent key ring
final KeyRing mRing;
+ private Integer mCacheUsage = null;
CanonicalizedPublicKey(KeyRing ring, PGPPublicKey key) {
super(key);
@@ -46,12 +51,82 @@ public class CanonicalizedPublicKey extends UncachedPublicKey {
return new IterableIterator<String>(mPublicKey.getUserIDs());
}
- public KeyRing getKeyRing() {
- return mRing;
- }
-
JcePublicKeyKeyEncryptionMethodGenerator getPubKeyEncryptionGenerator() {
return new JcePublicKeyKeyEncryptionMethodGenerator(mPublicKey);
}
+ public boolean canSign() {
+ // if key flags subpacket is available, honor it!
+ if (getKeyUsage() != null) {
+ return (getKeyUsage() & KeyFlags.SIGN_DATA) != 0;
+ }
+
+ if (UncachedKeyRing.isSigningAlgo(mPublicKey.getAlgorithm())) {
+ return true;
+ }
+
+ return false;
+ }
+
+ /**
+ * Get all key usage flags.
+ * If at least one key flag subpacket is present return these.
+ * If no subpacket is present it returns null.
+ */
+ @SuppressWarnings("unchecked")
+ public Integer getKeyUsage() {
+ if (mCacheUsage == null) {
+ for (PGPSignature sig : new IterableIterator<PGPSignature>(mPublicKey.getSignatures())) {
+ if (mPublicKey.isMasterKey() && sig.getKeyID() != mPublicKey.getKeyID()) {
+ continue;
+ }
+
+ PGPSignatureSubpacketVector hashed = sig.getHashedSubPackets();
+ if (hashed != null && hashed.getSubpacket(SignatureSubpacketTags.KEY_FLAGS) != null) {
+ // init if at least one key flag subpacket has been found
+ if (mCacheUsage == null) {
+ mCacheUsage = 0;
+ }
+ mCacheUsage |= hashed.getKeyFlags();
+ }
+ }
+ }
+ return mCacheUsage;
+ }
+
+ public boolean canCertify() {
+ // if key flags subpacket is available, honor it!
+ if (getKeyUsage() != null) {
+ return (getKeyUsage() & KeyFlags.CERTIFY_OTHER) != 0;
+ }
+
+ if (UncachedKeyRing.isSigningAlgo(mPublicKey.getAlgorithm())) {
+ return true;
+ }
+
+ return false;
+ }
+
+ public boolean canEncrypt() {
+ // if key flags subpacket is available, honor it!
+ if (getKeyUsage() != null) {
+ return (getKeyUsage() & (KeyFlags.ENCRYPT_COMMS | KeyFlags.ENCRYPT_STORAGE)) != 0;
+ }
+
+ // RSA_GENERAL, RSA_ENCRYPT, ELGAMAL_ENCRYPT, ELGAMAL_GENERAL, ECDH
+ if (UncachedKeyRing.isEncryptionAlgo(mPublicKey.getAlgorithm())) {
+ return true;
+ }
+
+ return false;
+ }
+
+ public boolean canAuthenticate() {
+ // if key flags subpacket is available, honor it!
+ if (getKeyUsage() != null) {
+ return (getKeyUsage() & KeyFlags.AUTHENTICATION) != 0;
+ }
+
+ return false;
+ }
}