From e8d87d8700bfa307a87e80a1025b79d510ff7402 Mon Sep 17 00:00:00 2001 From: Maksym Sadovnychyy Date: Thu, 3 Oct 2024 20:45:37 +0200 Subject: [PATCH] (feature): add otp secret generation --- .../Security/TtopGeneratorTests.cs | 15 ++++++++++++++- src/MaksIT.Core/Extensions/StringExtensions.cs | 10 ++++++++++ src/MaksIT.Core/MaksIT.Core.csproj | 2 +- src/MaksIT.Core/Security/TtopGenerator.cs | 11 +++++++++++ 4 files changed, 36 insertions(+), 2 deletions(-) diff --git a/src/MaksIT.Core.Tests/Security/TtopGeneratorTests.cs b/src/MaksIT.Core.Tests/Security/TtopGeneratorTests.cs index aaa82f0..984fcb0 100644 --- a/src/MaksIT.Core.Tests/Security/TtopGeneratorTests.cs +++ b/src/MaksIT.Core.Tests/Security/TtopGeneratorTests.cs @@ -1,4 +1,5 @@ -using MaksIT.Core.Security; +using MaksIT.Core.Extensions; +using MaksIT.Core.Security; using System; using Xunit; @@ -65,5 +66,17 @@ namespace MaksIT.Core.Tests.Security { // Assert Assert.True(timestep >= 0); } + + [Fact] + public void GenerateSecret_ReturnsValidBase32String() { + // Act + var secret = TotpGenerator.GenerateSecret(); + + // Assert + Assert.False(string.IsNullOrEmpty(secret)); + Assert.True(secret.IsBase32String()); + } + + } } diff --git a/src/MaksIT.Core/Extensions/StringExtensions.cs b/src/MaksIT.Core/Extensions/StringExtensions.cs index 1875015..1c044d1 100644 --- a/src/MaksIT.Core/Extensions/StringExtensions.cs +++ b/src/MaksIT.Core/Extensions/StringExtensions.cs @@ -262,5 +262,15 @@ namespace MaksIT.Core.Extensions { return dt; } + + public static bool IsBase32String(this string input) { + // Base32 characters are A-Z and 2-7 + foreach (char c in input) { + if (!((c >= 'A' && c <= 'Z') || (c >= '2' && c <= '7'))) { + return false; + } + } + return true; + } } } diff --git a/src/MaksIT.Core/MaksIT.Core.csproj b/src/MaksIT.Core/MaksIT.Core.csproj index 2768852..bbdc164 100644 --- a/src/MaksIT.Core/MaksIT.Core.csproj +++ b/src/MaksIT.Core/MaksIT.Core.csproj @@ -8,7 +8,7 @@ MaksIT.Core - 1.0.6 + 1.0.7 Maksym Sadovnychyy MAKS-IT MaksIT.Core diff --git a/src/MaksIT.Core/Security/TtopGenerator.cs b/src/MaksIT.Core/Security/TtopGenerator.cs index 7a8fea9..a4190d2 100644 --- a/src/MaksIT.Core/Security/TtopGenerator.cs +++ b/src/MaksIT.Core/Security/TtopGenerator.cs @@ -59,5 +59,16 @@ public static class TotpGenerator { var unixTimestamp = DateTimeOffset.UtcNow.ToUnixTimeSeconds(); return unixTimestamp / Timestep; } + + + public static string GenerateSecret() { + // Example of generating a 32-character base32 secret for TOTP + var random = new byte[20]; + using (var rng = RandomNumberGenerator.Create()) { + rng.GetBytes(random); + } + + return Base32Encoder.Encode(random); // You can use a Base32 encoder to generate the secret. + } }