diff options
author | Alex Barney <thealexbarney@gmail.com> | 2021-08-17 10:46:52 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-08-17 14:46:52 -0300 |
commit | cd4530f29c6a4ffd1b023105350b0440fa63f47b (patch) | |
tree | fd8f83b50404ecddef283c94558246e3d07e7e3e /Ryujinx.HLE/FileSystem/EncryptedFileSystemCreator.cs | |
parent | 680d3ed198ba6211d8357e370f0d29f1b5e95c74 (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.cs | 62 |
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; + } + } + } +} |