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();