summary refs log tree commit diff
path: root/crypto/src/bcpg/sig
diff options
context:
space:
mode:
Diffstat (limited to 'crypto/src/bcpg/sig')
-rw-r--r--crypto/src/bcpg/sig/IntendedRecipientFingerprint.cs28
-rw-r--r--crypto/src/bcpg/sig/IssuerFingerprint.cs28
-rw-r--r--crypto/src/bcpg/sig/PolicyUrl.cs24
-rw-r--r--crypto/src/bcpg/sig/RegularExpression.cs40
-rw-r--r--crypto/src/bcpg/sig/RevocationKey.cs23
-rw-r--r--crypto/src/bcpg/sig/SignatureTarget.cs30
6 files changed, 157 insertions, 16 deletions
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); + } +}