diff --git a/src/Api/Api.csproj b/src/Api/Api.csproj index 96b248f90b..6505fdab5b 100644 --- a/src/Api/Api.csproj +++ b/src/Api/Api.csproj @@ -39,8 +39,4 @@ - - - - diff --git a/src/Api/Auth/Controllers/OpaqueKeyExchangeController.cs b/src/Api/Auth/Controllers/OpaqueKeyExchangeController.cs index 5be9c3eb9a..692e68db68 100644 --- a/src/Api/Auth/Controllers/OpaqueKeyExchangeController.cs +++ b/src/Api/Auth/Controllers/OpaqueKeyExchangeController.cs @@ -1,7 +1,7 @@ using Bit.Api.Auth.Models.Request.Opaque; using Bit.Api.Auth.Models.Response.Opaque; +using Bit.Core.Auth.Services; using Bit.Core.Services; -using Bitwarden.OPAQUE; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; @@ -11,54 +11,33 @@ namespace Bit.Api.Auth.Controllers; [Authorize("Web")] public class OpaqueKeyExchangeController : Controller { - private readonly IUserService _userService; - private readonly BitwardenOpaqueServer _bitwardenOpaque; + private readonly IOpaqueKeyExchangeService _opaqueKeyExchangeService; + IUserService _userService; public OpaqueKeyExchangeController( + IOpaqueKeyExchangeService opaqueKeyExchangeService, IUserService userService ) { + _opaqueKeyExchangeService = opaqueKeyExchangeService; _userService = userService; - _bitwardenOpaque = new BitwardenOpaqueServer(); } [HttpPost("~/opaque/start-registration")] public async Task StartRegistration([FromBody] OpaqueRegistrationStartRequest request) { var user = await _userService.GetUserByPrincipalAsync(User); - var registrationRequest = _bitwardenOpaque.StartRegistration(request.CipherConfiguration, null, System.Convert.FromBase64String(request.RegistrationRequest), user.Id.ToString()); - var message = registrationRequest.registrationResponse; - var serverSetup = registrationRequest.serverSetup; - // persist server setup - var sessionId = Guid.NewGuid(); - SessionStore.RegisterSessions.Add(sessionId, new RegisterSession() { SessionId = sessionId, ServerSetup = serverSetup, cipherConfiguration = request.CipherConfiguration }); - return new OpaqueRegistrationStartResponse(sessionId, System.Convert.ToBase64String(message)); + var result = await _opaqueKeyExchangeService.StartRegistration(System.Convert.FromBase64String(request.RegistrationRequest), user, request.CipherConfiguration); + return new OpaqueRegistrationStartResponse(result.Item1, System.Convert.ToBase64String(result.Item2)); } [HttpPost("~/opaque/finish-registration")] public async Task FinishRegistration([FromBody] OpaqueRegistrationFinishRequest request) { - await Task.Run(() => - { - var registerSession = SessionStore.RegisterSessions[request.SessionId]; - var registrationFinish = _bitwardenOpaque.FinishRegistration(registerSession.cipherConfiguration, System.Convert.FromBase64String(request.RegistrationUpload)); - Console.WriteLine("Registration Finish: " + registrationFinish); - }); + await Task.Run(() => { }); return ""; } } -public class RegisterSession -{ - public Guid SessionId { get; set; } - public byte[] ServerSetup { get; set; } - public CipherConfiguration cipherConfiguration { get; set; } -} - -public class SessionStore() -{ - public static Dictionary RegisterSessions = new Dictionary(); - public static Dictionary LoginSessions = new Dictionary(); -} diff --git a/src/Core/Auth/Services/IOpaqueKeyExchangeService.cs b/src/Core/Auth/Services/IOpaqueKeyExchangeService.cs new file mode 100644 index 0000000000..3ff4af8a1a --- /dev/null +++ b/src/Core/Auth/Services/IOpaqueKeyExchangeService.cs @@ -0,0 +1,10 @@ +using Bit.Core.Entities; +using Bitwarden.OPAQUE; + +namespace Bit.Core.Auth.Services; + +public interface IOpaqueKeyExchangeService +{ + public Task<(Guid, byte[])> StartRegistration(byte[] request, User user, CipherConfiguration cipherConfiguration); + public Task FinishRegistration(Guid sessionId, byte[] request, User user); +} diff --git a/src/Core/Auth/Services/Implementations/OpaqueKeyExchangeService.cs b/src/Core/Auth/Services/Implementations/OpaqueKeyExchangeService.cs new file mode 100644 index 0000000000..bca890ee9d --- /dev/null +++ b/src/Core/Auth/Services/Implementations/OpaqueKeyExchangeService.cs @@ -0,0 +1,48 @@ +using Bit.Core.Entities; +using Bitwarden.OPAQUE; + +namespace Bit.Core.Auth.Services; + +public class OpaqueKeyExchangeService : IOpaqueKeyExchangeService +{ + + private readonly BitwardenOpaqueServer _bitwardenOpaque; + + public OpaqueKeyExchangeService( + ) + { + _bitwardenOpaque = new BitwardenOpaqueServer(); + } + + + public async Task<(Guid, byte[])> StartRegistration(byte[] request, User user, CipherConfiguration cipherConfiguration) + { + var registrationRequest = _bitwardenOpaque.StartRegistration(cipherConfiguration, null, request, user.Id.ToString()); + var message = registrationRequest.registrationResponse; + var serverSetup = registrationRequest.serverSetup; + // persist server setup + var sessionId = Guid.NewGuid(); + SessionStore.RegisterSessions.Add(sessionId, new RegisterSession() { SessionId = sessionId, ServerSetup = serverSetup, cipherConfiguration = cipherConfiguration }); + await Task.Run(() => { }); + return (sessionId, message); + } + + public async Task FinishRegistration(Guid sessionId, byte[] request, User user) + { + await Task.Run(() => { }); + return true; + } +} + +public class RegisterSession +{ + public Guid SessionId { get; set; } + public byte[] ServerSetup { get; set; } + public CipherConfiguration cipherConfiguration { get; set; } +} + +public class SessionStore() +{ + public static Dictionary RegisterSessions = new Dictionary(); + public static Dictionary LoginSessions = new Dictionary(); +} diff --git a/src/Core/Core.csproj b/src/Core/Core.csproj index 8a8de3d77d..8bd7b91a4c 100644 --- a/src/Core/Core.csproj +++ b/src/Core/Core.csproj @@ -77,4 +77,8 @@ + + + + diff --git a/src/SharedWeb/Utilities/ServiceCollectionExtensions.cs b/src/SharedWeb/Utilities/ServiceCollectionExtensions.cs index 144ea1f036..a0bee13f2e 100644 --- a/src/SharedWeb/Utilities/ServiceCollectionExtensions.cs +++ b/src/SharedWeb/Utilities/ServiceCollectionExtensions.cs @@ -118,6 +118,7 @@ public static class ServiceCollectionExtensions services.AddScoped(); services.AddScoped(); services.AddScoped(); + services.AddScoped(); services.AddSingleton(); services.AddScoped(); services.AddScoped();