92 lines
2.8 KiB
C#
92 lines
2.8 KiB
C#
|
//Copyright (c) Microsoft Corporation. All rights reserved.
|
|||
|
|
|||
|
using System;
|
|||
|
using System.Security.Cryptography;
|
|||
|
|
|||
|
// **************************************************************
|
|||
|
// * Raw implementation of the MD5 hash algorithm
|
|||
|
// * from RFC 1321.
|
|||
|
// *
|
|||
|
// * Written By: Reid Borsuk and Jenny Zheng
|
|||
|
// * Copyright (c) Microsoft Corporation. All rights reserved.
|
|||
|
// **************************************************************
|
|||
|
|
|||
|
|
|||
|
#if SILVERLIGHT
|
|||
|
#else
|
|||
|
//public class MD5Managed : MD5
|
|||
|
#endif
|
|||
|
namespace SharpCifs.Util.Sharpen
|
|||
|
{
|
|||
|
public class Md5Managed : HashAlgorithm
|
|||
|
|
|||
|
{
|
|||
|
public static Md5Managed Create()
|
|||
|
{
|
|||
|
return new Md5Managed();
|
|||
|
}
|
|||
|
|
|||
|
private byte[] _data;
|
|||
|
private AbcdStruct _abcd;
|
|||
|
private Int64 _totalLength;
|
|||
|
private int _dataSize;
|
|||
|
|
|||
|
public Md5Managed()
|
|||
|
{
|
|||
|
//field cannot access
|
|||
|
//HashSizeValue = 0x80;
|
|||
|
Initialize();
|
|||
|
}
|
|||
|
|
|||
|
public override void Initialize()
|
|||
|
{
|
|||
|
_data = new byte[64];
|
|||
|
_dataSize = 0;
|
|||
|
_totalLength = 0;
|
|||
|
_abcd = new AbcdStruct();
|
|||
|
//Intitial values as defined in RFC 1321
|
|||
|
_abcd.A = 0x67452301;
|
|||
|
_abcd.B = 0xefcdab89;
|
|||
|
_abcd.C = 0x98badcfe;
|
|||
|
_abcd.D = 0x10325476;
|
|||
|
}
|
|||
|
|
|||
|
protected override void HashCore(byte[] array, int ibStart, int cbSize)
|
|||
|
{
|
|||
|
int startIndex = ibStart;
|
|||
|
int totalArrayLength = _dataSize + cbSize;
|
|||
|
if (totalArrayLength >= 64)
|
|||
|
{
|
|||
|
Array.Copy(array, startIndex, _data, _dataSize, 64 - _dataSize);
|
|||
|
// Process message of 64 bytes (512 bits)
|
|||
|
Md5Core.GetHashBlock(_data, ref _abcd, 0);
|
|||
|
startIndex += 64 - _dataSize;
|
|||
|
totalArrayLength -= 64;
|
|||
|
while (totalArrayLength >= 64)
|
|||
|
{
|
|||
|
Array.Copy(array, startIndex, _data, 0, 64);
|
|||
|
Md5Core.GetHashBlock(array, ref _abcd, startIndex);
|
|||
|
totalArrayLength -= 64;
|
|||
|
startIndex += 64;
|
|||
|
}
|
|||
|
_dataSize = totalArrayLength;
|
|||
|
Array.Copy(array, startIndex, _data, 0, totalArrayLength);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
Array.Copy(array, startIndex, _data, _dataSize, cbSize);
|
|||
|
_dataSize = totalArrayLength;
|
|||
|
}
|
|||
|
_totalLength += cbSize;
|
|||
|
}
|
|||
|
|
|||
|
protected override byte[] HashFinal()
|
|||
|
{
|
|||
|
//field cannot access
|
|||
|
//HashValue = Md5Core.GetHashFinalBlock(_data, 0, _dataSize, _abcd, _totalLength * 8);
|
|||
|
//return HashValue;
|
|||
|
return Md5Core.GetHashFinalBlock(_data, 0, _dataSize, _abcd, _totalLength * 8);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|