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);
}
}
}