diff --git a/SharpHash/Checksums/SHA3Context.cs b/SharpHash/Checksums/SHA3Context.cs new file mode 100644 index 0000000..df4c2c4 --- /dev/null +++ b/SharpHash/Checksums/SHA3Context.cs @@ -0,0 +1,145 @@ +// +// SHA3Context.cs +// +// Author: +// Natalia Portillo +// +// Copyright (c) 2015 © Claunia.com +// +// 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 . + +using System.Text; +using System.IO; + +namespace SharpHash.Checksums +{ + /// + /// Provides a UNIX similar API to Mohammad Mahdi Saffari's SHA3. + /// + public class SHA3Context + { + SHA3.SHA3 _sha3Provider; + + /// + /// Initializes the SHA3 hash provider + /// + public void Init() + { + _sha3Provider = SHA3.SHA3.Create(); + } + + /// + /// Updates the hash with data. + /// + /// Data buffer. + /// Length of buffer to hash. + public void Update(byte[] data, uint len) + { + _sha3Provider.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() + { + _sha3Provider.TransformFinalBlock(new byte[0], 0, 0); + return _sha3Provider.Hash; + } + + /// + /// Returns a hexadecimal representation of the hash value. + /// + public string End() + { + _sha3Provider.TransformFinalBlock(new byte[0], 0, 0); + StringBuilder sha3Output = new StringBuilder(); + + for (int i = 0; i < _sha3Provider.Hash.Length; i++) + { + sha3Output.Append(_sha3Provider.Hash[i].ToString("x2")); + } + + return sha3Output.ToString(); + } + + /// + /// Gets the hash of a file + /// + /// File path. + public byte[] File(string filename) + { + FileStream fileStream = new FileStream(filename, FileMode.Open); + return _sha3Provider.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 = _sha3Provider.ComputeHash(fileStream); + StringBuilder sha3Output = new StringBuilder(); + + for (int i = 0; i < hash.Length; i++) + { + sha3Output.Append(hash[i].ToString("x2")); + } + + return sha3Output.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 = _sha3Provider.ComputeHash(data, 0, (int)len); + StringBuilder sha3Output = new StringBuilder(); + + for (int i = 0; i < hash.Length; i++) + { + sha3Output.Append(hash[i].ToString("x2")); + } + + return sha3Output.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/SharpHash/SharpHash.csproj b/SharpHash/SharpHash.csproj index 73f700f..cda74d1 100644 --- a/SharpHash/SharpHash.csproj +++ b/SharpHash/SharpHash.csproj @@ -31,6 +31,9 @@ + + ..\packages\SHA3.0.9.2\lib\net40\SHA3Managed.dll + @@ -45,6 +48,7 @@ + @@ -59,4 +63,7 @@ + + + \ No newline at end of file diff --git a/SharpHash/packages.config b/SharpHash/packages.config new file mode 100644 index 0000000..2ef14d0 --- /dev/null +++ b/SharpHash/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file