diff --git a/src/MaksIT.Core/MaksIT.Core.csproj b/src/MaksIT.Core/MaksIT.Core.csproj
index bbdc164..043bb78 100644
--- a/src/MaksIT.Core/MaksIT.Core.csproj
+++ b/src/MaksIT.Core/MaksIT.Core.csproj
@@ -8,7 +8,7 @@
MaksIT.Core
- 1.0.7
+ 1.0.8
Maksym Sadovnychyy
MAKS-IT
MaksIT.Core
diff --git a/src/MaksIT.Core/Security/TtopGenerator.cs b/src/MaksIT.Core/Security/TotpGenerator.cs
similarity index 67%
rename from src/MaksIT.Core/Security/TtopGenerator.cs
rename to src/MaksIT.Core/Security/TotpGenerator.cs
index a4190d2..303fb0e 100644
--- a/src/MaksIT.Core/Security/TtopGenerator.cs
+++ b/src/MaksIT.Core/Security/TotpGenerator.cs
@@ -60,7 +60,6 @@ public static class TotpGenerator {
return unixTimestamp / Timestep;
}
-
public static string GenerateSecret() {
// Example of generating a 32-character base32 secret for TOTP
var random = new byte[20];
@@ -70,5 +69,42 @@ public static class TotpGenerator {
return Base32Encoder.Encode(random); // You can use a Base32 encoder to generate the secret.
}
+
+ public static List GenerateRecoveryCodes(int defaultCodeCount = 6) {
+ var recoveryCodes = new List();
+
+ for (int i = 0; i < defaultCodeCount; i++) {
+ var code = Guid.NewGuid().ToString("N").Substring(0, 8); // Generate an 8-character code
+ var formattedCode = $"{code.Substring(0, 4)}-{code.Substring(4, 4)}"; // Format as XXXX-XXXX
+ recoveryCodes.Add(formattedCode);
+ }
+
+ return recoveryCodes;
+ }
+
+ public static string GenerateTotpAuthLink(string label, string username, string twoFactoSharedKey, string issuer, string? algorithm = null, int? digits = null, int? period = null) {
+
+ var queryParams = new List {
+ $"secret={Uri.EscapeDataString(twoFactoSharedKey)}",
+ $"issuer={Uri.EscapeDataString(issuer)}"
+ };
+
+ if (algorithm != null) {
+ queryParams.Add($"algorithm={Uri.EscapeDataString(algorithm)}");
+ }
+
+ if (digits != null) {
+ queryParams.Add($"digits={digits}");
+ }
+
+ if (period != null) {
+ queryParams.Add($"period={period}");
+ }
+
+ var queryString = string.Join("&", queryParams);
+ var authLink = $"otpauth://totp/{Uri.EscapeDataString(label)}:{Uri.EscapeDataString(username)}?{queryString}";
+
+ return authLink;
+ }
}