mirror of
https://github.com/aaru-dps/Aaru.Decoders.git
synced 2025-12-16 19:24:32 +00:00
Add error handling to scrambling (#9)
This commit is contained in:
committed by
GitHub
parent
089ba52732
commit
fd04357f56
@@ -35,6 +35,7 @@ using System;
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Diagnostics.CodeAnalysis;
|
using System.Diagnostics.CodeAnalysis;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using Aaru.CommonTypes.Enums;
|
||||||
using Aaru.Helpers;
|
using Aaru.Helpers;
|
||||||
|
|
||||||
namespace Aaru.Decoders.DVD;
|
namespace Aaru.Decoders.DVD;
|
||||||
@@ -204,38 +205,50 @@ public sealed class Sector
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="sector">Buffer of the scrambled sector</param>
|
/// <param name="sector">Buffer of the scrambled sector</param>
|
||||||
/// <param name="cipher">Buffer of the scrambling cipher</param>
|
/// <param name="cipher">Buffer of the scrambling cipher</param>
|
||||||
/// <returns>The unscrambled sector.</returns>
|
/// <param name="scrambled">Buffer of unscrambled sector data</param>
|
||||||
static byte[] UnscrambleSector(byte[] sector, IReadOnlyList<byte> cipher)
|
/// <returns>The Error.</returns>
|
||||||
|
static ErrorNumber UnscrambleSector(byte[] sector, IReadOnlyList<byte> cipher, out byte[] scrambled)
|
||||||
{
|
{
|
||||||
var scrambled = new byte[sector.Length];
|
scrambled = new byte[sector.Length];
|
||||||
Array.Copy(sector, 0, scrambled, 0, sector.Length);
|
Array.Copy(sector, 0, scrambled, 0, sector.Length);
|
||||||
|
|
||||||
for(var i = 0; i < 2048; i++)
|
for(var i = 0; i < 2048; i++)
|
||||||
scrambled[i + 12] = (byte)(sector[i + 12] ^ cipher[i]);
|
scrambled[i + 12] = (byte)(sector[i + 12] ^ cipher[i]);
|
||||||
|
|
||||||
return ComputeEdc(0, scrambled, 2060) != BigEndianBitConverter.ToUInt32(sector, 2060) ? sector : scrambled;
|
return ComputeEdc(0, scrambled, 2060) != BigEndianBitConverter.ToUInt32(sector, 2060)
|
||||||
|
? ErrorNumber.NotVerifiable
|
||||||
|
: ErrorNumber.NoError;
|
||||||
}
|
}
|
||||||
|
|
||||||
public byte[] Scramble(byte[] sector)
|
public ErrorNumber Scramble(byte[] sector, out byte[] scrambled)
|
||||||
{
|
{
|
||||||
|
scrambled = new byte[sector.Length];
|
||||||
|
|
||||||
if(sector is not { Length: 2064 })
|
if(sector is not { Length: 2064 })
|
||||||
return sector;
|
return ErrorNumber.NotSupported;
|
||||||
|
|
||||||
byte[]? cipher = GetSeed(sector);
|
byte[]? cipher = GetSeed(sector);
|
||||||
|
|
||||||
return cipher == null ? sector : UnscrambleSector(sector, cipher);
|
return cipher == null ? ErrorNumber.UnrecognizedFormat : UnscrambleSector(sector, cipher, out scrambled);
|
||||||
}
|
}
|
||||||
|
|
||||||
public byte[] Scramble(byte[] sector, uint transferLength)
|
public ErrorNumber Scramble(byte[] sector, uint transferLength, out byte[] scrambled)
|
||||||
{
|
{
|
||||||
var scrambled = new byte[sector.Length];
|
scrambled = new byte[sector.Length];
|
||||||
|
|
||||||
if(sector.Length % 2064 != 0 || sector.Length / 2064 != transferLength)
|
if(sector.Length % 2064 != 0 || sector.Length / 2064 != transferLength)
|
||||||
return sector;
|
return ErrorNumber.NotSupported;
|
||||||
|
|
||||||
for(uint i = 0; i < transferLength; i++)
|
for(uint i = 0; i < transferLength; i++)
|
||||||
Array.Copy(Scramble(sector.Skip((int)(i * 2064)).Take(2064).ToArray()), 0, scrambled, i * 2064, 2064);
|
{
|
||||||
|
ErrorNumber error = Scramble(sector.Skip((int)(i * 2064)).Take(2064).ToArray(), out byte[]? currentSector);
|
||||||
|
|
||||||
return scrambled;
|
if(error != ErrorNumber.NoError)
|
||||||
|
return error;
|
||||||
|
|
||||||
|
Array.Copy(currentSector, 0, scrambled, i * 2064, 2064);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ErrorNumber.NoError;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user