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.
+ }
}