aboutsummaryrefslogtreecommitdiffstats
path: root/libraries/spongycastle/pg/src/main/java/org/spongycastle/openpgp/PGPSignatureSubpacketGenerator.java
diff options
context:
space:
mode:
Diffstat (limited to 'libraries/spongycastle/pg/src/main/java/org/spongycastle/openpgp/PGPSignatureSubpacketGenerator.java')
-rw-r--r--libraries/spongycastle/pg/src/main/java/org/spongycastle/openpgp/PGPSignatureSubpacketGenerator.java197
1 files changed, 197 insertions, 0 deletions
diff --git a/libraries/spongycastle/pg/src/main/java/org/spongycastle/openpgp/PGPSignatureSubpacketGenerator.java b/libraries/spongycastle/pg/src/main/java/org/spongycastle/openpgp/PGPSignatureSubpacketGenerator.java
new file mode 100644
index 000000000..f88b733a2
--- /dev/null
+++ b/libraries/spongycastle/pg/src/main/java/org/spongycastle/openpgp/PGPSignatureSubpacketGenerator.java
@@ -0,0 +1,197 @@
+package org.spongycastle.openpgp;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+import org.spongycastle.bcpg.SignatureSubpacket;
+import org.spongycastle.bcpg.SignatureSubpacketTags;
+import org.spongycastle.bcpg.sig.EmbeddedSignature;
+import org.spongycastle.bcpg.sig.Exportable;
+import org.spongycastle.bcpg.sig.Features;
+import org.spongycastle.bcpg.sig.IssuerKeyID;
+import org.spongycastle.bcpg.sig.KeyExpirationTime;
+import org.spongycastle.bcpg.sig.KeyFlags;
+import org.spongycastle.bcpg.sig.NotationData;
+import org.spongycastle.bcpg.sig.PreferredAlgorithms;
+import org.spongycastle.bcpg.sig.PrimaryUserID;
+import org.spongycastle.bcpg.sig.Revocable;
+import org.spongycastle.bcpg.sig.RevocationKey;
+import org.spongycastle.bcpg.sig.RevocationKeyTags;
+import org.spongycastle.bcpg.sig.RevocationReason;
+import org.spongycastle.bcpg.sig.SignatureCreationTime;
+import org.spongycastle.bcpg.sig.SignatureExpirationTime;
+import org.spongycastle.bcpg.sig.SignerUserID;
+import org.spongycastle.bcpg.sig.TrustSignature;
+
+/**
+ * Generator for signature subpackets.
+ */
+public class PGPSignatureSubpacketGenerator
+{
+ List list = new ArrayList();
+
+ public PGPSignatureSubpacketGenerator()
+ {
+ }
+
+ public void setRevocable(boolean isCritical, boolean isRevocable)
+ {
+ list.add(new Revocable(isCritical, isRevocable));
+ }
+
+ public void setExportable(boolean isCritical, boolean isExportable)
+ {
+ list.add(new Exportable(isCritical, isExportable));
+ }
+
+ public void setFeature(boolean isCritical, byte feature)
+ {
+ list.add(new Features(isCritical, feature));
+ }
+
+ /**
+ * Add a TrustSignature packet to the signature. The values for depth and trust are
+ * largely installation dependent but there are some guidelines in RFC 4880 -
+ * 5.2.3.13.
+ *
+ * @param isCritical true if the packet is critical.
+ * @param depth depth level.
+ * @param trustAmount trust amount.
+ */
+ public void setTrust(boolean isCritical, int depth, int trustAmount)
+ {
+ list.add(new TrustSignature(isCritical, depth, trustAmount));
+ }
+
+ /**
+ * Set the number of seconds a key is valid for after the time of its creation. A
+ * value of zero means the key never expires.
+ *
+ * @param isCritical true if should be treated as critical, false otherwise.
+ * @param seconds
+ */
+ public void setKeyExpirationTime(boolean isCritical, long seconds)
+ {
+ list.add(new KeyExpirationTime(isCritical, seconds));
+ }
+
+ /**
+ * Set the number of seconds a signature is valid for after the time of its creation.
+ * A value of zero means the signature never expires.
+ *
+ * @param isCritical true if should be treated as critical, false otherwise.
+ * @param seconds
+ */
+ public void setSignatureExpirationTime(boolean isCritical, long seconds)
+ {
+ list.add(new SignatureExpirationTime(isCritical, seconds));
+ }
+
+ /**
+ * Set the creation time for the signature.
+ * <p>
+ * Note: this overrides the generation of a creation time when the signature is
+ * generated.
+ */
+ public void setSignatureCreationTime(boolean isCritical, Date date)
+ {
+ list.add(new SignatureCreationTime(isCritical, date));
+ }
+
+ public void setPreferredHashAlgorithms(boolean isCritical, int[] algorithms)
+ {
+ list.add(new PreferredAlgorithms(SignatureSubpacketTags.PREFERRED_HASH_ALGS, isCritical,
+ algorithms));
+ }
+
+ public void setPreferredSymmetricAlgorithms(boolean isCritical, int[] algorithms)
+ {
+ list.add(new PreferredAlgorithms(SignatureSubpacketTags.PREFERRED_SYM_ALGS, isCritical,
+ algorithms));
+ }
+
+ public void setPreferredCompressionAlgorithms(boolean isCritical, int[] algorithms)
+ {
+ list.add(new PreferredAlgorithms(SignatureSubpacketTags.PREFERRED_COMP_ALGS, isCritical,
+ algorithms));
+ }
+
+ public void setKeyFlags(boolean isCritical, int flags)
+ {
+ list.add(new KeyFlags(isCritical, flags));
+ }
+
+ public void setSignerUserID(boolean isCritical, String userID)
+ {
+ if (userID == null)
+ {
+ throw new IllegalArgumentException("attempt to set null SignerUserID");
+ }
+
+ list.add(new SignerUserID(isCritical, userID));
+ }
+
+ public void setEmbeddedSignature(boolean isCritical, PGPSignature pgpSignature)
+ throws IOException
+ {
+ byte[] sig = pgpSignature.getEncoded();
+ byte[] data;
+
+ if (sig.length - 1 > 256)
+ {
+ data = new byte[sig.length - 3];
+ }
+ else
+ {
+ data = new byte[sig.length - 2];
+ }
+
+ System.arraycopy(sig, sig.length - data.length, data, 0, data.length);
+
+ list.add(new EmbeddedSignature(isCritical, data));
+ }
+
+ public void setPrimaryUserID(boolean isCritical, boolean isPrimaryUserID)
+ {
+ list.add(new PrimaryUserID(isCritical, isPrimaryUserID));
+ }
+
+ public void setNotationData(boolean isCritical, boolean isHumanReadable, String notationName,
+ String notationValue)
+ {
+ list.add(new NotationData(isCritical, isHumanReadable, notationName, notationValue));
+ }
+
+ /**
+ * Sets revocation reason sub packet
+ */
+ public void setRevocationReason(boolean isCritical, byte reason, String description)
+ {
+ list.add(new RevocationReason(isCritical, reason, description));
+ }
+
+ /**
+ * Sets revocation key sub packet
+ */
+ public void setRevocationKey(boolean isCritical, int keyAlgorithm, byte[] fingerprint)
+ {
+ list.add(new RevocationKey(isCritical, RevocationKeyTags.CLASS_DEFAULT, keyAlgorithm,
+ fingerprint));
+ }
+
+ /**
+ * Sets issuer key sub packe
+ */
+ public void setIssuerKeyID(boolean isCritical, long keyID)
+ {
+ list.add(new IssuerKeyID(isCritical, keyID));
+ }
+
+ public PGPSignatureSubpacketVector generate()
+ {
+ return new PGPSignatureSubpacketVector(
+ (SignatureSubpacket[])list.toArray(new SignatureSubpacket[list.size()]));
+ }
+}