608 lines
12 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|
|
}
|