1
0
mirror of https://github.com/bitwarden/browser synced 2025-12-22 03:03:43 +00:00
Files
browser/libs/common/src/vault/models/domain/fido2-credential.ts
Bernd Schoolmann 395e4f2c05 [PM-27591] Remove orgid in vault decryption code (#17099)
* Remove orgid in vault decryption code

* Remove folder usage without provided key

* Fix folder test

* Fix build

* Fix build

* Fix build

* Fix tests

* Update spec to not use EncString decrypt

* Fix tests

* Fix test

* Fix test

* Remove comment

* Remove org id parameter
2025-12-08 07:09:43 -07:00

184 lines
6.0 KiB
TypeScript

import { Jsonify } from "type-fest";
import { Fido2Credential as SdkFido2Credential } from "@bitwarden/sdk-internal";
import { EncString } from "../../../key-management/crypto/models/enc-string";
import Domain from "../../../platform/models/domain/domain-base";
import { SymmetricCryptoKey } from "../../../platform/models/domain/symmetric-crypto-key";
import { conditionalEncString, encStringFrom } from "../../utils/domain-utils";
import { Fido2CredentialData } from "../data/fido2-credential.data";
import { Fido2CredentialView } from "../view/fido2-credential.view";
export class Fido2Credential extends Domain {
credentialId!: EncString;
keyType!: EncString;
keyAlgorithm!: EncString;
keyCurve!: EncString;
keyValue!: EncString;
rpId!: EncString;
userHandle?: EncString;
userName?: EncString;
counter!: EncString;
rpName?: EncString;
userDisplayName?: EncString;
discoverable!: EncString;
creationDate!: Date;
constructor(obj?: Fido2CredentialData) {
super();
if (obj == null) {
this.creationDate = new Date();
return;
}
this.credentialId = new EncString(obj.credentialId);
this.keyType = new EncString(obj.keyType);
this.keyAlgorithm = new EncString(obj.keyAlgorithm);
this.keyCurve = new EncString(obj.keyCurve);
this.keyValue = new EncString(obj.keyValue);
this.rpId = new EncString(obj.rpId);
this.counter = new EncString(obj.counter);
this.discoverable = new EncString(obj.discoverable);
this.userHandle = conditionalEncString(obj.userHandle);
this.userName = conditionalEncString(obj.userName);
this.rpName = conditionalEncString(obj.rpName);
this.userDisplayName = conditionalEncString(obj.userDisplayName);
this.creationDate = new Date(obj.creationDate);
}
async decrypt(decryptionKey: SymmetricCryptoKey): Promise<Fido2CredentialView> {
const view = await this.decryptObj<Fido2Credential, Fido2CredentialView>(
this,
new Fido2CredentialView(),
[
"credentialId",
"keyType",
"keyAlgorithm",
"keyCurve",
"keyValue",
"rpId",
"userHandle",
"userName",
"rpName",
"userDisplayName",
],
decryptionKey,
);
const { counter } = await this.decryptObj<
Fido2Credential,
{
counter: string;
}
>(this, { counter: "" }, ["counter"], decryptionKey);
// Counter will end up as NaN if this fails
view.counter = parseInt(counter);
const { discoverable } = await this.decryptObj<Fido2Credential, { discoverable: string }>(
this,
{ discoverable: "" },
["discoverable"],
decryptionKey,
);
view.discoverable = discoverable === "true";
view.creationDate = this.creationDate;
return view;
}
toFido2CredentialData(): Fido2CredentialData {
const i = new Fido2CredentialData();
i.creationDate = this.creationDate.toISOString();
this.buildDataModel(this, i, {
credentialId: null,
keyType: null,
keyAlgorithm: null,
keyCurve: null,
keyValue: null,
rpId: null,
userHandle: null,
userName: null,
counter: null,
rpName: null,
userDisplayName: null,
discoverable: null,
});
return i;
}
static fromJSON(obj: Jsonify<Fido2Credential> | undefined): Fido2Credential | undefined {
if (obj == null) {
return undefined;
}
const credential = new Fido2Credential();
credential.credentialId = EncString.fromJSON(obj.credentialId);
credential.keyType = EncString.fromJSON(obj.keyType);
credential.keyAlgorithm = EncString.fromJSON(obj.keyAlgorithm);
credential.keyCurve = EncString.fromJSON(obj.keyCurve);
credential.keyValue = EncString.fromJSON(obj.keyValue);
credential.rpId = EncString.fromJSON(obj.rpId);
credential.userHandle = encStringFrom(obj.userHandle);
credential.userName = encStringFrom(obj.userName);
credential.counter = EncString.fromJSON(obj.counter);
credential.rpName = encStringFrom(obj.rpName);
credential.userDisplayName = encStringFrom(obj.userDisplayName);
credential.discoverable = EncString.fromJSON(obj.discoverable);
credential.creationDate = new Date(obj.creationDate);
return credential;
}
/**
* Maps Fido2Credential to SDK format.
*
* @returns {SdkFido2Credential} The SDK Fido2Credential object.
*/
toSdkFido2Credential(): SdkFido2Credential {
return {
credentialId: this.credentialId?.toSdk(),
keyType: this.keyType.toSdk(),
keyAlgorithm: this.keyAlgorithm.toSdk(),
keyCurve: this.keyCurve.toSdk(),
keyValue: this.keyValue.toSdk(),
rpId: this.rpId.toSdk(),
userHandle: this.userHandle?.toSdk(),
userName: this.userName?.toSdk(),
counter: this.counter.toSdk(),
rpName: this.rpName?.toSdk(),
userDisplayName: this.userDisplayName?.toSdk(),
discoverable: this.discoverable?.toSdk(),
creationDate: this.creationDate.toISOString(),
};
}
/**
* Maps an SDK Fido2Credential object to a Fido2Credential
* @param obj - The SDK Fido2Credential object
*/
static fromSdkFido2Credential(obj?: SdkFido2Credential): Fido2Credential | undefined {
if (obj == null) {
return undefined;
}
const credential = new Fido2Credential();
credential.credentialId = EncString.fromJSON(obj.credentialId);
credential.keyType = EncString.fromJSON(obj.keyType);
credential.keyAlgorithm = EncString.fromJSON(obj.keyAlgorithm);
credential.keyCurve = EncString.fromJSON(obj.keyCurve);
credential.keyValue = EncString.fromJSON(obj.keyValue);
credential.rpId = EncString.fromJSON(obj.rpId);
credential.counter = EncString.fromJSON(obj.counter);
credential.userHandle = encStringFrom(obj.userHandle);
credential.userName = encStringFrom(obj.userName);
credential.rpName = encStringFrom(obj.rpName);
credential.userDisplayName = encStringFrom(obj.userDisplayName);
credential.discoverable = EncString.fromJSON(obj.discoverable);
credential.creationDate = new Date(obj.creationDate);
return credential;
}
}