/// Class to hold a single master secret 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 PgpSecretKeyRingBundle class.
	/// 
	/// 
	public class PgpSecretKeyRing
		: PgpKeyRing
    {
        private readonly ArrayList keys;
		internal PgpSecretKeyRing(
			ArrayList keys)
        {
            this.keys = keys;
        }
        public PgpSecretKeyRing(
            byte[] encoding)
            : this(new MemoryStream(encoding))
        {
        }
		public PgpSecretKeyRing(
            Stream inputStream)
        {
			this.keys = new ArrayList();
			BcpgInputStream bcpgInput = BcpgInputStream.Wrap(inputStream);
			PacketTag initialTag = bcpgInput.NextPacketTag();
			if (initialTag != PacketTag.SecretKey && initialTag != PacketTag.SecretSubkey)
            {
                throw new IOException("secret key ring doesn't start with secret key tag: "
					+ "tag 0x" + ((int)initialTag).ToString("X"));
            }
			SecretKeyPacket secret = (SecretKeyPacket) bcpgInput.ReadPacket();
			//
            // ignore GPG comment packets if found.
            //
            while (bcpgInput.NextPacketTag() == PacketTag.Experimental2)
            {
                bcpgInput.ReadPacket();
            }
			TrustPacket trust = ReadOptionalTrustPacket(bcpgInput);
			// revocation and direct signatures
			ArrayList keySigs = ReadSignaturesAndTrust(bcpgInput);
			ArrayList ids, idTrusts, idSigs;
			ReadUserIDs(bcpgInput, out ids, out idTrusts, out idSigs);
			keys.Add(new PgpSecretKey(secret, trust, keySigs, ids, idTrusts, idSigs));
			// Read subkeys
			while (bcpgInput.NextPacketTag() == PacketTag.SecretSubkey)
            {
                SecretSubkeyPacket sub = (SecretSubkeyPacket) bcpgInput.ReadPacket();
                //
                // ignore GPG comment packets if found.
                //
                while (bcpgInput.NextPacketTag() == PacketTag.Experimental2)
                {
                    bcpgInput.ReadPacket();
                }
				TrustPacket subTrust = ReadOptionalTrustPacket(bcpgInput);
				ArrayList sigList = ReadSignaturesAndTrust(bcpgInput);
				keys.Add(new PgpSecretKey(sub, subTrust, sigList));
            }
        }
		///