(feature): add otp secret generation

This commit is contained in:
Maksym Sadovnychyy 2024-10-03 20:45:37 +02:00
parent 885f3d80a4
commit e8d87d8700
4 changed files with 36 additions and 2 deletions

View File

@ -1,4 +1,5 @@
using MaksIT.Core.Security; using MaksIT.Core.Extensions;
using MaksIT.Core.Security;
using System; using System;
using Xunit; using Xunit;
@ -65,5 +66,17 @@ namespace MaksIT.Core.Tests.Security {
// Assert // Assert
Assert.True(timestep >= 0); Assert.True(timestep >= 0);
} }
[Fact]
public void GenerateSecret_ReturnsValidBase32String() {
// Act
var secret = TotpGenerator.GenerateSecret();
// Assert
Assert.False(string.IsNullOrEmpty(secret));
Assert.True(secret.IsBase32String());
}
} }
} }

View File

@ -262,5 +262,15 @@ namespace MaksIT.Core.Extensions {
return dt; 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;
}
} }
} }

View File

@ -8,7 +8,7 @@
<!-- NuGet package metadata --> <!-- NuGet package metadata -->
<PackageId>MaksIT.Core</PackageId> <PackageId>MaksIT.Core</PackageId>
<Version>1.0.6</Version> <Version>1.0.7</Version>
<Authors>Maksym Sadovnychyy</Authors> <Authors>Maksym Sadovnychyy</Authors>
<Company>MAKS-IT</Company> <Company>MAKS-IT</Company>
<Product>MaksIT.Core</Product> <Product>MaksIT.Core</Product>

View File

@ -59,5 +59,16 @@ public static class TotpGenerator {
var unixTimestamp = DateTimeOffset.UtcNow.ToUnixTimeSeconds(); var unixTimestamp = DateTimeOffset.UtcNow.ToUnixTimeSeconds();
return unixTimestamp / Timestep; 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.
}
} }