1
package org.bouncycastle.openpgp;
3
import java.io.ByteArrayInputStream;
4
import java.io.IOException;
5
import java.io.InputStream;
6
import java.util.ArrayList;
9
import org.bouncycastle.bcpg.BCPGInputStream;
10
import org.bouncycastle.bcpg.PacketTags;
13
* General class for reading a PGP object stream.
15
* Note: if this class finds a PGPPublicKey or a PGPSecretKey it
16
* will create a PGPPublicKeyRing, or a PGPSecretKeyRing for each
17
* key found. If all you are trying to do is read a key ring file use
18
* either PGPPublicKeyRingCollection or PGPSecretKeyRingCollection.
20
public class PGPObjectFactory
24
public PGPObjectFactory(
27
this.in = new BCPGInputStream(in);
30
public PGPObjectFactory(
33
this(new ByteArrayInputStream(bytes));
37
* Return the next object in the stream, or null if the end is reached.
40
* @throws IOException on a parse error
42
public Object nextObject()
47
switch (in.nextPacketTag())
51
case PacketTags.SIGNATURE:
54
while (in.nextPacketTag() == PacketTags.SIGNATURE)
58
l.add(new PGPSignature(in));
60
catch (PGPException e)
62
throw new IOException("can't create signature object: " + e);
66
return new PGPSignatureList((PGPSignature[])l.toArray(new PGPSignature[l.size()]));
67
case PacketTags.SECRET_KEY:
70
return new PGPSecretKeyRing(in);
72
catch (PGPException e)
74
throw new IOException("can't create secret key object: " + e);
76
case PacketTags.PUBLIC_KEY:
77
return new PGPPublicKeyRing(in);
78
case PacketTags.PUBLIC_SUBKEY:
79
return PGPPublicKeyRing.readSubkey(in);
80
case PacketTags.COMPRESSED_DATA:
81
return new PGPCompressedData(in);
82
case PacketTags.LITERAL_DATA:
83
return new PGPLiteralData(in);
84
case PacketTags.PUBLIC_KEY_ENC_SESSION:
85
case PacketTags.SYMMETRIC_KEY_ENC_SESSION:
86
return new PGPEncryptedDataList(in);
87
case PacketTags.ONE_PASS_SIGNATURE:
90
while (in.nextPacketTag() == PacketTags.ONE_PASS_SIGNATURE)
94
l.add(new PGPOnePassSignature(in));
96
catch (PGPException e)
98
throw new IOException("can't create one pass signature object: " + e);
102
return new PGPOnePassSignatureList((PGPOnePassSignature[])l.toArray(new PGPOnePassSignature[l.size()]));
103
case PacketTags.MARKER:
104
return new PGPMarker(in);
105
case PacketTags.EXPERIMENTAL_1:
106
case PacketTags.EXPERIMENTAL_2:
107
case PacketTags.EXPERIMENTAL_3:
108
case PacketTags.EXPERIMENTAL_4:
109
return in.readPacket();
112
throw new IOException("unknown object in stream: " + in.nextPacketTag());