diff --git a/bitwarden_license/src/Sso/Utilities/DynamicAuthenticationSchemeProvider.cs b/bitwarden_license/src/Sso/Utilities/DynamicAuthenticationSchemeProvider.cs
index 749bba2ad1..e8628fd6b3 100644
--- a/bitwarden_license/src/Sso/Utilities/DynamicAuthenticationSchemeProvider.cs
+++ b/bitwarden_license/src/Sso/Utilities/DynamicAuthenticationSchemeProvider.cs
@@ -2,7 +2,6 @@
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography.X509Certificates;
-using System.Text.Json;
using System.Threading;
using System.Threading.Tasks;
using Bit.Core.Entities;
@@ -25,7 +24,6 @@ using Microsoft.IdentityModel.Tokens;
using Sustainsys.Saml2.AspNetCore2;
using Sustainsys.Saml2.Configuration;
using Sustainsys.Saml2.Saml2P;
-using U2F.Core.Utils;
namespace Bit.Core.Business.Sso
{
@@ -412,7 +410,7 @@ namespace Bit.Core.Business.Sso
}
if (!string.IsNullOrWhiteSpace(config.IdpX509PublicCert))
{
- var cert = config.IdpX509PublicCert.Base64StringToByteArray();
+ var cert = CoreHelpers.Base64UrlDecode(config.IdpX509PublicCert);
idp.SigningKeys.AddConfiguredKey(new X509Certificate2(cert));
}
// This must happen last since it calls Validate() internally.
diff --git a/src/Api/Models/Request/Organizations/OrganizationSsoRequestModel.cs b/src/Api/Models/Request/Organizations/OrganizationSsoRequestModel.cs
index 77d8b0e342..ae10ce78d9 100644
--- a/src/Api/Models/Request/Organizations/OrganizationSsoRequestModel.cs
+++ b/src/Api/Models/Request/Organizations/OrganizationSsoRequestModel.cs
@@ -9,8 +9,8 @@ using Bit.Core.Enums;
using Bit.Core.Models.Data;
using Bit.Core.Services;
using Bit.Core.Sso;
+using Bit.Core.Utilities;
using Microsoft.AspNetCore.Authentication.OpenIdConnect;
-using U2F.Core.Utils;
namespace Bit.Api.Models.Request.Organizations
{
@@ -147,7 +147,7 @@ namespace Bit.Api.Models.Request.Organizations
ValidationResult failedResult = null;
try
{
- var certData = StripPemCertificateElements(IdpX509PublicCert).Base64StringToByteArray();
+ var certData = CoreHelpers.Base64UrlDecode(StripPemCertificateElements(IdpX509PublicCert));
new X509Certificate2(certData);
}
catch (FormatException)
diff --git a/src/Core/Core.csproj b/src/Core/Core.csproj
index b70d79092d..44f96360fe 100644
--- a/src/Core/Core.csproj
+++ b/src/Core/Core.csproj
@@ -50,7 +50,6 @@
-
diff --git a/src/Core/Entities/U2f.cs b/src/Core/Entities/U2f.cs
deleted file mode 100644
index 3e8a187e6b..0000000000
--- a/src/Core/Entities/U2f.cs
+++ /dev/null
@@ -1,26 +0,0 @@
-using System;
-using System.ComponentModel.DataAnnotations;
-
-namespace Bit.Core.Entities
-{
- public class U2f : ITableObject
- {
- public int Id { get; set; }
- public Guid UserId { get; set; }
- [MaxLength(200)]
- public string KeyHandle { get; set; }
- [MaxLength(200)]
- public string Challenge { get; set; }
- [MaxLength(50)]
- public string AppId { get; set; }
- [MaxLength(20)]
- public string Version { get; set; }
- public DateTime CreationDate { get; internal set; } = DateTime.UtcNow;
-
- public void SetNewId()
- {
- // int will be auto-populated
- Id = 0;
- }
- }
-}
diff --git a/src/Core/Enums/TwoFactorProviderType.cs b/src/Core/Enums/TwoFactorProviderType.cs
index d3d0c195ae..3779d5adde 100644
--- a/src/Core/Enums/TwoFactorProviderType.cs
+++ b/src/Core/Enums/TwoFactorProviderType.cs
@@ -6,7 +6,7 @@
Email = 1,
Duo = 2,
YubiKey = 3,
- U2f = 4,
+ // U2f = 4, // Deprecated
Remember = 5,
OrganizationDuo = 6,
WebAuthn = 7,
diff --git a/src/Core/Identity/U2fTokenProvider.cs b/src/Core/Identity/U2fTokenProvider.cs
deleted file mode 100644
index fa3b5d3fcd..0000000000
--- a/src/Core/Identity/U2fTokenProvider.cs
+++ /dev/null
@@ -1,221 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text.Json;
-using System.Threading.Tasks;
-using Bit.Core.Entities;
-using Bit.Core.Enums;
-using Bit.Core.Models;
-using Bit.Core.Repositories;
-using Bit.Core.Services;
-using Bit.Core.Settings;
-using Microsoft.AspNetCore.Identity;
-using Microsoft.Extensions.DependencyInjection;
-using U2F.Core.Exceptions;
-using U2F.Core.Models;
-using U2F.Core.Utils;
-using U2fLib = U2F.Core.Crypto.U2F;
-
-namespace Bit.Core.Identity
-{
- public class U2fTokenProvider : IUserTwoFactorTokenProvider
- {
- private readonly IServiceProvider _serviceProvider;
- private readonly IU2fRepository _u2fRepository;
- private readonly GlobalSettings _globalSettings;
-
- public U2fTokenProvider(
- IServiceProvider serviceProvider,
- IU2fRepository u2fRepository,
- GlobalSettings globalSettings)
- {
- _serviceProvider = serviceProvider;
- _u2fRepository = u2fRepository;
- _globalSettings = globalSettings;
- }
-
- public async Task CanGenerateTwoFactorTokenAsync(UserManager manager, User user)
- {
- var userService = _serviceProvider.GetRequiredService();
- if (!(await userService.CanAccessPremium(user)))
- {
- return false;
- }
-
- var provider = user.GetTwoFactorProvider(TwoFactorProviderType.U2f);
- if (!HasProperMetaData(provider))
- {
- return false;
- }
-
- return await userService.TwoFactorProviderIsEnabledAsync(TwoFactorProviderType.U2f, user);
- }
-
- public async Task GenerateAsync(string purpose, UserManager manager, User user)
- {
- var userService = _serviceProvider.GetRequiredService();
- if (!(await userService.CanAccessPremium(user)))
- {
- return null;
- }
-
- var provider = user.GetTwoFactorProvider(TwoFactorProviderType.U2f);
- var keys = LoadKeys(provider);
- if (keys.Count == 0)
- {
- return null;
- }
-
- await _u2fRepository.DeleteManyByUserIdAsync(user.Id);
-
- try
- {
- var challengeBytes = U2fLib.Crypto.GenerateChallenge();
- var appId = Utilities.CoreHelpers.U2fAppIdUrl(_globalSettings);
- var oldChallenges = new List