Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
88 commits
Select commit Hold shift + click to select a range
85e72b0
Minor improvements around widgets insertion
d2dyno1 Mar 19, 2026
2df7290
Added Gallery picker to MAUI
d2dyno1 Mar 20, 2026
de0f6bc
Added GetAvailableDestinationNameAsync check to recycle bin
d2dyno1 Mar 20, 2026
e9037ac
Renamed Dashboard to AppPlatform
d2dyno1 Mar 21, 2026
ea4ce82
Added AppPlatform
d2dyno1 Mar 21, 2026
cf0592a
Groundwork for AppPlatform
d2dyno1 Mar 21, 2026
3a5bf88
Update submodules
d2dyno1 Mar 21, 2026
cec9a9e
Update SecureFolderFS.AppPlatform
d2dyno1 Mar 21, 2026
c7fcd89
Improved FileSystemSlide design
d2dyno1 Mar 26, 2026
9be3e00
Merge branch 'master' into f_rc1
d2dyno1 Mar 26, 2026
768fec5
Improved the design of AuthenticationSlide
d2dyno1 Mar 26, 2026
20433cf
Added CenterWindow to MacOsWindowHelper
d2dyno1 Mar 26, 2026
20ea79d
Improved EncryptedFileSlide design
d2dyno1 Mar 26, 2026
f6d9619
Fixed build
d2dyno1 Mar 27, 2026
5a5f7d3
Added iridescent effect to the magnifier ring
d2dyno1 Mar 27, 2026
15ef328
Update EncryptedFileSlide.xaml.cs
d2dyno1 Mar 27, 2026
688023e
Added deformation, fresnel, and inner shadow
d2dyno1 Mar 27, 2026
6024280
Update caches in RepairNameAsync
d2dyno1 Mar 28, 2026
26b354b
Added AuthenticationSlide animation
d2dyno1 Mar 28, 2026
d48b614
Disable intro screen for testing
d2dyno1 Mar 28, 2026
acda210
Fixed ExecutionEngineException on WinUI
d2dyno1 Mar 28, 2026
8bf831d
Added ring deformation
d2dyno1 Mar 28, 2026
05844cf
Adjusted iridescent effect and randomize wallpapers
d2dyno1 Mar 28, 2026
844ab22
Revert
d2dyno1 Mar 28, 2026
07beeb9
Safety checks in Recycle Bin Folder
d2dyno1 Mar 28, 2026
aab72ce
Added missing intro screenshots
d2dyno1 Mar 28, 2026
44cc105
Merge branch 'master' into f_rc1
d2dyno1 Mar 28, 2026
dffde07
Added CredentialTests
d2dyno1 Mar 29, 2026
ae3e82c
Added Path and Encrypted Path properties on MAUI
d2dyno1 Mar 29, 2026
249acca
Updated license files
d2dyno1 Mar 29, 2026
bc7a9b6
Update LicensesDialog.xaml
d2dyno1 Mar 29, 2026
0cde8bb
Update WindowsAppSDK LICENSE
d2dyno1 Mar 29, 2026
aae735d
Merge branch 'master' into f_rc1
d2dyno1 Mar 30, 2026
50fea4d
Fixed some warnings
d2dyno1 Mar 30, 2026
b3b2f9d
Removed redundant code
d2dyno1 Mar 30, 2026
53542a0
Merge branch 'master' into f_rc1
d2dyno1 Mar 30, 2026
4299319
Merge branch 'master' into f_rc1
d2dyno1 Mar 31, 2026
6178747
Merge branch 'master' into f_rc1
d2dyno1 Mar 31, 2026
5a164fc
Merge branch 'master' into f_rc1
d2dyno1 Mar 31, 2026
771b9e7
Merge branch 'master' into f_rc1
d2dyno1 Mar 31, 2026
6af86e7
Merge branch 'master' into f_rc1
d2dyno1 Apr 2, 2026
b07c862
Begin working on logging
d2dyno1 Apr 2, 2026
3528431
Some improvements to iOS thumbnail loading
d2dyno1 Apr 2, 2026
6e2d9e6
Avoid double thumbnail cache key resolving
d2dyno1 Apr 3, 2026
abbcaa3
Merge branch 'master' into f_rc1
d2dyno1 Apr 3, 2026
accb60f
Remove CopyToAsync from IImageStream
d2dyno1 Apr 3, 2026
b5b3b85
Update BrowserControl.Rendering.xaml.cs
d2dyno1 Apr 3, 2026
6ea7491
Removed EnqueueVisibleItemsForThumbnails
d2dyno1 Apr 3, 2026
9d5af26
Merge branch 'master' into f_rc1
d2dyno1 Apr 3, 2026
fdc6aba
Increase DEFAULT_MAX_ENTRIES cache size
d2dyno1 Apr 3, 2026
94e1645
More thumbnail optimizations
d2dyno1 Apr 3, 2026
d2e5397
Preserve thumbnail aspect ratio
d2dyno1 Apr 3, 2026
67c694c
Improved the design of HealthPage
d2dyno1 Apr 3, 2026
bc045cf
Update OverviewPage.xaml
d2dyno1 Apr 3, 2026
09744ad
Updated AggregatedDataWidget design
d2dyno1 Apr 4, 2026
6b804c0
Added aggregated data reading and writing operation dots
d2dyno1 Apr 5, 2026
7781eff
Redesigned MainWizardPage on MAUI
d2dyno1 Apr 5, 2026
31654b5
Improved SourceSelectionWizardPage design
d2dyno1 Apr 5, 2026
49d8af3
Removed unused files
d2dyno1 Apr 5, 2026
c121d8b
Fixed IntroductionPage on iOS
d2dyno1 Apr 5, 2026
618b008
Moved assets to .github folder
d2dyno1 Apr 5, 2026
aecf19f
Fixed build
d2dyno1 Apr 5, 2026
02e44d8
Redesigned Settings and DeviceLink pages
d2dyno1 Apr 6, 2026
6260a71
Minor improvements to HealthPage
d2dyno1 Apr 6, 2026
c9cffae
Avoid code duplication
d2dyno1 Apr 6, 2026
7df657e
Update BaseVaultCredentialsService.cs
d2dyno1 Apr 6, 2026
575d54e
Apply code review
d2dyno1 Apr 7, 2026
612d403
Partially fix Base4K encoding
d2dyno1 Apr 8, 2026
76ba871
Simplify and optimize NativePathHelpers
d2dyno1 Apr 8, 2026
c57b850
Removed FormC normalization
d2dyno1 Apr 8, 2026
703ff4b
Readd FormC normalization for select platforms
d2dyno1 Apr 8, 2026
2303f80
Update AbstractPathHelpers.cs
d2dyno1 Apr 8, 2026
41c37fa
Use IsNormalized
d2dyno1 Apr 8, 2026
72c63cf
Update AbstractPathHelpers.cs
d2dyno1 Apr 8, 2026
bb7d87c
Removed VaultListMigratorHelpers
d2dyno1 Apr 9, 2026
41f3e4e
Added tr-TR to manifest
d2dyno1 Apr 9, 2026
4ef5eec
Added simple URI activation params
d2dyno1 Apr 10, 2026
387dda9
Begin work on Cli (#120)
d2dyno1 Apr 11, 2026
9e7f0f3
Minor changes
d2dyno1 Apr 12, 2026
526b6f0
Added VaultItemInfoDialog
d2dyno1 Apr 12, 2026
9d5ea90
Added size information to VaultItemInfoDialog
d2dyno1 Apr 12, 2026
04a7042
Code review
d2dyno1 Apr 12, 2026
878adb4
Fixed Google Drive enumeration
d2dyno1 Apr 12, 2026
5acbb94
Update VaultWizardDialog.xaml.cs
d2dyno1 Apr 13, 2026
f8d6340
Removed Vanara references
d2dyno1 Apr 13, 2026
d552930
Update Directory.Packages.props
d2dyno1 Apr 13, 2026
cbdf451
Re-align graphs
d2dyno1 Apr 13, 2026
cb3a174
Show a popup when renaming an item to an existing name
d2dyno1 Apr 15, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
63 changes: 0 additions & 63 deletions .gitattributes

This file was deleted.

File renamed without changes
File renamed without changes
File renamed without changes
File renamed without changes
File renamed without changes
File renamed without changes
18 changes: 9 additions & 9 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<p align="center">
<img src="assets/SecureFolderFS_Header.png" />
<img src=".github/assets/SecureFolderFS_Header.png" />
</p>

<p align="center">
Expand Down Expand Up @@ -32,19 +32,19 @@ This ensures that your data will always remain secure.

<p align="left">
<a style="text-decoration:none" href="https://apps.microsoft.com/store/detail/securefolderfs/9NZ7CZRN7GG8" target="_blank">
<img height="56" src="assets/Source_Microsoft.png" alt="Get it from Microsoft" />
<img height="56" src=".github/assets/Source_Microsoft.png" alt="Get it from Microsoft" />
</a>
<!--<a style="text-decoration:none" href="https://apps.apple.com">
<img height="56" src="assets/Source_AppStore.png" alt="Download on the App Store" />
<img height="56" src=".github/assets/Source_AppStore.png" alt="Download on the App Store" />
</a>
<a style="text-decoration:none" href="https://play.google.com/store/apps/details?id=org.securefolderfs.securefolderfs">
<img height="56" src="assets/Source_GooglePlay.png" alt="Get it on Google Play" />
<img height="56" src=".github/assets/Source_GooglePlay.png" alt="Get it on Google Play" />
</a>
<a style="text-decoration:none" href="https://flathub.org/apps/org.securefolderfs.securefolderfs">
<img height="56" src="assets/Source_Flathub.png" alt="Get it on Flathub" />
<img height="56" src=".github/assets/Source_Flathub.png" alt="Get it on Flathub" />
</a>-->
<a style="text-decoration:none" href="https://github.com/securefolderfs-community/SecureFolderFS/releases/latest">
<img height="56" src="assets/Source_GitHub.png" alt="Get it from GitHub" />
<img height="56" src=".github/assets/Source_GitHub.png" alt="Get it from GitHub" />
</a>
</p>

Expand All @@ -58,14 +58,14 @@ SecureFolderFS is a modern encryption program that helps you keep your files saf
From the app's UI, you can create new vaults to store items securely.

<p align="center">
<img src="assets/SecureFolderFS_LockedVault.png" width="750" />
<img src=".github/assets/SecureFolderFS_LockedVault.png" width="750" />
</p>

> *For example, the 'Secrets' vault is locked behind a password.*
> *You must enter the correct password, which was set when the vault was created, to decrypt and unlock the vault.*

<p align="center">
<img src="assets/SecureFolderFS_Dashboard.png" width="750" />
<img src=".github/assets/SecureFolderFS_Dashboard.png" width="750" />
</p>

> *Upon entering the correct password, the vault will then open.*
Expand Down Expand Up @@ -162,5 +162,5 @@ cd SecureFolderFS
---

<p align="center">
<img src="assets/SecureFolderFS_Hero.png" />
<img src=".github/assets/SecureFolderFS_Hero.png" />
</p>
22 changes: 0 additions & 22 deletions solution-config.props

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
namespace SecureFolderFS.Core.Cryptography.Cipher
{
[Obsolete("AES-CTR + HMAC encryption mode is deprecated.")]
public static class AesCtr128
public static class AesCtr256
{
private const ulong CTR_START = 0UL;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,7 @@

namespace SecureFolderFS.Core.Cryptography.Cipher
{
/// TODO: Needs docs
public static class AesGcm128
public static class AesGcm256
{
public static void Encrypt(ReadOnlySpan<byte> bytes, ReadOnlySpan<byte> key, ReadOnlySpan<byte> nonce, Span<byte> tag, Span<byte> result, ReadOnlySpan<byte> associatedData)
{
Expand Down
Original file line number Diff line number Diff line change
@@ -1,21 +1,19 @@
using Miscreant;
using System;
using System;
using System.Runtime.CompilerServices;
using System.Security.Cryptography;
using Miscreant;

namespace SecureFolderFS.Core.Cryptography.Cipher
{
// TODO: Needs docs
public sealed class AesSiv128 : IDisposable
public sealed class AesSiv256 : IDisposable
{
private readonly Aead _aesCmacSiv;

private AesSiv128(Aead aesCmacSiv)
private AesSiv256(Aead aesCmacSiv)
{
_aesCmacSiv = aesCmacSiv;
}

public static AesSiv128 CreateInstance(ReadOnlySpan<byte> dekKey, ReadOnlySpan<byte> macKey)
public static AesSiv256 CreateInstance(ReadOnlySpan<byte> dekKey, ReadOnlySpan<byte> macKey)
{
// The longKey will be split into two keys - one for S2V and the other one for CTR
var longKey = new byte[dekKey.Length + macKey.Length];
Expand All @@ -26,7 +24,7 @@ public static AesSiv128 CreateInstance(ReadOnlySpan<byte> dekKey, ReadOnlySpan<b
macKey.CopyTo(longKeySpan.Slice(dekKey.Length));

var aesCmacSiv = Aead.CreateAesCmacSiv(longKey);
return new AesSiv128(aesCmacSiv);
return new AesSiv256(aesCmacSiv);
}

[MethodImpl(MethodImplOptions.Synchronized)]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ public override unsafe void EncryptChunk(ReadOnlySpan<byte> plaintextChunk, long
RandomNumberGenerator.Fill(ciphertextChunk.Slice(0, CHUNK_NONCE_SIZE));

// Encrypt
AesCtr128.Encrypt(
AesCtr256.Encrypt(
plaintextChunk,
header.GetHeaderContentKey(),
ciphertextChunk.Slice(0, CHUNK_NONCE_SIZE),
Expand Down Expand Up @@ -114,7 +114,7 @@ public override unsafe bool DecryptChunk(ReadOnlySpan<byte> ciphertextChunk, lon
}

// Decrypt
AesCtr128.Decrypt(
AesCtr256.Decrypt(
ciphertextChunk.GetChunkPayload(),
header.GetHeaderContentKey(),
ciphertextChunk.GetChunkNonce(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ public override void EncryptChunk(ReadOnlySpan<byte> plaintextChunk, long chunkN
CryptHelpers.FillAssociatedDataBigEndian(associatedData, header.GetHeaderNonce(), chunkNumber);

// Encrypt
AesGcm128.Encrypt(
AesGcm256.Encrypt(
plaintextChunk,
header.GetHeaderContentKey(),
ciphertextChunk.Slice(0, CHUNK_NONCE_SIZE),
Expand All @@ -52,7 +52,7 @@ public override bool DecryptChunk(ReadOnlySpan<byte> ciphertextChunk, long chunk
CryptHelpers.FillAssociatedDataBigEndian(associatedData, header.GetHeaderNonce(), chunkNumber);

// Decrypt
return AesGcm128.TryDecrypt(
return AesGcm256.TryDecrypt(
ciphertextChunk.GetChunkPayload(),
header.GetHeaderContentKey(),
ciphertextChunk.GetChunkNonce(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ public virtual long CalculateCiphertextSize(long plaintextSize)
/// <inheritdoc/>
public virtual long CalculatePlaintextSize(long ciphertextSize)
{
if (ciphertextSize == 0L)
if (ciphertextSize <= 0L)
return 0L;

var chunkOverhead = ChunkCiphertextSize - ChunkPlaintextSize;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ public override unsafe void EncryptHeader(ReadOnlySpan<byte> plaintextHeader, Sp
var pt = new ReadOnlySpan<byte>((byte*)s.ptPtr, s.ptLen);
var ct = new Span<byte>((byte*)s.ctPtr, s.ctLen);

AesCtr128.Encrypt(
AesCtr256.Encrypt(
pt.GetHeaderContentKey(),
dekKey,
pt.GetHeaderNonce(),
Expand Down Expand Up @@ -113,7 +113,7 @@ public override unsafe bool DecryptHeader(ReadOnlySpan<byte> ciphertextHeader, S
var ct = new ReadOnlySpan<byte>((byte*)s.ctPtr, s.ctLen);
var pt = new Span<byte>((byte*)s.ptPtr, s.ptLen);

AesCtr128.Decrypt(
AesCtr256.Decrypt(
ct.GetHeaderContentKey(),
dekKey,
ct.GetHeaderNonce(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ public override unsafe void EncryptHeader(ReadOnlySpan<byte> plaintextHeader, Sp
var ct = new Span<byte>((byte*)s.ctPtr, s.ctLen);

// Encrypt
AesGcm128.Encrypt(
AesGcm256.Encrypt(
pt.GetHeaderContentKey(),
dekKey,
pt.GetHeaderNonce(),
Expand Down Expand Up @@ -76,7 +76,7 @@ public override unsafe bool DecryptHeader(ReadOnlySpan<byte> ciphertextHeader, S
var pt = new Span<byte>((byte*)s.ptPtr, s.ptLen);

// Decrypt
return AesGcm128.TryDecrypt(
return AesGcm256.TryDecrypt(
ct.GetHeaderContentKey(),
dekKey,
ct.GetHeaderNonce(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,29 +8,30 @@ namespace SecureFolderFS.Core.Cryptography.NameCrypt
/// <inheritdoc cref="INameCrypt"/>
internal sealed class AesSivNameCrypt : BaseNameCrypt
{
private readonly AesSiv128 _aesSiv128;
private readonly AesSiv256 _aesSiv256;

public AesSivNameCrypt(KeyPair keyPair, string fileNameEncodingId)
: base(fileNameEncodingId)
{
_aesSiv128 = keyPair.UseKeys((dekKey, macKey) =>
_aesSiv256 = keyPair.UseKeys((dekKey, macKey) =>
{
return AesSiv128.CreateInstance(dekKey.ToArray(), macKey.ToArray()); // Note: AesSiv128 requires a byte[] key.
// Note: AesSiv256 requires a byte[] key.
return AesSiv256.CreateInstance(dekKey.ToArray(), macKey.ToArray());
});
}

/// <inheritdoc/>
protected override byte[] EncryptFileName(ReadOnlySpan<byte> plaintextFileNameBuffer, ReadOnlySpan<byte> directoryId)
{
return _aesSiv128.Encrypt(plaintextFileNameBuffer, directoryId);
return _aesSiv256.Encrypt(plaintextFileNameBuffer, directoryId);
}

/// <inheritdoc/>
protected override byte[]? DecryptFileName(ReadOnlySpan<byte> ciphertextFileNameBuffer, ReadOnlySpan<byte> directoryId)
{
try
{
return _aesSiv128.Decrypt(ciphertextFileNameBuffer, directoryId);
return _aesSiv256.Decrypt(ciphertextFileNameBuffer, directoryId);
}
catch (CryptographicException)
{
Expand All @@ -41,7 +42,7 @@ protected override byte[] EncryptFileName(ReadOnlySpan<byte> plaintextFileNameBu
/// <inheritdoc/>
public override void Dispose()
{
_aesSiv128.Dispose();
_aesSiv256.Dispose();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,14 +18,13 @@ namespace SecureFolderFS.Core.Dokany.Callbacks
{
internal abstract class BaseDokanyCallbacks : IDokanOperationsUnsafe, IDisposable
{
protected readonly FileSystemSpecifics specifics;
protected readonly BaseHandlesManager handlesManager;
protected readonly VolumeModel volumeModel;

public FileSystemSpecifics Specifics { get; }

protected BaseDokanyCallbacks(FileSystemSpecifics specifics, BaseHandlesManager handlesManager, VolumeModel volumeModel)
{
Specifics = specifics;
this.specifics = specifics;
this.handlesManager = handlesManager;
this.volumeModel = volumeModel;
}
Expand Down Expand Up @@ -83,7 +82,7 @@ public virtual NtStatus FindFiles(string fileName, out IList<FileInformation> fi
/// <inheritdoc/>
public virtual NtStatus SetEndOfFile(string fileName, long length, IDokanFileInfo info)
{
if (Specifics.Options.IsReadOnly)
if (specifics.Options.IsReadOnly)
return Trace(DokanResult.AccessDenied, fileName, info);

if (handlesManager.GetHandle<FileHandle>(GetContextValue(info)) is not { } fileHandle)
Expand Down Expand Up @@ -207,7 +206,7 @@ public virtual unsafe NtStatus ReadFile(string fileName, IntPtr buffer, uint buf
[MethodImpl(MethodImplOptions.Synchronized)]
public virtual unsafe NtStatus WriteFile(string fileName, IntPtr buffer, uint bufferLength, out int bytesWritten, long offset, IDokanFileInfo info)
{
if (Specifics.Options.IsReadOnly)
if (specifics.Options.IsReadOnly)
{
bytesWritten = 0;
return Trace(DokanResult.AccessDenied, fileName, info);
Expand Down Expand Up @@ -349,7 +348,7 @@ protected void CloseHandle(IDokanFileInfo info)
/// <inheritdoc/>
public virtual void Dispose()
{
Specifics.Dispose();
specifics.Dispose();
handlesManager.Dispose();
}

Expand Down
Loading
Loading