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