ACID.cs
1 using Ryujinx.HLE.Exceptions; 2 using System.IO; 3 4 namespace Ryujinx.HLE.Loaders.Npdm 5 { 6 public class Acid 7 { 8 private const int AcidMagic = 'A' << 0 | 'C' << 8 | 'I' << 16 | 'D' << 24; 9 10 public byte[] Rsa2048Signature { get; private set; } 11 public byte[] Rsa2048Modulus { get; private set; } 12 public int Unknown1 { get; private set; } 13 public int Flags { get; private set; } 14 15 public long TitleIdRangeMin { get; private set; } 16 public long TitleIdRangeMax { get; private set; } 17 18 public FsAccessControl FsAccessControl { get; private set; } 19 public ServiceAccessControl ServiceAccessControl { get; private set; } 20 public KernelAccessControl KernelAccessControl { get; private set; } 21 22 /// <exception cref="InvalidNpdmException">The stream doesn't contain valid ACID data.</exception> 23 /// <exception cref="System.ArgumentException">The stream does not support reading, is <see langword="null"/>, or is already closed.</exception> 24 /// <exception cref="EndOfStreamException">The end of the stream is reached.</exception> 25 /// <exception cref="System.ObjectDisposedException">The stream is closed.</exception> 26 /// <exception cref="IOException">An I/O error occurred.</exception> 27 public Acid(Stream stream, int offset) 28 { 29 stream.Seek(offset, SeekOrigin.Begin); 30 31 BinaryReader reader = new(stream); 32 33 Rsa2048Signature = reader.ReadBytes(0x100); 34 Rsa2048Modulus = reader.ReadBytes(0x100); 35 36 if (reader.ReadInt32() != AcidMagic) 37 { 38 throw new InvalidNpdmException("ACID Stream doesn't contain ACID section!"); 39 } 40 41 // Size field used with the above signature (?). 42 Unknown1 = reader.ReadInt32(); 43 44 reader.ReadInt32(); 45 46 // Bit0 must be 1 on retail, on devunit 0 is also allowed. Bit1 is unknown. 47 Flags = reader.ReadInt32(); 48 49 TitleIdRangeMin = reader.ReadInt64(); 50 TitleIdRangeMax = reader.ReadInt64(); 51 52 int fsAccessControlOffset = reader.ReadInt32(); 53 int fsAccessControlSize = reader.ReadInt32(); 54 int serviceAccessControlOffset = reader.ReadInt32(); 55 int serviceAccessControlSize = reader.ReadInt32(); 56 int kernelAccessControlOffset = reader.ReadInt32(); 57 int kernelAccessControlSize = reader.ReadInt32(); 58 59 FsAccessControl = new FsAccessControl(stream, offset + fsAccessControlOffset, fsAccessControlSize); 60 61 ServiceAccessControl = new ServiceAccessControl(stream, offset + serviceAccessControlOffset, serviceAccessControlSize); 62 63 KernelAccessControl = new KernelAccessControl(stream, offset + kernelAccessControlOffset, kernelAccessControlSize); 64 } 65 } 66 }