/// Class to hold a single master public key and its subkeys.
	/// 
	/// Often PGP keyring files consist of multiple master keys, if you are trying to process
	/// or construct one of these you should use the PgpPublicKeyRingBundle class.
	/// 
	/// 
	public class PgpPublicKeyRing
		: PgpKeyRing
    {
        private readonly ArrayList keys;
		public PgpPublicKeyRing(
            byte[] encoding)
            : this(new MemoryStream(encoding, false))
        {
        }
		internal PgpPublicKeyRing(
            ArrayList pubKeys)
        {
            this.keys = pubKeys;
        }
		public PgpPublicKeyRing(
            Stream inputStream)
        {
			this.keys = new ArrayList();
            BcpgInputStream bcpgInput = BcpgInputStream.Wrap(inputStream);
			PacketTag initialTag = bcpgInput.NextPacketTag();
            if (initialTag != PacketTag.PublicKey && initialTag != PacketTag.PublicSubkey)
            {
                throw new IOException("public key ring doesn't start with public key tag: "
					+ "tag 0x" + ((int)initialTag).ToString("X"));
            }
			PublicKeyPacket pubPk = (PublicKeyPacket) bcpgInput.ReadPacket();;
			TrustPacket trustPk = ReadOptionalTrustPacket(bcpgInput);
            // direct signatures and revocations
			ArrayList keySigs = ReadSignaturesAndTrust(bcpgInput);
			ArrayList ids, idTrusts, idSigs;
			ReadUserIDs(bcpgInput, out ids, out idTrusts, out idSigs);
			keys.Add(new PgpPublicKey(pubPk, trustPk, keySigs, ids, idTrusts, idSigs));
			// Read subkeys
			while (bcpgInput.NextPacketTag() == PacketTag.PublicSubkey)
            {
                PublicKeyPacket	pk = (PublicKeyPacket) bcpgInput.ReadPacket();
				TrustPacket kTrust = ReadOptionalTrustPacket(bcpgInput);
				// PGP 8 actually leaves out the signature.
				ArrayList sigList = ReadSignaturesAndTrust(bcpgInput);
				keys.Add(new PgpPublicKey(pk, kTrust, sigList));
            }
        }
		///