diff options
Diffstat (limited to '')
-rw-r--r-- | Crypto/src/crypto/tls/CombinedHash.cs | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/Crypto/src/crypto/tls/CombinedHash.cs b/Crypto/src/crypto/tls/CombinedHash.cs new file mode 100644 index 000000000..59ad87a7b --- /dev/null +++ b/Crypto/src/crypto/tls/CombinedHash.cs @@ -0,0 +1,82 @@ +using System; + +using Org.BouncyCastle.Crypto.Digests; + +namespace Org.BouncyCastle.Crypto.Tls +{ + /// <remarks>A combined hash, which implements md5(m) || sha1(m).</remarks> + internal class CombinedHash + : IDigest + { + private readonly MD5Digest md5; + private readonly Sha1Digest sha1; + + internal CombinedHash() + { + this.md5 = new MD5Digest(); + this.sha1 = new Sha1Digest(); + } + + internal CombinedHash(CombinedHash t) + { + this.md5 = new MD5Digest(t.md5); + this.sha1 = new Sha1Digest(t.sha1); + } + + /// <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(); + } + } +} |