diff --git a/pgpainless-core/src/main/java/org/pgpainless/key/SubkeyIdentifier.java b/pgpainless-core/src/main/java/org/pgpainless/key/SubkeyIdentifier.java index 4491b468..f1e26770 100644 --- a/pgpainless-core/src/main/java/org/pgpainless/key/SubkeyIdentifier.java +++ b/pgpainless-core/src/main/java/org/pgpainless/key/SubkeyIdentifier.java @@ -15,9 +15,11 @@ */ package org.pgpainless.key; +import java.util.NoSuchElementException; import javax.annotation.Nonnull; import org.bouncycastle.openpgp.PGPKeyRing; +import org.bouncycastle.openpgp.PGPPublicKey; /** * Tuple class used to identify a subkey by fingerprints of the primary key of the subkeys key ring, @@ -47,7 +49,12 @@ public class SubkeyIdentifier { * @param keyId keyid of the subkey */ public SubkeyIdentifier(@Nonnull PGPKeyRing keyRing, long keyId) { - this(new OpenPgpV4Fingerprint(keyRing.getPublicKey()), new OpenPgpV4Fingerprint(keyRing.getPublicKey(keyId))); + PGPPublicKey subkey = keyRing.getPublicKey(keyId); + if (subkey == null) { + throw new NoSuchElementException("Key ring does not contain subkey with id " + Long.toHexString(keyId)); + } + this.primaryKeyFingerprint = new OpenPgpV4Fingerprint(keyRing); + this.subkeyFingerprint = new OpenPgpV4Fingerprint(subkey); } public SubkeyIdentifier(@Nonnull PGPKeyRing keyRing, @Nonnull OpenPgpV4Fingerprint subkeyFingerprint) { diff --git a/pgpainless-core/src/test/java/org/pgpainless/key/SubkeyIdentifierTest.java b/pgpainless-core/src/test/java/org/pgpainless/key/SubkeyIdentifierTest.java index d9614152..0349f55b 100644 --- a/pgpainless-core/src/test/java/org/pgpainless/key/SubkeyIdentifierTest.java +++ b/pgpainless-core/src/test/java/org/pgpainless/key/SubkeyIdentifierTest.java @@ -17,8 +17,10 @@ package org.pgpainless.key; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; import java.io.IOException; +import java.util.NoSuchElementException; import org.bouncycastle.openpgp.PGPPublicKeyRing; import org.junit.jupiter.api.BeforeAll; @@ -110,4 +112,9 @@ public class SubkeyIdentifierTest { assertNotEquals(id1, PRIMARY_FP); assertNotEquals(id1, null); } + + @Test + public void nonExistentSubkeyThrowsNoSuchElementException() { + assertThrows(NoSuchElementException.class, () -> new SubkeyIdentifier(CERT, 123)); + } }