GDROMExplorer/SEGATools/HashAlgorithm/ECC.cs

608 lines
12 KiB
C#

// Decompiled with JetBrains decompiler
// Type: SEGATools.HashAlgorithm.ECC
// Assembly: SEGATools, Version=1.0.3.0, Culture=neutral, PublicKeyToken=611be24fdeb07e08
// MVID: D631183F-57B1-40A1-B502-5364D288307A
// Assembly location: SEGATools.dll
using ImageReader.DiscSectors;
using System;
namespace SEGATools.HashAlgorithm
{
public static class ECC
{
private static readonly byte[] ECC_F_LOOKUP_TABLE = new byte[256]
{
(byte) 0,
(byte) 2,
(byte) 4,
(byte) 6,
(byte) 8,
(byte) 10,
(byte) 12,
(byte) 14,
(byte) 16,
(byte) 18,
(byte) 20,
(byte) 22,
(byte) 24,
(byte) 26,
(byte) 28,
(byte) 30,
(byte) 32,
(byte) 34,
(byte) 36,
(byte) 38,
(byte) 40,
(byte) 42,
(byte) 44,
(byte) 46,
(byte) 48,
(byte) 50,
(byte) 52,
(byte) 54,
(byte) 56,
(byte) 58,
(byte) 60,
(byte) 62,
(byte) 64,
(byte) 66,
(byte) 68,
(byte) 70,
(byte) 72,
(byte) 74,
(byte) 76,
(byte) 78,
(byte) 80,
(byte) 82,
(byte) 84,
(byte) 86,
(byte) 88,
(byte) 90,
(byte) 92,
(byte) 94,
(byte) 96,
(byte) 98,
(byte) 100,
(byte) 102,
(byte) 104,
(byte) 106,
(byte) 108,
(byte) 110,
(byte) 112,
(byte) 114,
(byte) 116,
(byte) 118,
(byte) 120,
(byte) 122,
(byte) 124,
(byte) 126,
(byte) 128,
(byte) 130,
(byte) 132,
(byte) 134,
(byte) 136,
(byte) 138,
(byte) 140,
(byte) 142,
(byte) 144,
(byte) 146,
(byte) 148,
(byte) 150,
(byte) 152,
(byte) 154,
(byte) 156,
(byte) 158,
(byte) 160,
(byte) 162,
(byte) 164,
(byte) 166,
(byte) 168,
(byte) 170,
(byte) 172,
(byte) 174,
(byte) 176,
(byte) 178,
(byte) 180,
(byte) 182,
(byte) 184,
(byte) 186,
(byte) 188,
(byte) 190,
(byte) 192,
(byte) 194,
(byte) 196,
(byte) 198,
(byte) 200,
(byte) 202,
(byte) 204,
(byte) 206,
(byte) 208,
(byte) 210,
(byte) 212,
(byte) 214,
(byte) 216,
(byte) 218,
(byte) 220,
(byte) 222,
(byte) 224,
(byte) 226,
(byte) 228,
(byte) 230,
(byte) 232,
(byte) 234,
(byte) 236,
(byte) 238,
(byte) 240,
(byte) 242,
(byte) 244,
(byte) 246,
(byte) 248,
(byte) 250,
(byte) 252,
(byte) 254,
(byte) 29,
(byte) 31,
(byte) 25,
(byte) 27,
(byte) 21,
(byte) 23,
(byte) 17,
(byte) 19,
(byte) 13,
(byte) 15,
(byte) 9,
(byte) 11,
(byte) 5,
(byte) 7,
(byte) 1,
(byte) 3,
(byte) 61,
(byte) 63,
(byte) 57,
(byte) 59,
(byte) 53,
(byte) 55,
(byte) 49,
(byte) 51,
(byte) 45,
(byte) 47,
(byte) 41,
(byte) 43,
(byte) 37,
(byte) 39,
(byte) 33,
(byte) 35,
(byte) 93,
(byte) 95,
(byte) 89,
(byte) 91,
(byte) 85,
(byte) 87,
(byte) 81,
(byte) 83,
(byte) 77,
(byte) 79,
(byte) 73,
(byte) 75,
(byte) 69,
(byte) 71,
(byte) 65,
(byte) 67,
(byte) 125,
(byte) 127,
(byte) 121,
(byte) 123,
(byte) 117,
(byte) 119,
(byte) 113,
(byte) 115,
(byte) 109,
(byte) 111,
(byte) 105,
(byte) 107,
(byte) 101,
(byte) 103,
(byte) 97,
(byte) 99,
(byte) 157,
(byte) 159,
(byte) 153,
(byte) 155,
(byte) 149,
(byte) 151,
(byte) 145,
(byte) 147,
(byte) 141,
(byte) 143,
(byte) 137,
(byte) 139,
(byte) 133,
(byte) 135,
(byte) 129,
(byte) 131,
(byte) 189,
(byte) 191,
(byte) 185,
(byte) 187,
(byte) 181,
(byte) 183,
(byte) 177,
(byte) 179,
(byte) 173,
(byte) 175,
(byte) 169,
(byte) 171,
(byte) 165,
(byte) 167,
(byte) 161,
(byte) 163,
(byte) 221,
(byte) 223,
(byte) 217,
(byte) 219,
(byte) 213,
(byte) 215,
(byte) 209,
(byte) 211,
(byte) 205,
(byte) 207,
(byte) 201,
(byte) 203,
(byte) 197,
(byte) 199,
(byte) 193,
(byte) 195,
(byte) 253,
byte.MaxValue,
(byte) 249,
(byte) 251,
(byte) 245,
(byte) 247,
(byte) 241,
(byte) 243,
(byte) 237,
(byte) 239,
(byte) 233,
(byte) 235,
(byte) 229,
(byte) 231,
(byte) 225,
(byte) 227
};
private static readonly byte[] ECC_B_LOOKUP_TABLE = new byte[256]
{
(byte) 0,
(byte) 244,
(byte) 245,
(byte) 1,
(byte) 247,
(byte) 3,
(byte) 2,
(byte) 246,
(byte) 243,
(byte) 7,
(byte) 6,
(byte) 242,
(byte) 4,
(byte) 240,
(byte) 241,
(byte) 5,
(byte) 251,
(byte) 15,
(byte) 14,
(byte) 250,
(byte) 12,
(byte) 248,
(byte) 249,
(byte) 13,
(byte) 8,
(byte) 252,
(byte) 253,
(byte) 9,
byte.MaxValue,
(byte) 11,
(byte) 10,
(byte) 254,
(byte) 235,
(byte) 31,
(byte) 30,
(byte) 234,
(byte) 28,
(byte) 232,
(byte) 233,
(byte) 29,
(byte) 24,
(byte) 236,
(byte) 237,
(byte) 25,
(byte) 239,
(byte) 27,
(byte) 26,
(byte) 238,
(byte) 16,
(byte) 228,
(byte) 229,
(byte) 17,
(byte) 231,
(byte) 19,
(byte) 18,
(byte) 230,
(byte) 227,
(byte) 23,
(byte) 22,
(byte) 226,
(byte) 20,
(byte) 224,
(byte) 225,
(byte) 21,
(byte) 203,
(byte) 63,
(byte) 62,
(byte) 202,
(byte) 60,
(byte) 200,
(byte) 201,
(byte) 61,
(byte) 56,
(byte) 204,
(byte) 205,
(byte) 57,
(byte) 207,
(byte) 59,
(byte) 58,
(byte) 206,
(byte) 48,
(byte) 196,
(byte) 197,
(byte) 49,
(byte) 199,
(byte) 51,
(byte) 50,
(byte) 198,
(byte) 195,
(byte) 55,
(byte) 54,
(byte) 194,
(byte) 52,
(byte) 192,
(byte) 193,
(byte) 53,
(byte) 32,
(byte) 212,
(byte) 213,
(byte) 33,
(byte) 215,
(byte) 35,
(byte) 34,
(byte) 214,
(byte) 211,
(byte) 39,
(byte) 38,
(byte) 210,
(byte) 36,
(byte) 208,
(byte) 209,
(byte) 37,
(byte) 219,
(byte) 47,
(byte) 46,
(byte) 218,
(byte) 44,
(byte) 216,
(byte) 217,
(byte) 45,
(byte) 40,
(byte) 220,
(byte) 221,
(byte) 41,
(byte) 223,
(byte) 43,
(byte) 42,
(byte) 222,
(byte) 139,
(byte) 127,
(byte) 126,
(byte) 138,
(byte) 124,
(byte) 136,
(byte) 137,
(byte) 125,
(byte) 120,
(byte) 140,
(byte) 141,
(byte) 121,
(byte) 143,
(byte) 123,
(byte) 122,
(byte) 142,
(byte) 112,
(byte) 132,
(byte) 133,
(byte) 113,
(byte) 135,
(byte) 115,
(byte) 114,
(byte) 134,
(byte) 131,
(byte) 119,
(byte) 118,
(byte) 130,
(byte) 116,
(byte) 128,
(byte) 129,
(byte) 117,
(byte) 96,
(byte) 148,
(byte) 149,
(byte) 97,
(byte) 151,
(byte) 99,
(byte) 98,
(byte) 150,
(byte) 147,
(byte) 103,
(byte) 102,
(byte) 146,
(byte) 100,
(byte) 144,
(byte) 145,
(byte) 101,
(byte) 155,
(byte) 111,
(byte) 110,
(byte) 154,
(byte) 108,
(byte) 152,
(byte) 153,
(byte) 109,
(byte) 104,
(byte) 156,
(byte) 157,
(byte) 105,
(byte) 159,
(byte) 107,
(byte) 106,
(byte) 158,
(byte) 64,
(byte) 180,
(byte) 181,
(byte) 65,
(byte) 183,
(byte) 67,
(byte) 66,
(byte) 182,
(byte) 179,
(byte) 71,
(byte) 70,
(byte) 178,
(byte) 68,
(byte) 176,
(byte) 177,
(byte) 69,
(byte) 187,
(byte) 79,
(byte) 78,
(byte) 186,
(byte) 76,
(byte) 184,
(byte) 185,
(byte) 77,
(byte) 72,
(byte) 188,
(byte) 189,
(byte) 73,
(byte) 191,
(byte) 75,
(byte) 74,
(byte) 190,
(byte) 171,
(byte) 95,
(byte) 94,
(byte) 170,
(byte) 92,
(byte) 168,
(byte) 169,
(byte) 93,
(byte) 88,
(byte) 172,
(byte) 173,
(byte) 89,
(byte) 175,
(byte) 91,
(byte) 90,
(byte) 174,
(byte) 80,
(byte) 164,
(byte) 165,
(byte) 81,
(byte) 167,
(byte) 83,
(byte) 82,
(byte) 166,
(byte) 163,
(byte) 87,
(byte) 86,
(byte) 162,
(byte) 84,
(byte) 160,
(byte) 161,
(byte) 85
};
internal static int ComputeECCBlock(
byte[] src,
int srcOffset,
byte[] dest,
int destOffset,
uint majorCount,
uint minorCount,
uint majorMult,
uint minorInc)
{
uint num1 = majorCount * minorCount;
for (uint index1 = 0; index1 < majorCount; ++index1)
{
uint num2 = (uint) ((int) (index1 >> 1) * (int) majorMult + ((int) index1 & 1));
byte num3 = 0;
byte num4 = 0;
for (uint index2 = 0; index2 < minorCount; ++index2)
{
byte num5 = src[(long) srcOffset + (long) num2];
num2 += minorInc;
if (num2 >= num1)
num2 -= num1;
byte num6 = (byte) ((uint) num3 ^ (uint) num5);
num4 ^= num5;
num3 = ECC.ECC_F_LOOKUP_TABLE[(int) num6];
}
byte num7 = ECC.ECC_B_LOOKUP_TABLE[(int) ECC.ECC_F_LOOKUP_TABLE[(int) num3] ^ (int) num4];
dest[(long) destOffset + (long) index1] = num7;
dest[(long) destOffset + (long) index1 + (long) majorCount] = (byte) ((uint) num7 ^ (uint) num4);
}
return (int) majorCount * 2;
}
internal static void CheckBufferSize(byte[] buffer)
{
if (buffer == null)
throw new ArgumentNullException(nameof (buffer));
if (buffer.Length != DiscSectorCommon.RawSectorSize)
throw new ArgumentException(string.Format("length must be {0} bytes", (object) DiscSectorCommon.RawSectorSize), nameof (buffer));
}
public interface ECCParityVectorAlgorithm
{
void ComputeVectors(byte[] buffer);
}
public class PParity : ECC.ECCParityVectorAlgorithm
{
public static readonly int P_PARITY_VECTOR_LENGTH = ECC.PParity.P_PARITY_VECTORS * 2 * 2;
public static readonly int P_PARITY_VECTOR_OFFSET = 2076;
private static readonly int P_PARITY_VECTORS = 43;
private static readonly int P_PARITY_DATA_OFFSET = 12;
public void ComputeVectors(byte[] buffer)
{
ECC.CheckBufferSize(buffer);
ECC.ComputeECCBlock(buffer, ECC.PParity.P_PARITY_DATA_OFFSET, buffer, ECC.PParity.P_PARITY_VECTOR_OFFSET, (uint) (ECC.PParity.P_PARITY_VECTORS * 2), 24U, 2U, 86U);
}
}
public class QParity : ECC.ECCParityVectorAlgorithm
{
public static readonly int Q_PARITY_VECTOR_LENGTH = ECC.QParity.Q_PARITY_VECTORS * 2 * 2;
public static readonly int Q_PARITY_VECTOR_OFFSET = 2248;
private static readonly int Q_PARITY_VECTORS = 26;
private static readonly int Q_PARITY_DATA_OFFSET = 12;
public void ComputeVectors(byte[] buffer)
{
ECC.CheckBufferSize(buffer);
ECC.ComputeECCBlock(buffer, ECC.QParity.Q_PARITY_DATA_OFFSET, buffer, ECC.QParity.Q_PARITY_VECTOR_OFFSET, (uint) (ECC.QParity.Q_PARITY_VECTORS * 2), 43U, 86U, 88U);
}
}
}
}