You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
69 lines
2.1 KiB
69 lines
2.1 KiB
#if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR) |
|
#pragma warning disable |
|
using System; |
|
using System.IO; |
|
using BestHTTP.SecureProtocol.Org.BouncyCastle.Bcpg.Attr; |
|
using BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.IO; |
|
|
|
namespace BestHTTP.SecureProtocol.Org.BouncyCastle.Bcpg |
|
{ |
|
/** |
|
* reader for user attribute sub-packets |
|
*/ |
|
public class UserAttributeSubpacketsParser |
|
{ |
|
private readonly Stream input; |
|
|
|
public UserAttributeSubpacketsParser( |
|
Stream input) |
|
{ |
|
this.input = input; |
|
} |
|
|
|
public virtual UserAttributeSubpacket ReadPacket() |
|
{ |
|
int l = input.ReadByte(); |
|
if (l < 0) |
|
return null; |
|
|
|
int bodyLen = 0; |
|
bool longLength = false; |
|
if (l < 192) |
|
{ |
|
bodyLen = l; |
|
} |
|
else if (l <= 223) |
|
{ |
|
bodyLen = ((l - 192) << 8) + (input.ReadByte()) + 192; |
|
} |
|
else if (l == 255) |
|
{ |
|
bodyLen = (input.ReadByte() << 24) | (input.ReadByte() << 16) |
|
| (input.ReadByte() << 8) | input.ReadByte(); |
|
longLength = true; |
|
} |
|
else |
|
{ |
|
throw new IOException("unrecognised length reading user attribute sub packet"); |
|
} |
|
|
|
int tag = input.ReadByte(); |
|
if (tag < 0) |
|
throw new EndOfStreamException("unexpected EOF reading user attribute sub packet"); |
|
|
|
byte[] data = new byte[bodyLen - 1]; |
|
if (Streams.ReadFully(input, data) < data.Length) |
|
throw new EndOfStreamException(); |
|
|
|
UserAttributeSubpacketTag type = (UserAttributeSubpacketTag) tag; |
|
switch (type) |
|
{ |
|
case UserAttributeSubpacketTag.ImageAttribute: |
|
return new ImageAttrib(longLength, data); |
|
} |
|
return new UserAttributeSubpacket(type, longLength, data); |
|
} |
|
} |
|
} |
|
#pragma warning restore |
|
#endif
|
|
|