From 0e734a59ae939bd4f85a7b0d4e2d4625aed9c1c6 Mon Sep 17 00:00:00 2001 From: Jared Snider Date: Fri, 21 Mar 2025 17:08:38 -0400 Subject: [PATCH] DefaultOpaqueKeyExchangeService WIP test suite --- ...efault-opaque-key-exchange.service.spec.ts | 105 ++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 libs/common/src/auth/opaque/default-opaque-key-exchange.service.spec.ts diff --git a/libs/common/src/auth/opaque/default-opaque-key-exchange.service.spec.ts b/libs/common/src/auth/opaque/default-opaque-key-exchange.service.spec.ts new file mode 100644 index 00000000000..96df2ef5c85 --- /dev/null +++ b/libs/common/src/auth/opaque/default-opaque-key-exchange.service.spec.ts @@ -0,0 +1,105 @@ +import { MockProxy, mock } from "jest-mock-extended"; +import { BehaviorSubject } from "rxjs"; + +import { BitwardenClient } from "@bitwarden/sdk-internal"; + +import { EncryptService } from "../../key-management/crypto/abstractions/encrypt.service"; +import { LogService } from "../../platform/abstractions/log.service"; +import { SdkService } from "../../platform/abstractions/sdk/sdk.service"; +import { SymmetricCryptoKey } from "../../platform/models/domain/symmetric-crypto-key"; +import { UserKey } from "../../types/key"; + +import { DefaultOpaqueKeyExchangeService } from "./default-opaque-key-exchange.service"; +import { OpaqueCipherConfiguration } from "./models/opaque-cipher-configuration"; +import { OpaqueKeyExchangeApiService } from "./opaque-key-exchange-api.service"; +import { OpaqueKeyExchangeService } from "./opaque-key-exchange.service"; + +describe("DefaultOpaqueKeyExchangeService", () => { + let opaqueKeyExchangeApiService: MockProxy; + let sdkService: MockProxy; + let encryptService: MockProxy; + let logService: MockProxy; + + let service: OpaqueKeyExchangeService; + + let sdkBitwardenClient: BitwardenClient; + + beforeEach(() => { + opaqueKeyExchangeApiService = mock(); + + sdkService = mock(); + sdkBitwardenClient = mock(); + sdkService.client$ = new BehaviorSubject(sdkBitwardenClient); + + encryptService = mock(); + logService = mock(); + + service = new DefaultOpaqueKeyExchangeService( + opaqueKeyExchangeApiService, + sdkService, + encryptService, + logService, + ); + }); + + it("instantiates", () => { + expect(service).toBeDefined(); + }); + + describe("register", () => { + let masterPassword: string; + let userKey: UserKey; + let opaqueCipherConfig: OpaqueCipherConfiguration; + // let clientRegistrationStartResult: ClientRegistrationStartResult; + // let registrationStartResponse: RegistrationStartResponse; + + beforeEach(() => { + masterPassword = "masterPassword"; + userKey = new SymmetricCryptoKey(new Uint8Array(64)) as UserKey; + opaqueCipherConfig = new OpaqueCipherConfiguration({ + memory: 1024, + iterations: 1, + parallelism: 1, + }); + + // clientRegistrationStartResult = mock(); + // sdkBitwardenClient.crypto().opaque_register_start.mockReturnValue(clientRegistrationStartResult); + + // registrationStartResponse = mock(); + }); + + describe("register input validation", () => { + const falseyValues = [undefined, null, ""]; + + it.each(falseyValues)( + "should throw error if masterPassword is %p", + async (badMasterPassword) => { + await expect( + service.register(badMasterPassword as any, userKey, opaqueCipherConfig), + ).rejects.toThrow( + `Unable to register user with missing parameters. masterPassword exists: ${!!badMasterPassword}, userKey exists: ${!!userKey}, cipherConfig exists: ${!!opaqueCipherConfig}`, + ); + }, + ); + + it.each(falseyValues)("should throw error if userKey is %p", async (badUserKey) => { + await expect( + service.register(masterPassword, badUserKey as any, opaqueCipherConfig), + ).rejects.toThrow( + `Unable to register user with missing parameters. masterPassword exists: ${!!masterPassword}, userKey exists: ${!!badUserKey}, cipherConfig exists: ${!!opaqueCipherConfig}`, + ); + }); + + it.each(falseyValues)("should throw error if cipherConfig is %p", async (badCipherConfig) => { + await expect( + service.register(masterPassword, userKey, badCipherConfig as any), + ).rejects.toThrow( + `Unable to register user with missing parameters. masterPassword exists: ${!!masterPassword}, userKey exists: ${!!userKey}, cipherConfig exists: ${!!badCipherConfig}`, + ); + }); + }); + + // TODO: test registration process + // it("registers a user with OPAQUE with the provided master password, user key, and cipher config", async () => {}); + }); +});