< Summary - Heimdall API

Information
Class: ArturRios.Heimdall.Command.Services.TotpSecretProtector
Assembly: ArturRios.Heimdall.Command
File(s): /home/ci/agent/workspace/heimdall-api-docs_main/app/src/Application/ArturRios.Heimdall.Command/Services/TotpSecretProtector.cs
Line coverage
100%
Covered lines: 5
Uncovered lines: 0
Coverable lines: 5
Total lines: 34
Line coverage: 100%
Branch coverage
N/A
Covered branches: 0
Total branches: 0
Branch coverage: N/A
Method coverage
100%
Covered methods: 3
Fully covered methods: 3
Total methods: 3
Method coverage: 100%
Full method coverage: 100%

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
Protect(...)100%11100%
Unprotect(...)100%11100%

File(s)

/home/ci/agent/workspace/heimdall-api-docs_main/app/src/Application/ArturRios.Heimdall.Command/Services/TotpSecretProtector.cs

#LineLine coverage
 1using System.Text;
 2using Microsoft.AspNetCore.DataProtection;
 3
 4namespace ArturRios.Heimdall.Command.Services;
 5
 6/// <summary>
 7///     Default <see cref="ITotpSecretProtector" />, wrapping ASP.NET Core's Data Protection API
 8///     (UC-36 step 3, FR-2F-02). Registered from <c>CommandServiceCollectionExtensions.AddTwoFactorServices</c>,
 9///     after <c>DataServiceCollectionExtensions.AddDataProtectionKeyRing</c> has added
 10///     <c>AddDataProtection()</c> to the container this protector's <see cref="IDataProtector" /> is
 11///     resolved from.
 12/// </summary>
 13/// <remarks>
 14///     A single, fixed purpose string scopes the protector to this one use — Data Protection derives
 15///     a different key for every distinct purpose, so a secret protected here cannot be unprotected
 16///     by any other component that also happens to call <c>CreateProtector</c>.
 17/// </remarks>
 18public class TotpSecretProtector : ITotpSecretProtector
 19{
 20    private const string Purpose = "ArturRios.Heimdall.TwoFactorAuth.TotpSecret.v1";
 21
 22    private readonly IDataProtector _protector;
 23
 19424    public TotpSecretProtector(IDataProtectionProvider provider)
 25    {
 19426        _protector = provider.CreateProtector(Purpose);
 19427    }
 28
 29    public byte[] Protect(string base32Secret) =>
 1930        _protector.Protect(Encoding.UTF8.GetBytes(base32Secret));
 31
 32    public string Unprotect(byte[] protectedSecret) =>
 4033        Encoding.UTF8.GetString(_protector.Unprotect(protectedSecret));
 34}