diff --git a/crypto/src/bcpg/sig/IntendedRecipientFingerprint.cs b/crypto/src/bcpg/sig/IntendedRecipientFingerprint.cs
new file mode 100644
index 000000000..7077c2d40
--- /dev/null
+++ b/crypto/src/bcpg/sig/IntendedRecipientFingerprint.cs
@@ -0,0 +1,28 @@
+using System;
+
+using Org.BouncyCastle.Utilities;
+
+namespace Org.BouncyCastle.Bcpg.Sig
+{
+ /**
+ * packet giving the intended recipient fingerprint.
+ */
+ public class IntendedRecipientFingerprint
+ : SignatureSubpacket
+ {
+ public IntendedRecipientFingerprint(bool critical, bool isLongLength, byte[] data)
+ : base(SignatureSubpacketTag.IntendedRecipientFingerprint, critical, isLongLength, data)
+ {
+ }
+
+ public IntendedRecipientFingerprint(bool critical, int keyVersion, byte[] fingerprint)
+ : base(SignatureSubpacketTag.IntendedRecipientFingerprint, critical, false,
+ Arrays.Prepend(fingerprint, (byte)keyVersion))
+ {
+ }
+
+ public int KeyVersion => data[0];
+
+ public byte[] GetFingerprint() => Arrays.CopyOfRange(data, 1, data.Length);
+ }
+}
diff --git a/crypto/src/bcpg/sig/IssuerFingerprint.cs b/crypto/src/bcpg/sig/IssuerFingerprint.cs
new file mode 100644
index 000000000..469a8e0d8
--- /dev/null
+++ b/crypto/src/bcpg/sig/IssuerFingerprint.cs
@@ -0,0 +1,28 @@
+using System;
+
+using Org.BouncyCastle.Utilities;
+
+namespace Org.BouncyCastle.Bcpg.Sig
+{
+ /**
+ * packet giving the issuer key fingerprint.
+ */
+ public class IssuerFingerprint
+ : SignatureSubpacket
+ {
+ public IssuerFingerprint(bool critical, bool isLongLength, byte[] data)
+ : base(SignatureSubpacketTag.IssuerFingerprint, critical, isLongLength, data)
+ {
+ }
+
+ public IssuerFingerprint(bool critical, int keyVersion, byte[] fingerprint)
+ : base(SignatureSubpacketTag.IssuerFingerprint, critical, false,
+ Arrays.Prepend(fingerprint, (byte)keyVersion))
+ {
+ }
+
+ public int KeyVersion => data[0];
+
+ public byte[] GetFingerprint() => Arrays.CopyOfRange(data, 1, data.Length);
+ }
+}
diff --git a/crypto/src/bcpg/sig/PolicyUrl.cs b/crypto/src/bcpg/sig/PolicyUrl.cs
new file mode 100644
index 000000000..16f4d1a64
--- /dev/null
+++ b/crypto/src/bcpg/sig/PolicyUrl.cs
@@ -0,0 +1,24 @@
+using System;
+
+using Org.BouncyCastle.Utilities;
+
+namespace Org.BouncyCastle.Bcpg.Sig
+{
+ public class PolicyUrl
+ : SignatureSubpacket
+ {
+ public PolicyUrl(bool critical, string url)
+ : this(critical, false, Strings.ToUtf8ByteArray(url))
+ {
+ }
+
+ public PolicyUrl(bool critical, bool isLongLength, byte[] data)
+ : base(SignatureSubpacketTag.PolicyUrl, critical, isLongLength, data)
+ {
+ }
+
+ public string Url => Strings.FromUtf8ByteArray(data);
+
+ public byte[] GetRawUrl() => Arrays.Clone(data);
+ }
+}
diff --git a/crypto/src/bcpg/sig/RegularExpression.cs b/crypto/src/bcpg/sig/RegularExpression.cs
new file mode 100644
index 000000000..c4b48ea2a
--- /dev/null
+++ b/crypto/src/bcpg/sig/RegularExpression.cs
@@ -0,0 +1,40 @@
+using System;
+using System.Text.RegularExpressions;
+
+using Org.BouncyCastle.Utilities;
+
+namespace Org.BouncyCastle.Bcpg.Sig
+{
+ /**
+ * Regexp Packet - RFC 4880 5.2.3.14. Note: the RFC says the byte encoding is to be null terminated.
+ */
+ public class RegularExpression
+ : SignatureSubpacket
+ {
+ public RegularExpression(bool critical, bool isLongLength, byte[] data)
+ : base(SignatureSubpacketTag.RegExp, critical, isLongLength, data)
+ {
+ if (data[data.Length - 1] != 0)
+ throw new ArgumentException("data in regex missing null termination");
+ }
+
+ public RegularExpression(bool critical, string regex)
+ : base(SignatureSubpacketTag.RegExp, critical, false, ToNullTerminatedUtf8ByteArray(regex))
+ {
+ }
+
+ public string Regex
+ {
+ // last byte is null terminator
+ get { return Strings.FromUtf8ByteArray(data, 0, data.Length - 1); }
+ }
+
+ public byte[] GetRawRegex() => Arrays.Clone(data);
+
+ private static byte[] ToNullTerminatedUtf8ByteArray(string str)
+ {
+ byte[] utf8 = Strings.ToUtf8ByteArray(str);
+ return Arrays.Append(utf8, 0x00);
+ }
+ }
+}
diff --git a/crypto/src/bcpg/sig/RevocationKey.cs b/crypto/src/bcpg/sig/RevocationKey.cs
index 11467d2af..e4ad4195b 100644
--- a/crypto/src/bcpg/sig/RevocationKey.cs
+++ b/crypto/src/bcpg/sig/RevocationKey.cs
@@ -12,28 +12,20 @@ namespace Org.BouncyCastle.Bcpg
// 1 octet of class,
// 1 octet of public-key algorithm ID,
// 20 octets of fingerprint
- public RevocationKey(
- bool isCritical,
- bool isLongLength,
- byte[] data)
+ public RevocationKey(bool isCritical, bool isLongLength, byte[] data)
: base(SignatureSubpacketTag.RevocationKey, isCritical, isLongLength, data)
{
}
- public RevocationKey(
- bool isCritical,
- RevocationKeyTag signatureClass,
- PublicKeyAlgorithmTag keyAlgorithm,
- byte[] fingerprint)
+ public RevocationKey(bool isCritical, RevocationKeyTag signatureClass, PublicKeyAlgorithmTag keyAlgorithm,
+ byte[] fingerprint)
: base(SignatureSubpacketTag.RevocationKey, isCritical, false,
CreateData(signatureClass, keyAlgorithm, fingerprint))
{
}
- private static byte[] CreateData(
- RevocationKeyTag signatureClass,
- PublicKeyAlgorithmTag keyAlgorithm,
- byte[] fingerprint)
+ private static byte[] CreateData(RevocationKeyTag signatureClass, PublicKeyAlgorithmTag keyAlgorithm,
+ byte[] fingerprint)
{
byte[] data = new byte[2 + fingerprint.Length];
data[0] = (byte)signatureClass;
@@ -44,17 +36,16 @@ namespace Org.BouncyCastle.Bcpg
public virtual RevocationKeyTag SignatureClass
{
- get { return (RevocationKeyTag)this.GetData()[0]; }
+ get { return (RevocationKeyTag)data[0]; }
}
public virtual PublicKeyAlgorithmTag Algorithm
{
- get { return (PublicKeyAlgorithmTag)this.GetData()[1]; }
+ get { return (PublicKeyAlgorithmTag)data[1]; }
}
public virtual byte[] GetFingerprint()
{
- byte[] data = this.GetData();
byte[] fingerprint = new byte[data.Length - 2];
Array.Copy(data, 2, fingerprint, 0, fingerprint.Length);
return fingerprint;
diff --git a/crypto/src/bcpg/sig/SignatureTarget.cs b/crypto/src/bcpg/sig/SignatureTarget.cs
new file mode 100644
index 000000000..c6a8dc574
--- /dev/null
+++ b/crypto/src/bcpg/sig/SignatureTarget.cs
@@ -0,0 +1,30 @@
+using System;
+
+using Org.BouncyCastle.Utilities;
+
+namespace Org.BouncyCastle.Bcpg.Sig
+{
+ /**
+ * RFC 4880, Section 5.2.3.25 - Signature Target subpacket.
+ */
+ public class SignatureTarget
+ : SignatureSubpacket
+ {
+ public SignatureTarget(bool critical, bool isLongLength, byte[] data)
+ : base(SignatureSubpacketTag.SignatureTarget, critical, isLongLength, data)
+ {
+ }
+
+ public SignatureTarget(bool critical, int publicKeyAlgorithm, int hashAlgorithm, byte[] hashData)
+ : base(SignatureSubpacketTag.SignatureTarget, critical, false,
+ Arrays.Concatenate(new byte[]{ (byte)publicKeyAlgorithm, (byte)hashAlgorithm }, hashData))
+ {
+ }
+
+ public int PublicKeyAlgorithm => data[0];
+
+ public int HashAlgorithm => data[1];
+
+ public byte[] GetHashData() => Arrays.CopyOfRange(data, 2, data.Length);
+ }
+}
|