Add Tiger2 variants (0x80 pad start)

This commit is contained in:
Matt Nadareski
2024-11-09 21:32:02 -05:00
parent d9cf9fd3b2
commit 6df184fa4e
16 changed files with 306 additions and 105 deletions

View File

@@ -191,6 +191,12 @@ namespace SabreTools.Hashing.Test
{HashType.Tiger160_4, "e7609126923009f733cd0fcbc5a733fa4f4ccf7a"},
{HashType.Tiger192_3, "afc7ac1c3c031b675562f917b59f088533405e1a2f72912d"},
{HashType.Tiger192_4, "e7609126923009f733cd0fcbc5a733fa4f4ccf7ab7c0e2a3"},
{HashType.Tiger2_128_3, "b26271774e66519b1c746f210e0be05c"},
{HashType.Tiger2_128_4, "f1df540d3f2521b87a957c9b2b00fc7c"},
{HashType.Tiger2_160_3, "b26271774e66519b1c746f210e0be05c4fd9efde"},
{HashType.Tiger2_160_4, "f1df540d3f2521b87a957c9b2b00fc7c589306dc"},
{HashType.Tiger2_192_3, "b26271774e66519b1c746f210e0be05c4fd9efde26e46e89"},
{HashType.Tiger2_192_4, "f1df540d3f2521b87a957c9b2b00fc7c589306dcf094acb5"},
{HashType.XxHash32, "aa1d338e"},
{HashType.XxHash64, "181e9ea4f0f62b08"},

View File

@@ -832,6 +832,36 @@ namespace SabreTools.Hashing
/// </summary>
Tiger192_4,
/// <summary>
/// Tiger2 128-bit hash, 3 passes
/// </summary>
Tiger2_128_3,
/// <summary>
/// Tiger2 128-bit hash, 4 passes
/// </summary>
Tiger2_128_4,
/// <summary>
/// Tiger2 160-bit hash, 3 passes
/// </summary>
Tiger2_160_3,
/// <summary>
/// Tiger2 160-bit hash, 4 passes
/// </summary>
Tiger2_160_4,
/// <summary>
/// Tiger2 192-bit hash, 3 passes
/// </summary>
Tiger2_192_3,
/// <summary>
/// Tiger2 192-bit hash, 4 passes
/// </summary>
Tiger2_192_4,
#endregion
#region xxHash

View File

@@ -310,6 +310,12 @@ namespace SabreTools.Hashing
HashType.Tiger160_4 => new MessageDigest.Tiger160_4(),
HashType.Tiger192_3 => new MessageDigest.Tiger192_3(),
HashType.Tiger192_4 => new MessageDigest.Tiger192_4(),
HashType.Tiger2_128_3 => new MessageDigest.Tiger2_128_3(),
HashType.Tiger2_128_4 => new MessageDigest.Tiger2_128_4(),
HashType.Tiger2_160_3 => new MessageDigest.Tiger2_160_3(),
HashType.Tiger2_160_4 => new MessageDigest.Tiger2_160_4(),
HashType.Tiger2_192_3 => new MessageDigest.Tiger2_192_3(),
HashType.Tiger2_192_4 => new MessageDigest.Tiger2_192_4(),
HashType.XxHash32 => new XxHash.XxHash32(),
HashType.XxHash64 => new XxHash.XxHash64(),

View File

@@ -0,0 +1,25 @@
using System;
namespace SabreTools.Hashing.MessageDigest
{
/// <summary>
/// 3-pass variant of Tiger-128
/// </summary>
public class Tiger128_3 : TigerHashBase
{
public Tiger128_3() : base()
{
_passes = 3;
_padStart = 0x01;
}
/// <inheritdoc/>
public override byte[] GetHash()
{
byte[] hash = base.GetHash();
byte[] trimmedHash = new byte[16];
Array.Copy(hash, trimmedHash, 16);
return trimmedHash;
}
}
}

View File

@@ -0,0 +1,25 @@
using System;
namespace SabreTools.Hashing.MessageDigest
{
/// <summary>
/// 4-pass variant of Tiger-128
/// </summary>
public class Tiger128_4 : TigerHashBase
{
public Tiger128_4() : base()
{
_passes = 4;
_padStart = 0x01;
}
/// <inheritdoc/>
public override byte[] GetHash()
{
byte[] hash = base.GetHash();
byte[] trimmedHash = new byte[16];
Array.Copy(hash, trimmedHash, 16);
return trimmedHash;
}
}
}

View File

@@ -0,0 +1,25 @@
using System;
namespace SabreTools.Hashing.MessageDigest
{
/// <summary>
/// 3-pass variant of Tiger-160
/// </summary>
public class Tiger160_3 : TigerHashBase
{
public Tiger160_3() : base()
{
_passes = 3;
_padStart = 0x01;
}
/// <inheritdoc/>
public override byte[] GetHash()
{
byte[] hash = base.GetHash();
byte[] trimmedHash = new byte[20];
Array.Copy(hash, trimmedHash, 20);
return trimmedHash;
}
}
}

View File

@@ -0,0 +1,25 @@
using System;
namespace SabreTools.Hashing.MessageDigest
{
/// <summary>
/// 4-pass variant of Tiger-160
/// </summary>
public class Tiger160_4 : TigerHashBase
{
public Tiger160_4() : base()
{
_passes = 4;
_padStart = 0x01;
}
/// <inheritdoc/>
public override byte[] GetHash()
{
byte[] hash = base.GetHash();
byte[] trimmedHash = new byte[20];
Array.Copy(hash, trimmedHash, 20);
return trimmedHash;
}
}
}

View File

@@ -0,0 +1,14 @@
namespace SabreTools.Hashing.MessageDigest
{
/// <summary>
/// 3-pass variant of Tiger-192
/// </summary>
public class Tiger192_3 : TigerHashBase
{
public Tiger192_3() : base()
{
_passes = 3;
_padStart = 0x01;
}
}
}

View File

@@ -0,0 +1,14 @@
namespace SabreTools.Hashing.MessageDigest
{
/// <summary>
/// 4-pass variant of Tiger-192
/// </summary>
public class Tiger192_4 : TigerHashBase
{
public Tiger192_4() : base()
{
_passes = 4;
_padStart = 0x01;
}
}
}

View File

@@ -0,0 +1,25 @@
using System;
namespace SabreTools.Hashing.MessageDigest
{
/// <summary>
/// 3-pass variant of Tiger2-128
/// </summary>
public class Tiger2_128_3 : TigerHashBase
{
public Tiger2_128_3() : base()
{
_passes = 3;
_padStart = 0x80;
}
/// <inheritdoc/>
public override byte[] GetHash()
{
byte[] hash = base.GetHash();
byte[] trimmedHash = new byte[16];
Array.Copy(hash, trimmedHash, 16);
return trimmedHash;
}
}
}

View File

@@ -0,0 +1,25 @@
using System;
namespace SabreTools.Hashing.MessageDigest
{
/// <summary>
/// 4-pass variant of Tiger2-128
/// </summary>
public class Tiger2_128_4 : TigerHashBase
{
public Tiger2_128_4() : base()
{
_passes = 4;
_padStart = 0x80;
}
/// <inheritdoc/>
public override byte[] GetHash()
{
byte[] hash = base.GetHash();
byte[] trimmedHash = new byte[16];
Array.Copy(hash, trimmedHash, 16);
return trimmedHash;
}
}
}

View File

@@ -0,0 +1,25 @@
using System;
namespace SabreTools.Hashing.MessageDigest
{
/// <summary>
/// 3-pass variant of Tiger2-160
/// </summary>
public class Tiger2_160_3 : TigerHashBase
{
public Tiger2_160_3() : base()
{
_passes = 3;
_padStart = 0x80;
}
/// <inheritdoc/>
public override byte[] GetHash()
{
byte[] hash = base.GetHash();
byte[] trimmedHash = new byte[20];
Array.Copy(hash, trimmedHash, 20);
return trimmedHash;
}
}
}

View File

@@ -0,0 +1,25 @@
using System;
namespace SabreTools.Hashing.MessageDigest
{
/// <summary>
/// 4-pass variant of Tiger2-160
/// </summary>
public class Tiger2_160_4 : TigerHashBase
{
public Tiger2_160_4() : base()
{
_passes = 4;
_padStart = 0x80;
}
/// <inheritdoc/>
public override byte[] GetHash()
{
byte[] hash = base.GetHash();
byte[] trimmedHash = new byte[20];
Array.Copy(hash, trimmedHash, 20);
return trimmedHash;
}
}
}

View File

@@ -0,0 +1,14 @@
namespace SabreTools.Hashing.MessageDigest
{
/// <summary>
/// 3-pass variant of Tiger2-192
/// </summary>
public class Tiger2_192_3 : TigerHashBase
{
public Tiger2_192_3() : base()
{
_passes = 3;
_padStart = 0x80;
}
}
}

View File

@@ -0,0 +1,14 @@
namespace SabreTools.Hashing.MessageDigest
{
/// <summary>
/// 4-pass variant of Tiger2-192
/// </summary>
public class Tiger2_192_4 : TigerHashBase
{
public Tiger2_192_4() : base()
{
_passes = 4;
_padStart = 0x80;
}
}
}

View File

@@ -5,19 +5,24 @@ using static SabreTools.Hashing.MessageDigest.Constants;
namespace SabreTools.Hashing.MessageDigest
{
/// <see href="https://biham.cs.technion.ac.il/Reports/Tiger//>
public abstract class TigerHash : MessageDigestBase<ulong>
public abstract class TigerHashBase : MessageDigestBase<ulong>
{
/// <summary>
/// Number of passes (minimum 3)
/// </summary>
protected int _passes;
/// <summary>
/// Byte to start padding with
/// </summary>
protected byte _padStart;
/// <summary>
/// Set of 3 64-bit numbers representing the hash state
/// </summary>
private readonly ulong[] _state = new ulong[3];
public TigerHash() : base()
public TigerHashBase() : base()
{
}
@@ -97,7 +102,7 @@ namespace SabreTools.Hashing.MessageDigest
// Prebuild the padding
var padding = new byte[padLength];
padding[0] = 0x01;
padding[0] = _padStart;
padding[padLength - 1] = (byte)((totalBitCount >> 56) & 0xff);
padding[padLength - 2] = (byte)((totalBitCount >> 48) & 0xff);
padding[padLength - 3] = (byte)((totalBitCount >> 40) & 0xff);
@@ -234,106 +239,4 @@ namespace SabreTools.Hashing.MessageDigest
_block[7] -= _block[6] ^ 0x0123456789ABCDEF;
}
}
/// <summary>
/// 3-pass variant of Tiger-192
/// </summary>
public class Tiger192_3 : TigerHash
{
public Tiger192_3() : base()
{
_passes = 3;
}
}
/// <summary>
/// 4-pass variant of Tiger-192
/// </summary>
public class Tiger192_4 : TigerHash
{
public Tiger192_4() : base()
{
_passes = 4;
}
}
/// <summary>
/// 3-pass variant of Tiger-160
/// </summary>
public class Tiger160_3 : TigerHash
{
public Tiger160_3() : base()
{
_passes = 3;
}
/// <inheritdoc/>
public override byte[] GetHash()
{
byte[] hash = base.GetHash();
byte[] trimmedHash = new byte[20];
Array.Copy(hash, trimmedHash, 20);
return trimmedHash;
}
}
/// <summary>
/// 4-pass variant of Tiger-160
/// </summary>
public class Tiger160_4 : TigerHash
{
public Tiger160_4() : base()
{
_passes = 4;
}
/// <inheritdoc/>
public override byte[] GetHash()
{
byte[] hash = base.GetHash();
byte[] trimmedHash = new byte[20];
Array.Copy(hash, trimmedHash, 20);
return trimmedHash;
}
}
/// <summary>
/// 3-pass variant of Tiger-128
/// </summary>
public class Tiger128_3 : TigerHash
{
public Tiger128_3() : base()
{
_passes = 3;
}
/// <inheritdoc/>
public override byte[] GetHash()
{
byte[] hash = base.GetHash();
byte[] trimmedHash = new byte[16];
Array.Copy(hash, trimmedHash, 16);
return trimmedHash;
}
}
/// <summary>
/// 4-pass variant of Tiger-128
/// </summary>
public class Tiger128_4 : TigerHash
{
public Tiger128_4() : base()
{
_passes = 4;
}
/// <inheritdoc/>
public override byte[] GetHash()
{
byte[] hash = base.GetHash();
byte[] trimmedHash = new byte[16];
Array.Copy(hash, trimmedHash, 16);
return trimmedHash;
}
}
}