Get either 'Bitwarden' and 'Bitwarden_biometric' keys. (#1904)

* Get either 'Bitwarden' and 'Bitwarden_biometric' keys.

* Fix let var typo

* Fix string handling error

* Retrieve biometric key from Desktop

* Null check key
This commit is contained in:
Matt Gibson 2021-06-22 16:11:29 -04:00 committed by GitHub
parent 20df6fe230
commit f35f3550a7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 22 additions and 4 deletions

View File

@ -10,7 +10,6 @@ import {
CollectionService, CollectionService,
ConstantsService, ConstantsService,
ContainerService, ContainerService,
CryptoService,
EnvironmentService, EnvironmentService,
FolderService, FolderService,
PasswordGenerationService, PasswordGenerationService,
@ -82,6 +81,7 @@ import WindowsBackground from './windows.background';
import { PopupUtilsService } from '../popup/services/popup-utils.service'; import { PopupUtilsService } from '../popup/services/popup-utils.service';
import AutofillService from '../services/autofill.service'; import AutofillService from '../services/autofill.service';
import { BrowserCryptoService } from '../services/browserCrypto.service';
import BrowserMessagingService from '../services/browserMessaging.service'; import BrowserMessagingService from '../services/browserMessaging.service';
import BrowserPlatformUtilsService from '../services/browserPlatformUtils.service'; import BrowserPlatformUtilsService from '../services/browserPlatformUtils.service';
import BrowserStorageService from '../services/browserStorage.service'; import BrowserStorageService from '../services/browserStorage.service';
@ -173,7 +173,7 @@ export default class MainBackground {
this.i18nService = new I18nService(BrowserApi.getUILanguage(window)); this.i18nService = new I18nService(BrowserApi.getUILanguage(window));
this.cryptoFunctionService = new WebCryptoFunctionService(window, this.platformUtilsService); this.cryptoFunctionService = new WebCryptoFunctionService(window, this.platformUtilsService);
this.consoleLogService = new ConsoleLogService(false); this.consoleLogService = new ConsoleLogService(false);
this.cryptoService = new CryptoService(this.storageService, this.secureStorageService, this.cryptoService = new BrowserCryptoService(this.storageService, this.secureStorageService,
this.cryptoFunctionService, this.platformUtilsService, this.consoleLogService); this.cryptoFunctionService, this.platformUtilsService, this.consoleLogService);
this.tokenService = new TokenService(this.storageService); this.tokenService = new TokenService(this.storageService);
this.appIdService = new AppIdService(this.storageService); this.appIdService = new AppIdService(this.storageService);

View File

@ -4,6 +4,7 @@ import LocalAuthentication
let SFExtensionMessageKey = "message" let SFExtensionMessageKey = "message"
let ServiceName = "Bitwarden" let ServiceName = "Bitwarden"
let ServiceNameBiometric = ServiceName + "_biometric"
class SafariWebExtensionHandler: NSObject, NSExtensionRequestHandling { class SafariWebExtensionHandler: NSObject, NSExtensionRequestHandling {
@ -118,8 +119,11 @@ class SafariWebExtensionHandler: NSObject, NSExtensionRequestHandling {
var passwordLength: UInt32 = 0 var passwordLength: UInt32 = 0
var passwordPtr: UnsafeMutableRawPointer? = nil var passwordPtr: UnsafeMutableRawPointer? = nil
let status = SecKeychainFindGenericPassword(nil, UInt32(ServiceName.utf8.count), ServiceName, UInt32(passwordName.utf8.count), passwordName, &passwordLength, &passwordPtr, nil) var status = SecKeychainFindGenericPassword(nil, UInt32(ServiceNameBiometric.utf8.count), ServiceNameBiometric, UInt32(passwordName.utf8.count), passwordName, &passwordLength, &passwordPtr, nil)
if status != errSecSuccess {
status = SecKeychainFindGenericPassword(nil, UInt32(ServiceName.utf8.count), ServiceName, UInt32(passwordName.utf8.count), passwordName, &passwordLength, &passwordPtr, nil)
}
if status == errSecSuccess { if status == errSecSuccess {
let result = NSString(bytes: passwordPtr!, length: Int(passwordLength), encoding: String.Encoding.utf8.rawValue) as String? let result = NSString(bytes: passwordPtr!, length: Int(passwordLength), encoding: String.Encoding.utf8.rawValue) as String?
SecKeychainItemFreeContent(nil, passwordPtr) SecKeychainItemFreeContent(nil, passwordPtr)

View File

@ -0,0 +1,14 @@
import { KeySuffixOptions } from 'jslib-common/abstractions/storage.service';
import { CryptoService } from 'jslib-common/services/crypto.service';
export class BrowserCryptoService extends CryptoService {
protected async retrieveKeyFromStorage(keySuffix: KeySuffixOptions) {
if (keySuffix === 'biometric') {
await this.platformUtilService.authenticateBiometric();
return (await this.getKey())?.keyB64;
}
return await super.retrieveKeyFromStorage(keySuffix);
}
}