import { Component, OnInit } from "@angular/core"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { CryptoService } from "@bitwarden/common/abstractions/crypto.service"; import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/abstractions/log.service"; import { MessagingService } from "@bitwarden/common/abstractions/messaging.service"; import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service"; import { StateService } from "@bitwarden/common/abstractions/state.service"; import { DEFAULT_PBKDF2_ITERATIONS, KdfType } from "@bitwarden/common/enums/kdfType"; import { KdfRequest } from "@bitwarden/common/models/request/kdf.request"; @Component({ selector: "app-change-kdf", templateUrl: "change-kdf.component.html", }) export class ChangeKdfComponent implements OnInit { masterPassword: string; kdfIterations: number; kdf = KdfType.PBKDF2_SHA256; kdfOptions: any[] = []; formPromise: Promise; recommendedKdfIterations = DEFAULT_PBKDF2_ITERATIONS; constructor( private apiService: ApiService, private i18nService: I18nService, private platformUtilsService: PlatformUtilsService, private cryptoService: CryptoService, private messagingService: MessagingService, private logService: LogService, private stateService: StateService ) { this.kdfOptions = [{ name: "PBKDF2 SHA-256", value: KdfType.PBKDF2_SHA256 }]; } async ngOnInit() { this.kdf = await this.stateService.getKdfType(); this.kdfIterations = await this.stateService.getKdfIterations(); } async submit() { const hasEncKey = await this.cryptoService.hasEncKey(); if (!hasEncKey) { this.platformUtilsService.showToast("error", null, this.i18nService.t("updateKey")); return; } const request = new KdfRequest(); request.kdf = this.kdf; request.kdfIterations = this.kdfIterations; request.masterPasswordHash = await this.cryptoService.hashPassword(this.masterPassword, null); const email = await this.stateService.getEmail(); const newKey = await this.cryptoService.makeKey( this.masterPassword, email, this.kdf, this.kdfIterations ); request.newMasterPasswordHash = await this.cryptoService.hashPassword( this.masterPassword, newKey ); const newEncKey = await this.cryptoService.remakeEncKey(newKey); request.key = newEncKey[1].encryptedString; try { this.formPromise = this.apiService.postAccountKdf(request); await this.formPromise; this.platformUtilsService.showToast( "success", this.i18nService.t("encKeySettingsChanged"), this.i18nService.t("logBackIn") ); this.messagingService.send("logout"); } catch (e) { this.logService.error(e); } } }