diff --git a/apps/browser/src/vault/popup/components/vault/add-edit.component.html b/apps/browser/src/vault/popup/components/vault/add-edit.component.html index 555702b3c81..600633f0149 100644 --- a/apps/browser/src/vault/popup/components/vault/add-edit.component.html +++ b/apps/browser/src/vault/popup/components/vault/add-edit.component.html @@ -131,12 +131,12 @@ -
+
{{ "typePasskey" | i18n }} {{ "dateCreated" | i18n }} - {{ cipher.login.fido2Keys[0].creationDate | date : "short" }} + {{ cipher.login.fido2Credentials[0].creationDate | date : "short" }}
diff --git a/apps/browser/src/vault/popup/components/vault/view.component.html b/apps/browser/src/vault/popup/components/vault/view.component.html index 39f2d86d925..9f487b58d7e 100644 --- a/apps/browser/src/vault/popup/components/vault/view.component.html +++ b/apps/browser/src/vault/popup/components/vault/view.component.html @@ -144,12 +144,12 @@
-
+
{{ "typePasskey" | i18n }} {{ "dateCreated" | i18n }} - {{ cipher.login.fido2Keys[0].creationDate | date : "short" }} + {{ cipher.login.fido2Credentials[0].creationDate | date : "short" }}
diff --git a/apps/desktop/src/vault/app/vault/add-edit.component.html b/apps/desktop/src/vault/app/vault/add-edit.component.html index c6f45937351..4529d8fb3f7 100644 --- a/apps/desktop/src/vault/app/vault/add-edit.component.html +++ b/apps/desktop/src/vault/app/vault/add-edit.component.html @@ -117,12 +117,12 @@
{{ "typePasskey" | i18n }} {{ "dateCreated" | i18n }} - {{ cipher.login.fido2Keys[0].creationDate | date : "short" }} + {{ cipher.login.fido2Credentials[0].creationDate | date : "short" }}
diff --git a/apps/desktop/src/vault/app/vault/view.component.html b/apps/desktop/src/vault/app/vault/view.component.html index 80fcdfff7d6..6996271ebc5 100644 --- a/apps/desktop/src/vault/app/vault/view.component.html +++ b/apps/desktop/src/vault/app/vault/view.component.html @@ -119,9 +119,10 @@
-
+
{{ "typePasskey" | i18n }} - {{ "dateCreated" | i18n }} {{ cipher.login.fido2Keys[0].creationDate | date : "short" }} + {{ "dateCreated" | i18n }} + {{ cipher.login.fido2Credentials[0].creationDate | date : "short" }}
- +
- +
0) { + if (cipher.login?.fido2Credentials.length > 0) { const confirmed = await this.dialogService.openSimpleDialog({ title: { key: "passkeyNotCopied" }, content: { key: "passkeyNotCopiedAlert" }, diff --git a/libs/angular/src/vault/components/add-edit.component.ts b/libs/angular/src/vault/components/add-edit.component.ts index bcbfcc162bf..9dd08a33660 100644 --- a/libs/angular/src/vault/components/add-edit.component.ts +++ b/libs/angular/src/vault/components/add-edit.component.ts @@ -324,12 +324,12 @@ export class AddEditComponent implements OnInit, OnDestroy { : this.collections.filter((c) => (c as any).checked).map((c) => c.id); } - // Clear current Cipher Id and Fido2Key if exists to trigger "Add" cipher flow + // Clear current Cipher Id and Fido2Credentials if exists to trigger "Add" cipher flow if (this.cloneMode) { this.cipher.id = null; - if (this.cipher.type === CipherType.Login && this.cipher.login.fido2Keys.length > 0) { - this.cipher.login.fido2Keys = []; + if (this.cipher.type === CipherType.Login && this.cipher.login.fido2Credentials.length > 0) { + this.cipher.login.fido2Credentials = []; } } diff --git a/libs/angular/src/vault/components/view.component.ts b/libs/angular/src/vault/components/view.component.ts index 56c236a1208..3be16d50ac1 100644 --- a/libs/angular/src/vault/components/view.component.ts +++ b/libs/angular/src/vault/components/view.component.ts @@ -157,7 +157,7 @@ export class ViewComponent implements OnDestroy, OnInit { } async clone() { - if (this.cipher.login?.fido2Keys.length > 0) { + if (this.cipher.login?.fido2Credentials.length > 0) { const confirmed = await this.dialogService.openSimpleDialog({ title: { key: "passkeyNotCopied" }, content: { key: "passkeyNotCopiedAlert" }, diff --git a/libs/common/src/models/api/login.api.ts b/libs/common/src/models/api/login.api.ts index 600a3f21daf..934d2e99b5b 100644 --- a/libs/common/src/models/api/login.api.ts +++ b/libs/common/src/models/api/login.api.ts @@ -1,6 +1,6 @@ import { JsonObject } from "type-fest"; -import { Fido2KeyApi } from "../../vault/api/fido2-key.api"; +import { Fido2CredentialApi } from "../../vault/api/fido2-credential.api"; import { BaseResponse } from "../response/base.response"; import { LoginUriApi } from "./login-uri.api"; @@ -12,7 +12,7 @@ export class LoginApi extends BaseResponse { passwordRevisionDate: string; totp: string; autofillOnPageLoad: boolean; - fido2Keys?: Fido2KeyApi[]; + fido2Credentials?: Fido2CredentialApi[]; constructor(data: any = null) { super(data); @@ -30,9 +30,11 @@ export class LoginApi extends BaseResponse { this.uris = uris.map((u: any) => new LoginUriApi(u)); } - const fido2Keys = this.getResponseProperty("Fido2Keys"); - if (fido2Keys != null) { - this.fido2Keys = fido2Keys.map((key: JsonObject) => new Fido2KeyApi(key)); + const fido2Credentials = this.getResponseProperty("Fido2Credentials"); + if (fido2Credentials != null) { + this.fido2Credentials = fido2Credentials.map( + (key: JsonObject) => new Fido2CredentialApi(key) + ); } } } diff --git a/libs/common/src/models/export/fido2key.export.ts b/libs/common/src/models/export/fido2-credential.export.ts similarity index 85% rename from libs/common/src/models/export/fido2key.export.ts rename to libs/common/src/models/export/fido2-credential.export.ts index 69df345cbe0..67f7b7b4408 100644 --- a/libs/common/src/models/export/fido2key.export.ts +++ b/libs/common/src/models/export/fido2-credential.export.ts @@ -1,11 +1,10 @@ import { EncString } from "../../platform/models/domain/enc-string"; -import { Fido2KeyView } from "../../vault/models/view/fido2-key.view"; +import { Fido2Credential } from "../../vault/models/domain/fido2-credential"; +import { Fido2CredentialView } from "../../vault/models/view/fido2-credential.view"; -import { Fido2Key as Fido2KeyDomain } from "./../../vault/models/domain/fido2-key"; - -export class Fido2KeyExport { - static template(): Fido2KeyExport { - const req = new Fido2KeyExport(); +export class Fido2CredentialExport { + static template(): Fido2CredentialExport { + const req = new Fido2CredentialExport(); req.credentialId = "keyId"; req.keyType = "keyType"; req.keyAlgorithm = "keyAlgorithm"; @@ -21,7 +20,7 @@ export class Fido2KeyExport { return req; } - static toView(req: Fido2KeyExport, view = new Fido2KeyView()) { + static toView(req: Fido2CredentialExport, view = new Fido2CredentialView()) { view.credentialId = req.credentialId; view.keyType = req.keyType as "public-key"; view.keyAlgorithm = req.keyAlgorithm as "ECDSA"; @@ -37,7 +36,7 @@ export class Fido2KeyExport { return view; } - static toDomain(req: Fido2KeyExport, domain = new Fido2KeyDomain()) { + static toDomain(req: Fido2CredentialExport, domain = new Fido2Credential()) { domain.credentialId = req.credentialId != null ? new EncString(req.credentialId) : null; domain.keyType = req.keyType != null ? new EncString(req.keyType) : null; domain.keyAlgorithm = req.keyAlgorithm != null ? new EncString(req.keyAlgorithm) : null; @@ -67,12 +66,12 @@ export class Fido2KeyExport { discoverable: string; creationDate: Date; - constructor(o?: Fido2KeyView | Fido2KeyDomain) { + constructor(o?: Fido2CredentialView | Fido2Credential) { if (o == null) { return; } - if (o instanceof Fido2KeyView) { + if (o instanceof Fido2CredentialView) { this.credentialId = o.credentialId; this.keyType = o.keyType; this.keyAlgorithm = o.keyAlgorithm; diff --git a/libs/common/src/models/export/index.ts b/libs/common/src/models/export/index.ts index 8c35ee0e1ba..0b338572207 100644 --- a/libs/common/src/models/export/index.ts +++ b/libs/common/src/models/export/index.ts @@ -9,4 +9,4 @@ export { FolderExport } from "./folder.export"; export { IdentityExport } from "./identity.export"; export { LoginUriExport } from "./login-uri.export"; export { SecureNoteExport } from "./secure-note.export"; -export { Fido2KeyExport } from "./fido2key.export"; +export { Fido2CredentialExport } from "./fido2-credential.export"; diff --git a/libs/common/src/models/export/login.export.ts b/libs/common/src/models/export/login.export.ts index 6fa663171dc..c64d30b5b67 100644 --- a/libs/common/src/models/export/login.export.ts +++ b/libs/common/src/models/export/login.export.ts @@ -2,7 +2,7 @@ import { EncString } from "../../platform/models/domain/enc-string"; import { Login as LoginDomain } from "../../vault/models/domain/login"; import { LoginView } from "../../vault/models/view/login.view"; -import { Fido2KeyExport } from "./fido2key.export"; +import { Fido2CredentialExport } from "./fido2-credential.export"; import { LoginUriExport } from "./login-uri.export"; export class LoginExport { @@ -12,7 +12,7 @@ export class LoginExport { req.username = "jdoe"; req.password = "myp@ssword123"; req.totp = "JBSWY3DPEHPK3PXP"; - req.fido2Keys = [Fido2KeyExport.template()]; + req.fido2Credentials = [Fido2CredentialExport.template()]; return req; } @@ -23,8 +23,8 @@ export class LoginExport { view.username = req.username; view.password = req.password; view.totp = req.totp; - if (req.fido2Keys != null) { - view.fido2Keys = req.fido2Keys.map((key) => Fido2KeyExport.toView(key)); + if (req.fido2Credentials != null) { + view.fido2Credentials = req.fido2Credentials.map((key) => Fido2CredentialExport.toView(key)); } return view; } @@ -36,7 +36,7 @@ export class LoginExport { domain.username = req.username != null ? new EncString(req.username) : null; domain.password = req.password != null ? new EncString(req.password) : null; domain.totp = req.totp != null ? new EncString(req.totp) : null; - //left out fido2Key for now + //left out fido2Credential for now return domain; } @@ -44,7 +44,7 @@ export class LoginExport { username: string; password: string; totp: string; - fido2Keys: Fido2KeyExport[] = []; + fido2Credentials: Fido2CredentialExport[] = []; constructor(o?: LoginView | LoginDomain) { if (o == null) { @@ -59,8 +59,8 @@ export class LoginExport { } } - if (o.fido2Keys != null) { - this.fido2Keys = o.fido2Keys.map((key) => new Fido2KeyExport(key)); + if (o.fido2Credentials != null) { + this.fido2Credentials = o.fido2Credentials.map((key) => new Fido2CredentialExport(key)); } if (o instanceof LoginView) { diff --git a/libs/common/src/vault/api/fido2-key.api.ts b/libs/common/src/vault/api/fido2-credential.api.ts similarity index 95% rename from libs/common/src/vault/api/fido2-key.api.ts rename to libs/common/src/vault/api/fido2-credential.api.ts index 2205ff089bf..bfe32fc9b56 100644 --- a/libs/common/src/vault/api/fido2-key.api.ts +++ b/libs/common/src/vault/api/fido2-credential.api.ts @@ -1,6 +1,6 @@ import { BaseResponse } from "../../models/response/base.response"; -export class Fido2KeyApi extends BaseResponse { +export class Fido2CredentialApi extends BaseResponse { credentialId: string; keyType: "public-key"; keyAlgorithm: "ECDSA"; diff --git a/libs/common/src/vault/models/data/fido2-key.data.ts b/libs/common/src/vault/models/data/fido2-credential.data.ts similarity index 84% rename from libs/common/src/vault/models/data/fido2-key.data.ts rename to libs/common/src/vault/models/data/fido2-credential.data.ts index 9d7f4b3b4d4..8f5160d91ba 100644 --- a/libs/common/src/vault/models/data/fido2-key.data.ts +++ b/libs/common/src/vault/models/data/fido2-credential.data.ts @@ -1,6 +1,6 @@ -import { Fido2KeyApi } from "../../api/fido2-key.api"; +import { Fido2CredentialApi } from "../../api/fido2-credential.api"; -export class Fido2KeyData { +export class Fido2CredentialData { credentialId: string; keyType: "public-key"; keyAlgorithm: "ECDSA"; @@ -14,7 +14,7 @@ export class Fido2KeyData { discoverable: string; creationDate: string; - constructor(data?: Fido2KeyApi) { + constructor(data?: Fido2CredentialApi) { if (data == null) { return; } diff --git a/libs/common/src/vault/models/data/login.data.ts b/libs/common/src/vault/models/data/login.data.ts index b3f27e6773b..0d8c71e77b4 100644 --- a/libs/common/src/vault/models/data/login.data.ts +++ b/libs/common/src/vault/models/data/login.data.ts @@ -1,6 +1,6 @@ import { LoginApi } from "../../../models/api/login.api"; -import { Fido2KeyData } from "./fido2-key.data"; +import { Fido2CredentialData } from "./fido2-credential.data"; import { LoginUriData } from "./login-uri.data"; export class LoginData { @@ -10,7 +10,7 @@ export class LoginData { passwordRevisionDate: string; totp: string; autofillOnPageLoad: boolean; - fido2Keys?: Fido2KeyData[]; + fido2Credentials?: Fido2CredentialData[]; constructor(data?: LoginApi) { if (data == null) { @@ -27,8 +27,8 @@ export class LoginData { this.uris = data.uris.map((u) => new LoginUriData(u)); } - if (data.fido2Keys) { - this.fido2Keys = data.fido2Keys?.map((key) => new Fido2KeyData(key)); + if (data.fido2Credentials) { + this.fido2Credentials = data.fido2Credentials?.map((key) => new Fido2CredentialData(key)); } } } diff --git a/libs/common/src/vault/models/domain/cipher.spec.ts b/libs/common/src/vault/models/domain/cipher.spec.ts index a4379f4d86a..33c9cec56b4 100644 --- a/libs/common/src/vault/models/domain/cipher.spec.ts +++ b/libs/common/src/vault/models/domain/cipher.spec.ts @@ -82,7 +82,7 @@ describe("Cipher DTO", () => { passwordRevisionDate: "2022-01-31T12:00:00.000Z", totp: "EncryptedString", autofillOnPageLoad: false, - fido2Keys: [], + fido2Credentials: [], }, passwordHistory: [ { password: "EncryptedString", lastUsedDate: "2022-01-31T12:00:00.000Z" }, @@ -151,7 +151,7 @@ describe("Cipher DTO", () => { password: { encryptedString: "EncryptedString", encryptionType: 0 }, totp: { encryptedString: "EncryptedString", encryptionType: 0 }, uris: [{ match: 0, uri: { encryptedString: "EncryptedString", encryptionType: 0 } }], - fido2Keys: [], + fido2Credentials: [], }, attachments: [ { diff --git a/libs/common/src/vault/models/domain/fido2-key.spec.ts b/libs/common/src/vault/models/domain/fido2-credential.spec.ts similarity index 56% rename from libs/common/src/vault/models/domain/fido2-key.spec.ts rename to libs/common/src/vault/models/domain/fido2-credential.spec.ts index 74f3c82fe51..0b2b76a19cd 100644 --- a/libs/common/src/vault/models/domain/fido2-key.spec.ts +++ b/libs/common/src/vault/models/domain/fido2-credential.spec.ts @@ -1,11 +1,11 @@ import { mockEnc } from "../../../../spec"; import { EncryptionType } from "../../../enums"; import { EncString } from "../../../platform/models/domain/enc-string"; -import { Fido2KeyData } from "../data/fido2-key.data"; +import { Fido2CredentialData } from "../data/fido2-credential.data"; -import { Fido2Key } from "./fido2-key"; +import { Fido2Credential } from "./fido2-credential"; -describe("Fido2Key", () => { +describe("Fido2Credential", () => { let mockDate: Date; beforeEach(() => { @@ -14,10 +14,10 @@ describe("Fido2Key", () => { describe("constructor", () => { it("returns all fields null when given empty data parameter", () => { - const data = new Fido2KeyData(); - const fido2Key = new Fido2Key(data); + const data = new Fido2CredentialData(); + const credential = new Fido2Credential(data); - expect(fido2Key).toEqual({ + expect(credential).toEqual({ credentialId: null, keyType: null, keyAlgorithm: null, @@ -33,8 +33,8 @@ describe("Fido2Key", () => { }); }); - it("returns all fields as EncStrings except creationDate when given full Fido2KeyData", () => { - const data: Fido2KeyData = { + it("returns all fields as EncStrings except creationDate when given full Fido2CredentialData", () => { + const data: Fido2CredentialData = { credentialId: "credentialId", keyType: "public-key", keyAlgorithm: "ECDSA", @@ -48,9 +48,9 @@ describe("Fido2Key", () => { discoverable: "discoverable", creationDate: mockDate.toISOString(), }; - const fido2Key = new Fido2Key(data); + const credential = new Fido2Credential(data); - expect(fido2Key).toEqual({ + expect(credential).toEqual({ credentialId: { encryptedString: "credentialId", encryptionType: 0 }, keyType: { encryptedString: "public-key", encryptionType: 0 }, keyAlgorithm: { encryptedString: "ECDSA", encryptionType: 0 }, @@ -67,9 +67,9 @@ describe("Fido2Key", () => { }); it("should not populate fields when data parameter is not given", () => { - const fido2Key = new Fido2Key(); + const credential = new Fido2Credential(); - expect(fido2Key).toEqual({ + expect(credential).toEqual({ credentialId: null, }); }); @@ -77,23 +77,23 @@ describe("Fido2Key", () => { describe("decrypt", () => { it("decrypts and populates all fields when populated with EncStrings", async () => { - const fido2Key = new Fido2Key(); - fido2Key.credentialId = mockEnc("credentialId"); - fido2Key.keyType = mockEnc("keyType"); - fido2Key.keyAlgorithm = mockEnc("keyAlgorithm"); - fido2Key.keyCurve = mockEnc("keyCurve"); - fido2Key.keyValue = mockEnc("keyValue"); - fido2Key.rpId = mockEnc("rpId"); - fido2Key.userHandle = mockEnc("userHandle"); - fido2Key.counter = mockEnc("2"); - fido2Key.rpName = mockEnc("rpName"); - fido2Key.userDisplayName = mockEnc("userDisplayName"); - fido2Key.discoverable = mockEnc("true"); - fido2Key.creationDate = mockDate; + const credential = new Fido2Credential(); + credential.credentialId = mockEnc("credentialId"); + credential.keyType = mockEnc("keyType"); + credential.keyAlgorithm = mockEnc("keyAlgorithm"); + credential.keyCurve = mockEnc("keyCurve"); + credential.keyValue = mockEnc("keyValue"); + credential.rpId = mockEnc("rpId"); + credential.userHandle = mockEnc("userHandle"); + credential.counter = mockEnc("2"); + credential.rpName = mockEnc("rpName"); + credential.userDisplayName = mockEnc("userDisplayName"); + credential.discoverable = mockEnc("true"); + credential.creationDate = mockDate; - const fido2KeyView = await fido2Key.decrypt(null); + const credentialView = await credential.decrypt(null); - expect(fido2KeyView).toEqual({ + expect(credentialView).toEqual({ credentialId: "credentialId", keyType: "keyType", keyAlgorithm: "keyAlgorithm", @@ -110,9 +110,9 @@ describe("Fido2Key", () => { }); }); - describe("toFido2KeyData", () => { - it("encodes to data object when converted from Fido2KeyData and back", () => { - const data: Fido2KeyData = { + describe("toFido2CredentialData", () => { + it("encodes to data object when converted from Fido2CredentialData and back", () => { + const data: Fido2CredentialData = { credentialId: "credentialId", keyType: "public-key", keyAlgorithm: "ECDSA", @@ -127,8 +127,8 @@ describe("Fido2Key", () => { creationDate: mockDate.toISOString(), }; - const fido2Key = new Fido2Key(data); - const result = fido2Key.toFido2KeyData(); + const credential = new Fido2Credential(data); + const result = credential.toFido2CredentialData(); expect(result).toEqual(data); }); @@ -136,28 +136,28 @@ describe("Fido2Key", () => { describe("fromJSON", () => { it("recreates equivalent object when converted to JSON and back", () => { - const fido2Key = new Fido2Key(); - fido2Key.credentialId = createEncryptedEncString("credentialId"); - fido2Key.keyType = createEncryptedEncString("keyType"); - fido2Key.keyAlgorithm = createEncryptedEncString("keyAlgorithm"); - fido2Key.keyCurve = createEncryptedEncString("keyCurve"); - fido2Key.keyValue = createEncryptedEncString("keyValue"); - fido2Key.rpId = createEncryptedEncString("rpId"); - fido2Key.userHandle = createEncryptedEncString("userHandle"); - fido2Key.counter = createEncryptedEncString("2"); - fido2Key.rpName = createEncryptedEncString("rpName"); - fido2Key.userDisplayName = createEncryptedEncString("userDisplayName"); - fido2Key.discoverable = createEncryptedEncString("discoverable"); - fido2Key.creationDate = mockDate; + const credential = new Fido2Credential(); + credential.credentialId = createEncryptedEncString("credentialId"); + credential.keyType = createEncryptedEncString("keyType"); + credential.keyAlgorithm = createEncryptedEncString("keyAlgorithm"); + credential.keyCurve = createEncryptedEncString("keyCurve"); + credential.keyValue = createEncryptedEncString("keyValue"); + credential.rpId = createEncryptedEncString("rpId"); + credential.userHandle = createEncryptedEncString("userHandle"); + credential.counter = createEncryptedEncString("2"); + credential.rpName = createEncryptedEncString("rpName"); + credential.userDisplayName = createEncryptedEncString("userDisplayName"); + credential.discoverable = createEncryptedEncString("discoverable"); + credential.creationDate = mockDate; - const json = JSON.stringify(fido2Key); - const result = Fido2Key.fromJSON(JSON.parse(json)); + const json = JSON.stringify(credential); + const result = Fido2Credential.fromJSON(JSON.parse(json)); - expect(result).toEqual(fido2Key); + expect(result).toEqual(credential); }); it("returns null if input is null", () => { - expect(Fido2Key.fromJSON(null)).toBeNull(); + expect(Fido2Credential.fromJSON(null)).toBeNull(); }); }); }); diff --git a/libs/common/src/vault/models/domain/fido2-key.ts b/libs/common/src/vault/models/domain/fido2-credential.ts similarity index 87% rename from libs/common/src/vault/models/domain/fido2-key.ts rename to libs/common/src/vault/models/domain/fido2-credential.ts index fc4a2b990a2..84f075458a8 100644 --- a/libs/common/src/vault/models/domain/fido2-key.ts +++ b/libs/common/src/vault/models/domain/fido2-credential.ts @@ -3,10 +3,10 @@ import { Jsonify } from "type-fest"; import Domain from "../../../platform/models/domain/domain-base"; import { EncString } from "../../../platform/models/domain/enc-string"; import { SymmetricCryptoKey } from "../../../platform/models/domain/symmetric-crypto-key"; -import { Fido2KeyData } from "../data/fido2-key.data"; -import { Fido2KeyView } from "../view/fido2-key.view"; +import { Fido2CredentialData } from "../data/fido2-credential.data"; +import { Fido2CredentialView } from "../view/fido2-credential.view"; -export class Fido2Key extends Domain { +export class Fido2Credential extends Domain { credentialId: EncString | null = null; keyType: EncString; keyAlgorithm: EncString; @@ -20,7 +20,7 @@ export class Fido2Key extends Domain { discoverable: EncString; creationDate: Date; - constructor(obj?: Fido2KeyData) { + constructor(obj?: Fido2CredentialData) { super(); if (obj == null) { return; @@ -47,9 +47,9 @@ export class Fido2Key extends Domain { this.creationDate = obj.creationDate != null ? new Date(obj.creationDate) : null; } - async decrypt(orgId: string, encKey?: SymmetricCryptoKey): Promise { + async decrypt(orgId: string, encKey?: SymmetricCryptoKey): Promise { const view = await this.decryptObj( - new Fido2KeyView(), + new Fido2CredentialView(), { credentialId: null, keyType: null, @@ -91,8 +91,8 @@ export class Fido2Key extends Domain { return view; } - toFido2KeyData(): Fido2KeyData { - const i = new Fido2KeyData(); + toFido2CredentialData(): Fido2CredentialData { + const i = new Fido2CredentialData(); i.creationDate = this.creationDate.toISOString(); this.buildDataModel(this, i, { credentialId: null, @@ -110,7 +110,7 @@ export class Fido2Key extends Domain { return i; } - static fromJSON(obj: Jsonify): Fido2Key { + static fromJSON(obj: Jsonify): Fido2Credential { if (obj == null) { return null; } @@ -128,7 +128,7 @@ export class Fido2Key extends Domain { const discoverable = EncString.fromJSON(obj.discoverable); const creationDate = obj.creationDate != null ? new Date(obj.creationDate) : null; - return Object.assign(new Fido2Key(), obj, { + return Object.assign(new Fido2Credential(), obj, { credentialId, keyType, keyAlgorithm, diff --git a/libs/common/src/vault/models/domain/login.spec.ts b/libs/common/src/vault/models/domain/login.spec.ts index ca28ee6a6d8..69b4aa7cabf 100644 --- a/libs/common/src/vault/models/domain/login.spec.ts +++ b/libs/common/src/vault/models/domain/login.spec.ts @@ -4,15 +4,15 @@ import { Substitute, Arg } from "@fluffy-spoon/substitute"; import { mockEnc, mockFromJson } from "../../../../spec"; import { UriMatchType } from "../../../enums"; import { EncryptedString, EncString } from "../../../platform/models/domain/enc-string"; -import { Fido2KeyApi } from "../../api/fido2-key.api"; +import { Fido2CredentialApi } from "../../api/fido2-credential.api"; import { LoginData } from "../../models/data/login.data"; import { Login } from "../../models/domain/login"; import { LoginUri } from "../../models/domain/login-uri"; import { LoginUriView } from "../../models/view/login-uri.view"; -import { Fido2KeyData } from "../data/fido2-key.data"; -import { Fido2KeyView } from "../view/fido2-key.view"; +import { Fido2CredentialData } from "../data/fido2-credential.data"; +import { Fido2CredentialView } from "../view/fido2-credential.view"; -import { Fido2Key } from "./fido2-key"; +import { Fido2Credential } from "./fido2-credential"; describe("Login DTO", () => { it("Convert from empty LoginData", () => { @@ -25,12 +25,12 @@ describe("Login DTO", () => { username: null, password: null, totp: null, - fido2Keys: [], + fido2Credentials: [], }); }); it("Convert from full LoginData", () => { - const fido2KeyData = initializeFido2Key(new Fido2KeyData()); + const fido2CredentialData = initializeFido2Credential(new Fido2CredentialData()); const data: LoginData = { uris: [{ uri: "uri", match: UriMatchType.Domain }], username: "username", @@ -38,7 +38,7 @@ describe("Login DTO", () => { passwordRevisionDate: "2022-01-31T12:00:00.000Z", totp: "123", autofillOnPageLoad: false, - fido2Keys: [fido2KeyData], + fido2Credentials: [fido2CredentialData], }; const login = new Login(data); @@ -49,7 +49,7 @@ describe("Login DTO", () => { password: { encryptedString: "password", encryptionType: 0 }, totp: { encryptedString: "123", encryptionType: 0 }, uris: [{ match: 0, uri: { encryptedString: "uri", encryptionType: 0 } }], - fido2Keys: [encryptFido2Key(fido2KeyData)], + fido2Credentials: [encryptFido2Credential(fido2CredentialData)], }); }); @@ -57,7 +57,7 @@ describe("Login DTO", () => { const login = new Login(); expect(login).toEqual({ - fido2Keys: [], + fido2Credentials: [], }); }); @@ -68,14 +68,16 @@ describe("Login DTO", () => { loginUri.decrypt(Arg.any()).resolves(loginUriView); const login = new Login(); - const decryptedFido2Key = Symbol(); + const decryptedFido2Credential = Symbol(); login.uris = [loginUri]; login.username = mockEnc("encrypted username"); login.password = mockEnc("encrypted password"); login.passwordRevisionDate = new Date("2022-01-31T12:00:00.000Z"); login.totp = mockEnc("encrypted totp"); login.autofillOnPageLoad = true; - login.fido2Keys = [{ decrypt: jest.fn().mockReturnValue(decryptedFido2Key) } as any]; + login.fido2Credentials = [ + { decrypt: jest.fn().mockReturnValue(decryptedFido2Credential) } as any, + ]; const loginView = await login.decrypt(null); expect(loginView).toEqual({ @@ -94,7 +96,7 @@ describe("Login DTO", () => { }, ], autofillOnPageLoad: true, - fido2Keys: [decryptedFido2Key], + fido2Credentials: [decryptedFido2Credential], }); }); @@ -106,7 +108,7 @@ describe("Login DTO", () => { passwordRevisionDate: "2022-01-31T12:00:00.000Z", totp: "123", autofillOnPageLoad: false, - fido2Keys: [initializeFido2Key(new Fido2KeyData())], + fido2Credentials: [initializeFido2Credential(new Fido2CredentialData())], }; const login = new Login(data); @@ -128,7 +130,7 @@ describe("Login DTO", () => { password: "myPassword" as EncryptedString, passwordRevisionDate: passwordRevisionDate.toISOString(), totp: "myTotp" as EncryptedString, - fido2Keys: [ + fido2Credentials: [ { credentialId: "keyId" as EncryptedString, keyType: "keyType" as EncryptedString, @@ -152,7 +154,7 @@ describe("Login DTO", () => { password: "myPassword_fromJSON", passwordRevisionDate: passwordRevisionDate, totp: "myTotp_fromJSON", - fido2Keys: [ + fido2Credentials: [ { credentialId: "keyId_fromJSON", keyType: "keyType_fromJSON", @@ -178,8 +180,8 @@ describe("Login DTO", () => { }); }); -type Fido2KeyLike = Fido2KeyData | Fido2KeyView | Fido2KeyApi; -function initializeFido2Key(key: T): T { +type Fido2CredentialLike = Fido2CredentialData | Fido2CredentialView | Fido2CredentialApi; +function initializeFido2Credential(key: T): T { key.credentialId = "credentialId"; key.keyType = "public-key"; key.keyAlgorithm = "ECDSA"; @@ -195,8 +197,8 @@ function initializeFido2Key(key: T): T { return key; } -function encryptFido2Key(key: Fido2KeyLike): Fido2Key { - const encrypted = new Fido2Key(); +function encryptFido2Credential(key: Fido2CredentialLike): Fido2Credential { + const encrypted = new Fido2Credential(); encrypted.credentialId = { encryptedString: key.credentialId, encryptionType: 0 } as EncString; encrypted.keyType = { encryptedString: key.keyType, encryptionType: 0 } as EncString; encrypted.keyAlgorithm = { encryptedString: key.keyAlgorithm, encryptionType: 0 } as EncString; diff --git a/libs/common/src/vault/models/domain/login.ts b/libs/common/src/vault/models/domain/login.ts index fe9ad15c75d..ab4827ae466 100644 --- a/libs/common/src/vault/models/domain/login.ts +++ b/libs/common/src/vault/models/domain/login.ts @@ -6,7 +6,7 @@ import { SymmetricCryptoKey } from "../../../platform/models/domain/symmetric-cr import { LoginData } from "../data/login.data"; import { LoginView } from "../view/login.view"; -import { Fido2Key } from "./fido2-key"; +import { Fido2Credential } from "./fido2-credential"; import { LoginUri } from "./login-uri"; export class Login extends Domain { @@ -16,7 +16,7 @@ export class Login extends Domain { passwordRevisionDate?: Date; totp: EncString; autofillOnPageLoad: boolean; - fido2Keys: Fido2Key[] = []; + fido2Credentials: Fido2Credential[] = []; constructor(obj?: LoginData) { super(); @@ -45,8 +45,8 @@ export class Login extends Domain { }); } - if (obj.fido2Keys) { - this.fido2Keys = obj.fido2Keys.map((key) => new Fido2Key(key)); + if (obj.fido2Credentials) { + this.fido2Credentials = obj.fido2Credentials.map((key) => new Fido2Credential(key)); } } @@ -70,8 +70,10 @@ export class Login extends Domain { } } - if (this.fido2Keys != null) { - view.fido2Keys = await Promise.all(this.fido2Keys.map((key) => key.decrypt(orgId, encKey))); + if (this.fido2Credentials != null) { + view.fido2Credentials = await Promise.all( + this.fido2Credentials.map((key) => key.decrypt(orgId, encKey)) + ); } return view; @@ -95,7 +97,7 @@ export class Login extends Domain { }); } - l.fido2Keys = this.fido2Keys.map((key) => key.toFido2KeyData()); + l.fido2Credentials = this.fido2Credentials.map((key) => key.toFido2CredentialData()); return l; } @@ -111,7 +113,8 @@ export class Login extends Domain { const passwordRevisionDate = obj.passwordRevisionDate == null ? null : new Date(obj.passwordRevisionDate); const uris = obj.uris?.map((uri: any) => LoginUri.fromJSON(uri)); - const fido2Keys = obj.fido2Keys?.map((key) => Fido2Key.fromJSON(key)) ?? []; + const fido2Credentials = + obj.fido2Credentials?.map((key) => Fido2Credential.fromJSON(key)) ?? []; return Object.assign(new Login(), obj, { username, @@ -119,7 +122,7 @@ export class Login extends Domain { totp, passwordRevisionDate, uris, - fido2Keys, + fido2Credentials, }); } } diff --git a/libs/common/src/vault/models/request/cipher.request.ts b/libs/common/src/vault/models/request/cipher.request.ts index dde20cceb63..949d36ab051 100644 --- a/libs/common/src/vault/models/request/cipher.request.ts +++ b/libs/common/src/vault/models/request/cipher.request.ts @@ -4,7 +4,7 @@ import { IdentityApi } from "../../../models/api/identity.api"; import { LoginUriApi } from "../../../models/api/login-uri.api"; import { LoginApi } from "../../../models/api/login.api"; import { SecureNoteApi } from "../../../models/api/secure-note.api"; -import { Fido2KeyApi } from "../../api/fido2-key.api"; +import { Fido2CredentialApi } from "../../api/fido2-credential.api"; import { CipherRepromptType } from "../../enums/cipher-reprompt-type"; import { CipherType } from "../../enums/cipher-type"; import { Cipher } from "../domain/cipher"; @@ -65,9 +65,9 @@ export class CipherRequest { }); } - if (cipher.login.fido2Keys != null) { - this.login.fido2Keys = cipher.login.fido2Keys.map((key) => { - const keyApi = new Fido2KeyApi(); + if (cipher.login.fido2Credentials != null) { + this.login.fido2Credentials = cipher.login.fido2Credentials.map((key) => { + const keyApi = new Fido2CredentialApi(); keyApi.credentialId = key.credentialId != null ? key.credentialId.encryptedString : null; keyApi.keyType = diff --git a/libs/common/src/vault/models/view/fido2-key.view.ts b/libs/common/src/vault/models/view/fido2-credential.view.ts similarity index 73% rename from libs/common/src/vault/models/view/fido2-key.view.ts rename to libs/common/src/vault/models/view/fido2-credential.view.ts index 2ff03d368ab..b6894e84ff5 100644 --- a/libs/common/src/vault/models/view/fido2-key.view.ts +++ b/libs/common/src/vault/models/view/fido2-credential.view.ts @@ -2,7 +2,7 @@ import { Jsonify } from "type-fest"; import { ItemView } from "./item.view"; -export class Fido2KeyView extends ItemView { +export class Fido2CredentialView extends ItemView { credentialId: string; keyType: "public-key"; keyAlgorithm: "ECDSA"; @@ -20,9 +20,9 @@ export class Fido2KeyView extends ItemView { return this.userDisplayName; } - static fromJSON(obj: Partial>): Fido2KeyView { + static fromJSON(obj: Partial>): Fido2CredentialView { const creationDate = obj.creationDate != null ? new Date(obj.creationDate) : null; - return Object.assign(new Fido2KeyView(), obj, { + return Object.assign(new Fido2CredentialView(), obj, { creationDate, }); } diff --git a/libs/common/src/vault/models/view/login.view.ts b/libs/common/src/vault/models/view/login.view.ts index 9518725ad12..a55943dda04 100644 --- a/libs/common/src/vault/models/view/login.view.ts +++ b/libs/common/src/vault/models/view/login.view.ts @@ -5,7 +5,7 @@ import { linkedFieldOption } from "../../../misc/linkedFieldOption.decorator"; import { Utils } from "../../../platform/misc/utils"; import { Login } from "../domain/login"; -import { Fido2KeyView } from "./fido2-key.view"; +import { Fido2CredentialView } from "./fido2-credential.view"; import { ItemView } from "./item.view"; import { LoginUriView } from "./login-uri.view"; @@ -19,7 +19,7 @@ export class LoginView extends ItemView { totp: string = null; uris: LoginUriView[] = null; autofillOnPageLoad: boolean = null; - fido2Keys: Fido2KeyView[] = []; + fido2Credentials: Fido2CredentialView[] = []; constructor(l?: Login) { super(); @@ -81,12 +81,13 @@ export class LoginView extends ItemView { const passwordRevisionDate = obj.passwordRevisionDate == null ? null : new Date(obj.passwordRevisionDate); const uris = obj.uris?.map((uri: any) => LoginUriView.fromJSON(uri)); - const fido2Keys = obj.fido2Keys?.map((key) => Fido2KeyView.fromJSON(key)) ?? []; + const fido2Credentials = + obj.fido2Credentials?.map((key) => Fido2CredentialView.fromJSON(key)) ?? []; return Object.assign(new LoginView(), obj, { passwordRevisionDate, uris, - fido2Keys, + fido2Credentials, }); } } diff --git a/libs/common/src/vault/services/cipher.service.ts b/libs/common/src/vault/services/cipher.service.ts index e2c27fa7297..b5090a14883 100644 --- a/libs/common/src/vault/services/cipher.service.ts +++ b/libs/common/src/vault/services/cipher.service.ts @@ -30,7 +30,7 @@ import { CipherData } from "../models/data/cipher.data"; import { Attachment } from "../models/domain/attachment"; import { Card } from "../models/domain/card"; import { Cipher } from "../models/domain/cipher"; -import { Fido2Key } from "../models/domain/fido2-key"; +import { Fido2Credential } from "../models/domain/fido2-credential"; import { Field } from "../models/domain/field"; import { Identity } from "../models/domain/identity"; import { Login } from "../models/domain/login"; @@ -1138,10 +1138,10 @@ export class CipherService implements CipherServiceAbstraction { } } - if (model.login.fido2Keys != null) { - cipher.login.fido2Keys = await Promise.all( - model.login.fido2Keys.map(async (viewKey) => { - const domainKey = new Fido2Key(); + if (model.login.fido2Credentials != null) { + cipher.login.fido2Credentials = await Promise.all( + model.login.fido2Credentials.map(async (viewKey) => { + const domainKey = new Fido2Credential(); await this.encryptObjProperty( viewKey, domainKey, diff --git a/libs/common/src/vault/services/fido2/fido2-authenticator.service.spec.ts b/libs/common/src/vault/services/fido2/fido2-authenticator.service.spec.ts index a275deca2cc..93c0becaa21 100644 --- a/libs/common/src/vault/services/fido2/fido2-authenticator.service.spec.ts +++ b/libs/common/src/vault/services/fido2/fido2-authenticator.service.spec.ts @@ -18,7 +18,7 @@ import { SyncService } from "../../abstractions/sync/sync.service.abstraction"; import { CipherType } from "../../enums/cipher-type"; import { Cipher } from "../../models/domain/cipher"; import { CipherView } from "../../models/view/cipher.view"; -import { Fido2KeyView } from "../../models/view/fido2-key.view"; +import { Fido2CredentialView } from "../../models/view/fido2-credential.view"; import { LoginView } from "../../models/view/login.view"; import { CBOR } from "./cbor"; @@ -116,7 +116,7 @@ describe("FidoAuthenticatorService", () => { params = await createParams({ excludeCredentialDescriptorList: [ { - id: guidToRawFormat(excludedCipher.login.fido2Keys[0].credentialId), + id: guidToRawFormat(excludedCipher.login.fido2Credentials[0].credentialId), type: "public-key", }, ], @@ -234,7 +234,7 @@ describe("FidoAuthenticatorService", () => { name: existingCipher.name, login: expect.objectContaining({ - fido2Keys: [ + fido2Credentials: [ expect.objectContaining({ credentialId: expect.anything(), keyType: "public-key", @@ -304,7 +304,7 @@ describe("FidoAuthenticatorService", () => { ); cipherService.getAllDecrypted.mockResolvedValue([await cipher]); cipherService.encrypt.mockImplementation(async (cipher) => { - cipher.login.fido2Keys[0].credentialId = credentialId; // Replace id for testability + cipher.login.fido2Credentials[0].credentialId = credentialId; // Replace id for testability return {} as any; }); cipherService.createWithServer.mockImplementation(async (cipher) => { @@ -466,8 +466,8 @@ describe("FidoAuthenticatorService", () => { it("should inform user if credential exists but rpId does not match", async () => { const cipher = await createCipherView({ type: CipherType.Login }); - cipher.login.fido2Keys[0].credentialId = credentialId; - cipher.login.fido2Keys[0].rpId = "mismatch-rpid"; + cipher.login.fido2Credentials[0].credentialId = credentialId; + cipher.login.fido2Credentials[0].rpId = "mismatch-rpid"; cipherService.getAllDecrypted.mockResolvedValue([cipher]); userInterfaceSession.informCredentialNotFound.mockResolvedValue(); @@ -542,7 +542,7 @@ describe("FidoAuthenticatorService", () => { it("should only ask for discoverable credentials matched by rpId when params does not contains allowedCredentials list", async () => { params.allowCredentialDescriptorList = undefined; - const discoverableCiphers = ciphers.filter((c) => c.login.fido2Keys[0].discoverable); + const discoverableCiphers = ciphers.filter((c) => c.login.fido2Credentials[0].discoverable); userInterfaceSession.pickCredential.mockResolvedValue({ cipherId: discoverableCiphers[0].id, userVerified: false, @@ -592,7 +592,7 @@ describe("FidoAuthenticatorService", () => { let credentialIds: string[]; let selectedCredentialId: string; let ciphers: CipherView[]; - let fido2Keys: Fido2KeyView[]; + let fido2Credentials: Fido2CredentialView[]; let params: Fido2AuthenticatorGetAssertionParams; const init = async () => { @@ -607,7 +607,7 @@ describe("FidoAuthenticatorService", () => { { credentialId: id, rpId: RpId, counter: 9000, keyValue } ) ); - fido2Keys = ciphers.map((c) => c.login.fido2Keys[0]); + fido2Credentials = ciphers.map((c) => c.login.fido2Credentials[0]); selectedCredentialId = credentialIds[0]; params = await createParams({ allowCredentialDescriptorList: credentialIds.map((credentialId) => ({ @@ -637,7 +637,7 @@ describe("FidoAuthenticatorService", () => { expect.objectContaining({ id: ciphers[0].id, login: expect.objectContaining({ - fido2Keys: [ + fido2Credentials: [ expect.objectContaining({ counter: 9001, }), @@ -657,7 +657,7 @@ describe("FidoAuthenticatorService", () => { expect(result.selectedCredential.id).toEqual(guidToRawFormat(selectedCredentialId)); expect(result.selectedCredential.userHandle).toEqual( - Fido2Utils.stringToBuffer(fido2Keys[0].userHandle) + Fido2Utils.stringToBuffer(fido2Credentials[0].userHandle) ); expect(rpIdHash).toEqual( new Uint8Array([ @@ -740,28 +740,29 @@ describe("FidoAuthenticatorService", () => { }); function createCipherView( - data: Partial> = {}, - fido2Key: Partial = {} + data: Partial> = {}, + fido2Credential: Partial = {} ): CipherView { const cipher = new CipherView(); cipher.id = data.id ?? Utils.newGuid(); cipher.type = CipherType.Login; cipher.localData = {}; - const fido2KeyView = new Fido2KeyView(); - fido2KeyView.credentialId = fido2Key.credentialId ?? Utils.newGuid(); - fido2KeyView.rpId = fido2Key.rpId ?? RpId; - fido2KeyView.counter = fido2Key.counter ?? 0; - fido2KeyView.userHandle = fido2Key.userHandle ?? Fido2Utils.bufferToString(randomBytes(16)); - fido2KeyView.keyAlgorithm = fido2Key.keyAlgorithm ?? "ECDSA"; - fido2KeyView.keyCurve = fido2Key.keyCurve ?? "P-256"; - fido2KeyView.discoverable = fido2Key.discoverable ?? true; - fido2KeyView.keyValue = - fido2KeyView.keyValue ?? + const fido2CredentialView = new Fido2CredentialView(); + fido2CredentialView.credentialId = fido2Credential.credentialId ?? Utils.newGuid(); + fido2CredentialView.rpId = fido2Credential.rpId ?? RpId; + fido2CredentialView.counter = fido2Credential.counter ?? 0; + fido2CredentialView.userHandle = + fido2Credential.userHandle ?? Fido2Utils.bufferToString(randomBytes(16)); + fido2CredentialView.keyAlgorithm = fido2Credential.keyAlgorithm ?? "ECDSA"; + fido2CredentialView.keyCurve = fido2Credential.keyCurve ?? "P-256"; + fido2CredentialView.discoverable = fido2Credential.discoverable ?? true; + fido2CredentialView.keyValue = + fido2CredentialView.keyValue ?? "MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgTC-7XDZipXbaVBlnkjlBgO16ZmqBZWejK2iYo6lV0dehRANCAASOcM2WduNq1DriRYN7ZekvZz-bRhA-qNT4v0fbp5suUFJyWmgOQ0bybZcLXHaerK5Ep1JiSrQcewtQNgLtry7f"; cipher.login = new LoginView(); - cipher.login.fido2Keys = [fido2KeyView]; + cipher.login.fido2Credentials = [fido2CredentialView]; return cipher; } diff --git a/libs/common/src/vault/services/fido2/fido2-authenticator.service.ts b/libs/common/src/vault/services/fido2/fido2-authenticator.service.ts index 895e5ba4cef..801f7622f9d 100644 --- a/libs/common/src/vault/services/fido2/fido2-authenticator.service.ts +++ b/libs/common/src/vault/services/fido2/fido2-authenticator.service.ts @@ -16,7 +16,7 @@ import { Fido2UserInterfaceService } from "../../abstractions/fido2/fido2-user-i import { SyncService } from "../../abstractions/sync/sync.service.abstraction"; import { CipherType } from "../../enums/cipher-type"; import { CipherView } from "../../models/view/cipher.view"; -import { Fido2KeyView } from "../../models/view/fido2-key.view"; +import { Fido2CredentialView } from "../../models/view/fido2-credential.view"; import { CBOR } from "./cbor"; import { joseToDer } from "./ecdsa-utils"; @@ -101,7 +101,7 @@ export class Fido2AuthenticatorService implements Fido2AuthenticatorServiceAbstr } let cipher: CipherView; - let fido2Key: Fido2KeyView; + let fido2Credential: Fido2CredentialView; let keyPair: CryptoKeyPair; let userVerified = false; let credentialId: string; @@ -134,11 +134,11 @@ export class Fido2AuthenticatorService implements Fido2AuthenticatorServiceAbstr cipher = await encrypted.decrypt( await this.cipherService.getKeyForCipherKeyDecryption(encrypted) ); - fido2Key = await createKeyView(params, keyPair.privateKey); - cipher.login.fido2Keys = [fido2Key]; + fido2Credential = await createKeyView(params, keyPair.privateKey); + cipher.login.fido2Credentials = [fido2Credential]; const reencrypted = await this.cipherService.encrypt(cipher); await this.cipherService.updateWithServer(reencrypted); - credentialId = fido2Key.credentialId; + credentialId = fido2Credential.credentialId; } catch (error) { this.logService?.error( `[Fido2Authenticator] Aborting because of unknown error when creating credential: ${error}` @@ -149,7 +149,7 @@ export class Fido2AuthenticatorService implements Fido2AuthenticatorServiceAbstr const authData = await generateAuthData({ rpId: params.rpEntity.id, credentialId: guidToRawFormat(credentialId), - counter: fido2Key.counter, + counter: fido2Credential.counter, userPresence: true, userVerification: userVerified, keyPair, @@ -239,10 +239,10 @@ export class Fido2AuthenticatorService implements Fido2AuthenticatorServiceAbstr } try { - const selectedFido2Key = selectedCipher.login.fido2Keys[0]; - const selectedCredentialId = selectedFido2Key.credentialId; + const selectedFido2Credential = selectedCipher.login.fido2Credentials[0]; + const selectedCredentialId = selectedFido2Credential.credentialId; - ++selectedFido2Key.counter; + ++selectedFido2Credential.counter; selectedCipher.localData = { ...selectedCipher.localData, @@ -252,9 +252,9 @@ export class Fido2AuthenticatorService implements Fido2AuthenticatorServiceAbstr await this.cipherService.updateWithServer(encrypted); const authenticatorData = await generateAuthData({ - rpId: selectedFido2Key.rpId, + rpId: selectedFido2Credential.rpId, credentialId: guidToRawFormat(selectedCredentialId), - counter: selectedFido2Key.counter, + counter: selectedFido2Credential.counter, userPresence: true, userVerification: userVerified, }); @@ -262,14 +262,14 @@ export class Fido2AuthenticatorService implements Fido2AuthenticatorServiceAbstr const signature = await generateSignature({ authData: authenticatorData, clientDataHash: params.hash, - privateKey: await getPrivateKeyFromFido2Key(selectedFido2Key), + privateKey: await getPrivateKeyFromFido2Credential(selectedFido2Credential), }); return { authenticatorData, selectedCredential: { id: guidToRawFormat(selectedCredentialId), - userHandle: Fido2Utils.stringToBuffer(selectedFido2Key.userHandle), + userHandle: Fido2Utils.stringToBuffer(selectedFido2Credential.userHandle), }, signature, }; @@ -308,8 +308,8 @@ export class Fido2AuthenticatorService implements Fido2AuthenticatorServiceAbstr !cipher.isDeleted && cipher.organizationId == undefined && cipher.type === CipherType.Login && - cipher.login.fido2Keys.length > 0 && - ids.includes(cipher.login.fido2Keys[0].credentialId) + cipher.login.fido2Credentials.length > 0 && + ids.includes(cipher.login.fido2Credentials[0].credentialId) ) .map((cipher) => cipher.id); } @@ -336,9 +336,9 @@ export class Fido2AuthenticatorService implements Fido2AuthenticatorServiceAbstr (cipher) => !cipher.isDeleted && cipher.type === CipherType.Login && - cipher.login.fido2Keys.length > 0 && - cipher.login.fido2Keys[0].rpId === rpId && - ids.includes(cipher.login.fido2Keys[0].credentialId) + cipher.login.fido2Credentials.length > 0 && + cipher.login.fido2Credentials[0].rpId === rpId && + ids.includes(cipher.login.fido2Credentials[0].credentialId) ); } @@ -348,9 +348,9 @@ export class Fido2AuthenticatorService implements Fido2AuthenticatorServiceAbstr (cipher) => !cipher.isDeleted && cipher.type === CipherType.Login && - cipher.login.fido2Keys.length > 0 && - cipher.login.fido2Keys[0].rpId === rpId && - cipher.login.fido2Keys[0].discoverable + cipher.login.fido2Credentials.length > 0 && + cipher.login.fido2Credentials[0].rpId === rpId && + cipher.login.fido2Credentials[0].discoverable ); } } @@ -369,37 +369,39 @@ async function createKeyPair() { async function createKeyView( params: Fido2AuthenticatorMakeCredentialsParams, keyValue: CryptoKey -): Promise { +): Promise { if (keyValue.algorithm.name !== "ECDSA" && (keyValue.algorithm as any).namedCurve !== "P-256") { throw new Fido2AutenticatorError(Fido2AutenticatorErrorCode.Unknown); } const pkcs8Key = await crypto.subtle.exportKey("pkcs8", keyValue); - const fido2Key = new Fido2KeyView(); - fido2Key.credentialId = Utils.newGuid(); - fido2Key.keyType = "public-key"; - fido2Key.keyAlgorithm = "ECDSA"; - fido2Key.keyCurve = "P-256"; - fido2Key.keyValue = Fido2Utils.bufferToString(pkcs8Key); - fido2Key.rpId = params.rpEntity.id; - fido2Key.userHandle = Fido2Utils.bufferToString(params.userEntity.id); - fido2Key.counter = 0; - fido2Key.rpName = params.rpEntity.name; - fido2Key.userDisplayName = params.userEntity.displayName; - fido2Key.discoverable = params.requireResidentKey; - fido2Key.creationDate = new Date(); + const fido2Credential = new Fido2CredentialView(); + fido2Credential.credentialId = Utils.newGuid(); + fido2Credential.keyType = "public-key"; + fido2Credential.keyAlgorithm = "ECDSA"; + fido2Credential.keyCurve = "P-256"; + fido2Credential.keyValue = Fido2Utils.bufferToString(pkcs8Key); + fido2Credential.rpId = params.rpEntity.id; + fido2Credential.userHandle = Fido2Utils.bufferToString(params.userEntity.id); + fido2Credential.counter = 0; + fido2Credential.rpName = params.rpEntity.name; + fido2Credential.userDisplayName = params.userEntity.displayName; + fido2Credential.discoverable = params.requireResidentKey; + fido2Credential.creationDate = new Date(); - return fido2Key; + return fido2Credential; } -async function getPrivateKeyFromFido2Key(fido2Key: Fido2KeyView): Promise { - const keyBuffer = Fido2Utils.stringToBuffer(fido2Key.keyValue); +async function getPrivateKeyFromFido2Credential( + fido2Credential: Fido2CredentialView +): Promise { + const keyBuffer = Fido2Utils.stringToBuffer(fido2Credential.keyValue); return await crypto.subtle.importKey( "pkcs8", keyBuffer, { - name: fido2Key.keyAlgorithm, - namedCurve: fido2Key.keyCurve, + name: fido2Credential.keyAlgorithm, + namedCurve: fido2Credential.keyCurve, } as EcKeyImportParams, true, KeyUsages