diff --git a/pgpainless-core/src/main/java/org/pgpainless/signature/subpackets/BaseSignatureSubpackets.java b/pgpainless-core/src/main/java/org/pgpainless/signature/subpackets/BaseSignatureSubpackets.java index 182917a0..c6d68c6a 100644 --- a/pgpainless-core/src/main/java/org/pgpainless/signature/subpackets/BaseSignatureSubpackets.java +++ b/pgpainless-core/src/main/java/org/pgpainless/signature/subpackets/BaseSignatureSubpackets.java @@ -5,6 +5,7 @@ package org.pgpainless.signature.subpackets; import java.io.IOException; +import java.net.URL; import java.util.Date; import javax.annotation.Nonnull; import javax.annotation.Nullable; @@ -15,6 +16,7 @@ import org.bouncycastle.bcpg.sig.IntendedRecipientFingerprint; import org.bouncycastle.bcpg.sig.IssuerFingerprint; import org.bouncycastle.bcpg.sig.IssuerKeyID; import org.bouncycastle.bcpg.sig.NotationData; +import org.bouncycastle.bcpg.sig.PolicyURI; import org.bouncycastle.bcpg.sig.Revocable; import org.bouncycastle.bcpg.sig.SignatureCreationTime; import org.bouncycastle.bcpg.sig.SignatureExpirationTime; @@ -88,6 +90,12 @@ public interface BaseSignatureSubpackets { BaseSignatureSubpackets setExportable(@Nullable Exportable exportable); + BaseSignatureSubpackets setPolicyUrl(@Nullable URL policyUrl); + + BaseSignatureSubpackets setPolicyUrl(boolean isCritical, @Nonnull URL policyUrl); + + BaseSignatureSubpackets setPolicyUrl(@Nullable PolicyURI policyUrl); + BaseSignatureSubpackets setRevocable(boolean revocable); BaseSignatureSubpackets setRevocable(boolean isCritical, boolean isRevocable); diff --git a/pgpainless-core/src/main/java/org/pgpainless/signature/subpackets/SignatureSubpackets.java b/pgpainless-core/src/main/java/org/pgpainless/signature/subpackets/SignatureSubpackets.java index 6c0740c7..742ab831 100644 --- a/pgpainless-core/src/main/java/org/pgpainless/signature/subpackets/SignatureSubpackets.java +++ b/pgpainless-core/src/main/java/org/pgpainless/signature/subpackets/SignatureSubpackets.java @@ -5,6 +5,7 @@ package org.pgpainless.signature.subpackets; import java.io.IOException; +import java.net.URL; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; @@ -26,6 +27,7 @@ import org.bouncycastle.bcpg.sig.IssuerKeyID; import org.bouncycastle.bcpg.sig.KeyExpirationTime; import org.bouncycastle.bcpg.sig.KeyFlags; import org.bouncycastle.bcpg.sig.NotationData; +import org.bouncycastle.bcpg.sig.PolicyURI; import org.bouncycastle.bcpg.sig.PreferredAlgorithms; import org.bouncycastle.bcpg.sig.PrimaryUserID; import org.bouncycastle.bcpg.sig.Revocable; @@ -68,6 +70,7 @@ public class SignatureSubpackets private final List embeddedSignatureList = new ArrayList<>(); private SignerUserID signerUserId; private KeyExpirationTime keyExpirationTime; + private PolicyURI policyURI; private PrimaryUserID primaryUserId; private Revocable revocable; private RevocationReason revocationReason; @@ -485,6 +488,26 @@ public class SignatureSubpackets return exportable; } + @Override + public BaseSignatureSubpackets setPolicyUrl(@Nullable URL policyUrl) { + return policyUrl == null ? setPolicyUrl((PolicyURI) null) : setPolicyUrl(false, policyUrl); + } + + @Override + public BaseSignatureSubpackets setPolicyUrl(boolean isCritical, @Nonnull URL policyUrl) { + return setPolicyUrl(new PolicyURI(isCritical, policyUrl.toString())); + } + + @Override + public BaseSignatureSubpackets setPolicyUrl(@Nullable PolicyURI policyUrl) { + this.policyURI = policyUrl; + return this; + } + + public PolicyURI getPolicyURI() { + return policyURI; + } + @Override public SignatureSubpackets setRevocable(boolean revocable) { return setRevocable(true, revocable); diff --git a/pgpainless-core/src/main/java/org/pgpainless/signature/subpackets/SignatureSubpacketsHelper.java b/pgpainless-core/src/main/java/org/pgpainless/signature/subpackets/SignatureSubpacketsHelper.java index 2118c49c..4bea3036 100644 --- a/pgpainless-core/src/main/java/org/pgpainless/signature/subpackets/SignatureSubpacketsHelper.java +++ b/pgpainless-core/src/main/java/org/pgpainless/signature/subpackets/SignatureSubpacketsHelper.java @@ -12,6 +12,7 @@ import org.bouncycastle.bcpg.sig.IntendedRecipientFingerprint; import org.bouncycastle.bcpg.sig.KeyExpirationTime; import org.bouncycastle.bcpg.sig.KeyFlags; import org.bouncycastle.bcpg.sig.NotationData; +import org.bouncycastle.bcpg.sig.PolicyURI; import org.bouncycastle.bcpg.sig.PreferredAlgorithms; import org.bouncycastle.bcpg.sig.PrimaryUserID; import org.bouncycastle.bcpg.sig.Revocable; @@ -114,11 +115,14 @@ public class SignatureSubpacketsHelper { IntendedRecipientFingerprint intendedRecipientFingerprint = (IntendedRecipientFingerprint) subpacket; subpackets.addIntendedRecipientFingerprint(intendedRecipientFingerprint); break; + case policyUrl: + PolicyURI policyURI = (PolicyURI) subpacket; + subpackets.setPolicyUrl(policyURI); + break; case regularExpression: case keyServerPreferences: case preferredKeyServers: - case policyUrl: case placeholder: case preferredAEADAlgorithms: case attestedCertification: @@ -135,6 +139,7 @@ public class SignatureSubpacketsHelper { addSubpacket(generator, subpackets.getSignatureCreationTimeSubpacket()); addSubpacket(generator, subpackets.getSignatureExpirationTimeSubpacket()); addSubpacket(generator, subpackets.getExportableSubpacket()); + addSubpacket(generator, subpackets.getPolicyURI()); for (NotationData notationData : subpackets.getNotationDataSubpackets()) { addSubpacket(generator, notationData); }