71 lines
1.4 KiB
C#
71 lines
1.4 KiB
C#
using System;
|
|
|
|
using Org.BouncyCastle.Crypto.Digests;
|
|
|
|
namespace Org.BouncyCastle.Crypto.Tls
|
|
{
|
|
/// <remarks>A combined hash, which implements md5(m) || sha1(m).</remarks>
|
|
public class CombinedHash
|
|
: IDigest
|
|
{
|
|
private IDigest md5 = new MD5Digest();
|
|
private IDigest sha1 = new Sha1Digest();
|
|
|
|
/// <seealso cref="IDigest.AlgorithmName"/>
|
|
public string AlgorithmName
|
|
{
|
|
get
|
|
{
|
|
return md5.AlgorithmName + " and " + sha1.AlgorithmName + " for TLS 1.0";
|
|
}
|
|
}
|
|
|
|
/// <seealso cref="IDigest.GetByteLength"/>
|
|
public int GetByteLength()
|
|
{
|
|
return System.Math.Max(md5.GetByteLength(), sha1.GetByteLength());
|
|
}
|
|
|
|
/// <seealso cref="IDigest.GetDigestSize"/>
|
|
public int GetDigestSize()
|
|
{
|
|
return md5.GetDigestSize() + sha1.GetDigestSize();
|
|
}
|
|
|
|
/// <seealso cref="IDigest.Update"/>
|
|
public void Update(
|
|
byte input)
|
|
{
|
|
md5.Update(input);
|
|
sha1.Update(input);
|
|
}
|
|
|
|
/// <seealso cref="IDigest.BlockUpdate"/>
|
|
public void BlockUpdate(
|
|
byte[] input,
|
|
int inOff,
|
|
int len)
|
|
{
|
|
md5.BlockUpdate(input, inOff, len);
|
|
sha1.BlockUpdate(input, inOff, len);
|
|
}
|
|
|
|
/// <seealso cref="IDigest.DoFinal"/>
|
|
public int DoFinal(
|
|
byte[] output,
|
|
int outOff)
|
|
{
|
|
int i1 = md5.DoFinal(output, outOff);
|
|
int i2 = sha1.DoFinal(output, outOff + i1);
|
|
return i1 + i2;
|
|
}
|
|
|
|
/// <seealso cref="IDigest.Reset"/>
|
|
public void Reset()
|
|
{
|
|
md5.Reset();
|
|
sha1.Reset();
|
|
}
|
|
}
|
|
}
|