<PackageReference Include="BouncyCastle.Cryptography" Version="2.6.2" />

SignatureSubpacketsParser

using Org.BouncyCastle.Bcpg.Sig; using Org.BouncyCastle.Utilities; using Org.BouncyCastle.Utilities.IO; using System.IO; namespace Org.BouncyCastle.Bcpg { public class SignatureSubpacketsParser { private readonly Stream m_input; public SignatureSubpacketsParser(Stream input) { m_input = input; } public SignatureSubpacket ReadPacket() { StreamUtilities.StreamFlags flags; uint num = StreamUtilities.ReadBodyLen(m_input, out flags); if (flags.HasFlag(StreamUtilities.StreamFlags.Eof)) return null; if (flags.HasFlag(StreamUtilities.StreamFlags.Partial)) throw new IOException("unexpected length header"); bool isLongLength = flags.HasFlag(StreamUtilities.StreamFlags.LongLength); if (num >= 1) { byte num2 = StreamUtilities.RequireByte(m_input); byte[] array = new byte[num - 1]; int num3 = Streams.ReadFully(m_input, array); bool flag = (num2 & 128) != 0; SignatureSubpacketTag signatureSubpacketTag = (SignatureSubpacketTag)(num2 & 127); if (num3 != array.Length) { switch (signatureSubpacketTag) { case SignatureSubpacketTag.CreationTime: array = CheckData(array, 4, num3, "Signature Creation Time"); break; case SignatureSubpacketTag.IssuerKeyId: array = CheckData(array, 8, num3, "Issuer"); break; case SignatureSubpacketTag.KeyExpireTime: array = CheckData(array, 4, num3, "Signature Key Expiration Time"); break; case SignatureSubpacketTag.ExpireTime: array = CheckData(array, 4, num3, "Signature Expiration Time"); break; default: throw new EndOfStreamException("truncated subpacket data."); } } switch (signatureSubpacketTag) { case SignatureSubpacketTag.CreationTime: return new SignatureCreationTime(flag, isLongLength, array); case SignatureSubpacketTag.EmbeddedSignature: return new EmbeddedSignature(flag, isLongLength, array); case SignatureSubpacketTag.KeyExpireTime: return new KeyExpirationTime(flag, isLongLength, array); case SignatureSubpacketTag.ExpireTime: return new SignatureExpirationTime(flag, isLongLength, array); case SignatureSubpacketTag.Revocable: return new Revocable(flag, isLongLength, array); case SignatureSubpacketTag.Exportable: return new Exportable(flag, isLongLength, array); case SignatureSubpacketTag.Features: return new Features(flag, isLongLength, array); case SignatureSubpacketTag.IssuerKeyId: return new IssuerKeyId(flag, isLongLength, array); case SignatureSubpacketTag.TrustSig: return new TrustSignature(flag, isLongLength, array); case SignatureSubpacketTag.PreferredSymmetricAlgorithms: case SignatureSubpacketTag.PreferredHashAlgorithms: case SignatureSubpacketTag.PreferredCompressionAlgorithms: case SignatureSubpacketTag.PreferredAeadAlgorithms: return new PreferredAlgorithms(signatureSubpacketTag, flag, isLongLength, array); case SignatureSubpacketTag.KeyFlags: return new KeyFlags(flag, isLongLength, array); case SignatureSubpacketTag.PolicyUrl: return new PolicyUrl(flag, isLongLength, array); case SignatureSubpacketTag.PrimaryUserId: return new PrimaryUserId(flag, isLongLength, array); case SignatureSubpacketTag.SignerUserId: return new SignerUserId(flag, isLongLength, array); case SignatureSubpacketTag.NotationData: return new NotationData(flag, isLongLength, array); case SignatureSubpacketTag.RegExp: return new RegularExpression(flag, isLongLength, array); case SignatureSubpacketTag.RevocationReason: return new RevocationReason(flag, isLongLength, array); case SignatureSubpacketTag.RevocationKey: return new RevocationKey(flag, isLongLength, array); case SignatureSubpacketTag.SignatureTarget: return new SignatureTarget(flag, isLongLength, array); case SignatureSubpacketTag.IssuerFingerprint: return new IssuerFingerprint(flag, isLongLength, array); case SignatureSubpacketTag.IntendedRecipientFingerprint: return new IntendedRecipientFingerprint(flag, isLongLength, array); default: return new SignatureSubpacket(signatureSubpacketTag, flag, isLongLength, array); } } throw new EndOfStreamException("out of range data found in signature sub packet"); } private byte[] CheckData(byte[] data, int expected, int bytesRead, string name) { if (bytesRead != expected) throw new EndOfStreamException("truncated " + name + " subpacket data."); return Arrays.CopyOfRange(data, 0, expected); } } }