aboutsummaryrefslogtreecommitdiff
path: root/Emby.Server.Implementations/IO/SharpCifs/Util/Sharpen/MessageDigest.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Emby.Server.Implementations/IO/SharpCifs/Util/Sharpen/MessageDigest.cs')
-rw-r--r--Emby.Server.Implementations/IO/SharpCifs/Util/Sharpen/MessageDigest.cs118
1 files changed, 118 insertions, 0 deletions
diff --git a/Emby.Server.Implementations/IO/SharpCifs/Util/Sharpen/MessageDigest.cs b/Emby.Server.Implementations/IO/SharpCifs/Util/Sharpen/MessageDigest.cs
new file mode 100644
index 000000000..5562f9d36
--- /dev/null
+++ b/Emby.Server.Implementations/IO/SharpCifs/Util/Sharpen/MessageDigest.cs
@@ -0,0 +1,118 @@
+using System;
+using System.IO;
+using System.Reflection;
+using System.Security.Cryptography;
+
+namespace SharpCifs.Util.Sharpen
+{
+ public abstract class MessageDigest
+ {
+ public void Digest (byte[] buffer, int o, int len)
+ {
+ byte[] d = Digest ();
+ d.CopyTo (buffer, o);
+ }
+
+ public byte[] Digest (byte[] buffer)
+ {
+ Update (buffer);
+ return Digest ();
+ }
+
+ public abstract byte[] Digest ();
+ public abstract int GetDigestLength ();
+ public static MessageDigest GetInstance (string algorithm)
+ {
+ switch (algorithm.ToLower ()) {
+ case "sha-1":
+ //System.Security.CryptographySHA1Managed not found
+ //return new MessageDigest<SHA1Managed> ();
+ return new MessageDigest<System.Security.Cryptography.SHA1>();
+ case "md5":
+ return new MessageDigest<Md5Managed> ();
+ }
+ throw new NotSupportedException (string.Format ("The requested algorithm \"{0}\" is not supported.", algorithm));
+ }
+
+ public abstract void Reset ();
+ public abstract void Update (byte[] b);
+ public abstract void Update (byte b);
+ public abstract void Update (byte[] b, int offset, int len);
+ }
+
+
+ public class MessageDigest<TAlgorithm> : MessageDigest where TAlgorithm : HashAlgorithm //, new() //use static `Create` method
+ {
+ private TAlgorithm _hash;
+ //private CryptoStream _stream; //don't work .NET Core
+ private MemoryStream _stream;
+
+
+ public MessageDigest ()
+ {
+ Init ();
+ }
+
+ public override byte[] Digest ()
+ {
+ //CryptoStream -> MemoryStream, needless method
+ //_stream.FlushFinalBlock ();
+
+ //HashAlgorithm.`Hash` property deleted
+ //byte[] hash = _hash.Hash;
+ byte[] hash = _hash.ComputeHash(_stream.ToArray());
+
+ Reset ();
+ return hash;
+ }
+
+ public void Dispose ()
+ {
+ if (_stream != null) {
+ _stream.Dispose ();
+ }
+ _stream = null;
+ }
+
+ public override int GetDigestLength ()
+ {
+ return (_hash.HashSize / 8);
+ }
+
+ private void Init ()
+ {
+ //use static `Create` method
+ //_hash = Activator.CreateInstance<TAlgorithm> ();
+ var createMethod = typeof(TAlgorithm).GetRuntimeMethod("Create", new Type[0]);
+ _hash = (TAlgorithm)createMethod.Invoke(null, new object[] {});
+
+ //HashAlgorithm cannot cast `ICryptoTransform` on .NET Core, gave up using CryptoStream.
+ //_stream = new CryptoStream(Stream.Null, _hash, CryptoStreamMode.Write);
+ //_stream = new CryptoStream(_tmpStream, (ICryptoTransform)_hash, CryptoStreamMode.Write);
+ _stream = new MemoryStream();
+ }
+
+ public override void Reset ()
+ {
+ Dispose ();
+ Init ();
+ }
+
+ public override void Update (byte[] input)
+ {
+ _stream.Write (input, 0, input.Length);
+ }
+
+ public override void Update (byte input)
+ {
+ _stream.WriteByte (input);
+ }
+
+ public override void Update (byte[] input, int index, int count)
+ {
+ if (count < 0)
+ Console.WriteLine ("Argh!");
+ _stream.Write (input, index, count);
+ }
+ }
+}