2 // System.Security.Cryptography HashAlgorithm Class implementation
5 // Matthew S. Ford (Matthew.S.Ford@Rose-Hulman.Edu)
6 // Sebastien Pouliot (sebastien@ximian.com)
8 // Copyright 2001 by Matthew S. Ford.
9 // Portions (C) 2002 Motus Technologies Inc. (http://www.motus.com)
10 // (C) 2004 Novell (http://www.novell.com)
13 using System.Globalization;
16 namespace System.Security.Cryptography {
18 public abstract class HashAlgorithm : ICryptoTransform {
20 protected byte[] HashValue;
21 protected int HashSizeValue;
23 private bool disposed;
25 protected HashAlgorithm ()
30 public virtual bool CanTransformMultipleBlocks {
34 public virtual bool CanReuseTransform {
40 // same as System.IDisposable.Dispose() which is documented
44 public byte[] ComputeHash (byte[] input)
46 return ComputeHash (input, 0, input.Length);
49 public byte[] ComputeHash (byte[] buffer, int offset, int count)
52 throw new ObjectDisposedException ("HashAlgorithm");
54 HashCore (buffer, offset, count);
55 HashValue = HashFinal ();
61 public byte[] ComputeHash (Stream inputStream)
63 // don't read stream unless object is ready to use
65 throw new ObjectDisposedException ("HashAlgorithm");
67 byte[] buffer = new byte [4096];
68 int len = inputStream.Read (buffer, 0, 4096);
70 HashCore (buffer, 0, len);
71 len = inputStream.Read (buffer, 0, 4096);
73 HashValue = HashFinal ();
78 public static HashAlgorithm Create ()
80 return Create ("System.Security.Cryptography.HashAlgorithm");
83 public static HashAlgorithm Create (string hashName)
85 return (HashAlgorithm) CryptoConfig.CreateFromName (hashName);
88 public virtual byte[] Hash {
90 if (HashValue == null) {
91 throw new CryptographicUnexpectedOperationException (
92 Locale.GetText ("No hash value computed."));
98 protected abstract void HashCore (byte[] rgb, int start, int size);
100 protected abstract byte[] HashFinal ();
102 public virtual int HashSize {
103 get { return HashSizeValue; }
106 public abstract void Initialize ();
108 protected virtual void Dispose (bool disposing)
113 public virtual int InputBlockSize {
117 public virtual int OutputBlockSize {
121 void IDisposable.Dispose ()
124 GC.SuppressFinalize (this); // Finalization is now unnecessary
127 public int TransformBlock (byte[] inputBuffer, int inputOffset, int inputCount, byte[] outputBuffer, int outputOffset)
129 Buffer.BlockCopy (inputBuffer, inputOffset, outputBuffer, outputOffset, inputCount);
130 HashCore (inputBuffer, inputOffset, inputCount);
135 public byte[] TransformFinalBlock (byte[] inputBuffer, int inputOffset, int inputCount)
137 byte[] outputBuffer = new byte [inputCount];
139 Buffer.BlockCopy (inputBuffer, inputOffset, outputBuffer, 0, inputCount);
141 HashCore (inputBuffer, inputOffset, inputCount);
142 HashValue = HashFinal ();