61 lines
1.5 KiB
C#
61 lines
1.5 KiB
C#
using System.IO;
|
|
using Org.BouncyCastle.Bcpg.Attr;
|
|
using Org.BouncyCastle.Utilities.IO;
|
|
|
|
namespace Org.BouncyCastle.Bcpg;
|
|
|
|
public class UserAttributeSubpacketsParser
|
|
{
|
|
private readonly Stream input;
|
|
|
|
public UserAttributeSubpacketsParser(Stream input)
|
|
{
|
|
this.input = input;
|
|
}
|
|
|
|
public virtual UserAttributeSubpacket ReadPacket()
|
|
{
|
|
int num = input.ReadByte();
|
|
if (num < 0)
|
|
{
|
|
return null;
|
|
}
|
|
int num2 = 0;
|
|
bool forceLongLength = false;
|
|
if (num < 192)
|
|
{
|
|
num2 = num;
|
|
}
|
|
else if (num <= 223)
|
|
{
|
|
num2 = (num - 192 << 8) + input.ReadByte() + 192;
|
|
}
|
|
else
|
|
{
|
|
if (num != 255)
|
|
{
|
|
throw new IOException("unrecognised length reading user attribute sub packet");
|
|
}
|
|
num2 = (input.ReadByte() << 24) | (input.ReadByte() << 16) | (input.ReadByte() << 8) | input.ReadByte();
|
|
forceLongLength = true;
|
|
}
|
|
int num3 = input.ReadByte();
|
|
if (num3 < 0)
|
|
{
|
|
throw new EndOfStreamException("unexpected EOF reading user attribute sub packet");
|
|
}
|
|
byte[] array = new byte[num2 - 1];
|
|
if (Streams.ReadFully(input, array) < array.Length)
|
|
{
|
|
throw new EndOfStreamException();
|
|
}
|
|
UserAttributeSubpacketTag userAttributeSubpacketTag = (UserAttributeSubpacketTag)num3;
|
|
UserAttributeSubpacketTag userAttributeSubpacketTag2 = userAttributeSubpacketTag;
|
|
if (userAttributeSubpacketTag2 == UserAttributeSubpacketTag.ImageAttribute)
|
|
{
|
|
return new ImageAttrib(forceLongLength, array);
|
|
}
|
|
return new UserAttributeSubpacket(userAttributeSubpacketTag, forceLongLength, array);
|
|
}
|
|
}
|