Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
219 commits
Select commit Hold shift + click to select a range
dee1ada
Begin work on animated intro background
d2dyno1 Dec 19, 2025
6caa4a2
Light mode adjustments
d2dyno1 Dec 19, 2025
0346a3d
Upgraded to Uno 6.4
d2dyno1 Dec 19, 2025
8fcdb8c
Added link to Terms of Service
d2dyno1 Dec 20, 2025
aef68a8
Refactor onboarding slide to FeatureSlide control
d2dyno1 Dec 20, 2025
65d9824
Added OnPlatform to Uno
d2dyno1 Dec 20, 2025
16c5d83
Added Upload status operation
d2dyno1 Dec 25, 2025
5517d9f
Improved PerformOperationAsync
d2dyno1 Dec 25, 2025
637b51a
Use a segmented control in view options sheet
d2dyno1 Dec 25, 2025
fa26c7d
Improved popups
d2dyno1 Dec 25, 2025
f455c70
Minor improvements to popups
d2dyno1 Dec 25, 2025
509da41
Added popup shadow
d2dyno1 Dec 26, 2025
383d51c
Added cancellation when connecting to account
d2dyno1 Dec 26, 2025
d9958ca
ActivityIndicator for initializing LoginViewModel
d2dyno1 Dec 26, 2025
1a5efe7
Small UX fix
d2dyno1 Dec 26, 2025
566a41e
Added AccountBarControl to vault OverviewPage
d2dyno1 Dec 27, 2025
863e28e
Update FtpAccountViewModel.cs
d2dyno1 Dec 27, 2025
640ab95
Small stability fixes
d2dyno1 Dec 27, 2025
83f72e5
Update VaultLoginViewModel.cs
d2dyno1 Dec 27, 2025
70ceb10
Fixed build
d2dyno1 Dec 27, 2025
c95ed58
Minor changes
d2dyno1 Dec 30, 2025
f586cdd
Improved date formatting
d2dyno1 Jan 1, 2026
c4d2c48
Added the option to import and export settings
d2dyno1 Jan 1, 2026
496325f
Use FixedTimeEquals instead of SequenceEqual
d2dyno1 Jan 1, 2026
93ab9df
Begin work on memory hardening
d2dyno1 Jan 2, 2026
34fe6c9
Use new IKey interfaces
d2dyno1 Jan 2, 2026
511203f
Use andomNumberGenerator.Fill instead
d2dyno1 Jan 2, 2026
628a080
More work on UseKey security
d2dyno1 Jan 2, 2026
20bce38
Fixed build on Windows
d2dyno1 Jan 2, 2026
099b3cc
Prefer more IKeyUsage instead of IKeyBytes
d2dyno1 Jan 3, 2026
84d42db
Fixed vault name editing box visibility
d2dyno1 Jan 3, 2026
08447eb
Update SettingsPage.xaml
d2dyno1 Jan 3, 2026
558ee41
Update some deps
d2dyno1 Jan 3, 2026
3e29fad
Test fix for WebDav on MacOS
d2dyno1 Jan 7, 2026
8a0c779
Update EncryptingDiskStoreFile.cs
d2dyno1 Jan 7, 2026
f76146d
Update nwebdav
d2dyno1 Jan 7, 2026
41173b9
Added MulticastProgress
d2dyno1 Jan 7, 2026
46bfdfd
Added a limit to MulticastProgress
d2dyno1 Jan 7, 2026
f098146
Removed empty chars
d2dyno1 Jan 7, 2026
cdc14db
Update EncryptingDiskStoreFile.cs
d2dyno1 Jan 8, 2026
c2c1e26
Update nwebdav
d2dyno1 Jan 8, 2026
a1460e1
Inherit from IDavStorable
d2dyno1 Jan 8, 2026
2190cfb
Use actual GetItemsAsync
d2dyno1 Jan 8, 2026
7cc9af1
More reimplementing
d2dyno1 Jan 8, 2026
96be570
Reimplement DeleteAsync_Dav
d2dyno1 Jan 8, 2026
ea7c4eb
Reimplemented Create..Async methods
d2dyno1 Jan 8, 2026
5814be8
Removed IStoreItem, IStoreCollection, IStoreFile
d2dyno1 Jan 8, 2026
aae9f3b
Update EncryptingDiskStoreFile.cs
d2dyno1 Jan 8, 2026
5f19149
Update nwebdav
d2dyno1 Jan 8, 2026
7218dc9
Added BackedDav storage
d2dyno1 Jan 9, 2026
bd87a51
Minor cleanup
d2dyno1 Jan 9, 2026
9f3185c
Update nwebdav
d2dyno1 Jan 9, 2026
1b022e5
Test shortcut files on Windows
d2dyno1 Jan 9, 2026
026a52f
Cleaned up code
d2dyno1 Jan 9, 2026
156eb53
Update csproj
d2dyno1 Jan 9, 2026
7957d97
Test code
d2dyno1 Jan 9, 2026
fab8fe0
Begin work on separate window
d2dyno1 Jan 9, 2026
899d3a7
More work on vault preview
d2dyno1 Jan 10, 2026
558518e
Fixed some small activation issues
d2dyno1 Jan 10, 2026
d8d424c
Update VaultViewModel.cs
d2dyno1 Jan 10, 2026
842304b
Update App.xaml.cs
d2dyno1 Jan 10, 2026
cd3bea7
Update SkiaApplicationService.cs
d2dyno1 Jan 10, 2026
61ac8ee
Extend titlebar on MacOS
d2dyno1 Jan 10, 2026
cb2905b
Added widget reorder button
d2dyno1 Jan 10, 2026
9d70587
Some improvements
d2dyno1 Jan 10, 2026
bc03449
Update VaultDashboardPage.xaml
d2dyno1 Jan 11, 2026
d31bb10
Added a banner to privacy settings page
d2dyno1 Jan 11, 2026
652615d
Removed unused settings
d2dyno1 Jan 12, 2026
762a6ea
Added more scan options to health page
d2dyno1 Jan 12, 2026
e6c776c
Update VaultHealthViewModel.Scanning.cs
d2dyno1 Jan 12, 2026
a5687a0
Begin work on file content validator
d2dyno1 Jan 12, 2026
04d45fc
Implemented YubiKey PIV authentication
d2dyno1 Jan 12, 2026
88a5aa6
Update WindowsVaultCredentialsService.cs
d2dyno1 Jan 12, 2026
182e6fd
Fixed YubiKey blinking animation
d2dyno1 Jan 13, 2026
b7d5431
Fixed shield assets on Uno desktop
d2dyno1 Jan 13, 2026
d595201
Update SeverityHealthIconConverter.cs
d2dyno1 Jan 13, 2026
53ec64b
Added DebugPhoneLinkPage
d2dyno1 Jan 13, 2026
4c7e7dc
Draft DeviceLinkService
d2dyno1 Jan 16, 2026
739aeea
Fixed MainPage toolbar options
d2dyno1 Jan 16, 2026
12e5ff0
Device Link checkpoint
d2dyno1 Jan 24, 2026
6ac454e
Added MacOsIconHelper
d2dyno1 Jan 24, 2026
605dddf
Update MacOsIconHelper.cs
d2dyno1 Jan 24, 2026
ffcedcd
Quality control
d2dyno1 Jan 24, 2026
c699e95
Set AssemblyName to SecureFolderFS
d2dyno1 Jan 24, 2026
0c4b51e
Update UnoThemeHelper.cs
d2dyno1 Jan 29, 2026
42f765d
Persist widget order
d2dyno1 Jan 30, 2026
4a39981
Improvements to data corruption health checks
d2dyno1 Feb 1, 2026
77849d3
Fixed build
d2dyno1 Feb 1, 2026
50bd4c1
Begin work on Device Link Enrollment
d2dyno1 Feb 6, 2026
5ebb07a
Update SkiaVaultCredentialsService.cs
d2dyno1 Feb 6, 2026
1012039
Update WindowsVaultCredentialsService.cs
d2dyno1 Feb 6, 2026
589a322
More work on DeviceLink
d2dyno1 Feb 7, 2026
b000bad
Added prompt before sending DeviceLink credentials
d2dyno1 Feb 8, 2026
c28516b
Clean up some code
d2dyno1 Feb 8, 2026
0a7d122
Minor cleanup
d2dyno1 Feb 8, 2026
d664bbe
Performance and reliability improvements
d2dyno1 Feb 8, 2026
bef492a
Fixed initialization issue
d2dyno1 Feb 9, 2026
0ba249f
MAUI quality control
d2dyno1 Feb 10, 2026
3cbf104
Added Face ID Lottie animation
d2dyno1 Feb 11, 2026
4ffa3d4
Implemented in-memory thumbnail cache
d2dyno1 Feb 11, 2026
591127b
Slightly improved reading performance of GDrive
d2dyno1 Feb 11, 2026
fe4ed2c
Update Uno version
d2dyno1 Feb 11, 2026
22a67d5
Upgraded packages
d2dyno1 Feb 12, 2026
6067267
Added desktop type for DeviceLink image inference
d2dyno1 Feb 12, 2026
dc14b48
Update DeviceLinkViewModel.cs
d2dyno1 Feb 12, 2026
f9506c0
Handle network changes in DeviceLink
d2dyno1 Feb 13, 2026
c663411
Added reply protection to SecureChannelModel
d2dyno1 Feb 13, 2026
d4bea4f
Rename from PhoneLink to DeviceLink
d2dyno1 Feb 13, 2026
da13cb7
Added IFolderWatcher to recycle bin overlay
d2dyno1 Feb 13, 2026
ee48e38
Update SystemFolderEx.cs
d2dyno1 Feb 13, 2026
c5696ec
Update SecureFolderFS.SourceGenerator.csproj
d2dyno1 Feb 13, 2026
678bd56
Minor reliability fixes
d2dyno1 Feb 13, 2026
d97ee57
More recycle bin view changes
d2dyno1 Feb 13, 2026
739e22d
More UI improvements
d2dyno1 Feb 13, 2026
995528e
Use actual device icon in DeviceLink login view
d2dyno1 Feb 14, 2026
05c1127
Removed unused code
d2dyno1 Feb 14, 2026
dd783fc
Move SourceGenerator project to net10.0
d2dyno1 Feb 14, 2026
83d1aa6
Slight UI improvements to DeviceLink page
d2dyno1 Feb 14, 2026
201b530
Implemented drag and drop for items within folder structure
d2dyno1 Feb 14, 2026
e0ed7b4
Implemented drop from iOS Files app
d2dyno1 Feb 14, 2026
9930714
Added description to DeviceLink
d2dyno1 Feb 14, 2026
0415018
Added sharing options on iOS
d2dyno1 Feb 14, 2026
84a96d1
Support dropping items from iOS Gallery app
d2dyno1 Feb 15, 2026
e114236
Use DesktopName instead of MachineName
d2dyno1 Feb 15, 2026
bc94fc7
Fixed missing extension from Files app
d2dyno1 Feb 15, 2026
d6a96ca
Fix order of checks for iOS drag and drop
d2dyno1 Feb 15, 2026
f07c76b
Fixed PDF viewing on iOS
d2dyno1 Feb 15, 2026
9149c34
Fixed file preview title not updating when changing slides
d2dyno1 Feb 15, 2026
93b5a23
Initialize DeviceLink in the background
d2dyno1 Feb 16, 2026
c47bf46
Update NSec.Cryptography
d2dyno1 Feb 16, 2026
a5d0071
Fixed MAUI navigation tracking
d2dyno1 Feb 16, 2026
d8d3f3f
Removed unused code
d2dyno1 Feb 16, 2026
d26ae40
Use a Data Model for recycle bin config
d2dyno1 Feb 16, 2026
88b6027
Use WinUI.TableView in RecycleBinDialog
d2dyno1 Feb 16, 2026
d955650
Added a size column to RecycleBinDialog
d2dyno1 Feb 16, 2026
036b8e9
Fixed an issue where 2fa cfg files would be deleted if modifying the …
d2dyno1 Feb 17, 2026
792f398
Fixed build on Windows
d2dyno1 Feb 17, 2026
7f99d4c
Begin work on file system installation
d2dyno1 Feb 17, 2026
9d8c7c9
Added Dokany and WinFsp installations
d2dyno1 Feb 17, 2026
8473777
Moved file system installations to Windows folder
d2dyno1 Feb 18, 2026
6d65a0e
Save file system choice
d2dyno1 Feb 18, 2026
5bcbaf9
Added a Refresh button to RecycleBinDialog
d2dyno1 Feb 18, 2026
05a9c0e
Updated MainWizardPage styles
d2dyno1 Feb 18, 2026
f3bb8f5
Save last selected vault
d2dyno1 Feb 19, 2026
13bc208
Implemented IMoveRenamedFrom on CryptoFolder
d2dyno1 Feb 19, 2026
8d80cd6
Improved CryptoFolder reliability
d2dyno1 Feb 19, 2026
276388f
Corrected move and copy extensions for folders
d2dyno1 Feb 19, 2026
10e4881
Update nwebdav
d2dyno1 Feb 19, 2026
a3f2c90
Fixed Windows build
d2dyno1 Feb 19, 2026
0a3f1ff
Added common keyboard shortcuts support
d2dyno1 Feb 20, 2026
f90b307
Set focus to the password box when on login page
d2dyno1 Feb 20, 2026
4ea26e8
Update MainWindowRootControl.xaml.cs
d2dyno1 Feb 20, 2026
4806fde
Added BETA label to recycle bin button
d2dyno1 Feb 20, 2026
48e836b
Update VaultPropertiesPage.xaml
d2dyno1 Feb 20, 2026
457333c
Lock all vaults before quitting
d2dyno1 Feb 20, 2026
e0e41a4
Fixed view model namespaces on MAUI
d2dyno1 Feb 20, 2026
d49b668
Use AllowConcurrentExecutions in some places
d2dyno1 Feb 20, 2026
706ff70
Fixed FileIconConverter on MAUI
d2dyno1 Feb 20, 2026
871ac0f
Try fix CollectionView layout
d2dyno1 Feb 20, 2026
990678a
Fix initial file browser layout on MAUI
d2dyno1 Feb 20, 2026
725c0fc
Improved browser item selection UI
d2dyno1 Feb 20, 2026
6d7771d
Improved the design of MAUI's BreadcrumbBar
d2dyno1 Feb 20, 2026
624441d
Improved the design of RecycleBinModalPage
d2dyno1 Feb 20, 2026
82af8ff
Improved deletion UX on MAUI
d2dyno1 Feb 20, 2026
f18af61
Determine app language on first startup
d2dyno1 Feb 20, 2026
9064085
Implemented SystemService on MacOS
d2dyno1 Feb 21, 2026
b39b18b
Update VaultHealthViewModel.cs
d2dyno1 Feb 21, 2026
db92f45
Added swipe to dismiss on TransferControl
d2dyno1 Feb 21, 2026
ef1e5a6
Added AnimatedRevealLayout
d2dyno1 Feb 21, 2026
e1ff92b
Small BrowserControl improvements
d2dyno1 Feb 21, 2026
9bdefb6
Begin working on selection rectangle
d2dyno1 Feb 22, 2026
8cd587a
Unselect when rectangle is no longer over
d2dyno1 Feb 22, 2026
926158d
Minor fixes
d2dyno1 Feb 22, 2026
a3dfe79
Removed OnDemandDisposableStream
d2dyno1 Feb 22, 2026
b2b1edd
Improved PropertiesPopup design
d2dyno1 Feb 22, 2026
a8039ac
Redesigned vault wizard pages on MAUI
d2dyno1 Feb 22, 2026
983d123
Improved UI of Login, Settings, and DeviceLink views
d2dyno1 Feb 22, 2026
9d006c2
Improved vault list design on MAUI
d2dyno1 Feb 23, 2026
fefb3ac
Added text for selected items amount in BrowserPage
d2dyno1 Feb 25, 2026
ed15c5e
Removed stray spaces
d2dyno1 Feb 25, 2026
82dcfe0
Fixed Android build
d2dyno1 Feb 25, 2026
ab6ab7f
Improved video thumbnail loading perf on iOS
d2dyno1 Feb 26, 2026
d3986ae
Improved BaseModalPage iOS performance
d2dyno1 Feb 26, 2026
1227134
Some improvements to thumbnail loading
d2dyno1 Feb 26, 2026
7624c34
Don't use DeferredInitialization
d2dyno1 Feb 26, 2026
10e0c0c
Added swipe to dismiss to GalleryView
d2dyno1 Feb 26, 2026
04bef4c
Added PDF file icon
d2dyno1 Feb 26, 2026
032721b
Changed file and folder assets on Android
d2dyno1 Feb 27, 2026
271af82
Test for ML-KEM security for DeviceLink exchange
d2dyno1 Feb 27, 2026
a0d9978
Added basic widget management
d2dyno1 Feb 27, 2026
d1f8472
Implemented Dropbox cloud storage
d2dyno1 Mar 1, 2026
e902a5f
Improved Dropbox storage implementation
d2dyno1 Mar 1, 2026
ae595b6
Migrated to use new storage properties infrastructure
d2dyno1 Mar 1, 2026
fd0568c
Initial work on MAUI WebDav Client
d2dyno1 Mar 2, 2026
38fb07c
Fixed Android build
d2dyno1 Mar 3, 2026
a276122
Fixed IntroductionPage gradient on Android
d2dyno1 Mar 3, 2026
b455388
Fixed MaskedImage on Android
d2dyno1 Mar 3, 2026
86745c7
Added browser item drag threshold on Android
d2dyno1 Mar 3, 2026
32744f9
Fixed Browser selection on Android
d2dyno1 Mar 3, 2026
36aca1e
Apply Android insets on System's Navigation Bar
d2dyno1 Mar 3, 2026
513e454
Adjusted iOS
d2dyno1 Mar 3, 2026
aab5e7d
Fixed trimming on Android
d2dyno1 Mar 4, 2026
00772b6
More trimming fixes
d2dyno1 Mar 5, 2026
e8582b4
Fixed streaming issues and gallery panning
d2dyno1 Mar 5, 2026
9b1b4f2
Begin work on archive extraction on MAUI
d2dyno1 Mar 5, 2026
82ea9a0
Implemented zip extraction in MAUI
d2dyno1 Mar 5, 2026
4c948b5
[Core] Fixed parallelism by removing StreamsManager
d2dyno1 Mar 5, 2026
2fbab23
Fixed build
d2dyno1 Mar 5, 2026
626749e
Minor Android thumbnails perf improvements
d2dyno1 Mar 6, 2026
7f7d097
Fixed name collision when copying/moving/importing
d2dyno1 Mar 6, 2026
9355f2f
Some fixes to WebDav Client code
d2dyno1 Mar 6, 2026
d0be953
Some fixes to PlaintextStream reading and WebDav
d2dyno1 Mar 7, 2026
08cec99
Added basic error reporting to account login page
d2dyno1 Mar 7, 2026
ef66761
Added PQC preparation code for Vault V4
d2dyno1 Mar 7, 2026
9d4dcd1
Added macOS TouchID
d2dyno1 Mar 8, 2026
d9e91ad
Fixed WebDav Read and Write streams
d2dyno1 Mar 8, 2026
e6e0c72
Update DavClientWriteStream.cs
d2dyno1 Mar 8, 2026
cd89c46
Added theme tracking for PickerMappers
d2dyno1 Mar 8, 2026
5d601e4
Fixed opening in Files app on Android
d2dyno1 Mar 9, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
57 changes: 57 additions & 0 deletions SecureFolderFS.sln
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,12 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SecureFolderFS.Core.WinFsp"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SecureFolderFS.Cli", "src\Platforms\SecureFolderFS.Cli\SecureFolderFS.Cli.csproj", "{A9219707-C494-4D3B-8123-43652707B516}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SecureFolderFS.Sdk.DeviceLink", "src\Sdk\SecureFolderFS.Sdk.DeviceLink\SecureFolderFS.Sdk.DeviceLink.csproj", "{85FE77EA-9F89-4F42-BD79-26C82F847DDC}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SecureFolderFS.Sdk.Dropbox", "src\Sdk\SecureFolderFS.Sdk.Dropbox\SecureFolderFS.Sdk.Dropbox.csproj", "{FD52B782-4E07-41B2-8EA9-DE2347DEB9E2}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SecureFolderFS.Sdk.WebDavClient", "src\Sdk\SecureFolderFS.Sdk.WebDavClient\SecureFolderFS.Sdk.WebDavClient.csproj", "{E9D21865-C31B-49AD-B9CE-A8A9491789D5}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Expand Down Expand Up @@ -504,6 +510,54 @@ Global
{A9219707-C494-4D3B-8123-43652707B516}.Release|x64.Build.0 = Release|Any CPU
{A9219707-C494-4D3B-8123-43652707B516}.Release|x86.ActiveCfg = Release|Any CPU
{A9219707-C494-4D3B-8123-43652707B516}.Release|x86.Build.0 = Release|Any CPU
{85FE77EA-9F89-4F42-BD79-26C82F847DDC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{85FE77EA-9F89-4F42-BD79-26C82F847DDC}.Debug|Any CPU.Build.0 = Debug|Any CPU
{85FE77EA-9F89-4F42-BD79-26C82F847DDC}.Debug|arm64.ActiveCfg = Debug|Any CPU
{85FE77EA-9F89-4F42-BD79-26C82F847DDC}.Debug|arm64.Build.0 = Debug|Any CPU
{85FE77EA-9F89-4F42-BD79-26C82F847DDC}.Debug|x64.ActiveCfg = Debug|Any CPU
{85FE77EA-9F89-4F42-BD79-26C82F847DDC}.Debug|x64.Build.0 = Debug|Any CPU
{85FE77EA-9F89-4F42-BD79-26C82F847DDC}.Debug|x86.ActiveCfg = Debug|Any CPU
{85FE77EA-9F89-4F42-BD79-26C82F847DDC}.Debug|x86.Build.0 = Debug|Any CPU
{85FE77EA-9F89-4F42-BD79-26C82F847DDC}.Release|Any CPU.ActiveCfg = Release|Any CPU
{85FE77EA-9F89-4F42-BD79-26C82F847DDC}.Release|Any CPU.Build.0 = Release|Any CPU
{85FE77EA-9F89-4F42-BD79-26C82F847DDC}.Release|arm64.ActiveCfg = Release|Any CPU
{85FE77EA-9F89-4F42-BD79-26C82F847DDC}.Release|arm64.Build.0 = Release|Any CPU
{85FE77EA-9F89-4F42-BD79-26C82F847DDC}.Release|x64.ActiveCfg = Release|Any CPU
{85FE77EA-9F89-4F42-BD79-26C82F847DDC}.Release|x64.Build.0 = Release|Any CPU
{85FE77EA-9F89-4F42-BD79-26C82F847DDC}.Release|x86.ActiveCfg = Release|Any CPU
{85FE77EA-9F89-4F42-BD79-26C82F847DDC}.Release|x86.Build.0 = Release|Any CPU
{FD52B782-4E07-41B2-8EA9-DE2347DEB9E2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{FD52B782-4E07-41B2-8EA9-DE2347DEB9E2}.Debug|Any CPU.Build.0 = Debug|Any CPU
{FD52B782-4E07-41B2-8EA9-DE2347DEB9E2}.Debug|arm64.ActiveCfg = Debug|Any CPU
{FD52B782-4E07-41B2-8EA9-DE2347DEB9E2}.Debug|arm64.Build.0 = Debug|Any CPU
{FD52B782-4E07-41B2-8EA9-DE2347DEB9E2}.Debug|x64.ActiveCfg = Debug|Any CPU
{FD52B782-4E07-41B2-8EA9-DE2347DEB9E2}.Debug|x64.Build.0 = Debug|Any CPU
{FD52B782-4E07-41B2-8EA9-DE2347DEB9E2}.Debug|x86.ActiveCfg = Debug|Any CPU
{FD52B782-4E07-41B2-8EA9-DE2347DEB9E2}.Debug|x86.Build.0 = Debug|Any CPU
{FD52B782-4E07-41B2-8EA9-DE2347DEB9E2}.Release|Any CPU.ActiveCfg = Release|Any CPU
{FD52B782-4E07-41B2-8EA9-DE2347DEB9E2}.Release|Any CPU.Build.0 = Release|Any CPU
{FD52B782-4E07-41B2-8EA9-DE2347DEB9E2}.Release|arm64.ActiveCfg = Release|Any CPU
{FD52B782-4E07-41B2-8EA9-DE2347DEB9E2}.Release|arm64.Build.0 = Release|Any CPU
{FD52B782-4E07-41B2-8EA9-DE2347DEB9E2}.Release|x64.ActiveCfg = Release|Any CPU
{FD52B782-4E07-41B2-8EA9-DE2347DEB9E2}.Release|x64.Build.0 = Release|Any CPU
{FD52B782-4E07-41B2-8EA9-DE2347DEB9E2}.Release|x86.ActiveCfg = Release|Any CPU
{FD52B782-4E07-41B2-8EA9-DE2347DEB9E2}.Release|x86.Build.0 = Release|Any CPU
{E9D21865-C31B-49AD-B9CE-A8A9491789D5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E9D21865-C31B-49AD-B9CE-A8A9491789D5}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E9D21865-C31B-49AD-B9CE-A8A9491789D5}.Debug|arm64.ActiveCfg = Debug|Any CPU
{E9D21865-C31B-49AD-B9CE-A8A9491789D5}.Debug|arm64.Build.0 = Debug|Any CPU
{E9D21865-C31B-49AD-B9CE-A8A9491789D5}.Debug|x64.ActiveCfg = Debug|Any CPU
{E9D21865-C31B-49AD-B9CE-A8A9491789D5}.Debug|x64.Build.0 = Debug|Any CPU
{E9D21865-C31B-49AD-B9CE-A8A9491789D5}.Debug|x86.ActiveCfg = Debug|Any CPU
{E9D21865-C31B-49AD-B9CE-A8A9491789D5}.Debug|x86.Build.0 = Debug|Any CPU
{E9D21865-C31B-49AD-B9CE-A8A9491789D5}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E9D21865-C31B-49AD-B9CE-A8A9491789D5}.Release|Any CPU.Build.0 = Release|Any CPU
{E9D21865-C31B-49AD-B9CE-A8A9491789D5}.Release|arm64.ActiveCfg = Release|Any CPU
{E9D21865-C31B-49AD-B9CE-A8A9491789D5}.Release|arm64.Build.0 = Release|Any CPU
{E9D21865-C31B-49AD-B9CE-A8A9491789D5}.Release|x64.ActiveCfg = Release|Any CPU
{E9D21865-C31B-49AD-B9CE-A8A9491789D5}.Release|x64.Build.0 = Release|Any CPU
{E9D21865-C31B-49AD-B9CE-A8A9491789D5}.Release|x86.ActiveCfg = Release|Any CPU
{E9D21865-C31B-49AD-B9CE-A8A9491789D5}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
Expand Down Expand Up @@ -539,6 +593,9 @@ Global
{79C128B4-DD9D-4BAC-AA81-9BFAD02ECDD3} = {086CDAC6-2730-4F09-BA28-B41F737E6C4D}
{F56308B3-01B8-489B-ABE2-69F35FC5A7DE} = {F2ACE2B7-1599-4769-8FF4-41FA03B25D26}
{A9219707-C494-4D3B-8123-43652707B516} = {66BC1E2B-D99A-49E2-8B8F-EF7851493CB0}
{85FE77EA-9F89-4F42-BD79-26C82F847DDC} = {086CDAC6-2730-4F09-BA28-B41F737E6C4D}
{FD52B782-4E07-41B2-8EA9-DE2347DEB9E2} = {086CDAC6-2730-4F09-BA28-B41F737E6C4D}
{E9D21865-C31B-49AD-B9CE-A8A9491789D5} = {086CDAC6-2730-4F09-BA28-B41F737E6C4D}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {A1906FD8-BB54-4688-BC0F-9ED7532D2CB0}
Expand Down
2 changes: 1 addition & 1 deletion global.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"msbuild-sdks": {
"Uno.Sdk": "6.0.96"
"Uno.Sdk": "6.5.31"
}
}
2 changes: 1 addition & 1 deletion lib/nwebdav
Submodule nwebdav updated 54 files
+3 −3 NWebDav.Server/Dispatching/WebDavDispatcher.cs
+0 −28 NWebDav.Server/Extensions/DavStorageExtensions.Folder.cs
+0 −24 NWebDav.Server/Extensions/StoreExtensions.cs
+20 −24 NWebDav.Server/Handlers/CopyHandler.cs
+24 −12 NWebDav.Server/Handlers/DeleteHandler.cs
+13 −13 NWebDav.Server/Handlers/GetAndHeadHandler.cs
+7 −7 NWebDav.Server/Handlers/LockHandler.cs
+15 −8 NWebDav.Server/Handlers/MkcolHandler.cs
+45 −18 NWebDav.Server/Handlers/MoveHandler.cs
+5 −5 NWebDav.Server/Handlers/OptionsHandler.cs
+17 −17 NWebDav.Server/Handlers/PropFindHandler.cs
+4 −6 NWebDav.Server/Handlers/PropPatchHandler.cs
+68 −23 NWebDav.Server/Handlers/PutHandler.cs
+4 −6 NWebDav.Server/Handlers/UnlockHandler.cs
+4 −6 NWebDav.Server/IRequestHandler.cs
+14 −14 NWebDav.Server/Locking/BaseLockingManager.cs
+8 −8 NWebDav.Server/Locking/ILockingManager.cs
+10 −10 NWebDav.Server/Locking/InMemoryLockingManager.cs
+1 −1 NWebDav.Server/NWebDav.Server.csproj
+12 −12 NWebDav.Server/Props/DavExtCollectionProperties.cs
+2 −2 NWebDav.Server/Props/DavProperty.cs
+11 −11 NWebDav.Server/Props/DavTypedProperties.cs
+5 −5 NWebDav.Server/Props/DefaultLockingProperties.cs
+3 −3 NWebDav.Server/Props/IPropertyManager.cs
+6 −6 NWebDav.Server/Props/OverridePropertyManager.cs
+5 −5 NWebDav.Server/Props/PropertyManager.cs
+3 −3 NWebDav.Server/Props/QuotaProperties.cs
+12 −12 NWebDav.Server/Props/StandardProperties.cs
+5 −5 NWebDav.Server/Props/Win32Properties.cs
+201 −0 NWebDav.Server/Storage/BackedDavFile.cs
+512 −0 NWebDav.Server/Storage/BackedDavFolder.cs
+144 −0 NWebDav.Server/Storage/BackedDavStore.cs
+0 −21 NWebDav.Server/Storage/DavFile.cs
+0 −111 NWebDav.Server/Storage/DavFolder.cs
+0 −52 NWebDav.Server/Storage/DavStorable.cs
+2 −1 NWebDav.Server/Storage/IDavFile.cs
+6 −2 NWebDav.Server/Storage/IDavFolder.cs
+8 −1 NWebDav.Server/Storage/IDavStorable.cs
+14 −0 NWebDav.Server/Storage/IStore.cs
+98 −0 NWebDav.Server/Storage/LengthLimitedStream.cs
+5 −7 NWebDav.Server/Storage/RootDiskStore.cs
+0 −9 NWebDav.Server/Storage/StorageProperties/DavPropertyIdentifier.cs
+0 −73 NWebDav.Server/Storage/StorageProperties/DavStorageProperties.cs
+0 −31 NWebDav.Server/Storage/StorageProperties/DavStorageProperty.cs
+0 −61 NWebDav.Server/Storage/StorageProperties/IDavProperties.cs
+0 −17 NWebDav.Server/Storage/StorageProperties/IDavProperty.cs
+0 −70 NWebDav.Server/Stores/DiskStore.cs
+0 −462 NWebDav.Server/Stores/DiskStoreCollection.cs
+0 −238 NWebDav.Server/Stores/DiskStoreFile.cs
+0 −13 NWebDav.Server/Stores/IStore.cs
+0 −34 NWebDav.Server/Stores/IStoreCollection.cs
+0 −15 NWebDav.Server/Stores/IStoreFile.cs
+0 −20 NWebDav.Server/Stores/IStoreItem.cs
+0 −7 NWebDav.Server/Stores/StoreResult.cs
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@ public static AesSiv128 CreateInstance(ReadOnlySpan<byte> dekKey, ReadOnlySpan<b
macKey.CopyTo(longKeySpan.Slice(dekKey.Length));

var aesCmacSiv = Aead.CreateAesCmacSiv(longKey);

return new AesSiv128(aesCmacSiv);
}

Expand Down
5 changes: 2 additions & 3 deletions src/Core/SecureFolderFS.Core.Cryptography/Cipher/Argon2id.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,9 @@

namespace SecureFolderFS.Core.Cryptography.Cipher
{
/// TODO: Needs docs
public static class Argon2id
{
public static void Old_DeriveKey(ReadOnlySpan<byte> password, ReadOnlySpan<byte> salt, Span<byte> result)
public static void V2_DeriveKey(ReadOnlySpan<byte> password, ReadOnlySpan<byte> salt, Span<byte> result)
{
using var argon2id = new Konscious.Security.Cryptography.Argon2id(password.ToArray());
argon2id.Salt = salt.ToArray();
Expand All @@ -16,7 +15,7 @@ public static void Old_DeriveKey(ReadOnlySpan<byte> password, ReadOnlySpan<byte>
argon2id.GetBytes(Constants.KeyTraits.ARGON2_KEK_LENGTH).CopyTo(result);
}

public static void V3_DeriveKey(ReadOnlySpan<byte> password, ReadOnlySpan<byte> salt, Span<byte> result)
public static void DeriveKey(ReadOnlySpan<byte> password, ReadOnlySpan<byte> salt, Span<byte> result)
{
using var argon2id = new Konscious.Security.Cryptography.Argon2id(password.ToArray());
argon2id.Salt = salt.ToArray();
Expand Down
7 changes: 5 additions & 2 deletions src/Core/SecureFolderFS.Core.Cryptography/Constants.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,11 @@ public static class KeyTraits
public const int DEK_KEY_LENGTH = 32;
public const int MAC_KEY_LENGTH = 32;
public const int ARGON2_KEK_LENGTH = 32;
public const int CHALLENGE_KEY_PART_LENGTH = 128;
public const int ECIES_SHA256_AESGCM_STDX963_KEY_LENGTH = 32;
public const int CHALLENGE_KEY_PART_LENGTH_32 = 32;
public const int CHALLENGE_KEY_PART_LENGTH_64 = 64;
public const int CHALLENGE_KEY_PART_LENGTH_128 = 128;
public const int ECIES_SHA256_AESGCM_STDX963_KEY_LENGTH = CHALLENGE_KEY_PART_LENGTH_32;
public const int HMAC_SHA1_HASH_LENGTH = 20;
}

public static class CipherId
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
using System;
using System.Runtime.CompilerServices;
using System.Security.Cryptography;
using SecureFolderFS.Shared.ComponentModel;
using static SecureFolderFS.Core.Cryptography.Constants.Crypto.Chunks.AesCtrHmac;
using static SecureFolderFS.Core.Cryptography.Extensions.ContentCryptExtensions.AesCtrHmacContentExtensions;
using static SecureFolderFS.Core.Cryptography.Extensions.HeaderCryptExtensions.AesCtrHmacHeaderExtensions;
Expand All @@ -12,7 +13,7 @@ namespace SecureFolderFS.Core.Cryptography.ContentCrypt
/// <inheritdoc cref="IContentCrypt"/>
internal sealed class AesCtrHmacContentCrypt : BaseContentCrypt
{
private readonly SecretKey _macKey;
private readonly IKeyUsage _macKey;

/// <inheritdoc/>
public override int ChunkPlaintextSize { get; } = CHUNK_PLAINTEXT_SIZE;
Expand All @@ -23,16 +24,17 @@ internal sealed class AesCtrHmacContentCrypt : BaseContentCrypt
/// <inheritdoc/>
public override int ChunkFirstReservedSize { get; } = CHUNK_NONCE_SIZE;

public AesCtrHmacContentCrypt(SecretKey macKey)
public AesCtrHmacContentCrypt(IKeyUsage macKey)
{
_macKey = macKey;
}

/// <inheritdoc/>
public override void EncryptChunk(ReadOnlySpan<byte> plaintextChunk, long chunkNumber, ReadOnlySpan<byte> header, Span<byte> ciphertextChunk)
[SkipLocalsInit]
public override unsafe void EncryptChunk(ReadOnlySpan<byte> plaintextChunk, long chunkNumber, ReadOnlySpan<byte> header, Span<byte> ciphertextChunk)
{
// Chunk nonce
secureRandom.GetBytes(ciphertextChunk.Slice(0, CHUNK_NONCE_SIZE));
RandomNumberGenerator.Fill(ciphertextChunk.Slice(0, CHUNK_NONCE_SIZE));

// Encrypt
AesCtr128.Encrypt(
Expand All @@ -41,34 +43,75 @@ public override void EncryptChunk(ReadOnlySpan<byte> plaintextChunk, long chunkN
ciphertextChunk.Slice(0, CHUNK_NONCE_SIZE),
ciphertextChunk.Slice(CHUNK_NONCE_SIZE, plaintextChunk.Length));

// Calculate MAC
CalculateChunkMac(
header.GetHeaderNonce(),
ciphertextChunk.Slice(0, CHUNK_NONCE_SIZE),
ciphertextChunk.Slice(CHUNK_NONCE_SIZE, plaintextChunk.Length),
chunkNumber,
ciphertextChunk.Slice(CHUNK_NONCE_SIZE + plaintextChunk.Length, CHUNK_MAC_SIZE));
// Calculate MAC using UseKey pattern
fixed (byte* headerPtr = header)
fixed (byte* ciphertextPtr = ciphertextChunk)
{
var state = (
headerPtr: (nint)headerPtr,
headerLen: header.Length,
ctPtr: (nint)ciphertextPtr,
ctLen: ciphertextChunk.Length,
ptLen: plaintextChunk.Length,
chunkNumber
);

_macKey.UseKey(state, static (macKey, s) =>
{
var hdr = new ReadOnlySpan<byte>((byte*)s.headerPtr, s.headerLen);
var ct = new Span<byte>((byte*)s.ctPtr, s.ctLen);

CalculateChunkMacStatic(
macKey,
hdr.GetHeaderNonce(),
ct.Slice(0, CHUNK_NONCE_SIZE),
ct.Slice(CHUNK_NONCE_SIZE, s.ptLen),
s.chunkNumber,
ct.Slice(CHUNK_NONCE_SIZE + s.ptLen, CHUNK_MAC_SIZE));
});
}
}

/// <inheritdoc/>
[SkipLocalsInit]
public override bool DecryptChunk(ReadOnlySpan<byte> ciphertextChunk, long chunkNumber,
ReadOnlySpan<byte> header, Span<byte> plaintextChunk)
public override unsafe bool DecryptChunk(ReadOnlySpan<byte> ciphertextChunk, long chunkNumber, ReadOnlySpan<byte> header, Span<byte> plaintextChunk)
{
// Allocate byte* for MAC
Span<byte> mac = stackalloc byte[CHUNK_MAC_SIZE];

// Calculate MAC
CalculateChunkMac(
header.GetHeaderNonce(),
ciphertextChunk.GetChunkNonce(),
ciphertextChunk.GetChunkPayload(),
chunkNumber,
mac);

// Check MAC
if (!mac.SequenceEqual(ciphertextChunk.GetChunkMac()))
return false;
// Verify MAC using UseKey pattern
fixed (byte* headerPtr = header)
fixed (byte* ciphertextPtr = ciphertextChunk)
{
var state = (
headerPtr: (nint)headerPtr,
headerLen: header.Length,
ctPtr: (nint)ciphertextPtr,
ctLen: ciphertextChunk.Length,
chunkNumber
);

var macValid = _macKey.UseKey(state, static (macKey, s) =>
{
var hdr = new ReadOnlySpan<byte>((byte*)s.headerPtr, s.headerLen);
var ct = new ReadOnlySpan<byte>((byte*)s.ctPtr, s.ctLen);

// Allocate byte* for MAC
Span<byte> mac = stackalloc byte[CHUNK_MAC_SIZE];

// Calculate MAC
CalculateChunkMacStatic(
macKey,
hdr.GetHeaderNonce(),
ct.GetChunkNonce(),
ct.GetChunkPayload(),
s.chunkNumber,
mac);

// Check MAC using constant-time comparison to prevent timing attacks
return CryptographicOperations.FixedTimeEquals(mac, ct.GetChunkMac());
});

if (!macValid)
return false;
}

// Decrypt
AesCtr128.Decrypt(
Expand All @@ -81,7 +124,7 @@ public override bool DecryptChunk(ReadOnlySpan<byte> ciphertextChunk, long chunk
}

[SkipLocalsInit]
private void CalculateChunkMac(ReadOnlySpan<byte> headerNonce, ReadOnlySpan<byte> chunkNonce, ReadOnlySpan<byte> ciphertextPayload, long chunkNumber, Span<byte> chunkMac)
private static void CalculateChunkMacStatic(ReadOnlySpan<byte> macKey, ReadOnlySpan<byte> headerNonce, ReadOnlySpan<byte> chunkNonce, ReadOnlySpan<byte> ciphertextPayload, long chunkNumber, Span<byte> chunkMac)
{
// Convert long to byte array
Span<byte> beChunkNumber = stackalloc byte[sizeof(long)];
Expand All @@ -92,12 +135,12 @@ private void CalculateChunkMac(ReadOnlySpan<byte> headerNonce, ReadOnlySpan<byte
beChunkNumber.Reverse();

// Initialize HMAC
using var hmacSha256 = IncrementalHash.CreateHMAC(HashAlgorithmName.SHA256, _macKey);
using var hmacSha256 = IncrementalHash.CreateHMAC(HashAlgorithmName.SHA256, macKey);

hmacSha256.AppendData(headerNonce); // headerNonce
hmacSha256.AppendData(beChunkNumber); // beChunkNumber
hmacSha256.AppendData(chunkNonce); // chunkNonce
hmacSha256.AppendData(ciphertextPayload); // ciphertextPayload
hmacSha256.AppendData(ciphertextPayload); // ciphertextPayload

hmacSha256.GetCurrentHash(chunkMac);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
using SecureFolderFS.Core.Cryptography.Helpers;
using System;
using System.Runtime.CompilerServices;
using System.Security.Cryptography;
using static SecureFolderFS.Core.Cryptography.Constants.Crypto.Chunks.AesGcm;
using static SecureFolderFS.Core.Cryptography.Constants.Crypto.Headers.AesGcm;
using static SecureFolderFS.Core.Cryptography.Extensions.ContentCryptExtensions.AesGcmContentExtensions;
Expand All @@ -26,11 +27,11 @@ internal sealed class AesGcmContentCrypt : BaseContentCrypt
public override void EncryptChunk(ReadOnlySpan<byte> plaintextChunk, long chunkNumber, ReadOnlySpan<byte> header, Span<byte> ciphertextChunk)
{
// Chunk nonce
secureRandom.GetBytes(ciphertextChunk.Slice(0, CHUNK_NONCE_SIZE));
RandomNumberGenerator.Fill(ciphertextChunk.Slice(0, CHUNK_NONCE_SIZE));

// Big Endian chunk number and file header nonce
Span<byte> associatedData = stackalloc byte[sizeof(long) + HEADER_NONCE_SIZE];
CryptHelpers.FillAssociatedDataBe(associatedData, header.GetHeaderNonce(), chunkNumber);
CryptHelpers.FillAssociatedDataBigEndian(associatedData, header.GetHeaderNonce(), chunkNumber);

// Encrypt
AesGcm128.Encrypt(
Expand All @@ -48,7 +49,7 @@ public override bool DecryptChunk(ReadOnlySpan<byte> ciphertextChunk, long chunk
{
// Big Endian chunk number and file header nonce
Span<byte> associatedData = stackalloc byte[sizeof(long) + HEADER_NONCE_SIZE];
CryptHelpers.FillAssociatedDataBe(associatedData, header.GetHeaderNonce(), chunkNumber);
CryptHelpers.FillAssociatedDataBigEndian(associatedData, header.GetHeaderNonce(), chunkNumber);

// Decrypt
return AesGcm128.TryDecrypt(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,6 @@ namespace SecureFolderFS.Core.Cryptography.ContentCrypt
/// <inheritdoc cref="IContentCrypt"/>
internal abstract class BaseContentCrypt : IContentCrypt
{
protected readonly RandomNumberGenerator secureRandom;

/// <inheritdoc/>
public abstract int ChunkPlaintextSize { get; }

Expand All @@ -17,11 +15,6 @@ internal abstract class BaseContentCrypt : IContentCrypt
/// <inheritdoc/>
public abstract int ChunkFirstReservedSize { get; }

protected BaseContentCrypt()
{
secureRandom = RandomNumberGenerator.Create();
}

/// <inheritdoc/>
public abstract void EncryptChunk(ReadOnlySpan<byte> plaintextChunk, long chunkNumber, ReadOnlySpan<byte> header, Span<byte> ciphertextChunk);

Expand Down Expand Up @@ -61,7 +54,6 @@ public virtual long CalculatePlaintextSize(long ciphertextSize)
/// <inheritdoc/>
public virtual void Dispose()
{
secureRandom.Dispose();
}
}
}
Loading