From e7f583c1af3da277db2099191714de19bb27aedf Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Sat, 15 Jan 2022 02:43:59 +0100 Subject: [PATCH] Fix KeyRingInfo.get*Algorithm(keyId) --- .../org/pgpainless/key/info/KeyAccessor.java | 22 +++++++++++++++++++ .../org/pgpainless/key/info/KeyRingInfo.java | 11 +++++----- .../pgpainless/key/info/KeyRingInfoTest.java | 12 +++++----- 3 files changed, 34 insertions(+), 11 deletions(-) diff --git a/pgpainless-core/src/main/java/org/pgpainless/key/info/KeyAccessor.java b/pgpainless-core/src/main/java/org/pgpainless/key/info/KeyAccessor.java index 6c299580..5fa71d46 100644 --- a/pgpainless-core/src/main/java/org/pgpainless/key/info/KeyAccessor.java +++ b/pgpainless-core/src/main/java/org/pgpainless/key/info/KeyAccessor.java @@ -123,4 +123,26 @@ public abstract class KeyAccessor { return signature; } } + + public static class SubKey extends KeyAccessor { + + public SubKey(KeyRingInfo info, SubkeyIdentifier key) { + super(info, key); + } + + @Override + public @Nonnull PGPSignature getSignatureWithPreferences() { + PGPSignature signature; + if (key.getPrimaryKeyId() == key.getSubkeyId()) { + signature = info.getLatestDirectKeySelfSignature(); + if (signature == null) { + signature = info.getLatestUserIdCertification(info.getPrimaryUserId()); + } + } else { + signature = info.getCurrentSubkeyBindingSignature(key.getSubkeyId()); + } + + return signature; + } + } } diff --git a/pgpainless-core/src/main/java/org/pgpainless/key/info/KeyRingInfo.java b/pgpainless-core/src/main/java/org/pgpainless/key/info/KeyRingInfo.java index 56737b39..74b72e61 100644 --- a/pgpainless-core/src/main/java/org/pgpainless/key/info/KeyRingInfo.java +++ b/pgpainless-core/src/main/java/org/pgpainless/key/info/KeyRingInfo.java @@ -975,7 +975,8 @@ public class KeyRingInfo { } public Set getPreferredHashAlgorithms(long keyId) { - return getKeyAccessor(null, keyId).getPreferredHashAlgorithms(); + return new KeyAccessor.SubKey(this, new SubkeyIdentifier(keys, keyId)) + .getPreferredHashAlgorithms(); } public Set getPreferredSymmetricKeyAlgorithms() { @@ -987,7 +988,7 @@ public class KeyRingInfo { } public Set getPreferredSymmetricKeyAlgorithms(long keyId) { - return getKeyAccessor(null, keyId).getPreferredSymmetricKeyAlgorithms(); + return new KeyAccessor.SubKey(this, new SubkeyIdentifier(keys, keyId)).getPreferredSymmetricKeyAlgorithms(); } public Set getPreferredCompressionAlgorithms() { @@ -999,15 +1000,15 @@ public class KeyRingInfo { } public Set getPreferredCompressionAlgorithms(long keyId) { - return getKeyAccessor(null, keyId).getPreferredCompressionAlgorithms(); + return new KeyAccessor.SubKey(this, new SubkeyIdentifier(keys, keyId)).getPreferredCompressionAlgorithms(); } private KeyAccessor getKeyAccessor(@Nullable String userId, long keyID) { if (getPublicKey(keyID) == null) { - throw new IllegalArgumentException("No subkey with key id " + Long.toHexString(keyID) + " found on this key."); + throw new NoSuchElementException("No subkey with key id " + Long.toHexString(keyID) + " found on this key."); } if (userId != null && !getUserIds().contains(userId)) { - throw new IllegalArgumentException("No user-id '" + userId + "' found on this key."); + throw new NoSuchElementException("No user-id '" + userId + "' found on this key."); } return userId == null ? new KeyAccessor.ViaKeyId(this, new SubkeyIdentifier(keys, keyID)) : new KeyAccessor.ViaUserId(this, new SubkeyIdentifier(keys, keyID), userId); diff --git a/pgpainless-core/src/test/java/org/pgpainless/key/info/KeyRingInfoTest.java b/pgpainless-core/src/test/java/org/pgpainless/key/info/KeyRingInfoTest.java index 16b338e7..0cb351b7 100644 --- a/pgpainless-core/src/test/java/org/pgpainless/key/info/KeyRingInfoTest.java +++ b/pgpainless-core/src/test/java/org/pgpainless/key/info/KeyRingInfoTest.java @@ -598,9 +598,9 @@ public class KeyRingInfoTest { KeyRingInfo info = PGPainless.inspectKeyRing(secretKeys); // Bob is an invalid userId - assertThrows(IllegalArgumentException.class, () -> info.getPreferredSymmetricKeyAlgorithms("Bob")); + assertThrows(NoSuchElementException.class, () -> info.getPreferredSymmetricKeyAlgorithms("Bob")); // 123 is an invalid keyid - assertThrows(IllegalArgumentException.class, () -> info.getPreferredSymmetricKeyAlgorithms(123L)); + assertThrows(NoSuchElementException.class, () -> info.getPreferredSymmetricKeyAlgorithms(123L)); assertEquals(preferredHashAlgorithms, info.getPreferredHashAlgorithms("Alice")); assertEquals(preferredHashAlgorithms, info.getPreferredHashAlgorithms(pkid)); @@ -608,9 +608,9 @@ public class KeyRingInfoTest { assertEquals(preferredHashAlgorithms, info.getPreferredHashAlgorithms(skid2)); // Bob is an invalid userId - assertThrows(IllegalArgumentException.class, () -> info.getPreferredCompressionAlgorithms("Bob")); + assertThrows(NoSuchElementException.class, () -> info.getPreferredCompressionAlgorithms("Bob")); // 123 is an invalid keyid - assertThrows(IllegalArgumentException.class, () -> info.getPreferredCompressionAlgorithms(123L)); + assertThrows(NoSuchElementException.class, () -> info.getPreferredCompressionAlgorithms(123L)); assertEquals(preferredCompressionAlgorithms, info.getPreferredCompressionAlgorithms("Alice")); assertEquals(preferredCompressionAlgorithms, info.getPreferredCompressionAlgorithms(pkid)); @@ -618,9 +618,9 @@ public class KeyRingInfoTest { assertEquals(preferredCompressionAlgorithms, info.getPreferredCompressionAlgorithms(skid2)); // Bob is an invalid userId - assertThrows(IllegalArgumentException.class, () -> info.getPreferredSymmetricKeyAlgorithms("Bob")); + assertThrows(NoSuchElementException.class, () -> info.getPreferredSymmetricKeyAlgorithms("Bob")); // 123 is an invalid keyid - assertThrows(IllegalArgumentException.class, () -> info.getPreferredSymmetricKeyAlgorithms(123L)); + assertThrows(NoSuchElementException.class, () -> info.getPreferredSymmetricKeyAlgorithms(123L)); assertEquals(preferredSymmetricAlgorithms, info.getPreferredSymmetricKeyAlgorithms("Alice")); assertEquals(preferredSymmetricAlgorithms, info.getPreferredSymmetricKeyAlgorithms(pkid));