mirror of
https://github.com/SabreTools/SabreTools.Serialization.git
synced 2026-09-22 14:55:11 +00:00
Add XGD security sector models
This commit is contained in:
@@ -0,0 +1,31 @@
|
||||
namespace SabreTools.Data.Models.Xbox
|
||||
{
|
||||
/// <summary>
|
||||
/// XGD2/3 challenge response data
|
||||
/// </summary>
|
||||
public class ChallengeResponseDataXGD23
|
||||
{
|
||||
/// <summary>
|
||||
/// Challenge data
|
||||
/// </summary>
|
||||
/// <remarks>4 bytes</remarks>
|
||||
public byte[] ChallengeData { get; set; } = new byte[4]; // 0-3
|
||||
|
||||
/// <summary>
|
||||
/// Angle
|
||||
/// </summary>
|
||||
/// <remarks>Little-endian</remarks>
|
||||
public short Angle { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Unknown response data
|
||||
/// </summary>
|
||||
public byte Unknown06 { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Angle2
|
||||
/// </summary>
|
||||
/// <remarks>Little-endian</remarks>
|
||||
public short Angle2 { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
namespace SabreTools.Data.Models.Xbox
|
||||
{
|
||||
/// <summary>
|
||||
/// XGD2/3 decrypted challenge response table entry
|
||||
/// </summary>
|
||||
/// <remarks>Decrypted form of <see cref="EncryptedChallengeResponseXGD23"/></remarks>
|
||||
public class DecryptedChallengeResponseXGD23
|
||||
{
|
||||
/// <summary>
|
||||
/// Challenge Type
|
||||
/// </summary>
|
||||
public byte ChallengeType { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Challenge ID
|
||||
/// </summary>
|
||||
public byte ChallengeID { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Tolerance
|
||||
/// </summary>
|
||||
public byte Tolerance { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Type
|
||||
/// </summary>
|
||||
/// TODO: Is there an enum for this?
|
||||
public byte Type { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Challenge data
|
||||
/// </summary>
|
||||
public byte[] ChallengeData { get; set; } = new byte[4];
|
||||
|
||||
/// <summary>
|
||||
/// Unknown response data
|
||||
/// </summary>
|
||||
/// <remarks>2 bytes</remarks>
|
||||
public byte[] Unknown08 { get; set; } = new byte[2];
|
||||
|
||||
/// <summary>
|
||||
/// Angle
|
||||
/// </summary>
|
||||
/// <remarks>Little-endian</remarks>
|
||||
public short Angle { get; set; }
|
||||
}
|
||||
}
|
||||
30
SabreTools.Serialization/Models/Xbox/DriveEntryData.cs
Normal file
30
SabreTools.Serialization/Models/Xbox/DriveEntryData.cs
Normal file
@@ -0,0 +1,30 @@
|
||||
namespace SabreTools.Data.Models.Xbox
|
||||
{
|
||||
/// <summary>
|
||||
/// XGD1/2/3 drive entry data
|
||||
/// </summary>
|
||||
public class DriveEntryData
|
||||
{
|
||||
/// <summary>
|
||||
/// Response type
|
||||
/// </summary>
|
||||
/// TODO: Is there an enum for this?
|
||||
public byte ResponseType { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Challenge ID
|
||||
/// </summary>
|
||||
public byte ChallengeID { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Mod
|
||||
/// </summary>
|
||||
public byte Mod { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Drive response data
|
||||
/// </summary>
|
||||
/// <remarks>6 bytes; Includes SS ranges</remarks>
|
||||
public byte[] Data { get; set; } = new byte[6];
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
namespace SabreTools.Data.Models.Xbox
|
||||
{
|
||||
/// <summary>
|
||||
/// XGD1 encrypted challenge response
|
||||
/// </summary>
|
||||
/// <remarks>Decrypted form is undocumented</remarks>
|
||||
public class EncryptedChallengeResponseXGD1
|
||||
{
|
||||
/// <summary>
|
||||
/// Encrypted response data
|
||||
/// </summary>
|
||||
/// <remarks>11 bytes</remarks>
|
||||
public byte[] EncryptedData { get; set; } = new byte[11];
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
namespace SabreTools.Data.Models.Xbox
|
||||
{
|
||||
/// <summary>
|
||||
/// XGD2/3 encrypted challenge response
|
||||
/// </summary>
|
||||
/// <remarks>Encrypted form of <see cref="DecryptedChallengeResponseXGD23"/></remarks>
|
||||
public class EncryptedChallengeResponseXGD23
|
||||
{
|
||||
/// <summary>
|
||||
/// Encrypted response data
|
||||
/// </summary>
|
||||
/// <remarks>12 bytes</remarks>
|
||||
public byte[] EncryptedData { get; set; } = new byte[12];
|
||||
}
|
||||
}
|
||||
66
SabreTools.Serialization/Models/Xbox/SecuritySector.cs
Normal file
66
SabreTools.Serialization/Models/Xbox/SecuritySector.cs
Normal file
@@ -0,0 +1,66 @@
|
||||
namespace SabreTools.Data.Models.Xbox
|
||||
{
|
||||
/// <summary>
|
||||
/// XGD1 security sector data
|
||||
/// </summary>
|
||||
/// <see href="https://github.com/Deterous/ParseXboxMetadata/blob/main/docs/Structure%20of%20XGD1%20SS%20and%20DMI.pdf"/>
|
||||
public abstract class SecuritySector
|
||||
{
|
||||
#region PFI Common Data
|
||||
|
||||
/// <summary>
|
||||
/// Version Number (bits 0-3) and Book Type (bits 4-7)
|
||||
/// </summary>
|
||||
/// <remarks>Should be 0xD1 (XGD1) or 0xE1 (XGD2/3)</remarks>
|
||||
/// TODO: Split into separate properties
|
||||
public byte VersionNumberAndBookType { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Maximum Rate (bits 0-3) and Disc Size (bits 4-7)
|
||||
/// </summary>
|
||||
/// <remarks>Should be 0x0F</remarks>
|
||||
/// TODO: Split into separate properties
|
||||
public byte MaximumRateAndDiscSize { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Layer Type (bits 0-3), Path (bit 4), Layer Count (bits 5-6),
|
||||
/// and Reserved (bit 7)
|
||||
/// </summary>
|
||||
/// <remarks>Should be 0xA1</remarks>
|
||||
/// TODO: Split into separate properties
|
||||
public byte LayerTypePathLayerCount { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Track Density (bits 0-3) and Linear Density (bits 4-7)
|
||||
/// </summary>
|
||||
/// <remarks>Should be 0x10</remarks>
|
||||
/// TODO: Split into separate properties
|
||||
public byte TrackDensityAndLinearDensity { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Data start physical sector
|
||||
/// </summary>
|
||||
/// <remarks>Big-endian(?)</remarks>
|
||||
public uint DataStartPhysicalSector { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Data end physical sector
|
||||
/// </summary>
|
||||
/// <remarks>Big-endian(?)</remarks>
|
||||
public uint DataEndPhysicalSector { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Layer 0 end physical sector
|
||||
/// </summary>
|
||||
/// <remarks>Big-endian(?)</remarks>
|
||||
public uint Layer0EndPhysicalSector { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// If 0x10000000, then BCA is present.
|
||||
/// </summary>
|
||||
/// <remarks>Bits 0-6 are reserved</remarks>
|
||||
public byte BCAFlag { get; set; }
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
190
SabreTools.Serialization/Models/Xbox/SecuritySectorXGD1.cs
Normal file
190
SabreTools.Serialization/Models/Xbox/SecuritySectorXGD1.cs
Normal file
@@ -0,0 +1,190 @@
|
||||
using System;
|
||||
|
||||
namespace SabreTools.Data.Models.Xbox
|
||||
{
|
||||
/// <summary>
|
||||
/// XGD1 security sector data
|
||||
/// </summary>
|
||||
/// <see href="https://github.com/Deterous/ParseXboxMetadata/blob/main/docs/Structure%20of%20XGD1%20SS%20and%20DMI.pdf"/>
|
||||
public class SecuritySectorXGD1 : SecuritySector
|
||||
{
|
||||
// Common PFI data in base class
|
||||
|
||||
/// <summary>
|
||||
/// Reserved
|
||||
/// </summary>
|
||||
/// <remarks>703 bytes, all 0x00</remarks>
|
||||
public byte[] Reserved0011 { get; set; } = new byte[703];
|
||||
|
||||
/// <summary>
|
||||
/// CPR_MAI key
|
||||
/// </summary>
|
||||
/// <remarks>Unknown endianness</remarks>
|
||||
public uint CprMaiKey { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Reserved
|
||||
/// </summary>
|
||||
/// <remarks>44 bytes, all 0x00</remarks>
|
||||
public byte[] Reserved02D4 { get; set; } = new byte[44];
|
||||
|
||||
/// <summary>
|
||||
/// Encrypted challenge response table - version
|
||||
/// </summary>
|
||||
/// <remarks>Should be 0x01</remarks>
|
||||
public byte EncryptedChallengeResponseTableVersion { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Encrypted challenge response table - entries
|
||||
/// </summary>
|
||||
/// <remarks>Should be 0x17</remarks>
|
||||
public byte EncryptedChallengeResponseTableEntryCount { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Encrypted challenge responses
|
||||
/// </summary>
|
||||
/// <remarks>23 entries</remarks>
|
||||
public EncryptedChallengeResponseXGD1[] EncryptedChallengeResponses { get; set; } = new EncryptedChallengeResponseXGD1[23];
|
||||
|
||||
/// <summary>
|
||||
/// Reserved
|
||||
/// </summary>
|
||||
/// <remarks>32 bytes, all 0x00</remarks>
|
||||
public byte[] Reserved03FF { get; set; } = new byte[32];
|
||||
|
||||
/// <summary>
|
||||
/// FILETIME - Creation Timestamp?
|
||||
/// </summary>
|
||||
public ulong CreationTimestamp { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Unknown 16 bytes (Certificate GUID?)
|
||||
/// </summary>
|
||||
public Guid CertificateGuid { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Reserved
|
||||
/// </summary>
|
||||
/// <remarks>4 bytes, all 0x00</remarks>
|
||||
public byte[] Reserved0437 { get; set; } = new byte[4];
|
||||
|
||||
/// <summary>
|
||||
/// Unknown 16 bytes (Authoring GUID?)
|
||||
/// </summary>
|
||||
public Guid AuthoringGuid { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Reserved
|
||||
/// </summary>
|
||||
/// <remarks>84 bytes, all 0x00</remarks>
|
||||
public byte[] Reserved044B { get; set; } = new byte[84];
|
||||
|
||||
/// <summary>
|
||||
/// FILETIME - Authoring Timestamp
|
||||
/// </summary>
|
||||
public ulong AuthoringTimestamp { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// time_t - Certificate Timestamp
|
||||
/// </summary>
|
||||
/// <remarks>Early discs are all 0x00, if so then 0x427 is also 0x00</remarks>
|
||||
public uint CertificateTimestamp { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Reserved
|
||||
/// </summary>
|
||||
/// <remarks>15 bytes, all 0x00</remarks>
|
||||
public byte[] Reserved04AB { get; set; } = new byte[15];
|
||||
|
||||
/// <summary>
|
||||
/// Version?
|
||||
/// </summary>
|
||||
/// <remarks>Should be 0x01</remarks>
|
||||
public byte Version { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Unknown 16 bytes (ISO Mastering GUID?)
|
||||
/// </summary>
|
||||
public Guid ISOMasteringGuid { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// SHA-1 hash A
|
||||
/// </summary>
|
||||
/// <remarks>20 bytes</remarks>
|
||||
public byte[] SHA1HashA { get; set; } = new byte[20];
|
||||
|
||||
/// <summary>
|
||||
/// Signature A
|
||||
/// </summary>
|
||||
/// <remarks>256 bytes</remarks>
|
||||
public byte[] SignatureA { get; set; } = new byte[256];
|
||||
|
||||
/// <summary>
|
||||
/// FILETIME - Disc Mastering Timestamp
|
||||
/// </summary>
|
||||
public ulong DiscMasteringTimestamp { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Reserved
|
||||
/// </summary>
|
||||
/// <remarks>4 bytes, all 0x00; meant to be a time_t?</remarks>
|
||||
public byte[] Reserved05E7 { get; set; } = new byte[4];
|
||||
|
||||
/// <summary>
|
||||
/// Reserved
|
||||
/// </summary>
|
||||
/// <remarks>15 bytes, all 0x00</remarks>
|
||||
public byte[] Reserved05EB { get; set; } = new byte[15];
|
||||
|
||||
/// <summary>
|
||||
/// Unknown
|
||||
/// </summary>
|
||||
/// <remarks>0xFF (XGD1 discs from Mar-2007 onwards are 0x02 like XGD2)</remarks>
|
||||
public byte Unknown05FA { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Unknown 16 bytes (Disc Mastering GUID? 26 known variations for XGD1)
|
||||
/// </summary>
|
||||
public Guid DiscMasteringGuid { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// SHA-1 hash B
|
||||
/// </summary>
|
||||
/// <remarks>20 bytes</remarks>
|
||||
public byte[] SHA1HashB { get; set; } = new byte[20];
|
||||
|
||||
/// <summary>
|
||||
/// Signature B
|
||||
/// </summary>
|
||||
/// <remarks>256 bytes</remarks>
|
||||
public byte[] SignatureB { get; set; } = new byte[256];
|
||||
|
||||
/// <summary>
|
||||
/// SS Version
|
||||
/// </summary>
|
||||
/// <remarks>Should be 0x01</remarks>
|
||||
public byte SSVersion { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Number of security sector ranges
|
||||
/// </summary>
|
||||
/// <remarks>Should be 0x17</remarks>
|
||||
public byte NumberOfSecuritySectorRanges { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 23 Challenge Response Data (9 bytes each, includes Security Sector Ranges)
|
||||
/// </summary>
|
||||
public DriveEntryData[] ChallengeResponses { get; set; } = new DriveEntryData[23];
|
||||
|
||||
/// <summary>
|
||||
/// Duplicated 23 Challenge Response Data (9 bytes each)
|
||||
/// </summary>
|
||||
public DriveEntryData[] DuplicatedChallengeResponses { get; set; } = new DriveEntryData[23];
|
||||
|
||||
/// <summary>
|
||||
/// Reserved
|
||||
/// </summary>
|
||||
/// <remarks>Should be 0x00</remarks>
|
||||
public byte Reserved07FF { get; set; }
|
||||
}
|
||||
}
|
||||
218
SabreTools.Serialization/Models/Xbox/SecuritySectorXGD2.cs
Normal file
218
SabreTools.Serialization/Models/Xbox/SecuritySectorXGD2.cs
Normal file
@@ -0,0 +1,218 @@
|
||||
using System;
|
||||
|
||||
namespace SabreTools.Data.Models.Xbox
|
||||
{
|
||||
/// <summary>
|
||||
/// XGD2 security sector data
|
||||
/// </summary>
|
||||
/// <see href="https://github.com/Deterous/ParseXboxMetadata/blob/main/docs/Structure%20of%20XGD2%20SS%20and%20DMI.pdf"/>
|
||||
public class SecuritySectorXGD2 : SecuritySector
|
||||
{
|
||||
// Common PFI data in base class
|
||||
|
||||
/// <summary>
|
||||
/// Reserved
|
||||
/// </summary>
|
||||
/// <remarks>239 bytes, all 0x00</remarks>
|
||||
public byte[] Reserved0011 { get; set; } = new byte[239];
|
||||
|
||||
/// <summary>
|
||||
/// Unknown
|
||||
/// </summary>
|
||||
/// <remarks>Should be 0x00, 0x00, 0x00, 0x30</remarks>
|
||||
public byte[] Unknown0100 { get; set; } = new byte[4];
|
||||
|
||||
/// <summary>
|
||||
/// Unknown
|
||||
/// </summary>
|
||||
/// <remarks>Should be 0x00, 0x00, 0x06, 0xE0</remarks>
|
||||
public byte[] Unknown0104 { get; set; } = new byte[4];
|
||||
|
||||
/// <summary>
|
||||
/// Unknown
|
||||
/// </summary>
|
||||
/// <remarks>SHA-1? Unique for each ISO</remarks>
|
||||
public byte[] Unknown0108 { get; set; } = new byte[20];
|
||||
|
||||
/// <summary>
|
||||
/// Reserved
|
||||
/// </summary>
|
||||
/// <remarks>228 bytes, all 0x00</remarks>
|
||||
public byte[] Reserved011C { get; set; } = new byte[228];
|
||||
|
||||
/// <summary>
|
||||
/// 23 Challege Response data (9 bytes each)
|
||||
/// </summary>
|
||||
public ChallengeResponseDataXGD23[] ChallengeResponses { get; set; } = new ChallengeResponseDataXGD23[23];
|
||||
|
||||
/// <summary>
|
||||
/// Reserved
|
||||
/// </summary>
|
||||
/// <remarks>Should be 0x00</remarks>
|
||||
public byte Reserved02CF { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// CPR_MAI key
|
||||
/// </summary>
|
||||
/// <remarks>Unknown endianness</remarks>
|
||||
public uint CprMaiKey { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Reserved
|
||||
/// </summary>
|
||||
/// <remarks>44 bytes, all 0x00</remarks>
|
||||
public byte[] Reserved02D4 { get; set; } = new byte[44];
|
||||
|
||||
/// <summary>
|
||||
/// Encrypted challenge response table - version
|
||||
/// </summary>
|
||||
/// <remarks>Should be 0x01</remarks>
|
||||
public byte EncryptedChallengeResponseTableVersion { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Encrypted challenge response table - entries
|
||||
/// </summary>
|
||||
/// <remarks>Should be 0x17</remarks>
|
||||
public byte EncryptedChallengeResponseTableEntryCount { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Reserved
|
||||
/// </summary>
|
||||
/// <remarks>2 bytes, all 0x00</remarks>
|
||||
public byte[] Reserved0302 { get; set; } = new byte[2];
|
||||
|
||||
/// <summary>
|
||||
/// Encrypted challenge responses
|
||||
/// </summary>
|
||||
/// <remarks>21 entries</remarks>
|
||||
public EncryptedChallengeResponseXGD23[] EncryptedChallengeResponses { get; set; } = new EncryptedChallengeResponseXGD23[21];
|
||||
|
||||
/// <summary>
|
||||
/// Reserved
|
||||
/// </summary>
|
||||
/// <remarks>96 bytes, all 0x00</remarks>
|
||||
public byte[] Reserved0400 { get; set; } = new byte[96];
|
||||
|
||||
/// <summary>
|
||||
/// Media ID
|
||||
/// </summary>
|
||||
/// <remarks>16 bytes</remarks>
|
||||
public byte[] MediaID { get; set; } = new byte[16];
|
||||
|
||||
/// <summary>
|
||||
/// Reserved
|
||||
/// </summary>
|
||||
/// <remarks>46 bytes, all 0x00</remarks>
|
||||
public byte[] Reserved0470 { get; set; } = new byte[46];
|
||||
|
||||
/// <summary>
|
||||
/// Unknown
|
||||
/// </summary>
|
||||
/// <remarks>Should be 0x04</remarks>
|
||||
public byte Unknown049E { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// FILETIME - Authoring Timestamp
|
||||
/// </summary>
|
||||
public ulong AuthoringTimestamp { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Reserved
|
||||
/// </summary>
|
||||
/// <remarks>19 bytes, all 0x00</remarks>
|
||||
public byte[] Reserved04A7 { get; set; } = new byte[19];
|
||||
|
||||
/// <summary>
|
||||
/// Version?
|
||||
/// </summary>
|
||||
/// <remarks>Should be 0x02</remarks>
|
||||
public byte Version { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Unknown 16 bytes (ISO Mastering GUID?)
|
||||
/// </summary>
|
||||
public Guid ISOMasteringGuid { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// SHA-1 hash A
|
||||
/// </summary>
|
||||
/// <remarks>20 bytes</remarks>
|
||||
public byte[] SHA1HashA { get; set; } = new byte[20];
|
||||
|
||||
/// <summary>
|
||||
/// Signature A
|
||||
/// </summary>
|
||||
/// <remarks>256 bytes</remarks>
|
||||
public byte[] SignatureA { get; set; } = new byte[256];
|
||||
|
||||
/// <summary>
|
||||
/// FILETIME - Disc Mastering Timestamp
|
||||
/// </summary>
|
||||
public ulong DiscMasteringTimestamp { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Reserved
|
||||
/// </summary>
|
||||
/// <remarks>4 bytes, all 0x00; meant to be a time_t?</remarks>
|
||||
public byte[] Reserved05E7 { get; set; } = new byte[4];
|
||||
|
||||
/// <summary>
|
||||
/// Reserved
|
||||
/// </summary>
|
||||
/// <remarks>15 bytes, all 0x00</remarks>
|
||||
public byte[] Reserved05EB { get; set; } = new byte[15];
|
||||
|
||||
/// <summary>
|
||||
/// Unknown
|
||||
/// </summary>
|
||||
/// <remarks>Should be 0x02</remarks>
|
||||
public byte Unknown05FA { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Unknown 16 bytes (Disc Mastering GUID?)
|
||||
/// </summary>
|
||||
public Guid DiscMasteringGuid { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// SHA-1 hash B
|
||||
/// </summary>
|
||||
/// <remarks>20 bytes</remarks>
|
||||
public byte[] SHA1HashB { get; set; } = new byte[20];
|
||||
|
||||
/// <summary>
|
||||
/// Signature B
|
||||
/// </summary>
|
||||
/// <remarks>256 bytes</remarks>
|
||||
public byte[] SignatureB { get; set; } = new byte[256];
|
||||
|
||||
/// <summary>
|
||||
/// SS Version
|
||||
/// </summary>
|
||||
/// <remarks>Should be 0x02</remarks>
|
||||
public byte SSVersion { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Number of security sector ranges
|
||||
/// </summary>
|
||||
/// <remarks>Should be 0x15</remarks>
|
||||
public byte NumberOfSecuritySectorRanges { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 21 Security Sector Ranges (9 bytes each)
|
||||
/// </summary>
|
||||
/// <remarks>Actually 23 entries</remarks>
|
||||
public DriveEntryData[] DriveEntries { get; set; } = new DriveEntryData[23];
|
||||
|
||||
/// <summary>
|
||||
/// Duplicated 21 Security Sector Ranges (9 bytes each)
|
||||
/// </summary>
|
||||
/// <remarks>Actually 23 entries</remarks>
|
||||
public DriveEntryData[] DuplicatedDriveEntries { get; set; } = new DriveEntryData[23];
|
||||
|
||||
/// <summary>
|
||||
/// Reserved
|
||||
/// </summary>
|
||||
/// <remarks>Should be 0x00</remarks>
|
||||
public byte Reserved07FF { get; set; }
|
||||
}
|
||||
}
|
||||
217
SabreTools.Serialization/Models/Xbox/SecuritySectorXGD3.cs
Normal file
217
SabreTools.Serialization/Models/Xbox/SecuritySectorXGD3.cs
Normal file
@@ -0,0 +1,217 @@
|
||||
using System;
|
||||
|
||||
namespace SabreTools.Data.Models.Xbox
|
||||
{
|
||||
/// <summary>
|
||||
/// XGD2 security sector data
|
||||
/// </summary>
|
||||
/// <see href="https://github.com/Deterous/ParseXboxMetadata/blob/main/docs/Structure%20of%20XGD2%20SS%20and%20DMI.pdf"/>
|
||||
public class SecuritySectorXGD3 : SecuritySector
|
||||
{
|
||||
// Common PFI data in base class
|
||||
|
||||
/// <summary>
|
||||
/// Reserved
|
||||
/// </summary>
|
||||
/// <remarks>10 bytes, all 0x00</remarks>
|
||||
public byte[] Reserved0011 { get; set; } = new byte[10];
|
||||
|
||||
/// <summary>
|
||||
/// Unknown
|
||||
/// </summary>
|
||||
/// <remarks>Should be 0x06</remarks>
|
||||
public byte Unknown001B { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Reserved
|
||||
/// </summary>
|
||||
/// <remarks>4 bytes, all 0x00</remarks>
|
||||
public byte[] Reserved001C { get; set; } = new byte[4];
|
||||
|
||||
/// <summary>
|
||||
/// 23 Challege Response data (9 bytes each), usually only 8
|
||||
/// </summary>
|
||||
public ChallengeResponseDataXGD23[] ChallengeResponses { get; set; } = new ChallengeResponseDataXGD23[23];
|
||||
|
||||
/// <summary>
|
||||
/// Reserved
|
||||
/// </summary>
|
||||
/// <remarks>Should be 0x00</remarks>
|
||||
public byte Reserved00EF { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// CPR_MAI key
|
||||
/// </summary>
|
||||
/// <remarks>Unknown endianness</remarks>
|
||||
public uint CprMaiKey { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Unknown
|
||||
/// </summary>
|
||||
public byte[] Unknown0100 { get; set; } = new byte[4];
|
||||
|
||||
/// <summary>
|
||||
/// Unknown
|
||||
/// </summary>
|
||||
/// <remarks>Should be 0x00, 0x00, 0x06, 0xE0</remarks>
|
||||
public byte[] Unknown0104 { get; set; } = new byte[4];
|
||||
|
||||
/// <summary>
|
||||
/// Unknown
|
||||
/// </summary>
|
||||
/// <remarks>506 bytes</remarks>
|
||||
public byte[] Unknown0108 { get; set; } = new byte[506];
|
||||
|
||||
/// <summary>
|
||||
/// Encrypted challenge response table - version
|
||||
/// </summary>
|
||||
/// <remarks>Should be 0x02</remarks>
|
||||
public byte EncryptedChallengeResponseTableVersion { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Encrypted challenge response table - entries
|
||||
/// </summary>
|
||||
/// <remarks>Should be 0x15</remarks>
|
||||
public byte EncryptedChallengeResponseTableEntryCount { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Reserved
|
||||
/// </summary>
|
||||
/// <remarks>2 bytes, all 0x00</remarks>
|
||||
public byte[] Reserved0302 { get; set; } = new byte[2];
|
||||
|
||||
/// <summary>
|
||||
/// Encrypted challenge responses
|
||||
/// </summary>
|
||||
/// <remarks>21 entries</remarks>
|
||||
public EncryptedChallengeResponseXGD23[] EncryptedChallengeResponses { get; set; } = new EncryptedChallengeResponseXGD23[21];
|
||||
|
||||
/// <summary>
|
||||
/// Reserved
|
||||
/// </summary>
|
||||
/// <remarks>96 bytes, all 0x00</remarks>
|
||||
public byte[] Reserved0400 { get; set; } = new byte[96];
|
||||
|
||||
/// <summary>
|
||||
/// Media ID
|
||||
/// </summary>
|
||||
/// <remarks>16 bytes</remarks>
|
||||
public byte[] MediaID { get; set; } = new byte[16];
|
||||
|
||||
/// <summary>
|
||||
/// Reserved
|
||||
/// </summary>
|
||||
/// <remarks>46 bytes, all 0x00</remarks>
|
||||
public byte[] Reserved0470 { get; set; } = new byte[46];
|
||||
|
||||
/// <summary>
|
||||
/// Unknown
|
||||
/// </summary>
|
||||
/// <remarks>Should be 0x04</remarks>
|
||||
public byte Unknown049E { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// FILETIME - Authoring Timestamp
|
||||
/// </summary>
|
||||
public ulong AuthoringTimestamp { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Reserved
|
||||
/// </summary>
|
||||
/// <remarks>19 bytes, all 0x00</remarks>
|
||||
public byte[] Reserved04A7 { get; set; } = new byte[19];
|
||||
|
||||
/// <summary>
|
||||
/// Version?
|
||||
/// </summary>
|
||||
/// <remarks>Should be 0x02</remarks>
|
||||
public byte Version { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Unknown 16 bytes (ISO Mastering GUID?)
|
||||
/// </summary>
|
||||
public Guid ISOMasteringGuid { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// SHA-1 hash A
|
||||
/// </summary>
|
||||
/// <remarks>20 bytes</remarks>
|
||||
public byte[] SHA1HashA { get; set; } = new byte[20];
|
||||
|
||||
/// <summary>
|
||||
/// Signature A
|
||||
/// </summary>
|
||||
/// <remarks>256 bytes</remarks>
|
||||
public byte[] SignatureA { get; set; } = new byte[256];
|
||||
|
||||
/// <summary>
|
||||
/// FILETIME - Disc Mastering Timestamp
|
||||
/// </summary>
|
||||
public ulong DiscMasteringTimestamp { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Reserved
|
||||
/// </summary>
|
||||
/// <remarks>4 bytes, all 0x00; meant to be a time_t?</remarks>
|
||||
public byte[] Reserved05E7 { get; set; } = new byte[4];
|
||||
|
||||
/// <summary>
|
||||
/// Reserved
|
||||
/// </summary>
|
||||
/// <remarks>15 bytes, all 0x00</remarks>
|
||||
public byte[] Reserved05EB { get; set; } = new byte[15];
|
||||
|
||||
/// <summary>
|
||||
/// Unknown
|
||||
/// </summary>
|
||||
/// <remarks>Should be 0x02</remarks>
|
||||
public byte Unknown05FA { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Unknown 16 bytes (Disc Mastering GUID?)
|
||||
/// </summary>
|
||||
public Guid DiscMasteringGuid { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// SHA-1 hash B
|
||||
/// </summary>
|
||||
/// <remarks>20 bytes</remarks>
|
||||
public byte[] SHA1HashB { get; set; } = new byte[20];
|
||||
|
||||
/// <summary>
|
||||
/// Signature B
|
||||
/// </summary>
|
||||
/// <remarks>256 bytes</remarks>
|
||||
public byte[] SignatureB { get; set; } = new byte[256];
|
||||
|
||||
/// <summary>
|
||||
/// SS Version
|
||||
/// </summary>
|
||||
/// <remarks>Should be 0x02</remarks>
|
||||
public byte SSVersion { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Number of security sector ranges
|
||||
/// </summary>
|
||||
/// <remarks>Should be 0x15</remarks>
|
||||
public byte NumberOfSecuritySectorRanges { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 21 Security Sector Ranges (9 bytes each)
|
||||
/// </summary>
|
||||
/// <remarks>Actually 23 entries</remarks>
|
||||
public DriveEntryData[] DriveEntries { get; set; } = new DriveEntryData[23];
|
||||
|
||||
/// <summary>
|
||||
/// Duplicated 21 Security Sector Ranges (9 bytes each)
|
||||
/// </summary>
|
||||
/// <remarks>Actually 23 entries</remarks>
|
||||
public DriveEntryData[] DuplicatedDriveEntries { get; set; } = new DriveEntryData[23];
|
||||
|
||||
/// <summary>
|
||||
/// Reserved
|
||||
/// </summary>
|
||||
/// <remarks>Should be 0x00</remarks>
|
||||
public byte Reserved07FF { get; set; }
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user