Code:
/ FX-1434 / FX-1434 / 1.0 / untmp / whidbey / REDBITS / ndp / clr / src / BCL / System / Security / Cryptography / HashAlgorithm.cs / 1 / HashAlgorithm.cs
// ==++==
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// ==--==
//
// HashAlgorithm.cs
//
namespace System.Security.Cryptography {
using System.IO;
[System.Runtime.InteropServices.ComVisible(true)]
public abstract class HashAlgorithm : ICryptoTransform {
protected int HashSizeValue;
protected internal byte[] HashValue;
protected int State = 0;
private bool m_bDisposed = false;
protected HashAlgorithm() {}
//
// public properties
//
public virtual int HashSize {
get { return HashSizeValue; }
}
public virtual byte[] Hash {
get {
if (m_bDisposed)
throw new ObjectDisposedException(null, Environment.GetResourceString("ObjectDisposed_Generic"));
if (State != 0)
throw new CryptographicUnexpectedOperationException(Environment.GetResourceString("Cryptography_HashNotYetFinalized"));
return (byte[]) HashValue.Clone();
}
}
//
// public methods
//
static public HashAlgorithm Create() {
return Create("System.Security.Cryptography.HashAlgorithm");
}
static public HashAlgorithm Create(String hashName) {
return (HashAlgorithm) CryptoConfig.CreateFromName(hashName);
}
public byte[] ComputeHash(Stream inputStream) {
if (m_bDisposed)
throw new ObjectDisposedException(null, Environment.GetResourceString("ObjectDisposed_Generic"));
// Default the buffer size to 4K.
byte[] buffer = new byte[4096];
int bytesRead;
do {
bytesRead = inputStream.Read(buffer, 0, 4096);
if (bytesRead > 0) {
HashCore(buffer, 0, bytesRead);
}
} while (bytesRead > 0);
HashValue = HashFinal();
byte[] Tmp = (byte[]) HashValue.Clone();
Initialize();
return(Tmp);
}
public byte[] ComputeHash(byte[] buffer) {
if (m_bDisposed)
throw new ObjectDisposedException(null, Environment.GetResourceString("ObjectDisposed_Generic"));
// Do some validation
if (buffer == null) throw new ArgumentNullException("buffer");
HashCore(buffer, 0, buffer.Length);
HashValue = HashFinal();
byte[] Tmp = (byte[]) HashValue.Clone();
Initialize();
return(Tmp);
}
public byte[] ComputeHash(byte[] buffer, int offset, int count) {
if (m_bDisposed)
throw new ObjectDisposedException(null, Environment.GetResourceString("ObjectDisposed_Generic"));
// Do some validation
if (buffer == null) throw new ArgumentNullException("buffer");
if (offset < 0) throw new ArgumentOutOfRangeException("offset", Environment.GetResourceString("ArgumentOutOfRange_NeedNonNegNum"));
if (count < 0 || (count > buffer.Length)) throw new ArgumentException(Environment.GetResourceString("Argument_InvalidValue"));
if ((buffer.Length - count) < offset) throw new ArgumentException(Environment.GetResourceString("Argument_InvalidOffLen"));
HashCore(buffer, offset, count);
HashValue = HashFinal();
byte[] Tmp = (byte[]) HashValue.Clone();
Initialize();
return(Tmp);
}
// ICryptoTransform methods
// we assume any HashAlgorithm can take input a byte at a time
public virtual int InputBlockSize {
get { return(1); }
}
public virtual int OutputBlockSize {
get { return(1); }
}
public virtual bool CanTransformMultipleBlocks {
get { return(true); }
}
public virtual bool CanReuseTransform {
get { return(true); }
}
// We implement TransformBlock and TransformFinalBlock here
public int TransformBlock(byte[] inputBuffer, int inputOffset, int inputCount, byte[] outputBuffer, int outputOffset) {
if (m_bDisposed)
throw new ObjectDisposedException(null, Environment.GetResourceString("ObjectDisposed_Generic"));
// Do some validation, we let BlockCopy do the destination array validation
if (inputBuffer == null) throw new ArgumentNullException("inputBuffer");
if (inputOffset < 0) throw new ArgumentOutOfRangeException("inputOffset", Environment.GetResourceString("ArgumentOutOfRange_NeedNonNegNum"));
if (inputCount < 0 || (inputCount > inputBuffer.Length)) throw new ArgumentException(Environment.GetResourceString("Argument_InvalidValue"));
if ((inputBuffer.Length - inputCount) < inputOffset) throw new ArgumentException(Environment.GetResourceString("Argument_InvalidOffLen"));
// Change the State value
State = 1;
HashCore(inputBuffer, inputOffset, inputCount);
if ((outputBuffer != null) && ((inputBuffer != outputBuffer) || (inputOffset != outputOffset)))
Buffer.BlockCopy(inputBuffer, inputOffset, outputBuffer, outputOffset, inputCount);
return inputCount;
}
public byte[] TransformFinalBlock(byte[] inputBuffer, int inputOffset, int inputCount) {
if (m_bDisposed)
throw new ObjectDisposedException(null, Environment.GetResourceString("ObjectDisposed_Generic"));
// Do some validation
if (inputBuffer == null) throw new ArgumentNullException("inputBuffer");
if (inputOffset < 0) throw new ArgumentOutOfRangeException("inputOffset", Environment.GetResourceString("ArgumentOutOfRange_NeedNonNegNum"));
if (inputCount < 0 || (inputCount > inputBuffer.Length)) throw new ArgumentException(Environment.GetResourceString("Argument_InvalidValue"));
if ((inputBuffer.Length - inputCount) < inputOffset) throw new ArgumentException(Environment.GetResourceString("Argument_InvalidOffLen"));
HashCore(inputBuffer, inputOffset, inputCount);
HashValue = HashFinal();
byte[] outputBytes = new byte[inputCount];
if (inputCount != 0)
Buffer.InternalBlockCopy(inputBuffer, inputOffset, outputBytes, 0, inputCount);
// reset the State value
State = 0;
return outputBytes;
}
// IDisposable methods
///
void IDisposable.Dispose() {
Dispose(true);
GC.SuppressFinalize(this);
}
public void Clear() {
((IDisposable) this).Dispose();
}
protected virtual void Dispose(bool disposing) {
if (disposing) {
if (HashValue != null)
Array.Clear(HashValue, 0, HashValue.Length);
HashValue = null;
m_bDisposed = true;
}
}
//
// abstract public methods
//
public abstract void Initialize();
protected abstract void HashCore(byte[] array, int ibStart, int cbSize);
protected abstract byte[] HashFinal();
}
}
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- XPathDocumentBuilder.cs
- SessionEndedEventArgs.cs
- TextRunTypographyProperties.cs
- FixedSOMFixedBlock.cs
- ArrayConverter.cs
- DateTimeOffsetStorage.cs
- CngAlgorithm.cs
- util.cs
- PersonalizationState.cs
- CaseStatement.cs
- Transform3DCollection.cs
- XmlValueConverter.cs
- ListBox.cs
- SmtpFailedRecipientsException.cs
- GlobalEventManager.cs
- XamlClipboardData.cs
- VersionedStreamOwner.cs
- FormatSettings.cs
- StyleModeStack.cs
- Light.cs
- ServiceParser.cs
- ConfigXmlCDataSection.cs
- NativeMethods.cs
- FilterException.cs
- ClockController.cs
- ReferentialConstraint.cs
- FlowDocumentPage.cs
- ServiceOperationParameter.cs
- RegexTree.cs
- StateMachineAction.cs
- ToolboxItem.cs
- DataGridViewSelectedColumnCollection.cs
- Attributes.cs
- EventMap.cs
- TextServicesDisplayAttributePropertyRanges.cs
- WorkflowServiceHostFactory.cs
- XmlCustomFormatter.cs
- Quaternion.cs
- CodeComment.cs
- XmlAutoDetectWriter.cs
- UnionExpr.cs
- DataGridViewButtonCell.cs
- VerificationException.cs
- Privilege.cs
- SoapObjectReader.cs
- SubqueryRules.cs
- SqlNotificationRequest.cs
- TextSchema.cs
- xmlsaver.cs
- BoolExpression.cs
- EnumConverter.cs
- WorkerRequest.cs
- PartManifestEntry.cs
- FileDialogCustomPlacesCollection.cs
- RoleExceptions.cs
- NumericExpr.cs
- DiffuseMaterial.cs
- CodePropertyReferenceExpression.cs
- HwndSourceParameters.cs
- XAMLParseException.cs
- UIElement.cs
- VersionedStreamOwner.cs
- ContainerParaClient.cs
- DesignerAttribute.cs
- ProcessModelSection.cs
- LocalTransaction.cs
- MultiTrigger.cs
- CollectionConverter.cs
- ActivityExecutionContextCollection.cs
- DataGridTextBoxColumn.cs
- CacheForPrimitiveTypes.cs
- lengthconverter.cs
- ConfigurationManagerInternal.cs
- CodeStatement.cs
- AutomationElement.cs
- DocumentReferenceCollection.cs
- SqlServices.cs
- ParserContext.cs
- OleDbError.cs
- RuntimeConfigLKG.cs
- CompiledRegexRunnerFactory.cs
- CompositeControl.cs
- OneWayChannelFactory.cs
- ToolZone.cs
- _CommandStream.cs
- GraphicsContext.cs
- FontFamily.cs
- BuildManagerHost.cs
- cryptoapiTransform.cs
- NativeCppClassAttribute.cs
- ObjectIDGenerator.cs
- HitTestParameters.cs
- FileSecurity.cs
- WmfPlaceableFileHeader.cs
- VisualStyleElement.cs
- ContentPlaceHolder.cs
- PropertyInformationCollection.cs
- StylusPointPropertyInfo.cs
- Shared.cs
- XmlnsPrefixAttribute.cs