PgpObjectFactory
using System.Collections.Generic;
using System.IO;
namespace Org.BouncyCastle.Bcpg.OpenPgp
{
public class PgpObjectFactory
{
private readonly BcpgInputStream bcpgIn;
public PgpObjectFactory(Stream inputStream)
{
bcpgIn = BcpgInputStream.Wrap(inputStream);
}
public PgpObjectFactory(byte[] bytes)
: this(new MemoryStream(bytes, false))
{
}
public PgpObject NextPgpObject()
{
PacketTag packetTag = bcpgIn.NextPacketTag();
switch (packetTag) {
case (PacketTag)(-1):
return null;
default:
if ((uint)(packetTag - 60) <= 3)
return new PgpExperimental(bcpgIn);
break;
case PacketTag.Signature: {
List<PgpSignature> list2 = new List<PgpSignature>();
while (bcpgIn.NextPacketTag() == PacketTag.Signature) {
try {
list2.Add(new PgpSignature(bcpgIn));
} catch (UnsupportedPacketVersionException) {
} catch (PgpException ex4) {
throw new IOException("can't create signature object: " + ex4?.ToString());
}
}
return new PgpSignatureList(list2.ToArray());
}
case PacketTag.SecretKey:
try {
return new PgpSecretKeyRing(bcpgIn);
} catch (PgpException ex2) {
throw new IOException("can't create secret key object: " + ex2?.ToString());
}
case PacketTag.PublicKey:
return new PgpPublicKeyRing(bcpgIn);
case PacketTag.PublicSubkey:
return PgpPublicKeyRing.ReadSubkey(bcpgIn);
case PacketTag.CompressedData:
return new PgpCompressedData(bcpgIn);
case PacketTag.LiteralData:
return new PgpLiteralData(bcpgIn);
case PacketTag.PublicKeyEncryptedSession:
case PacketTag.SymmetricKeyEncryptedSessionKey:
return new PgpEncryptedDataList(bcpgIn);
case PacketTag.OnePassSignature: {
List<PgpOnePassSignature> list = new List<PgpOnePassSignature>();
while (bcpgIn.NextPacketTag() == PacketTag.OnePassSignature) {
try {
list.Add(new PgpOnePassSignature(bcpgIn));
} catch (PgpException ex) {
throw new IOException("can't create one pass signature object: " + ex?.ToString());
}
}
return new PgpOnePassSignatureList(list.ToArray());
}
case PacketTag.Marker:
return new PgpMarker(bcpgIn);
case PacketTag.SecretSubkey:
case PacketTag.SymmetricKeyEncrypted:
case PacketTag.Trust:
case PacketTag.UserId:
break;
}
throw new IOException("unknown object in stream " + bcpgIn.NextPacketTag().ToString());
}
public IList<PgpObject> AllPgpObjects()
{
List<PgpObject> list = new List<PgpObject>();
PgpObject item;
while ((item = NextPgpObject()) != null) {
list.Add(item);
}
return list;
}
public IList<T> FilterPgpObjects<T>() where T : PgpObject
{
List<T> list = new List<T>();
PgpObject pgpObject;
while ((pgpObject = NextPgpObject()) != null) {
T val = pgpObject as T;
if (val != null)
list.Add(val);
}
return list;
}
}
}