From 08e9bf748fec386f5f9ad427037375ee54c6ffe0 Mon Sep 17 00:00:00 2001 From: Cody Larkin Date: Fri, 13 Mar 2026 20:53:14 -0400 Subject: [PATCH] Password Hashing setup. Need server setups and decisions made about API to move forward more --- PasswordHasher.cs | 109 +++++++++++ Program.cs | 178 ++++++++++++++---- RelayCore.csproj | 1 + obj/Debug/net9.0/RelayCore.AssemblyInfo.cs | 2 +- .../net9.0/RelayCore.AssemblyInfoInputs.cache | 2 +- obj/Debug/net9.0/RelayCore.assets.cache | Bin 16551 -> 18083 bytes obj/RelayCore.csproj.nuget.dgspec.json | 4 + obj/project.assets.json | 105 +++++++++++ obj/project.nuget.cache | 5 +- obj/project.packagespec.json | 2 +- obj/rider.project.model.nuget.info | 2 +- obj/rider.project.restore.info | 2 +- 12 files changed, 372 insertions(+), 40 deletions(-) create mode 100644 PasswordHasher.cs diff --git a/PasswordHasher.cs b/PasswordHasher.cs new file mode 100644 index 0000000..d8fbae5 --- /dev/null +++ b/PasswordHasher.cs @@ -0,0 +1,109 @@ +using System; +using System.Security.Cryptography; +using System.Text; +using Konscious.Security.Cryptography; + +namespace PasswordHasher +{ + /// + /// Provides secure password hashing functionality using Argon2id algorithm + /// + public class PasswordHasher + { + /// + /// Size of the salt in bytes + /// + private const int SaltSize = 16; + + /// + /// Size of the hash in bytes + /// + private const int HashSize = 32; + + /// + /// Number of threads to use for parallel computation + /// + private const int DegreeOfParallelism = 1; + + /// + /// Number of iterations for the Argon2id algorithm + /// + private const int Iterations = 2; + + /// + /// Memory size in KB to use + /// + private const int MemorySize = 19456; // 19 MB + + /// + /// Generates a secure hash of a password using Argon2id with a random salt + /// + /// The plain text password to hash + /// A Base64 string containing the combined salt and hash + /// Thrown when password is null + public string HashPassword(string password) + { + // Generate a random salt + byte[] salt = new byte[SaltSize]; + using (RandomNumberGenerator rng = RandomNumberGenerator.Create()) + { + rng.GetBytes(salt); + } + + // Create hash + byte[] hash = HashPassword(password, salt); + + // Combine salt and hash + var combinedBytes = new byte[salt.Length + hash.Length]; + Array.Copy(salt, 0, combinedBytes, 0, salt.Length); + Array.Copy(hash, 0, combinedBytes, salt.Length, hash.Length); + + // Convert to base64 for storage + return Convert.ToBase64String(combinedBytes); + } + + /// + /// Generates a password hash using Argon2id with a specific salt + /// + /// The plain text password + /// The salt to use for hashing + /// A byte array containing the password hash + private byte[] HashPassword(string password, byte[] salt) + { + var argon2 = new Argon2id(Encoding.UTF8.GetBytes(password)) + { + Salt = salt, + DegreeOfParallelism = DegreeOfParallelism, + Iterations = Iterations, + MemorySize = MemorySize + }; + return argon2.GetBytes(HashSize); + } + + /// + /// Verifies if a password matches a stored hash + /// + /// The plain text password to verify + /// The stored hash in Base64 format + /// True if the password matches the hash, false otherwise + /// Thrown when password or hashedPassword are null + /// Thrown when hashedPassword is not in valid Base64 format + public bool VerifyPassword(string password, string hashedPassword) + { + // Decode the stored hash + byte[] combinedBytes = Convert.FromBase64String(hashedPassword); + + // Extract salt and hash + byte[] salt = new byte[SaltSize]; + byte[] hash = new byte[HashSize]; + Array.Copy(combinedBytes, 0, salt, 0, SaltSize); + Array.Copy(combinedBytes, SaltSize, hash, 0, HashSize); + + // Compute hash for the input password + byte[] newHash = HashPassword(password, salt); + + // Compare the hashes + return CryptographicOperations.FixedTimeEquals(hash, newHash); + } + } +} \ No newline at end of file diff --git a/Program.cs b/Program.cs index 65fb96a..33ea9c4 100644 --- a/Program.cs +++ b/Program.cs @@ -1,57 +1,60 @@ -using SurrealDb.Net; +using System.ComponentModel.Design; +using SurrealDb.Net; using SurrealDb.Net.Models; using SurrealDb.Net.Models.Auth; using System.Text.Json; - -const string TABLE = "person"; +using PasswordHasher; using var db = new SurrealDbClient("ws://127.0.0.1:8000/rpc"); await db.SignIn(new RootAuth { Username = "root", Password = "secret" }); await db.Use("test", "test"); +var user = new Users +{ + Username = "Keeper317", + Email = "Keeper317@gmail.com", + CreatedAt = DateTime.Now, + UpdatedAt = DateTime.Now, + LastLogin = DateTime.Now, + TwoFactorEnabled = false, + EmailVerified = false, + AccountStatus = (int) AccountStatuses.Active, + OnlineStatus = (int) OnlineStatuses.Online, +}; +var created = await db.Create("users", user); +Console.WriteLine($"Created Person: {ToJsonString(created)}"); +var hasher = new PasswordHasher.PasswordHasher(); +user.Password = hasher.HashPassword(created.Id + "password"); +user.UpdatedAt = DateTime.Now; +user.LastLogin = DateTime.Now; +user.Id = created.Id; + +bool isValid = hasher.VerifyPassword(created.Id + "password", user.Password); +Console.WriteLine($"Password match: {isValid}"); + +var updated = await db.Merge("users", new() { Id = created.Id, Password = user.Password }); -// var person = new Person -// { -// Title = "Founder CEO", -// Name = new() { FirstName = "Tobie", LastName = "Morgan Hitchcock" }, -// Marketing = true -// }; -// var created = await db.Create(TABLE, person); -// Console.WriteLine($"Created Person: {ToJsonString(created)}"); -// // var updated = await db.Merge( -// new() { Id = (TABLE, "3bi2i54plwqfqe8u2qiq"), Marketing = false } +// new() { Id = (TABLE, "8b4nwczy6x8f8zd5sslq"), Marketing = true } // ); -// Console.WriteLine($"Updated Person: {ToJsonString(updated)}"); +Console.WriteLine($"Updated Person: {ToJsonString(updated)}"); // -// var people = await db.Select(TABLE); -// Console.WriteLine($"Select Person: {ToJsonString(people)}"); - -var queryResponse = await db.Query( - $"SELECT Marketing, count() AS Count FROM type::table({TABLE}) GROUP BY Marketing" -); -// await db.Delete(TABLE); - +var people = await db.Select("users"); +Console.WriteLine($"Select Person: {ToJsonString(people)}"); +// +// var queryResponse = await db.Query($"SELECT Marketing, count() AS Count FROM type::table({TABLE}) GROUP BY Marketing"); // var groups = queryResponse.GetValue>(0); -Console.WriteLine($"Get Value as group: {ToJsonString(queryResponse)}"); +// Console.WriteLine($"Get Value as group: {ToJsonString(groups)}"); + +await db.Delete("users"); + static string ToJsonString(object? o) { return JsonSerializer.Serialize(o, new JsonSerializerOptions { WriteIndented = true, }); } -public class Person : Record -{ - public string? Title { get; set; } - public Name? Name { get; set; } - public bool Marketing { get; set; } -} -public class Name -{ - public string? FirstName { get; set; } - public string? LastName { get; set; } -} public class ResponsibilityMerge : Record { public bool Marketing { get; set; } @@ -60,4 +63,111 @@ public class Group { public bool Marketing { get; set; } public int Count { get; set; } +} + +public class Users : Record +{ + public required string Username { get; set; } + public string? Password { get; set; } + public required string Email { get; set; } + public required DateTime CreatedAt { get; set; } + public required DateTime UpdatedAt { get; set; } + public required DateTime LastLogin { get; set; } + public bool TwoFactorEnabled { get; set; } + public bool EmailVerified { get; set; } + public required int AccountStatus { get; set; } + public required int OnlineStatus { get; set; } +} + +public class PasswordHash : Record +{ + public string? Password { get; set; } +} + +public class Sessions : Record +{ + public required string UserId { get; set; } + public required string TokenHash { get; set; } + public required DateTime IssuedAt { get; set; } + public required DateTime ExpiresAt { get; set; } + public DateTime? LastUsedAt { get; set; } + public bool Revoked { get; set; } + public required string DeviceName { get; set; } + public required string IpAddress { get; set; } + public required string UserAgent { get; set; } +} + +public class PasswordReset : Record +{ + public required string UserId { get; set; } + public required string TokenHash { get; set; } + public required DateTime CreatedAt { get; set; } + public required DateTime ExpiresAt { get; set; } + public bool Revoked { get; set; } +} + +public class Licenses : Record +{ + public required string UserId { get; set; } + public required int LicenseType { get; set; } + public required int Status { get; set; } + public required DateTime CreatedAt { get; set; } + public required DateTime StartsAt { get; set; } + public required DateTime UpdatedAt { get; set; } + public required DateTime ExpiresAt { get; set; } + +} + +public class AuthAudits : Record +{ + public required string UserId { get; set; } + public required int EventType { get; set; } + public bool Success { get; set; } + public required string IpAddress { get; set; } + public required string UserAgent { get; set; } + public required string Details { get; set; } + public required DateTime CreatedAt { get; set; } +} +enum AccountStatuses +{ + Active, + Suspended, + Banned, + Deleted +} + +enum OnlineStatuses +{ + Online, + Busy, + DND, + Invisible, + Offline +} + +enum LicenseStatuses +{ + Active, + Expired, + Renewable, + Revoked +} + +enum LicenseType +{ + Free, + Basic, + Advanced, + Pro, + Enterprise +} + +enum LogEvents +{ + LoginSuccess, + LoginFailure, + LogoutSuccess, + LogoutFailure, + PasswordResetSuccess, + PasswordResetFailure, } \ No newline at end of file diff --git a/RelayCore.csproj b/RelayCore.csproj index 9a93daa..fc62708 100644 --- a/RelayCore.csproj +++ b/RelayCore.csproj @@ -9,6 +9,7 @@ + diff --git a/obj/Debug/net9.0/RelayCore.AssemblyInfo.cs b/obj/Debug/net9.0/RelayCore.AssemblyInfo.cs index af8b2b1..8e7d44b 100644 --- a/obj/Debug/net9.0/RelayCore.AssemblyInfo.cs +++ b/obj/Debug/net9.0/RelayCore.AssemblyInfo.cs @@ -13,7 +13,7 @@ using System.Reflection; [assembly: System.Reflection.AssemblyCompanyAttribute("RelayCore")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] -[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+ccbb3e874a5d2b1d5f9bc39960c235c07b5fe29d")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+7682ce0429634f5b008d85c59acf4ed3838121ef")] [assembly: System.Reflection.AssemblyProductAttribute("RelayCore")] [assembly: System.Reflection.AssemblyTitleAttribute("RelayCore")] [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] diff --git a/obj/Debug/net9.0/RelayCore.AssemblyInfoInputs.cache b/obj/Debug/net9.0/RelayCore.AssemblyInfoInputs.cache index dbf795f..56d3ba3 100644 --- a/obj/Debug/net9.0/RelayCore.AssemblyInfoInputs.cache +++ b/obj/Debug/net9.0/RelayCore.AssemblyInfoInputs.cache @@ -1 +1 @@ -4f5764b42df7cbe872550eb268495ab3739cb29ded503ffcfb83b6b63bb3a5ea +86555fdeb5734425e2303585c6b325bb51b77f8679eb62d09e5e490545061734 diff --git a/obj/Debug/net9.0/RelayCore.assets.cache b/obj/Debug/net9.0/RelayCore.assets.cache index 445fb03cf0dca8c2eb5ff700ab751b03d4a0d867..8889c27fb14516862a2eaa6ba898475949769154 100644 GIT binary patch literal 18083 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 delta 1767 zcmZuxT})eL817fb+H%^ihyGAndJ0{U(pD%f2+WSPK*nImwh%Vi4|HSH31yJU5|$-y z=pDv#5y~X}mCIMzffhxQ)c<&Ef@m;f*oIc%e5YzTe^WaMJoEZ@zQB z=Y8Mr=XsxZ?HzW1k%bQ*>`R+;$h=06|F2n z?O63($D^HI=0G}fL-lhO`MI!Y_(ZHKT6JS1x}e5X7oi?JHQvVe5eLg6ZA{>IUkr6d zKU$?JOjQVYXmsGNrwtF9han1XR)-d;9hMdYHkbjkLJtdI!+!@qoBX&|JBLlPfQuCl z9Eo36_iRx14AIPQ+lYVT6Dk^3(1?OYaWm1&%J3xa#YA8bUswg4OE~C6ex!nim0gF# zgc4GCzE)&*Wu0xx>I+JucAAgkYrQ0g**e7z#i3Ji*aImzj1O#r^F;-*DoB#%Y#|h% z2D?xz3gTYHt4s0Pw^Dzi=4>ukU^S)SX$9}bZ2bsD`Z-Z0!;55PnECK!$d`Xsxv9rv z=XgIOH~a9#3l}C&=X%dH4NcBB$C^5uV&$~HpDae!N7h1ifUKWvfb1aIAlXY~ys#ws z@V~hZGY=Kx1Xio6s2H!9EDCOgt?`n1VJ63&`LN-S>iet`A4@4Td#v~_+>HkBhs=p5 z-aM6k^!rzC>!q0wF5@>a=W^pK{Sdx=t_Bb2n@jqq(3Yg8PSp56!shsKlJ`}y zRMs3jLE;9F1F>=cQ5hF9`V`QkdApJr`;s+Es9M#t`;PB2Yf zfTtfX>ID(pi@B*Ea4f^S!VaDib&|cD%RVRrr?FW38a(l>Ho zW`e3`T2xC$!J=}evs6HX_#rOej7?JU9Kxx@){U}sw7^!o=);c*n@Ucr9Qq11jIrv% zZMB8Pw{GV?<>%;2Q)VLmY73RLkXPk&Q@oLA-%neAJY!PMI89&LYV6X6sD(*RJY=7o zIj6Lk!ckL%aALMw41c8=xzP-C2-w>$zlM08e6(XWzuZyF^7DJH7+8zk8w8`=`ws-cS4{u_ diff --git a/obj/RelayCore.csproj.nuget.dgspec.json b/obj/RelayCore.csproj.nuget.dgspec.json index d17716a..4555919 100644 --- a/obj/RelayCore.csproj.nuget.dgspec.json +++ b/obj/RelayCore.csproj.nuget.dgspec.json @@ -51,6 +51,10 @@ "net9.0": { "targetAlias": "net9.0", "dependencies": { + "Konscious.Security.Cryptography.Argon2": { + "target": "Package", + "version": "[1.3.1, )" + }, "SurrealDb.Net": { "target": "Package", "version": "[0.9.0, )" diff --git a/obj/project.assets.json b/obj/project.assets.json index a42fc44..4837f80 100644 --- a/obj/project.assets.json +++ b/obj/project.assets.json @@ -27,6 +27,36 @@ "lib/net8.0/Dahomey.Cbor.dll": {} } }, + "Konscious.Security.Cryptography.Argon2/1.3.1": { + "type": "package", + "dependencies": { + "Konscious.Security.Cryptography.Blake2": "1.1.1", + "System.Memory": "4.5.4" + }, + "compile": { + "lib/net8.0/Konscious.Security.Cryptography.Argon2.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/Konscious.Security.Cryptography.Argon2.dll": { + "related": ".xml" + } + } + }, + "Konscious.Security.Cryptography.Blake2/1.1.1": { + "type": "package", + "compile": { + "lib/net8.0/Konscious.Security.Cryptography.Blake2.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/Konscious.Security.Cryptography.Blake2.dll": { + "related": ".xml" + } + } + }, "Microsoft.Bcl.AsyncInterfaces/6.0.0": { "type": "package", "compile": { @@ -412,6 +442,15 @@ } } }, + "System.Memory/4.5.4": { + "type": "package", + "compile": { + "ref/netcoreapp2.1/_._": {} + }, + "runtime": { + "lib/netcoreapp2.1/_._": {} + } + }, "System.Reactive/6.0.0": { "type": "package", "compile": { @@ -511,6 +550,44 @@ "lib/netstandard2.0/Dahomey.Cbor.dll" ] }, + "Konscious.Security.Cryptography.Argon2/1.3.1": { + "sha512": "T+OAGwzYYXftahpOxO7J4xA5K6urxwGnWQf3M+Jpi+76Azv/0T3M5SuN+h7/QvXuiqNw3ZEZ5QqVLI5ygDAylw==", + "type": "package", + "path": "konscious.security.cryptography.argon2/1.3.1", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "konscious.security.cryptography.argon2.1.3.1.nupkg.sha512", + "konscious.security.cryptography.argon2.nuspec", + "lib/net46/Konscious.Security.Cryptography.Argon2.dll", + "lib/net46/Konscious.Security.Cryptography.Argon2.xml", + "lib/net6.0/Konscious.Security.Cryptography.Argon2.dll", + "lib/net6.0/Konscious.Security.Cryptography.Argon2.xml", + "lib/net8.0/Konscious.Security.Cryptography.Argon2.dll", + "lib/net8.0/Konscious.Security.Cryptography.Argon2.xml", + "lib/netstandard1.3/Konscious.Security.Cryptography.Argon2.dll", + "lib/netstandard1.3/Konscious.Security.Cryptography.Argon2.xml" + ] + }, + "Konscious.Security.Cryptography.Blake2/1.1.1": { + "sha512": "odwOyzj/J/lHJZNwFWJGU/LRecBShupAJ2S8TQqZfhUe9niHzu/voBYK5wuVKsvSpzbfupKQYZguVyIk1sgOkQ==", + "type": "package", + "path": "konscious.security.cryptography.blake2/1.1.1", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "konscious.security.cryptography.blake2.1.1.1.nupkg.sha512", + "konscious.security.cryptography.blake2.nuspec", + "lib/net46/Konscious.Security.Cryptography.Blake2.dll", + "lib/net46/Konscious.Security.Cryptography.Blake2.xml", + "lib/net6.0/Konscious.Security.Cryptography.Blake2.dll", + "lib/net6.0/Konscious.Security.Cryptography.Blake2.xml", + "lib/net8.0/Konscious.Security.Cryptography.Blake2.dll", + "lib/net8.0/Konscious.Security.Cryptography.Blake2.xml", + "lib/netstandard1.3/Konscious.Security.Cryptography.Blake2.dll", + "lib/netstandard1.3/Konscious.Security.Cryptography.Blake2.xml" + ] + }, "Microsoft.Bcl.AsyncInterfaces/6.0.0": { "sha512": "UcSjPsst+DfAdJGVDsu346FX0ci0ah+lw3WRtn18NUwEqRt70HaOQ7lI72vy3+1LxtqI3T5GWwV39rQSrCzAeg==", "type": "package", @@ -1131,6 +1208,29 @@ "system.linq.async.nuspec" ] }, + "System.Memory/4.5.4": { + "sha512": "1MbJTHS1lZ4bS4FmsJjnuGJOu88ZzTT2rLvrhW7Ygic+pC0NWA+3hgAen0HRdsocuQXCkUTdFn9yHJJhsijDXw==", + "type": "package", + "path": "system.memory/4.5.4", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "LICENSE.TXT", + "THIRD-PARTY-NOTICES.TXT", + "lib/net461/System.Memory.dll", + "lib/net461/System.Memory.xml", + "lib/netcoreapp2.1/_._", + "lib/netstandard1.1/System.Memory.dll", + "lib/netstandard1.1/System.Memory.xml", + "lib/netstandard2.0/System.Memory.dll", + "lib/netstandard2.0/System.Memory.xml", + "ref/netcoreapp2.1/_._", + "system.memory.4.5.4.nupkg.sha512", + "system.memory.nuspec", + "useSharedDesignerContext.txt", + "version.txt" + ] + }, "System.Reactive/6.0.0": { "sha512": "31kfaW4ZupZzPsI5PVe77VhnvFF55qgma7KZr/E0iFTs6fmdhhG8j0mgEx620iLTey1EynOkEfnyTjtNEpJzGw==", "type": "package", @@ -1239,6 +1339,7 @@ }, "projectFileDependencyGroups": { "net9.0": [ + "Konscious.Security.Cryptography.Argon2 >= 1.3.1", "SurrealDb.Net >= 0.9.0" ] }, @@ -1293,6 +1394,10 @@ "net9.0": { "targetAlias": "net9.0", "dependencies": { + "Konscious.Security.Cryptography.Argon2": { + "target": "Package", + "version": "[1.3.1, )" + }, "SurrealDb.Net": { "target": "Package", "version": "[0.9.0, )" diff --git a/obj/project.nuget.cache b/obj/project.nuget.cache index eacb7d3..f2556c4 100644 --- a/obj/project.nuget.cache +++ b/obj/project.nuget.cache @@ -1,11 +1,13 @@ { "version": 2, - "dgSpecHash": "FgXgk22yPWQ=", + "dgSpecHash": "hVKcd/jquSo=", "success": true, "projectFilePath": "D:\\DDI\\Relay\\RelayChat\\RelayCore\\RelayCore.csproj", "expectedPackageFiles": [ "C:\\Users\\Core\\.nuget\\packages\\concurrenthashset\\1.3.0\\concurrenthashset.1.3.0.nupkg.sha512", "C:\\Users\\Core\\.nuget\\packages\\dahomey.cbor\\1.24.3\\dahomey.cbor.1.24.3.nupkg.sha512", + "C:\\Users\\Core\\.nuget\\packages\\konscious.security.cryptography.argon2\\1.3.1\\konscious.security.cryptography.argon2.1.3.1.nupkg.sha512", + "C:\\Users\\Core\\.nuget\\packages\\konscious.security.cryptography.blake2\\1.1.1\\konscious.security.cryptography.blake2.1.1.1.nupkg.sha512", "C:\\Users\\Core\\.nuget\\packages\\microsoft.bcl.asyncinterfaces\\6.0.0\\microsoft.bcl.asyncinterfaces.6.0.0.nupkg.sha512", "C:\\Users\\Core\\.nuget\\packages\\microsoft.extensions.configuration\\9.0.4\\microsoft.extensions.configuration.9.0.4.nupkg.sha512", "C:\\Users\\Core\\.nuget\\packages\\microsoft.extensions.configuration.abstractions\\9.0.4\\microsoft.extensions.configuration.abstractions.9.0.4.nupkg.sha512", @@ -27,6 +29,7 @@ "C:\\Users\\Core\\.nuget\\packages\\system.collections.immutable\\9.0.4\\system.collections.immutable.9.0.4.nupkg.sha512", "C:\\Users\\Core\\.nuget\\packages\\system.io.pipelines\\7.0.0\\system.io.pipelines.7.0.0.nupkg.sha512", "C:\\Users\\Core\\.nuget\\packages\\system.linq.async\\6.0.1\\system.linq.async.6.0.1.nupkg.sha512", + "C:\\Users\\Core\\.nuget\\packages\\system.memory\\4.5.4\\system.memory.4.5.4.nupkg.sha512", "C:\\Users\\Core\\.nuget\\packages\\system.reactive\\6.0.0\\system.reactive.6.0.0.nupkg.sha512", "C:\\Users\\Core\\.nuget\\packages\\system.threading.channels\\8.0.0\\system.threading.channels.8.0.0.nupkg.sha512", "C:\\Users\\Core\\.nuget\\packages\\systemtextjsonpatch\\4.2.0\\systemtextjsonpatch.4.2.0.nupkg.sha512", diff --git a/obj/project.packagespec.json b/obj/project.packagespec.json index a71aff7..6e15b5d 100644 --- a/obj/project.packagespec.json +++ b/obj/project.packagespec.json @@ -1 +1 @@ -"restore":{"projectUniqueName":"D:\\DDI\\Relay\\RelayChat\\RelayCore\\RelayCore.csproj","projectName":"RelayCore","projectPath":"D:\\DDI\\Relay\\RelayChat\\RelayCore\\RelayCore.csproj","outputPath":"D:\\DDI\\Relay\\RelayChat\\RelayCore\\obj\\","projectStyle":"PackageReference","fallbackFolders":["C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages"],"originalTargetFrameworks":["net9.0"],"sources":{"C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\":{},"C:\\Program Files\\dotnet\\library-packs":{},"https://api.nuget.org/v3/index.json":{}},"frameworks":{"net9.0":{"targetAlias":"net9.0","projectReferences":{}}},"warningProperties":{"warnAsError":["NU1605"]},"restoreAuditProperties":{"enableAudit":"true","auditLevel":"low","auditMode":"direct"},"SdkAnalysisLevel":"9.0.300"}"frameworks":{"net9.0":{"targetAlias":"net9.0","dependencies":{"SurrealDb.Net":{"target":"Package","version":"[0.9.0, )"}},"imports":["net461","net462","net47","net471","net472","net48","net481"],"assetTargetFallback":true,"warn":true,"frameworkReferences":{"Microsoft.NETCore.App":{"privateAssets":"all"}},"runtimeIdentifierGraphPath":"C:\\Program Files\\dotnet\\sdk\\9.0.305/PortableRuntimeIdentifierGraph.json"}} \ No newline at end of file +"restore":{"projectUniqueName":"D:\\DDI\\Relay\\RelayChat\\RelayCore\\RelayCore.csproj","projectName":"RelayCore","projectPath":"D:\\DDI\\Relay\\RelayChat\\RelayCore\\RelayCore.csproj","outputPath":"D:\\DDI\\Relay\\RelayChat\\RelayCore\\obj\\","projectStyle":"PackageReference","fallbackFolders":["C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages"],"originalTargetFrameworks":["net9.0"],"sources":{"C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\":{},"C:\\Program Files\\dotnet\\library-packs":{},"https://api.nuget.org/v3/index.json":{}},"frameworks":{"net9.0":{"targetAlias":"net9.0","projectReferences":{}}},"warningProperties":{"warnAsError":["NU1605"]},"restoreAuditProperties":{"enableAudit":"true","auditLevel":"low","auditMode":"direct"},"SdkAnalysisLevel":"9.0.300"}"frameworks":{"net9.0":{"targetAlias":"net9.0","dependencies":{"Konscious.Security.Cryptography.Argon2":{"target":"Package","version":"[1.3.1, )"},"SurrealDb.Net":{"target":"Package","version":"[0.9.0, )"}},"imports":["net461","net462","net47","net471","net472","net48","net481"],"assetTargetFallback":true,"warn":true,"frameworkReferences":{"Microsoft.NETCore.App":{"privateAssets":"all"}},"runtimeIdentifierGraphPath":"C:\\Program Files\\dotnet\\sdk\\9.0.305/PortableRuntimeIdentifierGraph.json"}} \ No newline at end of file diff --git a/obj/rider.project.model.nuget.info b/obj/rider.project.model.nuget.info index 1fabd17..f9a00fa 100644 --- a/obj/rider.project.model.nuget.info +++ b/obj/rider.project.model.nuget.info @@ -1 +1 @@ -17731137598642406 \ No newline at end of file +17734474740469652 \ No newline at end of file diff --git a/obj/rider.project.restore.info b/obj/rider.project.restore.info index 264d953..84908d7 100644 --- a/obj/rider.project.restore.info +++ b/obj/rider.project.restore.info @@ -1 +1 @@ -17731190668997575 \ No newline at end of file +17734474749787742 \ No newline at end of file