(feature): add otp secret generation
This commit is contained in:
parent
885f3d80a4
commit
e8d87d8700
@ -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());
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -8,7 +8,7 @@
|
||||
|
||||
<!-- NuGet package metadata -->
|
||||
<PackageId>MaksIT.Core</PackageId>
|
||||
<Version>1.0.6</Version>
|
||||
<Version>1.0.7</Version>
|
||||
<Authors>Maksym Sadovnychyy</Authors>
|
||||
<Company>MAKS-IT</Company>
|
||||
<Product>MaksIT.Core</Product>
|
||||
|
||||
@ -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.
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user