| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 | 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);		}	}}
 |