Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions src/App/Pages/Vault/CipherAddEditPageViewModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -308,7 +308,7 @@ public bool HasCollections
public string PasswordVisibilityAccessibilityText => ShowPassword ? AppResources.PasswordIsVisibleTapToHide : AppResources.PasswordIsNotVisibleTapToShow;
public bool HasTotpValue => IsLogin && !string.IsNullOrEmpty(Cipher?.Login?.Totp);
public string SetupTotpText => $"{BitwardenIcons.Camera} {AppResources.SetupTotp}";
public bool ShowPasskeyInfo => Cipher?.HasFido2Key == true && !CloneMode;
public bool ShowPasskeyInfo => Cipher?.HasFido2Credential == true && !CloneMode;

public void Init()
{
Expand Down Expand Up @@ -370,7 +370,7 @@ public async Task<bool> LoadAsync(AppOptions appOptions = null)
if (Cipher.Type == CipherType.Login)
{
// passkeys can't be cloned
Cipher.Login.Fido2Keys = null;
Cipher.Login.Fido2Credentials = null;
}
}
if (appOptions?.OtpData != null && Cipher.Type == CipherType.Login)
Expand Down
4 changes: 2 additions & 2 deletions src/App/Pages/Vault/CipherDetailsPage.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -199,12 +199,12 @@
Text="{u:I18n Passkey}"
StyleClass="box-label"
Margin="0,10,0,0"
IsVisible="{Binding Cipher.Login.MainFido2Key, Converter={StaticResource notNull}}"/>
IsVisible="{Binding Cipher.Login.MainFido2Credential, Converter={StaticResource notNull}}"/>
<Entry
Text="{Binding CreationDate}"
IsEnabled="False"
StyleClass="box-value,text-muted"
IsVisible="{Binding Cipher.Login.MainFido2Key, Converter={StaticResource notNull}}" />
IsVisible="{Binding Cipher.Login.MainFido2Credential, Converter={StaticResource notNull}}" />
<Grid StyleClass="box-row"
IsVisible="{Binding ShowTotp}"
AutomationId="ItemRow">
Expand Down
2 changes: 1 addition & 1 deletion src/App/Pages/Vault/CipherDetailsPageViewModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -702,7 +702,7 @@ public async Task<bool> PromptPasswordAsync()

private async Task<bool> CanCloneAsync()
{
if (!Cipher.HasFido2Key)
if (!Cipher.HasFido2Credential)
{
return true;
}
Expand Down
6 changes: 3 additions & 3 deletions src/Core/Constants.cs
Original file line number Diff line number Diff line change
Expand Up @@ -69,9 +69,9 @@ public static class Constants
public const int MasterPasswordMinimumChars = 12;
public const int CipherKeyRandomBytesLength = 64;
public const string CipherKeyEncryptionMinServerVersion = "2023.9.1";
public const string DefaultFido2KeyType = "public-key";
public const string DefaultFido2KeyAlgorithm = "ECDSA";
public const string DefaultFido2KeyCurve = "P-256";
public const string DefaultFido2CredentialType = "public-key";
public const string DefaultFido2CredentialAlgorithm = "ECDSA";
public const string DefaultFido2CredentialCurve = "P-256";

public static readonly string[] AndroidAllClearCipherCacheKeys =
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,13 @@

namespace Bit.Core.Models.Api
{
public class Fido2KeyApi
public class Fido2CredentialApi
{
public Fido2KeyApi()
public Fido2CredentialApi()
{
}

public Fido2KeyApi(Fido2Key fido2Key)
public Fido2CredentialApi(Fido2Credential fido2Key)
{
CredentialId = fido2Key.CredentialId?.EncryptedString;
Discoverable = fido2Key.Discoverable?.EncryptedString;
Expand All @@ -25,9 +25,9 @@ public Fido2KeyApi(Fido2Key fido2Key)

public string CredentialId { get; set; }
public string Discoverable { get; set; }
public string KeyType { get; set; } = Constants.DefaultFido2KeyType;
public string KeyAlgorithm { get; set; } = Constants.DefaultFido2KeyAlgorithm;
public string KeyCurve { get; set; } = Constants.DefaultFido2KeyCurve;
public string KeyType { get; set; } = Constants.DefaultFido2CredentialType;
public string KeyAlgorithm { get; set; } = Constants.DefaultFido2CredentialAlgorithm;
public string KeyCurve { get; set; } = Constants.DefaultFido2CredentialCurve;
public string KeyValue { get; set; }
public string RpId { get; set; }
public string RpName { get; set; }
Expand Down
2 changes: 1 addition & 1 deletion src/Core/Models/Api/LoginApi.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,6 @@ public class LoginApi
public string Password { get; set; }
public DateTime? PasswordRevisionDate { get; set; }
public string Totp { get; set; }
public List<Fido2KeyApi> Fido2Keys { get; set; }
public List<Fido2CredentialApi> Fido2Credentials { get; set; }
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@

namespace Bit.Core.Models.Data
{
public class Fido2KeyData : Data
public class Fido2CredentialData : Data
{
public Fido2KeyData() { }
public Fido2CredentialData() { }

public Fido2KeyData(Fido2KeyApi apiData)
public Fido2CredentialData(Fido2CredentialApi apiData)
{
CredentialId = apiData.CredentialId;
Discoverable = apiData.Discoverable;
Expand All @@ -23,9 +23,9 @@ public Fido2KeyData(Fido2KeyApi apiData)

public string CredentialId { get; set; }
public string Discoverable { get; set; }
public string KeyType { get; set; } = Constants.DefaultFido2KeyType;
public string KeyAlgorithm { get; set; } = Constants.DefaultFido2KeyAlgorithm;
public string KeyCurve { get; set; } = Constants.DefaultFido2KeyCurve;
public string KeyType { get; set; } = Constants.DefaultFido2CredentialType;
public string KeyAlgorithm { get; set; } = Constants.DefaultFido2CredentialAlgorithm;
public string KeyCurve { get; set; } = Constants.DefaultFido2CredentialCurve;
public string KeyValue { get; set; }
public string RpId { get; set; }
public string RpName { get; set; }
Expand Down
4 changes: 2 additions & 2 deletions src/Core/Models/Data/LoginData.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,14 @@ public LoginData(LoginApi data)
PasswordRevisionDate = data.PasswordRevisionDate;
Totp = data.Totp;
Uris = data.Uris?.Select(u => new LoginUriData(u)).ToList();
Fido2Keys = data.Fido2Keys?.Select(f => new Fido2KeyData(f)).ToList();
Fido2Credentials = data.Fido2Credentials?.Select(f => new Fido2CredentialData(f)).ToList();
}

public List<LoginUriData> Uris { get; set; }
public string Username { get; set; }
public string Password { get; set; }
public DateTime? PasswordRevisionDate { get; set; }
public string Totp { get; set; }
public List<Fido2KeyData> Fido2Keys { get; set; }
public List<Fido2CredentialData> Fido2Credentials { get; set; }
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

namespace Bit.Core.Models.Domain
{
public class Fido2Key : Domain
public class Fido2Credential : Domain
{
public static HashSet<string> EncryptableProperties => new HashSet<string>
{
Expand All @@ -22,9 +22,9 @@ public class Fido2Key : Domain
nameof(Counter)
};

public Fido2Key() { }
public Fido2Credential() { }

public Fido2Key(Fido2KeyData data, bool alreadyEncrypted = false)
public Fido2Credential(Fido2CredentialData data, bool alreadyEncrypted = false)
{
BuildDomainModel(this, data, EncryptableProperties, alreadyEncrypted);
}
Expand All @@ -41,14 +41,14 @@ public Fido2Key(Fido2KeyData data, bool alreadyEncrypted = false)
public EncString UserName { get; set; }
public EncString Counter { get; set; }

public async Task<Fido2KeyView> DecryptAsync(string orgId, SymmetricCryptoKey key = null)
public async Task<Fido2CredentialView> DecryptAsync(string orgId, SymmetricCryptoKey key = null)
{
return await DecryptObjAsync(new Fido2KeyView(), this, EncryptableProperties, orgId, key);
return await DecryptObjAsync(new Fido2CredentialView(), this, EncryptableProperties, orgId, key);
}

public Fido2KeyData ToFido2KeyData()
public Fido2CredentialData ToFido2CredentialData()
{
var data = new Fido2KeyData();
var data = new Fido2CredentialData();
BuildDataModel(this, data, EncryptableProperties);
return data;
}
Expand Down
16 changes: 8 additions & 8 deletions src/Core/Models/Domain/Login.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ public Login(LoginData obj, bool alreadyEncrypted = false)
{
PasswordRevisionDate = obj.PasswordRevisionDate;
Uris = obj.Uris?.Select(u => new LoginUri(u, alreadyEncrypted)).ToList();
Fido2Keys = obj.Fido2Keys?.Select(f => new Fido2Key(f, alreadyEncrypted)).ToList();
Fido2Credentials = obj.Fido2Credentials?.Select(f => new Fido2Credential(f, alreadyEncrypted)).ToList();
BuildDomainModel(this, obj, new HashSet<string>
{
"Username",
Expand All @@ -29,7 +29,7 @@ public Login(LoginData obj, bool alreadyEncrypted = false)
public EncString Password { get; set; }
public DateTime? PasswordRevisionDate { get; set; }
public EncString Totp { get; set; }
public List<Fido2Key> Fido2Keys { get; set; }
public List<Fido2Credential> Fido2Credentials { get; set; }

public async Task<LoginView> DecryptAsync(string orgId, SymmetricCryptoKey key = null)
{
Expand All @@ -47,12 +47,12 @@ public async Task<LoginView> DecryptAsync(string orgId, SymmetricCryptoKey key =
view.Uris.Add(await uri.DecryptAsync(orgId, key));
}
}
if (Fido2Keys != null)
if (Fido2Credentials != null)
{
view.Fido2Keys = new List<Fido2KeyView>();
foreach (var fido2Key in Fido2Keys)
view.Fido2Credentials = new List<Fido2CredentialView>();
foreach (var fido2Credential in Fido2Credentials)
{
view.Fido2Keys.Add(await fido2Key.DecryptAsync(orgId, key));
view.Fido2Credentials.Add(await fido2Credential.DecryptAsync(orgId, key));
}
}
return view;
Expand All @@ -72,9 +72,9 @@ public LoginData ToLoginData()
{
l.Uris = Uris.Select(u => u.ToLoginUriData()).ToList();
}
if (Fido2Keys != null)
if (Fido2Credentials != null)
{
l.Fido2Keys = Fido2Keys.Select(f => f.ToFido2KeyData()).ToList();
l.Fido2Credentials = Fido2Credentials.Select(f => f.ToFido2CredentialData()).ToList();
}
return l;
}
Expand Down
2 changes: 1 addition & 1 deletion src/Core/Models/Request/CipherRequest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ public CipherRequest(Cipher cipher)
Password = cipher.Login.Password?.EncryptedString,
PasswordRevisionDate = cipher.Login.PasswordRevisionDate,
Totp = cipher.Login.Totp?.EncryptedString,
Fido2Keys = cipher.Login.Fido2Keys?.Select(f => new Fido2KeyApi(f)).ToList()
Fido2Credentials = cipher.Login.Fido2Credentials?.Select(f => new Fido2CredentialApi(f)).ToList()
};
break;
case CipherType.Card:
Expand Down
2 changes: 1 addition & 1 deletion src/Core/Models/View/CipherView.cs
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,6 @@ public string LinkedFieldI18nKey(LinkedIdType id)

public bool IsClonable => OrganizationId is null;

public bool HasFido2Key => Type == CipherType.Login && Login?.HasFido2Keys == true;
public bool HasFido2Credential => Type == CipherType.Login && Login?.HasFido2Credentials == true;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,13 @@

namespace Bit.Core.Models.View
{
public class Fido2KeyView : ItemView, ILaunchableView
public class Fido2CredentialView : ItemView, ILaunchableView
{
public string CredentialId { get; set; }
public string Discoverable { get; set; }
public string KeyType { get; set; } = Constants.DefaultFido2KeyType;
public string KeyAlgorithm { get; set; } = Constants.DefaultFido2KeyAlgorithm;
public string KeyCurve { get; set; } = Constants.DefaultFido2KeyCurve;
public string KeyType { get; set; } = Constants.DefaultFido2CredentialType;
public string KeyAlgorithm { get; set; } = Constants.DefaultFido2CredentialAlgorithm;
public string KeyCurve { get; set; } = Constants.DefaultFido2CredentialCurve;
public string KeyValue { get; set; }
public string RpId { get; set; }
public string RpName { get; set; }
Expand All @@ -23,6 +23,6 @@ public class Fido2KeyView : ItemView, ILaunchableView
public bool CanLaunch => !string.IsNullOrEmpty(RpId);
public string LaunchUri => $"https://{RpId}";

public bool IsUniqueAgainst(Fido2KeyView fido2View) => fido2View?.RpId != RpId || fido2View?.UserName != UserName;
public bool IsUniqueAgainst(Fido2CredentialView fido2View) => fido2View?.RpId != RpId || fido2View?.UserName != UserName;
}
}
6 changes: 3 additions & 3 deletions src/Core/Models/View/LoginView.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,16 +20,16 @@ public LoginView(Login l)
public DateTime? PasswordRevisionDate { get; set; }
public string Totp { get; set; }
public List<LoginUriView> Uris { get; set; }
public List<Fido2KeyView> Fido2Keys { get; set; }
public List<Fido2CredentialView> Fido2Credentials { get; set; }

public string Uri => HasUris ? Uris[0].Uri : null;
public string MaskedPassword => Password != null ? "••••••••" : null;
public override string SubTitle => Username;
public bool CanLaunch => HasUris && Uris.Any(u => u.CanLaunch);
public string LaunchUri => HasUris ? Uris.FirstOrDefault(u => u.CanLaunch)?.LaunchUri : null;
public bool HasUris => (Uris?.Count ?? 0) > 0;
public bool HasFido2Keys => Fido2Keys?.Any() == true;
public Fido2KeyView MainFido2Key => HasFido2Keys ? Fido2Keys[0] : null;
public bool HasFido2Credentials => Fido2Credentials?.Any() == true;
public Fido2CredentialView MainFido2Credential => HasFido2Credentials ? Fido2Credentials[0] : null;

public override List<KeyValuePair<string, LinkedIdType>> LinkedFieldOptions
{
Expand Down
16 changes: 8 additions & 8 deletions src/Core/Services/CipherService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -597,15 +597,15 @@ public async Task SaveWithServerAsync(Cipher cipher)

private async Task<bool> ValidateCanBeSharedWithOrgAsync(CipherView cipher, string organizationId)
{
if (!cipher.HasFido2Key)
if (!cipher.HasFido2Credential)
{
return true;
}

var decCiphers = await GetAllDecryptedAsync();
return !decCiphers
.Where(c => c.OrganizationId == organizationId)
.Any(c => !cipher.Login.MainFido2Key.IsUniqueAgainst(c.Login?.MainFido2Key));
.Any(c => !cipher.Login.MainFido2Credential.IsUniqueAgainst(c.Login?.MainFido2Credential));
}

public async Task<Cipher> SaveAttachmentRawWithServerAsync(Cipher cipher, CipherView cipherView, string filename, byte[] data)
Expand Down Expand Up @@ -1176,14 +1176,14 @@ private async Task EncryptCipherDataAsync(Cipher cipher, CipherView model, Symme
cipher.Login.Uris.Add(loginUri);
}
}
if (model.Login.HasFido2Keys)
if (model.Login.HasFido2Credentials)
{
cipher.Login.Fido2Keys = new List<Fido2Key>();
foreach (var fido2Key in model.Login.Fido2Keys)
cipher.Login.Fido2Credentials = new List<Fido2Credential>();
foreach (var fido2Credential in model.Login.Fido2Credentials)
{
var fido2KeyDomain = new Fido2Key();
await EncryptObjPropertyAsync(fido2Key, fido2KeyDomain, Fido2Key.EncryptableProperties, key);
cipher.Login.Fido2Keys.Add(fido2KeyDomain);
var fido2CredentialDomain = new Fido2Credential();
await EncryptObjPropertyAsync(fido2Credential, fido2CredentialDomain, Fido2Credential.EncryptableProperties, key);
cipher.Login.Fido2Credentials.Add(fido2CredentialDomain);
}
}
break;
Expand Down