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); }
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); }
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); }