1
0
Fork 0
mirror of https://github.com/pgpainless/pgpainless.git synced 2025-09-09 18:29:39 +02:00

Rename new CertifyCertificate API methods and add revocation methods

This commit is contained in:
Paul Schaub 2025-03-26 15:01:30 +01:00
parent a8cbd36a52
commit 8c58ca620d
Signed by: vanitasvitae
GPG key ID: 62BEE9264BF17311
4 changed files with 47 additions and 14 deletions

View file

@ -48,7 +48,7 @@ class CertifyCertificate(private val api: PGPainless) {
* @return API * @return API
*/ */
@JvmOverloads @JvmOverloads
fun userIdOnCertificate( fun certifyUserId(
userId: CharSequence, userId: CharSequence,
certificate: OpenPGPCertificate, certificate: OpenPGPCertificate,
certificationType: CertificationType = CertificationType.GENERIC certificationType: CertificationType = CertificationType.GENERIC
@ -62,7 +62,8 @@ class CertifyCertificate(private val api: PGPainless) {
* @param certificate certificate * @param certificate certificate
* @return API * @return API
*/ */
@Deprecated("Pass in an OpenPGPCertificate instead of PGPPublicKeyRing.") @Deprecated(
"Pass in an OpenPGPCertificate instead.", replaceWith = ReplaceWith("certifyUserId"))
fun userIdOnCertificate(userId: String, certificate: PGPPublicKeyRing): CertificationOnUserId = fun userIdOnCertificate(userId: String, certificate: PGPPublicKeyRing): CertificationOnUserId =
userIdOnCertificate(userId, certificate, CertificationType.GENERIC) userIdOnCertificate(userId, certificate, CertificationType.GENERIC)
@ -88,7 +89,7 @@ class CertifyCertificate(private val api: PGPainless) {
* @param userId userid to revoke * @param userId userid to revoke
* @param certificate certificate carrying the userid * @param certificate certificate carrying the userid
*/ */
fun revokeUserIdOnCertificate(userId: CharSequence, certificate: OpenPGPCertificate) = fun revokeCertifiedUserId(userId: CharSequence, certificate: OpenPGPCertificate) =
RevocationOnUserId(userId, certificate, api) RevocationOnUserId(userId, certificate, api)
/** /**
@ -100,7 +101,7 @@ class CertifyCertificate(private val api: PGPainless) {
* @return API * @return API
*/ */
@JvmOverloads @JvmOverloads
fun certificate(certificate: OpenPGPCertificate, trustworthiness: Trustworthiness? = null) = fun delegateTrust(certificate: OpenPGPCertificate, trustworthiness: Trustworthiness? = null) =
DelegationOnCertificate(certificate, trustworthiness, api) DelegationOnCertificate(certificate, trustworthiness, api)
/** /**
@ -133,7 +134,7 @@ class CertifyCertificate(private val api: PGPainless) {
* *
* @param certificate certificate to revoke the delegation to * @param certificate certificate to revoke the delegation to
*/ */
fun revokeCertificate(certificate: OpenPGPCertificate): RevocationOnCertificate = fun revokeDelegatedTrust(certificate: OpenPGPCertificate): RevocationOnCertificate =
RevocationOnCertificate(certificate, api) RevocationOnCertificate(certificate, api)
class CertificationOnUserId( class CertificationOnUserId(

View file

@ -47,7 +47,7 @@ public class CertifyCertificateTest {
OpenPGPCertificate bobCertificate = bob.toCertificate(); OpenPGPCertificate bobCertificate = bob.toCertificate();
CertifyCertificate.CertificationResult result = api.generateCertification() CertifyCertificate.CertificationResult result = api.generateCertification()
.userIdOnCertificate(bobUserId, bobCertificate) .certifyUserId(bobUserId, bobCertificate)
.withKey(alice, protector) .withKey(alice, protector)
.build(); .build();
@ -82,7 +82,7 @@ public class CertifyCertificateTest {
OpenPGPCertificate bobCertificate = bob.toCertificate(); OpenPGPCertificate bobCertificate = bob.toCertificate();
CertifyCertificate.CertificationResult result = api.generateCertification() CertifyCertificate.CertificationResult result = api.generateCertification()
.certificate(bobCertificate, Trustworthiness.fullyTrusted().introducer()) .delegateTrust(bobCertificate, Trustworthiness.fullyTrusted().introducer())
.withKey(alice, protector) .withKey(alice, protector)
.build(); .build();
@ -125,7 +125,7 @@ public class CertifyCertificateTest {
String petName = "Bobby"; String petName = "Bobby";
CertifyCertificate.CertificationResult result = api.generateCertification() CertifyCertificate.CertificationResult result = api.generateCertification()
.userIdOnCertificate(petName, bobCert) .certifyUserId(petName, bobCert)
.withKey(aliceKey, SecretKeyRingProtector.unprotectedKeys()) .withKey(aliceKey, SecretKeyRingProtector.unprotectedKeys())
.buildWithSubpackets(new CertificationSubpackets.Callback() { .buildWithSubpackets(new CertificationSubpackets.Callback() {
@Override @Override
@ -155,7 +155,7 @@ public class CertifyCertificateTest {
OpenPGPCertificate caCert = caKey.toCertificate(); OpenPGPCertificate caCert = caKey.toCertificate();
CertifyCertificate.CertificationResult result = api.generateCertification() CertifyCertificate.CertificationResult result = api.generateCertification()
.certificate(caCert, Trustworthiness.fullyTrusted().introducer()) .delegateTrust(caCert, Trustworthiness.fullyTrusted().introducer())
.withKey(aliceKey, SecretKeyRingProtector.unprotectedKeys()) .withKey(aliceKey, SecretKeyRingProtector.unprotectedKeys())
.buildWithSubpackets(new CertificationSubpackets.Callback() { .buildWithSubpackets(new CertificationSubpackets.Callback() {
@Override @Override

View file

@ -5,6 +5,7 @@
package org.pgpainless.key.certification; package org.pgpainless.key.certification;
import org.bouncycastle.openpgp.PGPException; import org.bouncycastle.openpgp.PGPException;
import org.bouncycastle.openpgp.PGPSignatureException;
import org.bouncycastle.openpgp.api.OpenPGPCertificate; import org.bouncycastle.openpgp.api.OpenPGPCertificate;
import org.bouncycastle.openpgp.api.OpenPGPKey; import org.bouncycastle.openpgp.api.OpenPGPKey;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
@ -19,7 +20,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
public class CertifyV6CertificateTest { public class CertifyV6CertificateTest {
@Test @Test
public void testCertifyV6CertWithV6Key() throws PGPException { public void testCertifyV6UIDWithV6Key() throws PGPException {
PGPainless api = PGPainless.getInstance(); PGPainless api = PGPainless.getInstance();
OpenPGPKey aliceKey = api.generateKey(OpenPGPKeyVersion.v6) OpenPGPKey aliceKey = api.generateKey(OpenPGPKeyVersion.v6)
@ -31,7 +32,7 @@ public class CertifyV6CertificateTest {
// Create a certification on Bobs certificate // Create a certification on Bobs certificate
OpenPGPCertificate bobCertified = api.generateCertification() OpenPGPCertificate bobCertified = api.generateCertification()
.userIdOnCertificate("Bob <bob@pgpainless.org>", bobCert) .certifyUserId("Bob <bob@pgpainless.org>", bobCert)
.withKey(aliceKey, SecretKeyRingProtector.unprotectedKeys()) .withKey(aliceKey, SecretKeyRingProtector.unprotectedKeys())
.build().getCertifiedCertificate(); .build().getCertifiedCertificate();
@ -43,7 +44,6 @@ public class CertifyV6CertificateTest {
assertTrue(signatureChain.isValid()); assertTrue(signatureChain.isValid());
// Revoke Alice' key and... // Revoke Alice' key and...
OpenPGPKey aliceRevoked = api.modify(aliceKey) OpenPGPKey aliceRevoked = api.modify(aliceKey)
.revoke(SecretKeyRingProtector.unprotectedKeys()) .revoke(SecretKeyRingProtector.unprotectedKeys())
@ -64,7 +64,7 @@ public class CertifyV6CertificateTest {
// Instead, revoke the certification itself and... // Instead, revoke the certification itself and...
bobCertified = api.generateCertification() bobCertified = api.generateCertification()
.revokeUserIdOnCertificate("Bob <bob@pgpainless.org>", bobCertified) .revokeCertifiedUserId("Bob <bob@pgpainless.org>", bobCertified)
.withKey(aliceKey, SecretKeyRingProtector.unprotectedKeys()) .withKey(aliceKey, SecretKeyRingProtector.unprotectedKeys())
.build().getCertifiedCertificate(); .build().getCertifiedCertificate();
@ -75,4 +75,36 @@ public class CertifyV6CertificateTest {
assertNotNull(brokenChain); assertNotNull(brokenChain);
assertTrue(brokenChain.isValid()); assertTrue(brokenChain.isValid());
} }
@Test
public void testCertifyV6CertificateWithV6Key() throws PGPSignatureException {
PGPainless api = PGPainless.getInstance();
OpenPGPKey aliceKey = api.generateKey(OpenPGPKeyVersion.v6)
.modernKeyRing("Alice <alice@pgpainless.org>");
OpenPGPKey bobKey = api.generateKey(OpenPGPKeyVersion.v6)
.modernKeyRing("Bob <bob@pgpainless.org>");
OpenPGPCertificate bobCert = bobKey.toCertificate();
// Alice delegates trust to Bob
OpenPGPCertificate bobDelegated = api.generateCertification()
.delegateTrust(bobCert)
.withKey(aliceKey, SecretKeyRingProtector.unprotectedKeys())
.build().getCertifiedCertificate();
// Check that Bob is actually delegated to by Alice
OpenPGPCertificate.OpenPGPSignatureChain delegation = bobDelegated.getDelegationBy(aliceKey.toCertificate());
assertNotNull(delegation);
assertTrue(delegation.isValid());
// Alice revokes the delegation
OpenPGPCertificate bobRevoked = api.generateCertification()
.revokeDelegatedTrust(bobDelegated)
.withKey(aliceKey, SecretKeyRingProtector.unprotectedKeys())
.build().getCertifiedCertificate();
OpenPGPCertificate.OpenPGPSignatureChain revocation = bobRevoked.getRevocationBy(aliceKey.toCertificate());
assertNotNull(revocation);
assertTrue(revocation.isValid());
}
} }

View file

@ -61,7 +61,7 @@ public class GenerateKeyWithoutPrimaryKeyFlagsTest {
// Key without CERTIFY_OTHER flag cannot be used to certify other keys // Key without CERTIFY_OTHER flag cannot be used to certify other keys
OpenPGPCertificate thirdPartyCert = TestKeys.getCryptieCertificate(); OpenPGPCertificate thirdPartyCert = TestKeys.getCryptieCertificate();
assertThrows(KeyException.UnacceptableThirdPartyCertificationKeyException.class, () -> assertThrows(KeyException.UnacceptableThirdPartyCertificationKeyException.class, () ->
api.generateCertification().certificate(thirdPartyCert) api.generateCertification().delegateTrust(thirdPartyCert)
.withKey(key, SecretKeyRingProtector.unprotectedKeys())); .withKey(key, SecretKeyRingProtector.unprotectedKeys()));
// Key without CERTIFY_OTHER flags is usable for encryption and signing // Key without CERTIFY_OTHER flags is usable for encryption and signing