diff --git a/libs/common/src/key-management/crypto/services/encrypt.service.implementation.ts b/libs/common/src/key-management/crypto/services/encrypt.service.implementation.ts index 5bb946b25bf..525e8a6b5f7 100644 --- a/libs/common/src/key-management/crypto/services/encrypt.service.implementation.ts +++ b/libs/common/src/key-management/crypto/services/encrypt.service.implementation.ts @@ -26,6 +26,7 @@ import { getFeatureFlagValue, } from "../../../enums/feature-flag.enum"; import { ServerConfig } from "../../../platform/abstractions/config/server-config"; +import { SdkLoadService } from "../../../platform/abstractions/sdk/sdk-load.service"; import { EncryptService } from "../abstractions/encrypt.service"; export class EncryptServiceImplementation implements EncryptService { @@ -242,6 +243,7 @@ export class EncryptServiceImplementation implements EncryptService { if (encString == null || encString.encryptedString == null) { throw new Error("encString is null or undefined"); } + await SdkLoadService.Ready; return PureCrypto.symmetric_decrypt(encString.encryptedString, key.toEncoded()); } this.logService.debug("decrypting with javascript"); @@ -324,6 +326,7 @@ export class EncryptServiceImplementation implements EncryptService { encThing.dataBytes, encThing.macBytes, ).buffer; + await SdkLoadService.Ready; return PureCrypto.symmetric_decrypt_array_buffer(buffer, key.toEncoded()); } this.logService.debug("[EncryptService] Decrypting bytes with javascript"); diff --git a/libs/common/src/key-management/crypto/services/encrypt.service.spec.ts b/libs/common/src/key-management/crypto/services/encrypt.service.spec.ts index d19de6c0414..813dd693dd9 100644 --- a/libs/common/src/key-management/crypto/services/encrypt.service.spec.ts +++ b/libs/common/src/key-management/crypto/services/encrypt.service.spec.ts @@ -11,10 +11,12 @@ import { SymmetricCryptoKey, } from "@bitwarden/common/platform/models/domain/symmetric-crypto-key"; import { CsprngArray } from "@bitwarden/common/types/csprng"; +import { PureCrypto } from "@bitwarden/sdk-internal"; import { makeStaticByteArray } from "../../../../spec"; import { DefaultFeatureFlagValue, FeatureFlag } from "../../../enums/feature-flag.enum"; import { ServerConfig } from "../../../platform/abstractions/config/server-config"; +import { SdkLoadService } from "../../../platform/abstractions/sdk/sdk-load.service"; import { EncryptServiceImplementation } from "./encrypt.service.implementation"; @@ -343,6 +345,24 @@ describe("EncryptService", () => { ); }); + it("calls PureCrypto when useSDKForDecryption is true", async () => { + (encryptService as any).useSDKForDecryption = true; + const decryptedBytes = makeStaticByteArray(10, 200); + Object.defineProperty(SdkLoadService, "Ready", { + value: Promise.resolve(), + configurable: true, + }); + jest.spyOn(PureCrypto, "symmetric_decrypt_array_buffer").mockReturnValue(decryptedBytes); + + const actual = await encryptService.decryptToBytes(encBuffer, key); + + expect(PureCrypto.symmetric_decrypt_array_buffer).toHaveBeenCalledWith( + encBuffer.buffer, + key.toEncoded(), + ); + expect(actual).toEqualBuffer(decryptedBytes); + }); + it("decrypts data with provided key for Aes256CbcHmac", async () => { const decryptedBytes = makeStaticByteArray(10, 200); @@ -450,6 +470,25 @@ describe("EncryptService", () => { ); }); + it("calls PureCrypto when useSDKForDecryption is true", async () => { + (encryptService as any).useSDKForDecryption = true; + const key = new SymmetricCryptoKey(makeStaticByteArray(64, 0)); + const encString = new EncString(EncryptionType.AesCbc256_HmacSha256_B64, "data", "iv", "mac"); + Object.defineProperty(SdkLoadService, "Ready", { + value: Promise.resolve(), + configurable: true, + }); + jest.spyOn(PureCrypto, "symmetric_decrypt").mockReturnValue("data"); + + const actual = await encryptService.decryptToUtf8(encString, key); + + expect(actual).toEqual("data"); + expect(PureCrypto.symmetric_decrypt).toHaveBeenCalledWith( + encString.encryptedString, + key.toEncoded(), + ); + }); + it("decrypts data with provided key for AesCbc256_HmacSha256", async () => { const key = new SymmetricCryptoKey(makeStaticByteArray(64, 0)); const encString = new EncString(EncryptionType.AesCbc256_HmacSha256_B64, "data", "iv", "mac");