aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.HLE/FileSystem/EncryptedFileSystemCreator.cs
diff options
context:
space:
mode:
authorAlex Barney <thealexbarney@gmail.com>2021-08-17 10:46:52 -0700
committerGitHub <noreply@github.com>2021-08-17 14:46:52 -0300
commitcd4530f29c6a4ffd1b023105350b0440fa63f47b (patch)
treefd8f83b50404ecddef283c94558246e3d07e7e3e /Ryujinx.HLE/FileSystem/EncryptedFileSystemCreator.cs
parent680d3ed198ba6211d8357e370f0d29f1b5e95c74 (diff)
Always use an all-zeros key for AES-XTS file systems (#2561)
Diffstat (limited to 'Ryujinx.HLE/FileSystem/EncryptedFileSystemCreator.cs')
-rw-r--r--Ryujinx.HLE/FileSystem/EncryptedFileSystemCreator.cs62
1 files changed, 62 insertions, 0 deletions
diff --git a/Ryujinx.HLE/FileSystem/EncryptedFileSystemCreator.cs b/Ryujinx.HLE/FileSystem/EncryptedFileSystemCreator.cs
new file mode 100644
index 00000000..aaa80044
--- /dev/null
+++ b/Ryujinx.HLE/FileSystem/EncryptedFileSystemCreator.cs
@@ -0,0 +1,62 @@
+using LibHac;
+using LibHac.Common;
+using LibHac.Fs;
+using LibHac.Fs.Fsa;
+using LibHac.FsSrv.FsCreator;
+using LibHac.FsSystem;
+
+namespace Ryujinx.HLE.FileSystem
+{
+ public class EncryptedFileSystemCreator : IEncryptedFileSystemCreator
+ {
+ public EncryptedFileSystemCreator() { }
+
+ public Result Create(out ReferenceCountedDisposable<IFileSystem> encryptedFileSystem, ReferenceCountedDisposable<IFileSystem> baseFileSystem,
+ EncryptedFsKeyId keyId, in EncryptionSeed encryptionSeed)
+ {
+ UnsafeHelpers.SkipParamInit(out encryptedFileSystem);
+
+ if (keyId < EncryptedFsKeyId.Save || keyId > EncryptedFsKeyId.CustomStorage)
+ {
+ return ResultFs.InvalidArgument.Log();
+ }
+
+ // Force all-zero keys for now since people can open the emulator with different keys or sd seeds sometimes
+ var fs = new AesXtsFileSystem(baseFileSystem, new byte[0x32], 0x4000);
+ var aesFileSystem = new ReferenceCountedDisposable<IFileSystem>(fs);
+
+ // This wrapper will handle deleting files that were created with different keys
+ var wrappedFs = new ChangedEncryptionHandlingFileSystem(aesFileSystem);
+ encryptedFileSystem = new ReferenceCountedDisposable<IFileSystem>(wrappedFs);
+
+ return Result.Success;
+ }
+ }
+
+ public class ChangedEncryptionHandlingFileSystem : ForwardingFileSystem
+ {
+ public ChangedEncryptionHandlingFileSystem(ReferenceCountedDisposable<IFileSystem> baseFileSystem) : base(baseFileSystem) { }
+
+ protected override Result DoOpenFile(out IFile file, U8Span path, OpenMode mode)
+ {
+ UnsafeHelpers.SkipParamInit(out file);
+
+ try
+ {
+ return base.DoOpenFile(out file, path, mode);
+ }
+ catch (HorizonResultException ex)
+ {
+ if (ResultFs.AesXtsFileHeaderInvalidKeys.Includes(ex.ResultValue))
+ {
+ Result rc = DeleteFile(path);
+ if (rc.IsFailure()) return rc;
+
+ return base.DoOpenFile(out file, path, mode);
+ }
+
+ throw;
+ }
+ }
+ }
+}