Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/quite/humla-spongycastle.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'pg/src/main/java/org/spongycastle/bcpg/sig')
-rw-r--r--pg/src/main/java/org/spongycastle/bcpg/sig/EmbeddedSignature.java18
-rw-r--r--pg/src/main/java/org/spongycastle/bcpg/sig/Exportable.java46
-rw-r--r--pg/src/main/java/org/spongycastle/bcpg/sig/Features.java98
-rw-r--r--pg/src/main/java/org/spongycastle/bcpg/sig/IssuerKeyID.java50
-rw-r--r--pg/src/main/java/org/spongycastle/bcpg/sig/KeyExpirationTime.java50
-rw-r--r--pg/src/main/java/org/spongycastle/bcpg/sig/KeyFlags.java73
-rw-r--r--pg/src/main/java/org/spongycastle/bcpg/sig/NotationData.java113
-rw-r--r--pg/src/main/java/org/spongycastle/bcpg/sig/PreferredAlgorithms.java59
-rw-r--r--pg/src/main/java/org/spongycastle/bcpg/sig/PrimaryUserID.java46
-rw-r--r--pg/src/main/java/org/spongycastle/bcpg/sig/Revocable.java46
-rw-r--r--pg/src/main/java/org/spongycastle/bcpg/sig/RevocationKey.java52
-rw-r--r--pg/src/main/java/org/spongycastle/bcpg/sig/RevocationKeyTags.java8
-rw-r--r--pg/src/main/java/org/spongycastle/bcpg/sig/RevocationReason.java51
-rw-r--r--pg/src/main/java/org/spongycastle/bcpg/sig/RevocationReasonTags.java12
-rw-r--r--pg/src/main/java/org/spongycastle/bcpg/sig/SignatureCreationTime.java48
-rw-r--r--pg/src/main/java/org/spongycastle/bcpg/sig/SignatureExpirationTime.java48
-rw-r--r--pg/src/main/java/org/spongycastle/bcpg/sig/SignerUserID.java37
-rw-r--r--pg/src/main/java/org/spongycastle/bcpg/sig/TrustSignature.java48
18 files changed, 903 insertions, 0 deletions
diff --git a/pg/src/main/java/org/spongycastle/bcpg/sig/EmbeddedSignature.java b/pg/src/main/java/org/spongycastle/bcpg/sig/EmbeddedSignature.java
new file mode 100644
index 00000000..b4861b12
--- /dev/null
+++ b/pg/src/main/java/org/spongycastle/bcpg/sig/EmbeddedSignature.java
@@ -0,0 +1,18 @@
+package org.spongycastle.bcpg.sig;
+
+import org.spongycastle.bcpg.SignatureSubpacket;
+import org.spongycastle.bcpg.SignatureSubpacketTags;
+
+/**
+ * Packet embedded signature
+ */
+public class EmbeddedSignature
+ extends SignatureSubpacket
+{
+ public EmbeddedSignature(
+ boolean critical,
+ byte[] data)
+ {
+ super(SignatureSubpacketTags.EMBEDDED_SIGNATURE, critical, data);
+ }
+} \ No newline at end of file
diff --git a/pg/src/main/java/org/spongycastle/bcpg/sig/Exportable.java b/pg/src/main/java/org/spongycastle/bcpg/sig/Exportable.java
new file mode 100644
index 00000000..5831a69a
--- /dev/null
+++ b/pg/src/main/java/org/spongycastle/bcpg/sig/Exportable.java
@@ -0,0 +1,46 @@
+package org.spongycastle.bcpg.sig;
+
+import org.spongycastle.bcpg.SignatureSubpacket;
+import org.spongycastle.bcpg.SignatureSubpacketTags;
+
+/**
+ * packet giving signature creation time.
+ */
+public class Exportable
+ extends SignatureSubpacket
+{
+ private static byte[] booleanToByteArray(
+ boolean value)
+ {
+ byte[] data = new byte[1];
+
+ if (value)
+ {
+ data[0] = 1;
+ return data;
+ }
+ else
+ {
+ return data;
+ }
+ }
+
+ public Exportable(
+ boolean critical,
+ byte[] data)
+ {
+ super(SignatureSubpacketTags.EXPORTABLE, critical, data);
+ }
+
+ public Exportable(
+ boolean critical,
+ boolean isExportable)
+ {
+ super(SignatureSubpacketTags.EXPORTABLE, critical, booleanToByteArray(isExportable));
+ }
+
+ public boolean isExportable()
+ {
+ return data[0] != 0;
+ }
+}
diff --git a/pg/src/main/java/org/spongycastle/bcpg/sig/Features.java b/pg/src/main/java/org/spongycastle/bcpg/sig/Features.java
new file mode 100644
index 00000000..02ee5790
--- /dev/null
+++ b/pg/src/main/java/org/spongycastle/bcpg/sig/Features.java
@@ -0,0 +1,98 @@
+package org.spongycastle.bcpg.sig;
+
+import org.spongycastle.bcpg.SignatureSubpacket;
+import org.spongycastle.bcpg.SignatureSubpacketTags;
+
+public class Features
+ extends SignatureSubpacket
+{
+
+ /** Identifier for the modification detection feature */
+ public static final byte FEATURE_MODIFICATION_DETECTION = 1;
+
+ private static final byte[] featureToByteArray(byte feature)
+ {
+ byte[] data = new byte[1];
+ data[0] = feature;
+ return data;
+ }
+
+ public Features(boolean critical, byte[] data)
+ {
+ super(SignatureSubpacketTags.FEATURES, critical, data);
+ }
+
+ public Features(boolean critical, byte feature)
+ {
+ super(SignatureSubpacketTags.FEATURES, critical, featureToByteArray(feature));
+ }
+
+ /**
+ * Returns if modification detection is supported.
+ */
+ public boolean supportsModificationDetection()
+ {
+ return supportsFeature(FEATURE_MODIFICATION_DETECTION);
+ }
+
+
+// /** Class should be immutable.
+// * Set modification detection support.
+// */
+// public void setSupportsModificationDetection(boolean support)
+// {
+// setSupportsFeature(FEATURE_MODIFICATION_DETECTION, support);
+// }
+
+
+ /**
+ * Returns if a particular feature is supported.
+ */
+ public boolean supportsFeature(byte feature)
+ {
+ for (int i = 0; i < data.length; i++)
+ {
+ if (data[i] == feature)
+ {
+ return true;
+ }
+ }
+ return false;
+ }
+
+
+ /**
+ * Sets support for a particular feature.
+ */
+ private void setSupportsFeature(byte feature, boolean support)
+ {
+ if (feature == 0)
+ {
+ throw new IllegalArgumentException("feature == 0");
+ }
+ if (supportsFeature(feature) != support)
+ {
+ if (support == true)
+ {
+ byte[] temp = new byte[data.length + 1];
+ System.arraycopy(data, 0, temp, 0, data.length);
+ temp[data.length] = feature;
+ data = temp;
+ }
+ else
+ {
+ for (int i = 0; i < data.length; i++)
+ {
+ if (data[i] == feature)
+ {
+ byte[] temp = new byte[data.length - 1];
+ System.arraycopy(data, 0, temp, 0, i);
+ System.arraycopy(data, i + 1, temp, i, temp.length - i);
+ data = temp;
+ break;
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/pg/src/main/java/org/spongycastle/bcpg/sig/IssuerKeyID.java b/pg/src/main/java/org/spongycastle/bcpg/sig/IssuerKeyID.java
new file mode 100644
index 00000000..b963b797
--- /dev/null
+++ b/pg/src/main/java/org/spongycastle/bcpg/sig/IssuerKeyID.java
@@ -0,0 +1,50 @@
+package org.spongycastle.bcpg.sig;
+
+import org.spongycastle.bcpg.SignatureSubpacket;
+import org.spongycastle.bcpg.SignatureSubpacketTags;
+
+/**
+ * packet giving signature creation time.
+ */
+public class IssuerKeyID
+ extends SignatureSubpacket
+{
+ protected static byte[] keyIDToBytes(
+ long keyId)
+ {
+ byte[] data = new byte[8];
+
+ data[0] = (byte)(keyId >> 56);
+ data[1] = (byte)(keyId >> 48);
+ data[2] = (byte)(keyId >> 40);
+ data[3] = (byte)(keyId >> 32);
+ data[4] = (byte)(keyId >> 24);
+ data[5] = (byte)(keyId >> 16);
+ data[6] = (byte)(keyId >> 8);
+ data[7] = (byte)keyId;
+
+ return data;
+ }
+
+ public IssuerKeyID(
+ boolean critical,
+ byte[] data)
+ {
+ super(SignatureSubpacketTags.ISSUER_KEY_ID, critical, data);
+ }
+
+ public IssuerKeyID(
+ boolean critical,
+ long keyID)
+ {
+ super(SignatureSubpacketTags.ISSUER_KEY_ID, critical, keyIDToBytes(keyID));
+ }
+
+ public long getKeyID()
+ {
+ long keyID = ((long)(data[0] & 0xff) << 56) | ((long)(data[1] & 0xff) << 48) | ((long)(data[2] & 0xff) << 40) | ((long)(data[3] & 0xff) << 32)
+ | ((long)(data[4] & 0xff) << 24) | ((data[5] & 0xff) << 16) | ((data[6] & 0xff) << 8) | (data[7] & 0xff);
+
+ return keyID;
+ }
+}
diff --git a/pg/src/main/java/org/spongycastle/bcpg/sig/KeyExpirationTime.java b/pg/src/main/java/org/spongycastle/bcpg/sig/KeyExpirationTime.java
new file mode 100644
index 00000000..dc0817c9
--- /dev/null
+++ b/pg/src/main/java/org/spongycastle/bcpg/sig/KeyExpirationTime.java
@@ -0,0 +1,50 @@
+package org.spongycastle.bcpg.sig;
+
+import org.spongycastle.bcpg.SignatureSubpacket;
+import org.spongycastle.bcpg.SignatureSubpacketTags;
+
+/**
+ * packet giving time after creation at which the key expires.
+ */
+public class KeyExpirationTime
+ extends SignatureSubpacket
+{
+ protected static byte[] timeToBytes(
+ long t)
+ {
+ byte[] data = new byte[4];
+
+ data[0] = (byte)(t >> 24);
+ data[1] = (byte)(t >> 16);
+ data[2] = (byte)(t >> 8);
+ data[3] = (byte)t;
+
+ return data;
+ }
+
+ public KeyExpirationTime(
+ boolean critical,
+ byte[] data)
+ {
+ super(SignatureSubpacketTags.KEY_EXPIRE_TIME, critical, data);
+ }
+
+ public KeyExpirationTime(
+ boolean critical,
+ long seconds)
+ {
+ super(SignatureSubpacketTags.KEY_EXPIRE_TIME, critical, timeToBytes(seconds));
+ }
+
+ /**
+ * Return the number of seconds after creation time a key is valid for.
+ *
+ * @return second count for key validity.
+ */
+ public long getTime()
+ {
+ long time = ((long)(data[0] & 0xff) << 24) | ((data[1] & 0xff) << 16) | ((data[2] & 0xff) << 8) | (data[3] & 0xff);
+
+ return time;
+ }
+}
diff --git a/pg/src/main/java/org/spongycastle/bcpg/sig/KeyFlags.java b/pg/src/main/java/org/spongycastle/bcpg/sig/KeyFlags.java
new file mode 100644
index 00000000..6ebb1fa8
--- /dev/null
+++ b/pg/src/main/java/org/spongycastle/bcpg/sig/KeyFlags.java
@@ -0,0 +1,73 @@
+package org.spongycastle.bcpg.sig;
+
+import org.spongycastle.bcpg.SignatureSubpacket;
+import org.spongycastle.bcpg.SignatureSubpacketTags;
+
+/**
+ * Packet holding the key flag values.
+ */
+public class KeyFlags
+ extends SignatureSubpacket
+{
+ public static final int CERTIFY_OTHER = 0x01;
+ public static final int SIGN_DATA = 0x02;
+ public static final int ENCRYPT_COMMS = 0x04;
+ public static final int ENCRYPT_STORAGE = 0x08;
+ public static final int SPLIT = 0x10;
+ public static final int AUTHENTICATION = 0x20;
+ public static final int SHARED = 0x80;
+
+ private static byte[] intToByteArray(
+ int v)
+ {
+ byte[] tmp = new byte[4];
+ int size = 0;
+
+ for (int i = 0; i != 4; i++)
+ {
+ tmp[i] = (byte)(v >> (i * 8));
+ if (tmp[i] != 0)
+ {
+ size = i;
+ }
+ }
+
+ byte[] data = new byte[size + 1];
+
+ System.arraycopy(tmp, 0, data, 0, data.length);
+
+ return data;
+ }
+
+ public KeyFlags(
+ boolean critical,
+ byte[] data)
+ {
+ super(SignatureSubpacketTags.KEY_FLAGS, critical, data);
+ }
+
+ public KeyFlags(
+ boolean critical,
+ int flags)
+ {
+ super(SignatureSubpacketTags.KEY_FLAGS, critical, intToByteArray(flags));
+ }
+
+ /**
+ * Return the flag values contained in the first 4 octets (note: at the moment
+ * the standard only uses the first one).
+ *
+ * @return flag values.
+ */
+ public int getFlags()
+ {
+ int flags = 0;
+
+ for (int i = 0; i != data.length; i++)
+ {
+ flags |= (data[i] & 0xff) << (i * 8);
+ }
+
+ return flags;
+ }
+}
diff --git a/pg/src/main/java/org/spongycastle/bcpg/sig/NotationData.java b/pg/src/main/java/org/spongycastle/bcpg/sig/NotationData.java
new file mode 100644
index 00000000..d4b04323
--- /dev/null
+++ b/pg/src/main/java/org/spongycastle/bcpg/sig/NotationData.java
@@ -0,0 +1,113 @@
+package org.spongycastle.bcpg.sig;
+
+import java.io.ByteArrayOutputStream;
+
+import org.spongycastle.bcpg.SignatureSubpacket;
+import org.spongycastle.bcpg.SignatureSubpacketTags;
+import org.spongycastle.util.Strings;
+
+/**
+ * Class provided a NotationData object according to
+ * RFC2440, Chapter 5.2.3.15. Notation Data
+ */
+public class NotationData
+ extends SignatureSubpacket
+{
+ public static final int HEADER_FLAG_LENGTH = 4;
+ public static final int HEADER_NAME_LENGTH = 2;
+ public static final int HEADER_VALUE_LENGTH = 2;
+
+ public NotationData(boolean critical, byte[] data)
+ {
+ super(SignatureSubpacketTags.NOTATION_DATA, critical, data);
+ }
+
+ public NotationData(
+ boolean critical,
+ boolean humanReadable,
+ String notationName,
+ String notationValue)
+ {
+ super(SignatureSubpacketTags.NOTATION_DATA, critical, createData(humanReadable, notationName, notationValue));
+ }
+
+ private static byte[] createData(boolean humanReadable, String notationName, String notationValue)
+ {
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+
+// (4 octets of flags, 2 octets of name length (M),
+// 2 octets of value length (N),
+// M octets of name data,
+// N octets of value data)
+
+ // flags
+ out.write(humanReadable ? 0x80 : 0x00);
+ out.write(0x0);
+ out.write(0x0);
+ out.write(0x0);
+
+ byte[] nameData, valueData = null;
+ int nameLength, valueLength;
+
+ nameData = Strings.toUTF8ByteArray(notationName);
+ nameLength = Math.min(nameData.length, 0xFFFF);
+
+ if (nameLength != nameData.length)
+ {
+ throw new IllegalArgumentException("notationName exceeds maximum length.");
+ }
+
+ valueData = Strings.toUTF8ByteArray(notationValue);
+ valueLength = Math.min(valueData.length, 0xFFFF);
+ if (valueLength != valueData.length)
+ {
+ throw new IllegalArgumentException("notationValue exceeds maximum length.");
+ }
+
+ // name length
+ out.write((nameLength >>> 8) & 0xFF);
+ out.write((nameLength >>> 0) & 0xFF);
+
+ // value length
+ out.write((valueLength >>> 8) & 0xFF);
+ out.write((valueLength >>> 0) & 0xFF);
+
+ // name
+ out.write(nameData, 0, nameLength);
+
+ // value
+ out.write(valueData, 0, valueLength);
+
+ return out.toByteArray();
+ }
+
+ public boolean isHumanReadable()
+ {
+ return data[0] == (byte)0x80;
+ }
+
+ public String getNotationName()
+ {
+ int nameLength = (((data[HEADER_FLAG_LENGTH] & 0xff) << 8) + (data[HEADER_FLAG_LENGTH + 1] & 0xff));
+
+ byte bName[] = new byte[nameLength];
+ System.arraycopy(data, HEADER_FLAG_LENGTH + HEADER_NAME_LENGTH + HEADER_VALUE_LENGTH, bName, 0, nameLength);
+
+ return Strings.fromUTF8ByteArray(bName);
+ }
+
+ public String getNotationValue()
+ {
+ return Strings.fromUTF8ByteArray(getNotationValueBytes());
+ }
+
+ public byte[] getNotationValueBytes()
+ {
+ int nameLength = (((data[HEADER_FLAG_LENGTH] & 0xff) << 8) + (data[HEADER_FLAG_LENGTH + 1] & 0xff));
+ int valueLength = (((data[HEADER_FLAG_LENGTH + HEADER_NAME_LENGTH] & 0xff) << 8) + (data[HEADER_FLAG_LENGTH + HEADER_NAME_LENGTH + 1] & 0xff));
+
+ byte bValue[] = new byte[valueLength];
+ System.arraycopy(data, HEADER_FLAG_LENGTH + HEADER_NAME_LENGTH + HEADER_VALUE_LENGTH + nameLength, bValue, 0, valueLength);
+ return bValue;
+ }
+}
diff --git a/pg/src/main/java/org/spongycastle/bcpg/sig/PreferredAlgorithms.java b/pg/src/main/java/org/spongycastle/bcpg/sig/PreferredAlgorithms.java
new file mode 100644
index 00000000..ce99a1dc
--- /dev/null
+++ b/pg/src/main/java/org/spongycastle/bcpg/sig/PreferredAlgorithms.java
@@ -0,0 +1,59 @@
+package org.spongycastle.bcpg.sig;
+
+import org.spongycastle.bcpg.SignatureSubpacket;
+
+/**
+ * packet giving signature creation time.
+ */
+public class PreferredAlgorithms
+ extends SignatureSubpacket
+{
+ private static byte[] intToByteArray(
+ int[] v)
+ {
+ byte[] data = new byte[v.length];
+
+ for (int i = 0; i != v.length; i++)
+ {
+ data[i] = (byte)v[i];
+ }
+
+ return data;
+ }
+
+ public PreferredAlgorithms(
+ int type,
+ boolean critical,
+ byte[] data)
+ {
+ super(type, critical, data);
+ }
+
+ public PreferredAlgorithms(
+ int type,
+ boolean critical,
+ int[] preferrences)
+ {
+ super(type, critical, intToByteArray(preferrences));
+ }
+
+ /**
+ * @deprecated mispelt!
+ */
+ public int[] getPreferrences()
+ {
+ return getPreferences();
+ }
+
+ public int[] getPreferences()
+ {
+ int[] v = new int[data.length];
+
+ for (int i = 0; i != v.length; i++)
+ {
+ v[i] = data[i] & 0xff;
+ }
+
+ return v;
+ }
+}
diff --git a/pg/src/main/java/org/spongycastle/bcpg/sig/PrimaryUserID.java b/pg/src/main/java/org/spongycastle/bcpg/sig/PrimaryUserID.java
new file mode 100644
index 00000000..80829ad8
--- /dev/null
+++ b/pg/src/main/java/org/spongycastle/bcpg/sig/PrimaryUserID.java
@@ -0,0 +1,46 @@
+package org.spongycastle.bcpg.sig;
+
+import org.spongycastle.bcpg.SignatureSubpacket;
+import org.spongycastle.bcpg.SignatureSubpacketTags;
+
+/**
+ * packet giving whether or not the signature is signed using the primary user ID for the key.
+ */
+public class PrimaryUserID
+ extends SignatureSubpacket
+{
+ private static byte[] booleanToByteArray(
+ boolean value)
+ {
+ byte[] data = new byte[1];
+
+ if (value)
+ {
+ data[0] = 1;
+ return data;
+ }
+ else
+ {
+ return data;
+ }
+ }
+
+ public PrimaryUserID(
+ boolean critical,
+ byte[] data)
+ {
+ super(SignatureSubpacketTags.PRIMARY_USER_ID, critical, data);
+ }
+
+ public PrimaryUserID(
+ boolean critical,
+ boolean isPrimaryUserID)
+ {
+ super(SignatureSubpacketTags.PRIMARY_USER_ID, critical, booleanToByteArray(isPrimaryUserID));
+ }
+
+ public boolean isPrimaryUserID()
+ {
+ return data[0] != 0;
+ }
+}
diff --git a/pg/src/main/java/org/spongycastle/bcpg/sig/Revocable.java b/pg/src/main/java/org/spongycastle/bcpg/sig/Revocable.java
new file mode 100644
index 00000000..b982b014
--- /dev/null
+++ b/pg/src/main/java/org/spongycastle/bcpg/sig/Revocable.java
@@ -0,0 +1,46 @@
+package org.spongycastle.bcpg.sig;
+
+import org.spongycastle.bcpg.SignatureSubpacket;
+import org.spongycastle.bcpg.SignatureSubpacketTags;
+
+/**
+ * packet giving whether or not is revocable.
+ */
+public class Revocable
+ extends SignatureSubpacket
+{
+ private static byte[] booleanToByteArray(
+ boolean value)
+ {
+ byte[] data = new byte[1];
+
+ if (value)
+ {
+ data[0] = 1;
+ return data;
+ }
+ else
+ {
+ return data;
+ }
+ }
+
+ public Revocable(
+ boolean critical,
+ byte[] data)
+ {
+ super(SignatureSubpacketTags.REVOCABLE, critical, data);
+ }
+
+ public Revocable(
+ boolean critical,
+ boolean isRevocable)
+ {
+ super(SignatureSubpacketTags.REVOCABLE, critical, booleanToByteArray(isRevocable));
+ }
+
+ public boolean isRevocable()
+ {
+ return data[0] != 0;
+ }
+}
diff --git a/pg/src/main/java/org/spongycastle/bcpg/sig/RevocationKey.java b/pg/src/main/java/org/spongycastle/bcpg/sig/RevocationKey.java
new file mode 100644
index 00000000..b1059330
--- /dev/null
+++ b/pg/src/main/java/org/spongycastle/bcpg/sig/RevocationKey.java
@@ -0,0 +1,52 @@
+package org.spongycastle.bcpg.sig;
+
+import org.spongycastle.bcpg.SignatureSubpacket;
+import org.spongycastle.bcpg.SignatureSubpacketTags;
+
+/**
+ * Represents revocation key OpenPGP signature sub packet.
+ */
+public class RevocationKey extends SignatureSubpacket
+{
+ // 1 octet of class,
+ // 1 octet of public-key algorithm ID,
+ // 20 octets of fingerprint
+ public RevocationKey(boolean isCritical, byte[] data)
+ {
+ super(SignatureSubpacketTags.REVOCATION_KEY, isCritical, data);
+ }
+
+ public RevocationKey(boolean isCritical, byte signatureClass, int keyAlgorithm,
+ byte[] fingerprint)
+ {
+ super(SignatureSubpacketTags.REVOCATION_KEY, isCritical, createData(signatureClass,
+ (byte)(keyAlgorithm & 0xff), fingerprint));
+ }
+
+ private static byte[] createData(byte signatureClass, byte keyAlgorithm, byte[] fingerprint)
+ {
+ byte[] data = new byte[2 + fingerprint.length];
+ data[0] = signatureClass;
+ data[1] = keyAlgorithm;
+ System.arraycopy(fingerprint, 0, data, 2, fingerprint.length);
+ return data;
+ }
+
+ public byte getSignatureClass()
+ {
+ return this.getData()[0];
+ }
+
+ public int getAlgorithm()
+ {
+ return this.getData()[1];
+ }
+
+ public byte[] getFingerprint()
+ {
+ byte[] data = this.getData();
+ byte[] fingerprint = new byte[data.length - 2];
+ System.arraycopy(data, 2, fingerprint, 0, fingerprint.length);
+ return fingerprint;
+ }
+}
diff --git a/pg/src/main/java/org/spongycastle/bcpg/sig/RevocationKeyTags.java b/pg/src/main/java/org/spongycastle/bcpg/sig/RevocationKeyTags.java
new file mode 100644
index 00000000..294fdd34
--- /dev/null
+++ b/pg/src/main/java/org/spongycastle/bcpg/sig/RevocationKeyTags.java
@@ -0,0 +1,8 @@
+package org.spongycastle.bcpg.sig;
+
+public interface RevocationKeyTags
+{
+ public static final byte CLASS_DEFAULT = (byte)0x80;
+ public static final byte CLASS_SENSITIVE = (byte)0x40;
+
+}
diff --git a/pg/src/main/java/org/spongycastle/bcpg/sig/RevocationReason.java b/pg/src/main/java/org/spongycastle/bcpg/sig/RevocationReason.java
new file mode 100644
index 00000000..33cf451d
--- /dev/null
+++ b/pg/src/main/java/org/spongycastle/bcpg/sig/RevocationReason.java
@@ -0,0 +1,51 @@
+package org.spongycastle.bcpg.sig;
+
+import org.spongycastle.bcpg.SignatureSubpacket;
+import org.spongycastle.bcpg.SignatureSubpacketTags;
+import org.spongycastle.util.Strings;
+
+/**
+ * Represents revocation reason OpenPGP signature sub packet.
+ */
+public class RevocationReason extends SignatureSubpacket
+{
+ public RevocationReason(boolean isCritical, byte[] data)
+ {
+ super(SignatureSubpacketTags.REVOCATION_REASON, isCritical, data);
+ }
+
+ public RevocationReason(boolean isCritical, byte reason, String description)
+ {
+ super(SignatureSubpacketTags.REVOCATION_REASON, isCritical, createData(reason, description));
+ }
+
+ private static byte[] createData(byte reason, String description)
+ {
+ byte[] descriptionBytes = Strings.toUTF8ByteArray(description);
+ byte[] data = new byte[1 + descriptionBytes.length];
+
+ data[0] = reason;
+ System.arraycopy(descriptionBytes, 0, data, 1, descriptionBytes.length);
+
+ return data;
+ }
+
+ public byte getRevocationReason()
+ {
+ return getData()[0];
+ }
+
+ public String getRevocationDescription()
+ {
+ byte[] data = getData();
+ if (data.length == 1)
+ {
+ return "";
+ }
+
+ byte[] description = new byte[data.length - 1];
+ System.arraycopy(data, 1, description, 0, description.length);
+
+ return Strings.fromUTF8ByteArray(description);
+ }
+}
diff --git a/pg/src/main/java/org/spongycastle/bcpg/sig/RevocationReasonTags.java b/pg/src/main/java/org/spongycastle/bcpg/sig/RevocationReasonTags.java
new file mode 100644
index 00000000..94233fb3
--- /dev/null
+++ b/pg/src/main/java/org/spongycastle/bcpg/sig/RevocationReasonTags.java
@@ -0,0 +1,12 @@
+package org.spongycastle.bcpg.sig;
+
+public interface RevocationReasonTags
+{
+ public static final byte NO_REASON = 0; // No reason specified (key revocations or cert revocations)
+ public static final byte KEY_SUPERSEDED = 1; // Key is superseded (key revocations)
+ public static final byte KEY_COMPROMISED = 2; // Key material has been compromised (key revocations)
+ public static final byte KEY_RETIRED = 3; // Key is retired and no longer used (key revocations)
+ public static final byte USER_NO_LONGER_VALID = 32; // User ID information is no longer valid (cert revocations)
+
+ // 100-110 - Private Use
+}
diff --git a/pg/src/main/java/org/spongycastle/bcpg/sig/SignatureCreationTime.java b/pg/src/main/java/org/spongycastle/bcpg/sig/SignatureCreationTime.java
new file mode 100644
index 00000000..888cb9a9
--- /dev/null
+++ b/pg/src/main/java/org/spongycastle/bcpg/sig/SignatureCreationTime.java
@@ -0,0 +1,48 @@
+package org.spongycastle.bcpg.sig;
+
+import java.util.Date;
+
+import org.spongycastle.bcpg.SignatureSubpacket;
+import org.spongycastle.bcpg.SignatureSubpacketTags;
+
+/**
+ * packet giving signature creation time.
+ */
+public class SignatureCreationTime
+ extends SignatureSubpacket
+{
+ protected static byte[] timeToBytes(
+ Date date)
+ {
+ byte[] data = new byte[4];
+ long t = date.getTime() / 1000;
+
+ data[0] = (byte)(t >> 24);
+ data[1] = (byte)(t >> 16);
+ data[2] = (byte)(t >> 8);
+ data[3] = (byte)t;
+
+ return data;
+ }
+
+ public SignatureCreationTime(
+ boolean critical,
+ byte[] data)
+ {
+ super(SignatureSubpacketTags.CREATION_TIME, critical, data);
+ }
+
+ public SignatureCreationTime(
+ boolean critical,
+ Date date)
+ {
+ super(SignatureSubpacketTags.CREATION_TIME, critical, timeToBytes(date));
+ }
+
+ public Date getTime()
+ {
+ long time = ((long)(data[0] & 0xff) << 24) | ((data[1] & 0xff) << 16) | ((data[2] & 0xff) << 8) | (data[3] & 0xff);
+
+ return new Date(time * 1000);
+ }
+}
diff --git a/pg/src/main/java/org/spongycastle/bcpg/sig/SignatureExpirationTime.java b/pg/src/main/java/org/spongycastle/bcpg/sig/SignatureExpirationTime.java
new file mode 100644
index 00000000..bcf1444d
--- /dev/null
+++ b/pg/src/main/java/org/spongycastle/bcpg/sig/SignatureExpirationTime.java
@@ -0,0 +1,48 @@
+package org.spongycastle.bcpg.sig;
+
+import org.spongycastle.bcpg.SignatureSubpacket;
+import org.spongycastle.bcpg.SignatureSubpacketTags;
+
+/**
+ * packet giving signature expiration time.
+ */
+public class SignatureExpirationTime
+ extends SignatureSubpacket
+{
+ protected static byte[] timeToBytes(
+ long t)
+ {
+ byte[] data = new byte[4];
+
+ data[0] = (byte)(t >> 24);
+ data[1] = (byte)(t >> 16);
+ data[2] = (byte)(t >> 8);
+ data[3] = (byte)t;
+
+ return data;
+ }
+
+ public SignatureExpirationTime(
+ boolean critical,
+ byte[] data)
+ {
+ super(SignatureSubpacketTags.EXPIRE_TIME, critical, data);
+ }
+
+ public SignatureExpirationTime(
+ boolean critical,
+ long seconds)
+ {
+ super(SignatureSubpacketTags.EXPIRE_TIME, critical, timeToBytes(seconds));
+ }
+
+ /**
+ * return time in seconds before signature expires after creation time.
+ */
+ public long getTime()
+ {
+ long time = ((long)(data[0] & 0xff) << 24) | ((data[1] & 0xff) << 16) | ((data[2] & 0xff) << 8) | (data[3] & 0xff);
+
+ return time;
+ }
+}
diff --git a/pg/src/main/java/org/spongycastle/bcpg/sig/SignerUserID.java b/pg/src/main/java/org/spongycastle/bcpg/sig/SignerUserID.java
new file mode 100644
index 00000000..f1adf4b1
--- /dev/null
+++ b/pg/src/main/java/org/spongycastle/bcpg/sig/SignerUserID.java
@@ -0,0 +1,37 @@
+package org.spongycastle.bcpg.sig;
+
+import org.spongycastle.bcpg.SignatureSubpacket;
+import org.spongycastle.bcpg.SignatureSubpacketTags;
+import org.spongycastle.util.Arrays;
+import org.spongycastle.util.Strings;
+
+/**
+ * packet giving the User ID of the signer.
+ */
+public class SignerUserID
+ extends SignatureSubpacket
+{
+ public SignerUserID(
+ boolean critical,
+ byte[] data)
+ {
+ super(SignatureSubpacketTags.SIGNER_USER_ID, critical, data);
+ }
+
+ public SignerUserID(
+ boolean critical,
+ String userID)
+ {
+ super(SignatureSubpacketTags.SIGNER_USER_ID, critical, Strings.toUTF8ByteArray(userID));
+ }
+
+ public String getID()
+ {
+ return Strings.fromUTF8ByteArray(data);
+ }
+
+ public byte[] getRawID()
+ {
+ return Arrays.clone(data);
+ }
+}
diff --git a/pg/src/main/java/org/spongycastle/bcpg/sig/TrustSignature.java b/pg/src/main/java/org/spongycastle/bcpg/sig/TrustSignature.java
new file mode 100644
index 00000000..4555f222
--- /dev/null
+++ b/pg/src/main/java/org/spongycastle/bcpg/sig/TrustSignature.java
@@ -0,0 +1,48 @@
+package org.spongycastle.bcpg.sig;
+
+import org.spongycastle.bcpg.SignatureSubpacket;
+import org.spongycastle.bcpg.SignatureSubpacketTags;
+
+/**
+ * packet giving trust.
+ */
+public class TrustSignature
+ extends SignatureSubpacket
+{
+ private static byte[] intToByteArray(
+ int v1,
+ int v2)
+ {
+ byte[] data = new byte[2];
+
+ data[0] = (byte)v1;
+ data[1] = (byte)v2;
+
+ return data;
+ }
+
+ public TrustSignature(
+ boolean critical,
+ byte[] data)
+ {
+ super(SignatureSubpacketTags.TRUST_SIG, critical, data);
+ }
+
+ public TrustSignature(
+ boolean critical,
+ int depth,
+ int trustAmount)
+ {
+ super(SignatureSubpacketTags.TRUST_SIG, critical, intToByteArray(depth, trustAmount));
+ }
+
+ public int getDepth()
+ {
+ return data[0] & 0xff;
+ }
+
+ public int getTrustAmount()
+ {
+ return data[1] & 0xff;
+ }
+}