diff --git a/DiscImageChef/Checksums/CRC32Context.cs b/DiscImageChef/Checksums/CRC32Context.cs
new file mode 100644
index 000000000..a3b8a2a58
--- /dev/null
+++ b/DiscImageChef/Checksums/CRC32Context.cs
@@ -0,0 +1,222 @@
+/***************************************************************************
+The Disc Image Chef
+----------------------------------------------------------------------------
+
+Filename : CRC32Context.cs
+Version : 1.0
+Author(s) : Natalia Portillo
+
+Component : Checksums.
+
+Revision : $Revision$
+Last change by : $Author$
+Date : $Date$
+
+--[ Description ] ----------------------------------------------------------
+
+Implements a CRC32 algorithm.
+
+--[ License ] --------------------------------------------------------------
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as
+ published by the Free Software Foundation, either version 3 of the
+ License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+
+----------------------------------------------------------------------------
+Copyright (C) 2011-2014 Claunia.com
+****************************************************************************/
+//$Id$
+using System.Text;
+using System.IO;
+using System;
+
+namespace DiscImageChef.Checksums
+{
+ ///
+ /// Provides a UNIX similar API to calculate CRC32.
+ ///
+ public class CRC32Context
+ {
+ const UInt32 crc32Poly = 0xEDB88320;
+ const UInt32 crc32Seed = 0xFFFFFFFF;
+
+ UInt32[] table;
+ UInt32 hashInt;
+
+ ///
+ /// Initializes the CRC32 table and seed
+ ///
+ public void Init()
+ {
+ hashInt = crc32Seed;
+
+ table = new UInt32[256];
+ for (int i = 0; i < 256; i++)
+ {
+ UInt32 entry = (UInt32)i;
+ for (int j = 0; j < 8; j++)
+ if ((entry & 1) == 1)
+ entry = (entry >> 1) ^ crc32Poly;
+ else
+ entry = entry >> 1;
+ table[i] = entry;
+ }
+ }
+
+ ///
+ /// Updates the hash with data.
+ ///
+ /// Data buffer.
+ /// Length of buffer to hash.
+ public void Update(byte[] data, uint len)
+ {
+ for (int i = 0; i < len; i++)
+ hashInt = (hashInt >> 8) ^ table[data[i] ^ hashInt & 0xff];
+ }
+
+ ///
+ /// Updates the hash with data.
+ ///
+ /// Data buffer.
+ public void Update(byte[] data)
+ {
+ Update(data, (uint)data.Length);
+ }
+
+ ///
+ /// Returns a byte array of the hash value.
+ ///
+ public byte[] Final()
+ {
+ hashInt ^= crc32Seed;
+ return BigEndianBitConverter.GetBytes(hashInt);
+ }
+
+ ///
+ /// Returns a hexadecimal representation of the hash value.
+ ///
+ public string End()
+ {
+ hashInt ^= crc32Seed;
+ StringBuilder crc32Output = new StringBuilder();
+
+ for (int i = 0; i < BigEndianBitConverter.GetBytes(hashInt).Length; i++)
+ {
+ crc32Output.Append(BigEndianBitConverter.GetBytes(hashInt)[i].ToString("x2"));
+ }
+
+ return crc32Output.ToString();
+ }
+
+ ///
+ /// Gets the hash of a file
+ ///
+ /// File path.
+ public static byte[] File(string filename)
+ {
+ byte[] hash;
+ File(filename, out hash);
+ return hash;
+ }
+
+ ///
+ /// Gets the hash of a file in hexadecimal and as a byte array.
+ ///
+ /// File path.
+ /// Byte array of the hash value.
+ public static string File(string filename, out byte[] hash)
+ {
+ FileStream fileStream = new FileStream(filename, FileMode.Open);
+ UInt32[] localTable;
+ UInt32 localhashInt;
+
+ localhashInt = crc32Seed;
+
+ localTable = new UInt32[256];
+ for (int i = 0; i < 256; i++)
+ {
+ UInt32 entry = (UInt32)i;
+ for (int j = 0; j < 8; j++)
+ if ((entry & 1) == 1)
+ entry = (entry >> 1) ^ crc32Poly;
+ else
+ entry = entry >> 1;
+ localTable[i] = entry;
+ }
+
+ for (int i = 0; i < fileStream.Length; i++)
+ localhashInt = (localhashInt >> 8) ^ localTable[fileStream.ReadByte() ^ localhashInt & 0xff];
+
+ hash = BitConverter.GetBytes(localhashInt);
+
+ StringBuilder crc32Output = new StringBuilder();
+
+ for (int i = 0; i < hash.Length; i++)
+ {
+ crc32Output.Append(hash[i].ToString("x2"));
+ }
+
+ return crc32Output.ToString();
+ }
+
+ ///
+ /// Gets the hash of the specified data buffer.
+ ///
+ /// Data buffer.
+ /// Length of the data buffer to hash.
+ /// Byte array of the hash value.
+ public static string Data(byte[] data, uint len, out byte[] hash)
+ {
+ UInt32[] localTable;
+ UInt32 localhashInt;
+
+ localhashInt = crc32Seed;
+
+ localTable = new UInt32[256];
+ for (int i = 0; i < 256; i++)
+ {
+ UInt32 entry = (UInt32)i;
+ for (int j = 0; j < 8; j++)
+ if ((entry & 1) == 1)
+ entry = (entry >> 1) ^ crc32Poly;
+ else
+ entry = entry >> 1;
+ localTable[i] = entry;
+ }
+
+ for (int i = 0; i < len; i++)
+ localhashInt = (localhashInt >> 8) ^ localTable[data[i] ^ localhashInt & 0xff];
+
+ hash = BitConverter.GetBytes(localhashInt);
+
+ StringBuilder crc32Output = new StringBuilder();
+
+ for (int i = 0; i < hash.Length; i++)
+ {
+ crc32Output.Append(hash[i].ToString("x2"));
+ }
+
+ return crc32Output.ToString();
+ }
+
+ ///
+ /// Gets the hash of the specified data buffer.
+ ///
+ /// Data buffer.
+ /// Byte array of the hash value.
+ public static string Data(byte[] data, out byte[] hash)
+ {
+ return Data(data, (uint)data.Length, out hash);
+ }
+ }
+}
+
diff --git a/DiscImageChef/Checksums/CRC64Context.cs b/DiscImageChef/Checksums/CRC64Context.cs
new file mode 100644
index 000000000..33d4f25d5
--- /dev/null
+++ b/DiscImageChef/Checksums/CRC64Context.cs
@@ -0,0 +1,221 @@
+/***************************************************************************
+The Disc Image Chef
+----------------------------------------------------------------------------
+
+Filename : CRC64Context.cs
+Version : 1.0
+Author(s) : Natalia Portillo
+
+Checksums
+Revision : $Revision$
+Last change by : $Author$
+Date : $Date$
+
+--[ Description ] ----------------------------------------------------------
+
+Implements a CRC64 algorithm.
+
+--[ License ] --------------------------------------------------------------
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as
+ published by the Free Software Foundation, either version 3 of the
+ License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+
+----------------------------------------------------------------------------
+Copyright (C) 2011-2014 Claunia.com
+****************************************************************************/
+//$Id$
+using System.Text;
+using System.IO;
+using System;
+
+namespace DiscImageChef.Checksums
+{
+ ///
+ /// Provides a UNIX similar API to calculate CRC64 (ECMA).
+ ///
+ public class CRC64Context
+ {
+ const UInt64 crc64Poly = 0xC96C5795D7870F42;
+ const UInt64 crc64Seed = 0xFFFFFFFFFFFFFFFF;
+
+ UInt64[] table;
+ UInt64 hashInt;
+
+ ///
+ /// Initializes the CRC64 table and seed
+ ///
+ public void Init()
+ {
+ hashInt = crc64Seed;
+
+ table = new UInt64[256];
+ for (int i = 0; i < 256; i++)
+ {
+ UInt64 entry = (UInt64)i;
+ for (int j = 0; j < 8; j++)
+ if ((entry & 1) == 1)
+ entry = (entry >> 1) ^ crc64Poly;
+ else
+ entry = entry >> 1;
+ table[i] = entry;
+ }
+ }
+
+ ///
+ /// Updates the hash with data.
+ ///
+ /// Data buffer.
+ /// Length of buffer to hash.
+ public void Update(byte[] data, uint len)
+ {
+ for (int i = 0; i < len; i++)
+ hashInt = (hashInt >> 8) ^ table[data[i] ^ hashInt & 0xff];
+ }
+
+ ///
+ /// Updates the hash with data.
+ ///
+ /// Data buffer.
+ public void Update(byte[] data)
+ {
+ Update(data, (uint)data.Length);
+ }
+
+ ///
+ /// Returns a byte array of the hash value.
+ ///
+ public byte[] Final()
+ {
+ hashInt ^= crc64Seed;
+ return BigEndianBitConverter.GetBytes(hashInt);
+ }
+
+ ///
+ /// Returns a hexadecimal representation of the hash value.
+ ///
+ public string End()
+ {
+ hashInt ^= crc64Seed;
+ StringBuilder crc64Output = new StringBuilder();
+
+ for (int i = 0; i < BigEndianBitConverter.GetBytes(hashInt).Length; i++)
+ {
+ crc64Output.Append(BigEndianBitConverter.GetBytes(hashInt)[i].ToString("x2"));
+ }
+
+ return crc64Output.ToString();
+ }
+
+ ///
+ /// Gets the hash of a file
+ ///
+ /// File path.
+ public static byte[] File(string filename)
+ {
+ byte[] localHash;
+ File(filename, out localHash);
+ return localHash;
+ }
+
+ ///
+ /// Gets the hash of a file in hexadecimal and as a byte array.
+ ///
+ /// File path.
+ /// Byte array of the hash value.
+ public static string File(string filename, out byte[] hash)
+ {
+ FileStream fileStream = new FileStream(filename, FileMode.Open);
+ UInt64[] localTable;
+ UInt64 localhashInt;
+
+ localhashInt = crc64Seed;
+
+ localTable = new UInt64[256];
+ for (int i = 0; i < 256; i++)
+ {
+ UInt64 entry = (UInt64)i;
+ for (int j = 0; j < 8; j++)
+ if ((entry & 1) == 1)
+ entry = (entry >> 1) ^ crc64Poly;
+ else
+ entry = entry >> 1;
+ localTable[i] = entry;
+ }
+
+ for (int i = 0; i < fileStream.Length; i++)
+ localhashInt = (localhashInt >> 8) ^ localTable[(ulong)fileStream.ReadByte() ^ localhashInt & (ulong)0xff];
+
+ hash = BitConverter.GetBytes(localhashInt);
+
+ StringBuilder crc64Output = new StringBuilder();
+
+ for (int i = 0; i < hash.Length; i++)
+ {
+ crc64Output.Append(hash[i].ToString("x2"));
+ }
+
+ return crc64Output.ToString();
+ }
+
+ ///
+ /// Gets the hash of the specified data buffer.
+ ///
+ /// Data buffer.
+ /// Length of the data buffer to hash.
+ /// Byte array of the hash value.
+ public static string Data(byte[] data, uint len, out byte[] hash)
+ {
+ UInt64[] localTable;
+ UInt64 localhashInt;
+
+ localhashInt = crc64Seed;
+
+ localTable = new UInt64[256];
+ for (int i = 0; i < 256; i++)
+ {
+ UInt64 entry = (UInt64)i;
+ for (int j = 0; j < 8; j++)
+ if ((entry & 1) == 1)
+ entry = (entry >> 1) ^ crc64Poly;
+ else
+ entry = entry >> 1;
+ localTable[i] = entry;
+ }
+
+ for (int i = 0; i < len; i++)
+ localhashInt = (localhashInt >> 8) ^ localTable[data[i] ^ localhashInt & 0xff];
+
+ hash = BitConverter.GetBytes(localhashInt);
+
+ StringBuilder crc64Output = new StringBuilder();
+
+ for (int i = 0; i < hash.Length; i++)
+ {
+ crc64Output.Append(hash[i].ToString("x2"));
+ }
+
+ return crc64Output.ToString();
+ }
+
+ ///
+ /// Gets the hash of the specified data buffer.
+ ///
+ /// Data buffer.
+ /// Byte array of the hash value.
+ public static string Data(byte[] data, out byte[] hash)
+ {
+ return Data(data, (uint)data.Length, out hash);
+ }
+ }
+}
+
diff --git a/DiscImageChef/Checksums/MD5Context.cs b/DiscImageChef/Checksums/MD5Context.cs
new file mode 100644
index 000000000..d7cad56cb
--- /dev/null
+++ b/DiscImageChef/Checksums/MD5Context.cs
@@ -0,0 +1,162 @@
+/***************************************************************************
+The Disc Image Chef
+----------------------------------------------------------------------------
+
+Filename : MD5Context.cs
+Version : 1.0
+Author(s) : Natalia Portillo
+
+Component : Checksums.
+
+Revision : $Revision$
+Last change by : $Author$
+Date : $Date$
+
+--[ Description ] ----------------------------------------------------------
+
+Wraps up .NET MD5 implementation to a Init(), Update(), Final() context.
+
+--[ License ] --------------------------------------------------------------
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as
+ published by the Free Software Foundation, either version 3 of the
+ License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+
+----------------------------------------------------------------------------
+Copyright (C) 2011-2014 Claunia.com
+****************************************************************************/
+//$Id$
+using System.Security.Cryptography;
+using System.Text;
+using System.IO;
+
+namespace DiscImageChef.Checksums
+{
+ ///
+ /// Provides a UNIX similar API to .NET MD5.
+ ///
+ public class MD5Context
+ {
+ MD5 _md5Provider;
+
+ ///
+ /// Initializes the MD5 hash provider
+ ///
+ public void Init()
+ {
+ _md5Provider = MD5.Create();
+ }
+
+ ///
+ /// Updates the hash with data.
+ ///
+ /// Data buffer.
+ /// Length of buffer to hash.
+ public void Update(byte[] data, uint len)
+ {
+ _md5Provider.TransformBlock(data, 0, (int)len, data, 0);
+ }
+
+ ///
+ /// Updates the hash with data.
+ ///
+ /// Data buffer.
+ public void Update(byte[] data)
+ {
+ Update(data, (uint)data.Length);
+ }
+
+ ///
+ /// Returns a byte array of the hash value.
+ ///
+ public byte[] Final()
+ {
+ _md5Provider.TransformFinalBlock(new byte[0], 0, 0);
+ return _md5Provider.Hash;
+ }
+
+ ///
+ /// Returns a hexadecimal representation of the hash value.
+ ///
+ public string End()
+ {
+ _md5Provider.TransformFinalBlock(new byte[0], 0, 0);
+ StringBuilder md5Output = new StringBuilder();
+
+ for (int i = 0; i < _md5Provider.Hash.Length; i++)
+ {
+ md5Output.Append(_md5Provider.Hash[i].ToString("x2"));
+ }
+
+ return md5Output.ToString();
+ }
+
+ ///
+ /// Gets the hash of a file
+ ///
+ /// File path.
+ public byte[] File(string filename)
+ {
+ FileStream fileStream = new FileStream(filename, FileMode.Open);
+ return _md5Provider.ComputeHash(fileStream);
+ }
+
+ ///
+ /// Gets the hash of a file in hexadecimal and as a byte array.
+ ///
+ /// File path.
+ /// Byte array of the hash value.
+ public string File(string filename, out byte[] hash)
+ {
+ FileStream fileStream = new FileStream(filename, FileMode.Open);
+ hash = _md5Provider.ComputeHash(fileStream);
+ StringBuilder md5Output = new StringBuilder();
+
+ for (int i = 0; i < hash.Length; i++)
+ {
+ md5Output.Append(hash[i].ToString("x2"));
+ }
+
+ return md5Output.ToString();
+ }
+
+ ///
+ /// Gets the hash of the specified data buffer.
+ ///
+ /// Data buffer.
+ /// Length of the data buffer to hash.
+ /// Byte array of the hash value.
+ public string Data(byte[] data, uint len, out byte[] hash)
+ {
+ hash = _md5Provider.ComputeHash(data, 0, (int)len);
+ StringBuilder md5Output = new StringBuilder();
+
+ for (int i = 0; i < hash.Length; i++)
+ {
+ md5Output.Append(hash[i].ToString("x2"));
+ }
+
+ return md5Output.ToString();
+ }
+
+ ///
+ /// Gets the hash of the specified data buffer.
+ ///
+ /// Data buffer.
+ /// Byte array of the hash value.
+ public string Data(byte[] data, out byte[] hash)
+ {
+ return Data(data, (uint)data.Length, out hash);
+ }
+ }
+}
+
diff --git a/DiscImageChef/Checksums/RIPEMD160Context.cs b/DiscImageChef/Checksums/RIPEMD160Context.cs
new file mode 100644
index 000000000..47b4a6a86
--- /dev/null
+++ b/DiscImageChef/Checksums/RIPEMD160Context.cs
@@ -0,0 +1,162 @@
+/***************************************************************************
+The Disc Image Chef
+----------------------------------------------------------------------------
+
+Filename : RIPEMD160Context.cs
+Version : 1.0
+Author(s) : Natalia Portillo
+
+Component : Checksums.
+
+Revision : $Revision$
+Last change by : $Author$
+Date : $Date$
+
+--[ Description ] ----------------------------------------------------------
+
+Wraps up .NET RIPEMD160 implementation to a Init(), Update(), Final() context.
+
+--[ License ] --------------------------------------------------------------
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as
+ published by the Free Software Foundation, either version 3 of the
+ License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+
+----------------------------------------------------------------------------
+Copyright (C) 2011-2014 Claunia.com
+****************************************************************************/
+//$Id$
+using System.Security.Cryptography;
+using System.Text;
+using System.IO;
+
+namespace DiscImageChef.Checksums
+{
+ ///
+ /// Provides a UNIX similar API to .NET RIPEMD160.
+ ///
+ public class RIPEMD160Context
+ {
+ RIPEMD160 _ripemd160Provider;
+
+ ///
+ /// Initializes the RIPEMD160 hash provider
+ ///
+ public void Init()
+ {
+ _ripemd160Provider = RIPEMD160.Create();
+ }
+
+ ///
+ /// Updates the hash with data.
+ ///
+ /// Data buffer.
+ /// Length of buffer to hash.
+ public void Update(byte[] data, uint len)
+ {
+ _ripemd160Provider.TransformBlock(data, 0, (int)len, data, 0);
+ }
+
+ ///
+ /// Updates the hash with data.
+ ///
+ /// Data buffer.
+ public void Update(byte[] data)
+ {
+ Update(data, (uint)data.Length);
+ }
+
+ ///
+ /// Returns a byte array of the hash value.
+ ///
+ public byte[] Final()
+ {
+ _ripemd160Provider.TransformFinalBlock(new byte[0], 0, 0);
+ return _ripemd160Provider.Hash;
+ }
+
+ ///
+ /// Returns a hexadecimal representation of the hash value.
+ ///
+ public string End()
+ {
+ _ripemd160Provider.TransformFinalBlock(new byte[0], 0, 0);
+ StringBuilder ripemd160Output = new StringBuilder();
+
+ for (int i = 0; i < _ripemd160Provider.Hash.Length; i++)
+ {
+ ripemd160Output.Append(_ripemd160Provider.Hash[i].ToString("x2"));
+ }
+
+ return ripemd160Output.ToString();
+ }
+
+ ///
+ /// Gets the hash of a file
+ ///
+ /// File path.
+ public byte[] File(string filename)
+ {
+ FileStream fileStream = new FileStream(filename, FileMode.Open);
+ return _ripemd160Provider.ComputeHash(fileStream);
+ }
+
+ ///
+ /// Gets the hash of a file in hexadecimal and as a byte array.
+ ///
+ /// File path.
+ /// Byte array of the hash value.
+ public string File(string filename, out byte[] hash)
+ {
+ FileStream fileStream = new FileStream(filename, FileMode.Open);
+ hash = _ripemd160Provider.ComputeHash(fileStream);
+ StringBuilder ripemd160Output = new StringBuilder();
+
+ for (int i = 0; i < hash.Length; i++)
+ {
+ ripemd160Output.Append(hash[i].ToString("x2"));
+ }
+
+ return ripemd160Output.ToString();
+ }
+
+ ///
+ /// Gets the hash of the specified data buffer.
+ ///
+ /// Data buffer.
+ /// Length of the data buffer to hash.
+ /// Byte array of the hash value.
+ public string Data(byte[] data, uint len, out byte[] hash)
+ {
+ hash = _ripemd160Provider.ComputeHash(data, 0, (int)len);
+ StringBuilder ripemd160Output = new StringBuilder();
+
+ for (int i = 0; i < hash.Length; i++)
+ {
+ ripemd160Output.Append(hash[i].ToString("x2"));
+ }
+
+ return ripemd160Output.ToString();
+ }
+
+ ///
+ /// Gets the hash of the specified data buffer.
+ ///
+ /// Data buffer.
+ /// Byte array of the hash value.
+ public string Data(byte[] data, out byte[] hash)
+ {
+ return Data(data, (uint)data.Length, out hash);
+ }
+ }
+}
+
diff --git a/DiscImageChef/Checksums/SHA1Context.cs b/DiscImageChef/Checksums/SHA1Context.cs
new file mode 100644
index 000000000..22873d5c6
--- /dev/null
+++ b/DiscImageChef/Checksums/SHA1Context.cs
@@ -0,0 +1,162 @@
+/***************************************************************************
+The Disc Image Chef
+----------------------------------------------------------------------------
+
+Filename : SHA1Context.cs
+Version : 1.0
+Author(s) : Natalia Portillo
+
+Component : Checksums.
+
+Revision : $Revision$
+Last change by : $Author$
+Date : $Date$
+
+--[ Description ] ----------------------------------------------------------
+
+Wraps up .NET SHA1 implementation to a Init(), Update(), Final() context.
+
+--[ License ] --------------------------------------------------------------
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as
+ published by the Free Software Foundation, either version 3 of the
+ License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+
+----------------------------------------------------------------------------
+Copyright (C) 2011-2014 Claunia.com
+****************************************************************************/
+//$Id$
+using System.Security.Cryptography;
+using System.Text;
+using System.IO;
+
+namespace DiscImageChef.Checksums
+{
+ ///
+ /// Provides a UNIX similar API to .NET SHA1.
+ ///
+ public class SHA1Context
+ {
+ SHA1 _sha1Provider;
+
+ ///
+ /// Initializes the SHA1 hash provider
+ ///
+ public void Init()
+ {
+ _sha1Provider = SHA1.Create();
+ }
+
+ ///
+ /// Updates the hash with data.
+ ///
+ /// Data buffer.
+ /// Length of buffer to hash.
+ public void Update(byte[] data, uint len)
+ {
+ _sha1Provider.TransformBlock(data, 0, (int)len, data, 0);
+ }
+
+ ///
+ /// Updates the hash with data.
+ ///
+ /// Data buffer.
+ public void Update(byte[] data)
+ {
+ Update(data, (uint)data.Length);
+ }
+
+ ///
+ /// Returns a byte array of the hash value.
+ ///
+ public byte[] Final()
+ {
+ _sha1Provider.TransformFinalBlock(new byte[0], 0, 0);
+ return _sha1Provider.Hash;
+ }
+
+ ///
+ /// Returns a hexadecimal representation of the hash value.
+ ///
+ public string End()
+ {
+ _sha1Provider.TransformFinalBlock(new byte[0], 0, 0);
+ StringBuilder sha1Output = new StringBuilder();
+
+ for (int i = 0; i < _sha1Provider.Hash.Length; i++)
+ {
+ sha1Output.Append(_sha1Provider.Hash[i].ToString("x2"));
+ }
+
+ return sha1Output.ToString();
+ }
+
+ ///
+ /// Gets the hash of a file
+ ///
+ /// File path.
+ public byte[] File(string filename)
+ {
+ FileStream fileStream = new FileStream(filename, FileMode.Open);
+ return _sha1Provider.ComputeHash(fileStream);
+ }
+
+ ///
+ /// Gets the hash of a file in hexadecimal and as a byte array.
+ ///
+ /// File path.
+ /// Byte array of the hash value.
+ public string File(string filename, out byte[] hash)
+ {
+ FileStream fileStream = new FileStream(filename, FileMode.Open);
+ hash = _sha1Provider.ComputeHash(fileStream);
+ StringBuilder sha1Output = new StringBuilder();
+
+ for (int i = 0; i < hash.Length; i++)
+ {
+ sha1Output.Append(hash[i].ToString("x2"));
+ }
+
+ return sha1Output.ToString();
+ }
+
+ ///
+ /// Gets the hash of the specified data buffer.
+ ///
+ /// Data buffer.
+ /// Length of the data buffer to hash.
+ /// Byte array of the hash value.
+ public string Data(byte[] data, uint len, out byte[] hash)
+ {
+ hash = _sha1Provider.ComputeHash(data, 0, (int)len);
+ StringBuilder sha1Output = new StringBuilder();
+
+ for (int i = 0; i < hash.Length; i++)
+ {
+ sha1Output.Append(hash[i].ToString("x2"));
+ }
+
+ return sha1Output.ToString();
+ }
+
+ ///
+ /// Gets the hash of the specified data buffer.
+ ///
+ /// Data buffer.
+ /// Byte array of the hash value.
+ public string Data(byte[] data, out byte[] hash)
+ {
+ return Data(data, (uint)data.Length, out hash);
+ }
+ }
+}
+
diff --git a/DiscImageChef/Checksums/SHA256Context.cs b/DiscImageChef/Checksums/SHA256Context.cs
new file mode 100644
index 000000000..6da3dbbeb
--- /dev/null
+++ b/DiscImageChef/Checksums/SHA256Context.cs
@@ -0,0 +1,162 @@
+/***************************************************************************
+The Disc Image Chef
+----------------------------------------------------------------------------
+
+Filename : SHA256Context.cs
+Version : 1.0
+Author(s) : Natalia Portillo
+
+Component : Checksums.
+
+Revision : $Revision$
+Last change by : $Author$
+Date : $Date$
+
+--[ Description ] ----------------------------------------------------------
+
+Wraps up .NET SHA256 implementation to a Init(), Update(), Final() context.
+
+--[ License ] --------------------------------------------------------------
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as
+ published by the Free Software Foundation, either version 3 of the
+ License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+
+----------------------------------------------------------------------------
+Copyright (C) 2011-2014 Claunia.com
+****************************************************************************/
+//$Id$
+using System.Security.Cryptography;
+using System.Text;
+using System.IO;
+
+namespace DiscImageChef.Checksums
+{
+ ///
+ /// Provides a UNIX similar API to .NET SHA256.
+ ///
+ public class SHA256Context
+ {
+ SHA256 _sha256Provider;
+
+ ///
+ /// Initializes the SHA256 hash provider
+ ///
+ public void Init()
+ {
+ _sha256Provider = SHA256.Create();
+ }
+
+ ///
+ /// Updates the hash with data.
+ ///
+ /// Data buffer.
+ /// Length of buffer to hash.
+ public void Update(byte[] data, uint len)
+ {
+ _sha256Provider.TransformBlock(data, 0, (int)len, data, 0);
+ }
+
+ ///
+ /// Updates the hash with data.
+ ///
+ /// Data buffer.
+ public void Update(byte[] data)
+ {
+ Update(data, (uint)data.Length);
+ }
+
+ ///
+ /// Returns a byte array of the hash value.
+ ///
+ public byte[] Final()
+ {
+ _sha256Provider.TransformFinalBlock(new byte[0], 0, 0);
+ return _sha256Provider.Hash;
+ }
+
+ ///
+ /// Returns a hexadecimal representation of the hash value.
+ ///
+ public string End()
+ {
+ _sha256Provider.TransformFinalBlock(new byte[0], 0, 0);
+ StringBuilder sha256Output = new StringBuilder();
+
+ for (int i = 0; i < _sha256Provider.Hash.Length; i++)
+ {
+ sha256Output.Append(_sha256Provider.Hash[i].ToString("x2"));
+ }
+
+ return sha256Output.ToString();
+ }
+
+ ///
+ /// Gets the hash of a file
+ ///
+ /// File path.
+ public byte[] File(string filename)
+ {
+ FileStream fileStream = new FileStream(filename, FileMode.Open);
+ return _sha256Provider.ComputeHash(fileStream);
+ }
+
+ ///
+ /// Gets the hash of a file in hexadecimal and as a byte array.
+ ///
+ /// File path.
+ /// Byte array of the hash value.
+ public string File(string filename, out byte[] hash)
+ {
+ FileStream fileStream = new FileStream(filename, FileMode.Open);
+ hash = _sha256Provider.ComputeHash(fileStream);
+ StringBuilder sha256Output = new StringBuilder();
+
+ for (int i = 0; i < hash.Length; i++)
+ {
+ sha256Output.Append(hash[i].ToString("x2"));
+ }
+
+ return sha256Output.ToString();
+ }
+
+ ///
+ /// Gets the hash of the specified data buffer.
+ ///
+ /// Data buffer.
+ /// Length of the data buffer to hash.
+ /// Byte array of the hash value.
+ public string Data(byte[] data, uint len, out byte[] hash)
+ {
+ hash = _sha256Provider.ComputeHash(data, 0, (int)len);
+ StringBuilder sha256Output = new StringBuilder();
+
+ for (int i = 0; i < hash.Length; i++)
+ {
+ sha256Output.Append(hash[i].ToString("x2"));
+ }
+
+ return sha256Output.ToString();
+ }
+
+ ///
+ /// Gets the hash of the specified data buffer.
+ ///
+ /// Data buffer.
+ /// Byte array of the hash value.
+ public string Data(byte[] data, out byte[] hash)
+ {
+ return Data(data, (uint)data.Length, out hash);
+ }
+ }
+}
+
diff --git a/DiscImageChef/Checksums/SHA384Context.cs b/DiscImageChef/Checksums/SHA384Context.cs
new file mode 100644
index 000000000..c8f31c925
--- /dev/null
+++ b/DiscImageChef/Checksums/SHA384Context.cs
@@ -0,0 +1,162 @@
+/***************************************************************************
+The Disc Image Chef
+----------------------------------------------------------------------------
+
+Filename : SHA384Context.cs
+Version : 1.0
+Author(s) : Natalia Portillo
+
+Component : Checksums.
+
+Revision : $Revision$
+Last change by : $Author$
+Date : $Date$
+
+--[ Description ] ----------------------------------------------------------
+
+Wraps up .NET SHA384 implementation to a Init(), Update(), Final() context.
+
+--[ License ] --------------------------------------------------------------
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as
+ published by the Free Software Foundation, either version 3 of the
+ License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+
+----------------------------------------------------------------------------
+Copyright (C) 2011-2014 Claunia.com
+****************************************************************************/
+//$Id$
+using System.Security.Cryptography;
+using System.Text;
+using System.IO;
+
+namespace DiscImageChef.Checksums
+{
+ ///
+ /// Provides a UNIX similar API to .NET SHA384.
+ ///
+ public class SHA384Context
+ {
+ SHA384 _sha384Provider;
+
+ ///
+ /// Initializes the SHA384 hash provider
+ ///
+ public void Init()
+ {
+ _sha384Provider = SHA384.Create();
+ }
+
+ ///
+ /// Updates the hash with data.
+ ///
+ /// Data buffer.
+ /// Length of buffer to hash.
+ public void Update(byte[] data, uint len)
+ {
+ _sha384Provider.TransformBlock(data, 0, (int)len, data, 0);
+ }
+
+ ///
+ /// Updates the hash with data.
+ ///
+ /// Data buffer.
+ public void Update(byte[] data)
+ {
+ Update(data, (uint)data.Length);
+ }
+
+ ///
+ /// Returns a byte array of the hash value.
+ ///
+ public byte[] Final()
+ {
+ _sha384Provider.TransformFinalBlock(new byte[0], 0, 0);
+ return _sha384Provider.Hash;
+ }
+
+ ///
+ /// Returns a hexadecimal representation of the hash value.
+ ///
+ public string End()
+ {
+ _sha384Provider.TransformFinalBlock(new byte[0], 0, 0);
+ StringBuilder sha384Output = new StringBuilder();
+
+ for (int i = 0; i < _sha384Provider.Hash.Length; i++)
+ {
+ sha384Output.Append(_sha384Provider.Hash[i].ToString("x2"));
+ }
+
+ return sha384Output.ToString();
+ }
+
+ ///
+ /// Gets the hash of a file
+ ///
+ /// File path.
+ public byte[] File(string filename)
+ {
+ FileStream fileStream = new FileStream(filename, FileMode.Open);
+ return _sha384Provider.ComputeHash(fileStream);
+ }
+
+ ///
+ /// Gets the hash of a file in hexadecimal and as a byte array.
+ ///
+ /// File path.
+ /// Byte array of the hash value.
+ public string File(string filename, out byte[] hash)
+ {
+ FileStream fileStream = new FileStream(filename, FileMode.Open);
+ hash = _sha384Provider.ComputeHash(fileStream);
+ StringBuilder sha384Output = new StringBuilder();
+
+ for (int i = 0; i < hash.Length; i++)
+ {
+ sha384Output.Append(hash[i].ToString("x2"));
+ }
+
+ return sha384Output.ToString();
+ }
+
+ ///
+ /// Gets the hash of the specified data buffer.
+ ///
+ /// Data buffer.
+ /// Length of the data buffer to hash.
+ /// Byte array of the hash value.
+ public string Data(byte[] data, uint len, out byte[] hash)
+ {
+ hash = _sha384Provider.ComputeHash(data, 0, (int)len);
+ StringBuilder sha384Output = new StringBuilder();
+
+ for (int i = 0; i < hash.Length; i++)
+ {
+ sha384Output.Append(hash[i].ToString("x2"));
+ }
+
+ return sha384Output.ToString();
+ }
+
+ ///
+ /// Gets the hash of the specified data buffer.
+ ///
+ /// Data buffer.
+ /// Byte array of the hash value.
+ public string Data(byte[] data, out byte[] hash)
+ {
+ return Data(data, (uint)data.Length, out hash);
+ }
+ }
+}
+
diff --git a/DiscImageChef/Checksums/SHA512Context.cs b/DiscImageChef/Checksums/SHA512Context.cs
new file mode 100644
index 000000000..741a8f943
--- /dev/null
+++ b/DiscImageChef/Checksums/SHA512Context.cs
@@ -0,0 +1,162 @@
+/***************************************************************************
+The Disc Image Chef
+----------------------------------------------------------------------------
+
+Filename : SHA512Context.cs
+Version : 1.0
+Author(s) : Natalia Portillo
+
+Component : Checksums.
+
+Revision : $Revision$
+Last change by : $Author$
+Date : $Date$
+
+--[ Description ] ----------------------------------------------------------
+
+Wraps up .NET SHA512 implementation to a Init(), Update(), Final() context.
+
+--[ License ] --------------------------------------------------------------
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as
+ published by the Free Software Foundation, either version 3 of the
+ License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+
+----------------------------------------------------------------------------
+Copyright (C) 2011-2014 Claunia.com
+****************************************************************************/
+//$Id$
+using System.Security.Cryptography;
+using System.Text;
+using System.IO;
+
+namespace DiscImageChef.Checksums
+{
+ ///
+ /// Provides a UNIX similar API to .NET SHA512.
+ ///
+ public class SHA512Context
+ {
+ SHA512 _sha512Provider;
+
+ ///
+ /// Initializes the SHA512 hash provider
+ ///
+ public void Init()
+ {
+ _sha512Provider = SHA512.Create();
+ }
+
+ ///
+ /// Updates the hash with data.
+ ///
+ /// Data buffer.
+ /// Length of buffer to hash.
+ public void Update(byte[] data, uint len)
+ {
+ _sha512Provider.TransformBlock(data, 0, (int)len, data, 0);
+ }
+
+ ///
+ /// Updates the hash with data.
+ ///
+ /// Data buffer.
+ public void Update(byte[] data)
+ {
+ Update(data, (uint)data.Length);
+ }
+
+ ///
+ /// Returns a byte array of the hash value.
+ ///
+ public byte[] Final()
+ {
+ _sha512Provider.TransformFinalBlock(new byte[0], 0, 0);
+ return _sha512Provider.Hash;
+ }
+
+ ///
+ /// Returns a hexadecimal representation of the hash value.
+ ///
+ public string End()
+ {
+ _sha512Provider.TransformFinalBlock(new byte[0], 0, 0);
+ StringBuilder sha512Output = new StringBuilder();
+
+ for (int i = 0; i < _sha512Provider.Hash.Length; i++)
+ {
+ sha512Output.Append(_sha512Provider.Hash[i].ToString("x2"));
+ }
+
+ return sha512Output.ToString();
+ }
+
+ ///
+ /// Gets the hash of a file
+ ///
+ /// File path.
+ public byte[] File(string filename)
+ {
+ FileStream fileStream = new FileStream(filename, FileMode.Open);
+ return _sha512Provider.ComputeHash(fileStream);
+ }
+
+ ///
+ /// Gets the hash of a file in hexadecimal and as a byte array.
+ ///
+ /// File path.
+ /// Byte array of the hash value.
+ public string File(string filename, out byte[] hash)
+ {
+ FileStream fileStream = new FileStream(filename, FileMode.Open);
+ hash = _sha512Provider.ComputeHash(fileStream);
+ StringBuilder sha512Output = new StringBuilder();
+
+ for (int i = 0; i < hash.Length; i++)
+ {
+ sha512Output.Append(hash[i].ToString("x2"));
+ }
+
+ return sha512Output.ToString();
+ }
+
+ ///
+ /// Gets the hash of the specified data buffer.
+ ///
+ /// Data buffer.
+ /// Length of the data buffer to hash.
+ /// Byte array of the hash value.
+ public string Data(byte[] data, uint len, out byte[] hash)
+ {
+ hash = _sha512Provider.ComputeHash(data, 0, (int)len);
+ StringBuilder sha512Output = new StringBuilder();
+
+ for (int i = 0; i < hash.Length; i++)
+ {
+ sha512Output.Append(hash[i].ToString("x2"));
+ }
+
+ return sha512Output.ToString();
+ }
+
+ ///
+ /// Gets the hash of the specified data buffer.
+ ///
+ /// Data buffer.
+ /// Byte array of the hash value.
+ public string Data(byte[] data, out byte[] hash)
+ {
+ return Data(data, (uint)data.Length, out hash);
+ }
+ }
+}
+
diff --git a/DiscImageChef/Commands/Checksum.cs b/DiscImageChef/Commands/Checksum.cs
index 5711ea08d..7eec40f4a 100644
--- a/DiscImageChef/Commands/Checksum.cs
+++ b/DiscImageChef/Commands/Checksum.cs
@@ -1,4 +1,44 @@
-using System;
+/***************************************************************************
+The Disc Image Chef
+----------------------------------------------------------------------------
+
+Filename : Checksum.cs
+Version : 1.0
+Author(s) : Natalia Portillo
+
+Component : Verbs.
+
+Revision : $Revision$
+Last change by : $Author$
+Date : $Date$
+
+--[ Description ] ----------------------------------------------------------
+
+Implements the 'checksum' verb.
+
+--[ License ] --------------------------------------------------------------
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as
+ published by the Free Software Foundation, either version 3 of the
+ License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+
+----------------------------------------------------------------------------
+Copyright (C) 2011-2014 Claunia.com
+****************************************************************************/
+//$Id$
+using System;
+using DiscImageChef.ImagePlugins;
+using DiscImageChef.Checksums;
+using System.Collections.Generic;
namespace DiscImageChef.Commands
{
@@ -14,11 +54,186 @@ namespace DiscImageChef.Commands
Console.WriteLine("--whole-disc={0}", options.WholeDisc);
Console.WriteLine("--input={0}", options.InputFile);
Console.WriteLine("--crc32={0}", options.DoCRC32);
+ Console.WriteLine("--crc64={0}", options.DoCRC64);
Console.WriteLine("--md5={0}", options.DoMD5);
+ Console.WriteLine("--ripemd160={0}", options.DoRIPEMD160);
Console.WriteLine("--sha1={0}", options.DoSHA1);
- Console.WriteLine("--fuzzy={0}", options.DoFuzzy);
+ Console.WriteLine("--sha256={0}", options.DoSHA256);
+ Console.WriteLine("--sha384={0}", options.DoSHA384);
+ Console.WriteLine("--sha512={0}", options.DoSHA512);
+ }
+ //throw new NotImplementedException("Checksumming not yet implemented.");
+
+ ImagePlugin inputFormat = ImageFormat.Detect(options.InputFile);
+
+ if (inputFormat == null)
+ {
+ Console.WriteLine("Unable to recognize image format, not checksumming");
+ return;
+ }
+
+ inputFormat.OpenImage(options.InputFile);
+
+ if (options.SeparatedTracks)
+ {
+ try
+ {
+ List