private void WriteInnerHeaderField(Stream s, KdbxInnerHeaderFieldID kdbID,
                                           byte[] pbData1, byte[] pbData2)
        {
            s.WriteByte((byte)kdbID);

            byte[] pb1 = (pbData1 ?? MemUtil.EmptyByteArray);
            byte[] pb2 = (pbData2 ?? MemUtil.EmptyByteArray);

            int cb = pb1.Length + pb2.Length;

            if (cb < 0)
            {
                Debug.Assert(false); throw new OutOfMemoryException();
            }

            MemUtil.Write(s, MemUtil.Int32ToBytes(cb));
            MemUtil.Write(s, pb1);
            MemUtil.Write(s, pb2);
        }
示例#2
0
        private bool ReadInnerHeaderField(BinaryReaderEx br)
        {
            Debug.Assert(br != null);
            if (br == null)
            {
                throw new ArgumentNullException("br");
            }

            byte btFieldID = br.ReadByte();

            int cbSize = MemUtil.BytesToInt32(br.ReadBytes(4));

            if (cbSize < 0)
            {
                throw new FormatException(KLRes.FileCorrupted);
            }

            byte[] pbData = MemUtil.EmptyByteArray;
            if (cbSize > 0)
            {
                pbData = br.ReadBytes(cbSize);
            }

            bool bResult = true;
            KdbxInnerHeaderFieldID kdbID = (KdbxInnerHeaderFieldID)btFieldID;

            switch (kdbID)
            {
            case KdbxInnerHeaderFieldID.EndOfHeader:
                bResult = false;                         // Returning false indicates end of header
                break;

            case KdbxInnerHeaderFieldID.InnerRandomStreamID:
                SetInnerRandomStreamID(pbData);
                break;

            case KdbxInnerHeaderFieldID.InnerRandomStreamKey:
                Debug.Assert(m_pbInnerRandomStreamKey == null);
                m_pbInnerRandomStreamKey = pbData;
                CryptoRandom.Instance.AddEntropy(pbData);
                break;

            case KdbxInnerHeaderFieldID.Binary:
                if (pbData.Length < 1)
                {
                    throw new FormatException();
                }
                KdbxBinaryFlags f     = (KdbxBinaryFlags)pbData[0];
                bool            bProt = ((f & KdbxBinaryFlags.Protected) != KdbxBinaryFlags.None);

                ProtectedBinary pb = new ProtectedBinary(bProt, pbData,
                                                         1, pbData.Length - 1);
                Debug.Assert(m_pbsBinaries.Find(pb) < 0);                         // No deduplication?
                m_pbsBinaries.Add(pb);

                if (bProt)
                {
                    MemUtil.ZeroByteArray(pbData);
                }
                break;

            default:
                Debug.Assert(false);
                break;
            }

            return(bResult);
        }
示例#3
0
		private void WriteInnerHeaderField(Stream s, KdbxInnerHeaderFieldID kdbID,
			byte[] pbData1, byte[] pbData2)
		{
			s.WriteByte((byte)kdbID);

			byte[] pb1 = (pbData1 ?? MemUtil.EmptyByteArray);
			byte[] pb2 = (pbData2 ?? MemUtil.EmptyByteArray);

			int cb = pb1.Length + pb2.Length;
			if(cb < 0) { Debug.Assert(false); throw new OutOfMemoryException(); }

			MemUtil.Write(s, MemUtil.Int32ToBytes(cb));
			MemUtil.Write(s, pb1);
			MemUtil.Write(s, pb2);
		}