Update to the latest Bitwarden SDK (#3779)

This commit is contained in:
David Perez 2024-08-19 15:12:30 -05:00 committed by GitHub
parent 82fd7f01f8
commit 9e372c29d1
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
8 changed files with 118 additions and 4 deletions

View file

@ -1,6 +1,7 @@
package com.x8bit.bitwarden.data.auth.datasource.sdk
import com.bitwarden.core.AuthRequestResponse
import com.bitwarden.core.KeyConnectorResponse
import com.bitwarden.core.MasterPasswordPolicyOptions
import com.bitwarden.core.RegisterKeyResponse
import com.bitwarden.core.RegisterTdeKeyResponse
@ -37,6 +38,11 @@ interface AuthSdkSource {
purpose: HashPurpose,
): Result<String>
/**
* Creates a set of encryption key information for use with a key connector.
*/
suspend fun makeKeyConnectorKeys(): Result<KeyConnectorResponse>
/**
* Creates a set of encryption key information for registration.
*/

View file

@ -2,6 +2,7 @@ package com.x8bit.bitwarden.data.auth.datasource.sdk
import com.bitwarden.core.AuthRequestResponse
import com.bitwarden.core.FingerprintRequest
import com.bitwarden.core.KeyConnectorResponse
import com.bitwarden.core.MasterPasswordPolicyOptions
import com.bitwarden.core.RegisterKeyResponse
import com.bitwarden.core.RegisterTdeKeyResponse
@ -63,6 +64,13 @@ class AuthSdkSourceImpl(
)
}
override suspend fun makeKeyConnectorKeys(): Result<KeyConnectorResponse> =
runCatchingWithLogs {
getClient()
.auth()
.makeKeyConnectorKeys()
}
override suspend fun makeRegisterKeys(
email: String,
password: String,

View file

@ -6,6 +6,7 @@ import com.bitwarden.core.InitOrgCryptoRequest
import com.bitwarden.core.InitUserCryptoMethod
import com.bitwarden.core.InitUserCryptoRequest
import com.bitwarden.core.UpdatePasswordResponse
import com.bitwarden.crypto.Kdf
import com.bitwarden.crypto.TrustDeviceResponse
import com.bitwarden.exporters.ExportFormat
import com.bitwarden.fido.Fido2CredentialAutofillView
@ -52,6 +53,22 @@ interface VaultSdkSource {
*/
suspend fun getTrustDevice(userId: String): Result<TrustDeviceResponse>
/**
* Derives a "key connector" key from the given information for the given `userId. This can be
* used to later unlock their vault via a call to [initializeCrypto] with
* [InitUserCryptoMethod.KeyConnector].
*
* This should only be called after a successful call to [initializeCrypto] for the associated
* user.
*/
suspend fun deriveKeyConnector(
userId: String,
userKeyEncrypted: String,
email: String,
password: String,
kdf: Kdf,
): Result<String>
/**
* Derives a "pin key" from the given [pin] for the given [userId]. This can be used to later
* unlock their vault via a call to [initializeCrypto] with [InitUserCryptoMethod.Pin].

View file

@ -1,10 +1,12 @@
package com.x8bit.bitwarden.data.vault.datasource.sdk
import com.bitwarden.core.DateTime
import com.bitwarden.core.DeriveKeyConnectorRequest
import com.bitwarden.core.DerivePinKeyResponse
import com.bitwarden.core.InitOrgCryptoRequest
import com.bitwarden.core.InitUserCryptoRequest
import com.bitwarden.core.UpdatePasswordResponse
import com.bitwarden.crypto.Kdf
import com.bitwarden.crypto.TrustDeviceResponse
import com.bitwarden.exporters.ExportFormat
import com.bitwarden.fido.Fido2CredentialAutofillView
@ -67,6 +69,26 @@ class VaultSdkSourceImpl(
.trustDevice()
}
override suspend fun deriveKeyConnector(
userId: String,
userKeyEncrypted: String,
email: String,
password: String,
kdf: Kdf,
): Result<String> =
runCatchingWithLogs {
getClient(userId = userId)
.crypto()
.deriveKeyConnector(
request = DeriveKeyConnectorRequest(
userKeyEncrypted = userKeyEncrypted,
password = password,
kdf = kdf,
email = email,
),
)
}
override suspend fun derivePinKey(
userId: String,
pin: String,

View file

@ -2,6 +2,7 @@ package com.x8bit.bitwarden.data.auth.datasource.sdk
import com.bitwarden.core.AuthRequestResponse
import com.bitwarden.core.FingerprintRequest
import com.bitwarden.core.KeyConnectorResponse
import com.bitwarden.core.MasterPasswordPolicyOptions
import com.bitwarden.core.RegisterKeyResponse
import com.bitwarden.core.RegisterTdeKeyResponse
@ -124,6 +125,20 @@ class AuthSdkSourceTest {
}
}
@Test
fun `makeKeyConnectorKeys should call SDK and return a Result with the correct data`() =
runBlocking {
val expectedResult = mockk<KeyConnectorResponse>()
coEvery { clientAuth.makeKeyConnectorKeys() } returns expectedResult
val result = authSkdSource.makeKeyConnectorKeys()
assertEquals(expectedResult.asSuccess(), result)
coVerify(exactly = 1) {
clientAuth.makeKeyConnectorKeys()
}
}
@Test
fun `makeRegisterKeys should call SDK and return a Result with the correct data`() =
runBlocking {

View file

@ -1,10 +1,12 @@
package com.x8bit.bitwarden.data.vault.datasource.sdk
import com.bitwarden.core.DateTime
import com.bitwarden.core.DeriveKeyConnectorRequest
import com.bitwarden.core.DerivePinKeyResponse
import com.bitwarden.core.InitOrgCryptoRequest
import com.bitwarden.core.InitUserCryptoRequest
import com.bitwarden.core.UpdatePasswordResponse
import com.bitwarden.crypto.Kdf
import com.bitwarden.crypto.TrustDeviceResponse
import com.bitwarden.exporters.ExportFormat
import com.bitwarden.fido.ClientData
@ -145,6 +147,46 @@ class VaultSdkSourceTest {
}
}
@Test
fun `deriveKeyConnector should call SDK and return a Result with the correct data`() =
runBlocking {
val userId = "userId"
val userKeyEncrypted = "userKeyEncrypted"
val email = "email"
val password = "password"
val expectedResult = "expectedResult"
val kdf = mockk<Kdf>()
coEvery {
clientCrypto.deriveKeyConnector(
request = DeriveKeyConnectorRequest(
userKeyEncrypted = userKeyEncrypted,
email = email,
password = password,
kdf = kdf,
),
)
} returns expectedResult
val result = vaultSdkSource.deriveKeyConnector(
userId = userId,
userKeyEncrypted = userKeyEncrypted,
email = email,
password = password,
kdf = kdf,
)
assertEquals(expectedResult.asSuccess(), result)
coVerify(exactly = 1) {
sdkClientManager.getOrCreateClient(userId = userId)
clientCrypto.deriveKeyConnector(
request = DeriveKeyConnectorRequest(
userKeyEncrypted = userKeyEncrypted,
email = email,
password = password,
kdf = kdf,
),
)
}
}
@Test
fun `derivePinKey should call SDK and return a Result with the correct data`() = runBlocking {
val userId = "userId"

View file

@ -1,8 +1,8 @@
package com.x8bit.bitwarden.data.vault.datasource.sdk.model
import com.bitwarden.vault.CipherListView
import com.bitwarden.vault.CipherListViewType
import com.bitwarden.vault.CipherRepromptType
import com.bitwarden.vault.CipherType
import java.time.ZonedDateTime
/**
@ -15,7 +15,10 @@ fun createMockCipherListView(number: Int): CipherListView =
folderId = "mockFolderId-$number",
collectionIds = listOf("mockCollectionId-$number"),
name = "mockName-$number",
type = CipherType.LOGIN,
type = CipherListViewType.Login(
hasFido2 = false,
totp = null,
),
creationDate = ZonedDateTime
.parse("2023-10-27T12:00:00Z")
.toInstant(),
@ -30,5 +33,6 @@ fun createMockCipherListView(number: Int): CipherListView =
reprompt = CipherRepromptType.NONE,
edit = false,
viewPassword = false,
subTitle = "",
subTitle = "mockSubTitle-$number",
key = "mockKey-$number",
)

View file

@ -24,7 +24,7 @@ androidxSplash = "1.1.0-rc01"
androidXAppCompat = "1.7.0"
androdixAutofill = "1.1.0"
androidxWork = "2.9.1"
bitwardenSdk = "0.5.0-20240716.152920-144"
bitwardenSdk = "0.5.0-20240819.160739-177"
crashlytics = "3.0.2"
detekt = "1.23.6"
firebaseBom = "33.1.2"