public Firmware(byte[] key)
        {
            Contract.Requires<ArgumentNullException>(key != null);
            Contract.Requires<ArgumentException>(key.Length == 32);

            var memoryStream = new MemoryStream(new byte[65600]);
            memoryStream.Seek(64, SeekOrigin.Begin);
            Contract.Assume(memoryStream.CanSeek);
            Contract.Assume(memoryStream.Length >= 64);
            this.stream = new FirmwareStream(memoryStream, key, 64, false);
        }
        public Firmware(Stream stream, bool leaveOpen)
        {
            Contract.Requires<ArgumentNullException>(stream != null);
            Contract.Requires<ArgumentException>(stream.CanSeek);
            Contract.Requires<ArgumentException>(stream.Length >= 64);

            var key = new byte[32];
            Contract.Assume(HeaderKey.Length == 32);
            using (var headerStream = new FirmwareStream(stream, HeaderKey, 32))
            {
                headerStream.Seek(0, SeekOrigin.Begin);
                headerStream.Read(key, 0, 32);
            }

            Contract.Assume(stream.Length >= 64);
            this.stream = new FirmwareStream(stream, key, 64, leaveOpen);
        }
        public void UpdateHeader()
        {
            if (this.stream != null && this.stream.CanWrite && this.stream.CanSeek)
            {
                this.BaseStream.Seek(0, SeekOrigin.Begin);
                this.BaseStream.Write(HeaderControlBits, 0, HeaderControlBits.Length);
                this.BaseStream.Write(new byte[7], 0, 7);
                var checksum = this.Checksum;
                this.BaseStream.Seek(16, SeekOrigin.Begin);
                this.BaseStream.Write(BitConverter.GetBytes(checksum), 0, 4);
                this.BaseStream.Write(new byte[12], 0, 12);

                Contract.Assume(HeaderKey.Length == 32);
                Contract.Assume(this.BaseStream.CanSeek);
                using (var headerStream = new FirmwareStream(this.BaseStream, HeaderKey))
                {
                    var key = this.stream.GetKey();
                    headerStream.Write(key, 0, key.Length);
                }
            }
        }