Exemplo n.º 1
0
        internal ContentTimeBasedObjectResult(T instance, DateTime created, byte[] checksum = null, Action <ContentTimeBasedOptions> setup = null) : base(instance, setup)
        {
            var options = setup.ConfigureOptions();

            Created    = created;
            Checksum   = new ChecksumResult(checksum);
            Modified   = options.Modified;
            Validation = options.GetValidation(checksum);
        }
Exemplo n.º 2
0
        static public ChecksumResult VerifyCheckSum(byte[] dataStream, UInt16 startPos, UInt16 endPos, byte checkSum)
        {
            ChecksumResult retValue  = ChecksumResult.CHECKSUM_ERROR;
            byte           _checksum = 0x00;

            for (int i = startPos; i <= endPos; i++)
            {
                _checksum ^= dataStream[i];
            }
            if (checkSum == _checksum)
            {
                retValue = ChecksumResult.CHECKSUM_OK;
            }
            return(retValue);
        }
Exemplo n.º 3
0
        public MainForm(string path)
        {
            InitializeComponent();

            crc32TextBox.Text                  =
                md5TextBox.Text                =
                    sha1TextBox.Text           =
                        sha256TextBox.Text     =
                            sha512TextBox.Text = "please wait";

            pathLabel.Text = path;

            var worker = new BackgroundWorker {
                WorkerReportsProgress = true
            };

            worker.DoWork += delegate(object sender, DoWorkEventArgs e)
            {
                using (var stream = File.OpenRead(path))
                {
                    using (var crc32 = CRC32.Create())
                    {
                        using (var md5 = MD5.Create())
                        {
                            using (var sha1 = SHA1.Create())
                            {
                                using (var sha256 = SHA256.Create())
                                {
                                    using (var sha512 = SHA512.Create())
                                    {
                                        var totalLength         = (double)stream.Length;
                                        var lastPercentComplete = -1;

                                        var buffer = new byte[4096];
                                        int count;
                                        for (long readBytes = 0; (count = stream.Read(buffer, 0, buffer.Length)) > 0; readBytes += count)
                                        {
                                            var crc32Offset = 0;
                                            while (crc32Offset < count)
                                            {
                                                crc32Offset += crc32.TransformBlock(buffer, crc32Offset, count - crc32Offset, buffer, crc32Offset);
                                            }
                                            var md5Offset = 0;
                                            while (md5Offset < count)
                                            {
                                                md5Offset += md5.TransformBlock(buffer, md5Offset, count - md5Offset, buffer, md5Offset);
                                            }
                                            var sha1Offset = 0;
                                            while (sha1Offset < count)
                                            {
                                                sha1Offset += sha1.TransformBlock(buffer, sha1Offset, count - sha1Offset, buffer, sha1Offset);
                                            }
                                            var sha256Offset = 0;
                                            while (sha256Offset < count)
                                            {
                                                sha256Offset += sha256.TransformBlock(buffer, sha256Offset, count - sha256Offset, buffer, sha256Offset);
                                            }
                                            var sha512Offset = 0;
                                            while (sha512Offset < count)
                                            {
                                                sha512Offset += sha512.TransformBlock(buffer, sha512Offset, count - sha512Offset, buffer, sha512Offset);
                                            }

                                            var percentComplete = (int)((readBytes / totalLength) * 100);
                                            if (percentComplete != lastPercentComplete)
                                            {
                                                worker.ReportProgress(percentComplete);

                                                lastPercentComplete = percentComplete;
                                            }
                                        }

                                        crc32.TransformFinalBlock(buffer, 0, 0);
                                        md5.TransformFinalBlock(buffer, 0, 0);
                                        sha1.TransformFinalBlock(buffer, 0, 0);
                                        sha256.TransformFinalBlock(buffer, 0, 0);
                                        sha512.TransformFinalBlock(buffer, 0, 0);

                                        result = new ChecksumResult
                                        {
                                            CRC32  = $"{crc32.CRC32Hash:X4}",
                                            MD5    = ToHexString(md5.Hash),
                                            SHA1   = ToHexString(sha1.Hash),
                                            SHA256 = ToHexString(sha256.Hash),
                                            SHA512 = ToHexString(sha512.Hash)
                                        };
                                    }
                                }
                            }
                        }
                    }
                }
            };
            worker.ProgressChanged += (sender, args) =>
            {
                crc32TextBox.Text                  =
                    md5TextBox.Text                =
                        sha1TextBox.Text           =
                            sha256TextBox.Text     =
                                sha512TextBox.Text = $"{args.ProgressPercentage}%";
            };
            worker.RunWorkerCompleted += (sender, args) =>
            {
                crc32TextBox.Text  = result.CRC32;
                md5TextBox.Text    = result.MD5;
                sha1TextBox.Text   = result.SHA1;
                sha256TextBox.Text = result.SHA256;
                sha512TextBox.Text = result.SHA512;

                compareButton.Enabled = verifyPGPButton.Enabled = clipBoardButton.Enabled = true;
            };
            worker.RunWorkerAsync();
        }
Exemplo n.º 4
0
        private void ReadCommand()
        {
            const int nrOfBytes = 64;

            byte[] data;
            logger.Debug("Reading flash content to file: " + m_fileName);
            NotifyStatusChanged(this, new StatusEventArgs("Reading data from ECU..."));

            using (MD5 md5Hash = MD5.Create())
            {
                if (File.Exists(m_fileName))
                {
                    File.Delete(m_fileName);
                }
                FileStream fileStream = File.Create(m_fileName, 1024);
                logger.Debug("File created");
                SetFlashStatus(FlashStatus.Reading);
                logger.Debug("Flash status is reading");

                for (int i = 0; i < 512 * 1024 / nrOfBytes; i++)
                {
                    lock (m_synchObject)
                    {
                        if (m_command == FlashCommand.StopCommand)
                        {
                            continue;
                        }
                        if (m_endThread)
                        {
                            return;
                        }
                    }

                    while (!m_kwpHandler.sendReadRequest((uint)(nrOfBytes * i), (uint)nrOfBytes))
                    {
                        m_nrOfRetries++;
                    }

                    while (!m_kwpHandler.sendRequestDataByOffset(out data))
                    {
                        m_nrOfRetries++;
                    }
                    fileStream.Write(data, 0, nrOfBytes);
                    md5Hash.TransformBlock(data, 0, nrOfBytes, data, 0);
                    m_nrOfBytesRead += nrOfBytes;
                }
                fileStream.Close();
                logger.Debug("Closed file");

                ChecksumResult checksumResult = ChecksumT7.VerifyChecksum(m_fileName, ChecksumT7.DO_NOT_AUTOCORRECT, ChecksumT7.DO_NOT_AUTOFIXFOOTER, m_ShouldUpdateChecksum);
                if (checksumResult != ChecksumResult.Ok)
                {
                    if (File.Exists(m_fileName))
                    {
                        File.Delete(m_fileName);
                    }
                    NotifyStatusChanged(this, new StatusEventArgs("Checksum check failed"));
                }
                else
                {
                    Md5Tools.WriteMd5Hash(md5Hash, m_fileName);
                }
            }

            m_kwpHandler.sendDataTransferExitRequest();
            logger.Debug("Done reading");
        }
Exemplo n.º 5
0
        static private ChecksumResult CalculateLayer2Checksum(string filename, int OffsetLayer2, bool autocorrect, ChecksumDelegate.ChecksumUpdate delegateShouldUpdate)
        {
            ChecksumResult result           = ChecksumResult.Layer2Failed;
            uint           checksum0        = 0;
            uint           checksum1        = 0;
            uint           sum0             = 0;
            uint           matrix_dimension = 0;
            uint           partial_address  = 0;
            uint           x = 0;

            /*
             * Get 0x100 byte buffer from CHPTR – CHPTR + 0xFF
             * Because level 1 is in that area level1 must be correct first
             * Prepare coded_buffer (0x100 buffer from chptr) with loop: coded_buffer(x) = (buffer (x) + 0xD6) xor 0x21
             * (add 0xd6 to every byte of buffer, then xor it by 0x21)
             * [ 1 indexed, not 0 indexed ]
             * So, 0x101 byte buffer with first byte ignored (convention)
             * */
            byte[] coded_buffer = FileTools.readdatafromfile(filename, OffsetLayer2, 0x100);

            for (int i = 0; i < coded_buffer.Length; i++)
            {
                byte b = coded_buffer[i];
                b += 0xD6;
                b ^= 0x21;
                coded_buffer[i] = b;
            }

            byte[] complete_file = FileTools.readdatafromfile(filename, 0, 0x100000);
            int    index         = 0;
            bool   chk_found     = false;

            while (index < 0x100 && !chk_found)
            {
                if ((coded_buffer[index] == 0xFB) && (coded_buffer[index + 6] == 0xFC) && (coded_buffer[index + 0x0C] == 0xFD))
                {
                    sum0             = ((uint)coded_buffer[index + 1] * 0x01000000 + (uint)coded_buffer[index + 2] * 0x010000 + (uint)coded_buffer[index + 3] * 0x100 + (uint)coded_buffer[index + 4]);
                    matrix_dimension = (uint)coded_buffer[index + 7] * 0x01000000 + (uint)coded_buffer[index + 8] * 0x010000 + (uint)coded_buffer[index + 9] * 0x100 + (uint)coded_buffer[index + 10];
                    partial_address  = (uint)coded_buffer[index + 0x0d] * 0x01000000 + (uint)coded_buffer[index + 0x0e] * 0x010000 + (uint)coded_buffer[index + 0x0F] * 0x100 + (uint)coded_buffer[index + 0x10];
                    if (matrix_dimension >= 0x020000)
                    {
                        checksum0 = 0;
                        x         = partial_address;
                        while (x < (matrix_dimension - 4))
                        {
                            checksum0 = checksum0 + (uint)complete_file[x];
                            x++;
                        }
                        checksum0 = checksum0 + (uint)complete_file[matrix_dimension - 1];
                        checksum1 = 0;
                        x         = partial_address;
                        while (x < (matrix_dimension - 4))
                        {
                            checksum1 = checksum1 + (uint)complete_file[x] * 0x01000000 + (uint)complete_file[x + 1] * 0x10000 + (uint)complete_file[x + 2] * 0x100 + (uint)complete_file[x + 3];
                            x         = x + 4;
                        }
                        if ((checksum0 & 0xFFF00000) != (sum0 & 0xFFF00000))
                        {
                            checksum0 = checksum1;
                        }
                        if (checksum0 != sum0)
                        {
                            logger.Debug("Layer 2 checksum was invalid, should be updated!");
                            if (autocorrect)
                            {
                                result = UpdateLayer2(filename, OffsetLayer2, checksum0, index);
                            }
                            else
                            {
                                string filechecksum = sum0.ToString("X8");
                                string realchecksum = checksum0.ToString("X8");
                                if (delegateShouldUpdate("Checksum validation Layer 2", filechecksum, realchecksum))
                                {
                                    result = UpdateLayer2(filename, OffsetLayer2, checksum0, index);
                                }
                                else
                                {
                                    result = ChecksumResult.Layer2Failed;
                                }
                            }
                        }
                        else
                        {
                            result = ChecksumResult.Ok;
                        }
                        chk_found = true;
                    }
                }
                index++;
            }
            if (!chk_found)
            {
                logger.Debug("Layer 2 checksum could not be calculated [ file incompatible ]");
            }
            return(result);
        }
Exemplo n.º 6
0
        static public ChecksumResult VerifyChecksum(string filename, bool autocorrect, bool autofixFooter, ChecksumDelegate.ChecksumUpdate delegateShouldUpdate)
        {
            csumArea = new csum_area_t[16];
            for (int i = 0; i < csumArea.Length; i++)
            {
                csumArea[i] = new csum_area_t();
            }

            ChecksumResult result = ChecksumResult.Ok;

            T7FileHeader t7InfoHeader = new T7FileHeader();

            t7InfoHeader.init(filename, autofixFooter);

            int  sramOffset           = t7InfoHeader.getSramOffset();
            int  fwLength             = t7InfoHeader.getFWLength();
            int  calculatedFWChecksum = calculateFWChecksum(filename, sramOffset);
            uint calculatedF2Checksum = calculateF2Checksum(filename, 0, fwLength);
            int  calculatedFBChecksum = calculateFBChecksum(filename, 0, fwLength);

            int readF2checksum = t7InfoHeader.getChecksumF2();
            int readFBchecksum = t7InfoHeader.getChecksumFB();

            if (readF2checksum != 0)
            {
                if (t7InfoHeader.getChecksumF2() != (int)calculatedF2Checksum)
                {
                    result = ChecksumResult.ChecksumF2Failed;
                }
            }
            if (t7InfoHeader.getChecksumFB() != calculatedFBChecksum)
            {
                result = ChecksumResult.ChecksumFBFailed;
            }
            if (getFWChecksum(filename, sramOffset) != calculatedFWChecksum)
            {
                result = ChecksumResult.ChecksumFWFailed;
            }

            if (result != ChecksumResult.Ok)
            {
                logger.Debug("Checksum was invalid, should be updated!");
                logger.Debug("calculatedF2Checksum = " + calculatedF2Checksum.ToString("X8") + " readF2checksum = " + readF2checksum.ToString("X8"));
                logger.Debug("calculatedFBChecksum = " + calculatedFBChecksum.ToString("X8") + " readFBchecksum = " + readFBchecksum.ToString("X8"));
                logger.Debug("calculatedFWChecksum = " + calculatedFWChecksum.ToString("X8") + " getFWChecksum = " + getFWChecksum(filename, sramOffset).ToString("X8"));

                if (autocorrect)
                {
                    result = updateChecksum(filename, t7InfoHeader, calculatedFWChecksum, calculatedF2Checksum, calculatedFBChecksum, sramOffset);
                }
                else
                {
                    if (delegateShouldUpdate(null, null, null))
                    {
                        result = updateChecksum(filename, t7InfoHeader, calculatedFWChecksum, calculatedF2Checksum, calculatedFBChecksum, sramOffset);
                    }
                }
            }

            return(result);
        }
Exemplo n.º 7
0
        private ChecksumResult CalculateEDC15PChecksum(string filename, byte[] allBytes, bool verifyOnly, out ChecksumResultDetails result)
        {
            ChecksumResult res = new ChecksumResult();

            // checksum for EDC15P is implemented
            result = new ChecksumResultDetails();

            result.CalculationResult = ChecksumResult.ChecksumFail; // default = failed
            result.TypeResult        = ChecksumType.VAG_EDC15P_V41;


            if (allBytes.Length != 0x80000)
            {
                return(res);
            }

            if (allBytes[0x50008] == 'V' && allBytes[0x50009] == '4' && allBytes[0x5000A] == '.' && allBytes[0x5000B] == '1')
            {
                // checksum V4.1 rev.1
                result.TypeResult = ChecksumType.VAG_EDC15P_V41;
            }
            else if (allBytes[0x58008] == 'V' && allBytes[0x58009] == '4' && allBytes[0x5800A] == '.' && allBytes[0x5800B] == '1')
            {
                // checksum V4.1 rev.2
                result.TypeResult = ChecksumType.VAG_EDC15P_V41V2;
            }

            //allBytes = reverseEndian(allBytes);
            EDC15P_checksum chks = new EDC15P_checksum();

            if (result.TypeResult == ChecksumType.VAG_EDC15P_V41)
            {
                res = chks.tdi41_checksum_search(allBytes, (uint)allBytes.Length, false);
            }
            else
            {
                res = chks.tdi41v2_checksum_search(allBytes, (uint)allBytes.Length, false);
            }
            result.NumberChecksumsTotal = chks.ChecksumsFound;
            result.NumberChecksumsFail  = chks.ChecksumsIncorrect;
            result.NumberChecksumsOk    = chks.ChecksumsFound - chks.ChecksumsIncorrect;
            if (res == ChecksumResult.ChecksumOK)
            {
                Console.WriteLine("Checksum V4.1 matched");
                result.CalculationOk = true;
            }
            else if (res == ChecksumResult.ChecksumFail)
            {
                Console.WriteLine("UpdateChecksum: Checksum failed " + filename);
                if (!verifyOnly)
                {
                    File.WriteAllBytes(filename, allBytes);
                    result.CalculationOk = true;
                    Console.WriteLine("UpdateChecksum: Checksum fixed");
                }
            }
            else if (res == ChecksumResult.ChecksumTypeError)
            {
                result.TypeResult = ChecksumType.VAG_EDC15P_V41_2002;
                EDC15P_checksum chks2002 = new EDC15P_checksum();
                allBytes = File.ReadAllBytes(filename);

                //chks2002.DumpChecksumLocations("V41 2002", allBytes); // for debug info only

                ChecksumResult res2002 = chks2002.tdi41_2002_checksum_search(allBytes, (uint)allBytes.Length, false);
                result.NumberChecksumsTotal = chks2002.ChecksumsFound;
                result.NumberChecksumsFail  = chks2002.ChecksumsIncorrect;
                result.NumberChecksumsOk    = chks2002.ChecksumsFound - chks2002.ChecksumsIncorrect;

                if (res2002 == ChecksumResult.ChecksumOK)
                {
                    Console.WriteLine("Checksum 2002 matched " + filename);
                    result.CalculationOk = true;
                }
                else if (res2002 == ChecksumResult.ChecksumFail)
                {
                    Console.WriteLine("UpdateChecksum: Checksum 2002 failed " + filename);
                    if (!verifyOnly)
                    {
                        File.WriteAllBytes(filename, allBytes);
                        result.CalculationOk = true;
                        Console.WriteLine("UpdateChecksum: Checksum fixed");
                    }
                }
                else if (res2002 == ChecksumResult.ChecksumTypeError)
                {
                    // unknown checksum type
                    result.CalculationOk     = false;
                    result.CalculationResult = ChecksumResult.ChecksumTypeError;
                    result.TypeResult        = ChecksumType.Unknown;
                }
            }
            return(res);
        }
Exemplo n.º 8
0
        public ChecksumResultDetails UpdateChecksum(string filename, bool verifyOnly)
        {
            byte[]                allBytes;
            ChecksumResult        res    = new ChecksumResult();;
            ChecksumResultDetails result = new ChecksumResultDetails();

            EDCFileType fileType = DetermineFileType(filename, false);

            switch (fileType)
            {
            case EDCFileType.EDC15P:
            case EDCFileType.EDC15P6:
                allBytes = File.ReadAllBytes(filename);
                res      = CalculateEDC15PChecksum(filename, allBytes, verifyOnly, out result);
                break;

            case EDCFileType.EDC15V:
                // EDC15VM+ is similar to EDC15P
                allBytes = File.ReadAllBytes(filename);
                res      = CalculateEDC15VMChecksum(filename, allBytes, verifyOnly, out result);
                break;

            case EDCFileType.EDC15C:
                //TODO: Implement EDC15C checksum routine here
                break;

            case EDCFileType.EDC15M:
                //TODO: Implement EDC15M checksum routine here
                break;

            case EDCFileType.EDC16:
                //TODO: Implement EDC16x checksum routine here
                break;

            case EDCFileType.EDC17:
                //TODO: Implement EDC17x checksum routine here
                break;

            case EDCFileType.MSA15:
            case EDCFileType.MSA12:
            case EDCFileType.MSA11:
                //TODO: Implement MSA15 checksum routine here

                // this should be Bosch TDI V3.1 (Version 2.04)

                /* result.TypeResult = ChecksumType.VAG_EDC15P_V41;
                 * allBytes = File.ReadAllBytes(filename);
                 * //allBytes = reverseEndian(allBytes);
                 * MSA15_checksum msa15chks = new MSA15_checksum();
                 *
                 * res = msa15chks.tdi41_checksum_search(allBytes, (uint)allBytes.Length, false);
                 * result.NumberChecksumsTotal = msa15chks.ChecksumsFound;
                 * result.NumberChecksumsFail = msa15chks.ChecksumsIncorrect;
                 * result.NumberChecksumsOk = msa15chks.ChecksumsFound - msa15chks.ChecksumsIncorrect;
                 * if (res == ChecksumResult.ChecksumOK)
                 * {
                 *   //Console.WriteLine("Checksum matched");
                 *   result.CalculationOk = true;
                 * }
                 * else if (res == ChecksumResult.ChecksumFail)
                 * {
                 *   Console.WriteLine("UpdateChecksum: Checksum failed " + filename);
                 *   if (!verifyOnly)
                 *   {
                 *       File.WriteAllBytes(filename, allBytes);
                 *       result.CalculationOk = true;
                 *       Console.WriteLine("UpdateChecksum: Checksum fixed");
                 *   }
                 *
                 * }*/
                break;

            case EDCFileType.MSA6:
                //TODO: Implement MSA6 checksum routine here
                break;
            }
            if (result.CalculationOk)
            {
                result.CalculationResult = ChecksumResult.ChecksumOK;
            }
            return(result);
        }
Exemplo n.º 9
0
        private ChecksumResult CalculateEDC15VMChecksum(string filename, byte[] allBytes, bool verifyOnly, out ChecksumResultDetails result)
        {
            ChecksumResult res = new ChecksumResult();
            result = new ChecksumResultDetails();
            result.CalculationResult = ChecksumResult.ChecksumFail; // default = failed
            result.TypeResult = ChecksumType.VAG_EDC15VM_V41;
            if (/*allBytes.Length != 0x40000 && */allBytes.Length != 0x80000 && allBytes.Length != 0x100000) return res;
            if (allBytes.Length >= 0x80000)
            {
                if (allBytes[0x50008] == 'V' && allBytes[0x50009] == '4' && allBytes[0x5000A] == '.' && allBytes[0x5000B] == '1')
                {
                    // checksum V4.1 rev.1
                    result.TypeResult = ChecksumType.VAG_EDC15VM_V41;
                }
                else if (allBytes[0x58008] == 'V' && allBytes[0x58009] == '4' && allBytes[0x5800A] == '.' && allBytes[0x5800B] == '1')
                {
                    // checksum V4.1 rev.2
                    result.TypeResult = ChecksumType.VAG_EDC15VM_V41V2;
                }
            }
            //allBytes = reverseEndian(allBytes);
            EDC15VM_checksum chks = new EDC15VM_checksum();
            if (result.TypeResult == ChecksumType.VAG_EDC15VM_V41)
            {
                res = chks.tdi41_checksum_search(allBytes, (uint)allBytes.Length, false);
            }
            else
            {
                res = chks.tdi41v2_checksum_search(allBytes, (uint)allBytes.Length, false);
            }
            result.NumberChecksumsTotal = chks.ChecksumsFound;
            result.NumberChecksumsFail = chks.ChecksumsIncorrect;
            result.NumberChecksumsOk = chks.ChecksumsFound - chks.ChecksumsIncorrect;
            if (res == ChecksumResult.ChecksumOK)
            {
                Console.WriteLine("Checksum V4.1 matched");
                result.CalculationOk = true;
            }
            else if (res == ChecksumResult.ChecksumFail)
            {
                Console.WriteLine("UpdateChecksum: Checksum failed " + filename);
                if (!verifyOnly)
                {
                    File.WriteAllBytes(filename, allBytes);
                    result.CalculationOk = true;
                    Console.WriteLine("UpdateChecksum: Checksum fixed");
                }

            }
            else if (res == ChecksumResult.ChecksumTypeError)
            {
                result.TypeResult = ChecksumType.VAG_EDC15VM_V41_2002;
                EDC15VM_checksum chks2002 = new EDC15VM_checksum();
                allBytes = File.ReadAllBytes(filename);
                ChecksumResult res2002 = chks2002.tdi41_2002_checksum_search(allBytes, (uint)allBytes.Length, false);
                result.NumberChecksumsTotal = chks2002.ChecksumsFound;
                result.NumberChecksumsFail = chks2002.ChecksumsIncorrect;
                result.NumberChecksumsOk = chks2002.ChecksumsFound - chks2002.ChecksumsIncorrect;

                if (res2002 == ChecksumResult.ChecksumOK)
                {
                    Console.WriteLine("Checksum 2002 matched " + filename);
                    result.CalculationOk = true;
                }
                else if (res2002 == ChecksumResult.ChecksumFail)
                {
                    Console.WriteLine("UpdateChecksum: Checksum 2002 failed " + filename);
                    if (!verifyOnly)
                    {
                        File.WriteAllBytes(filename, allBytes);
                        result.CalculationOk = true;
                        Console.WriteLine("UpdateChecksum: Checksum fixed");
                    }
                }
                else if (res2002 == ChecksumResult.ChecksumTypeError)
                {
                    // unknown checksum type
                    result.CalculationOk = false;
                    result.CalculationResult = ChecksumResult.ChecksumTypeError;
                    result.TypeResult = ChecksumType.Unknown;
                }
            }
            return res;
        }
Exemplo n.º 10
0
        public ChecksumResultDetails UpdateChecksum(string filename, bool verifyOnly)
        {
            byte[] allBytes;
            ChecksumResult res = new ChecksumResult(); ;
            ChecksumResultDetails result = new ChecksumResultDetails();

            EDCFileType fileType = DetermineFileType(filename, false);
            switch (fileType)
            {
                case EDCFileType.EDC15P:
                case EDCFileType.EDC15P6:
                    allBytes = File.ReadAllBytes(filename);
                    res = CalculateEDC15PChecksum(filename, allBytes, verifyOnly, out result);
                    break;
                case EDCFileType.EDC15V:
                    // EDC15VM+ is similar to EDC15P
                    allBytes = File.ReadAllBytes(filename);
                    res = CalculateEDC15VMChecksum(filename, allBytes, verifyOnly, out result);
                    break;
                case EDCFileType.EDC15C:
                    //TODO: Implement EDC15C checksum routine here
                    break;
                case EDCFileType.EDC15M:
                    //TODO: Implement EDC15M checksum routine here
                    break;
                case EDCFileType.EDC16:
                    //TODO: Implement EDC16x checksum routine here
                    break;
                case EDCFileType.EDC17:
                    //TODO: Implement EDC17x checksum routine here
                    break;
                case EDCFileType.MSA15:
                case EDCFileType.MSA12:
                case EDCFileType.MSA11:
                    //TODO: Implement MSA15 checksum routine here

                    // this should be Bosch TDI V3.1 (Version 2.04)

                   /* result.TypeResult = ChecksumType.VAG_EDC15P_V41;
                    allBytes = File.ReadAllBytes(filename);
                    //allBytes = reverseEndian(allBytes);
                    MSA15_checksum msa15chks = new MSA15_checksum();

                    res = msa15chks.tdi41_checksum_search(allBytes, (uint)allBytes.Length, false);
                    result.NumberChecksumsTotal = msa15chks.ChecksumsFound;
                    result.NumberChecksumsFail = msa15chks.ChecksumsIncorrect;
                    result.NumberChecksumsOk = msa15chks.ChecksumsFound - msa15chks.ChecksumsIncorrect;
                    if (res == ChecksumResult.ChecksumOK)
                    {
                        //Console.WriteLine("Checksum matched");
                        result.CalculationOk = true;
                    }
                    else if (res == ChecksumResult.ChecksumFail)
                    {
                        Console.WriteLine("UpdateChecksum: Checksum failed " + filename);
                        if (!verifyOnly)
                        {
                            File.WriteAllBytes(filename, allBytes);
                            result.CalculationOk = true;
                            Console.WriteLine("UpdateChecksum: Checksum fixed");
                        }

                    }*/
                    break;
                case EDCFileType.MSA6:
                    //TODO: Implement MSA6 checksum routine here
                    break;
            }
            if (result.CalculationOk) result.CalculationResult = ChecksumResult.ChecksumOK;
            return result;
        }
 internal ContentBasedObjectResult(T instance, byte[] checksum, Action <ContentBasedOptions> setup = null) : base(instance, setup)
 {
     Checksum   = new ChecksumResult(checksum);
     Validation = Options.GetValidation(checksum);
 }