From 2e2c79be3d32394d76927aba5b827142c28e342b Mon Sep 17 00:00:00 2001 From: null Date: Fri, 19 Jun 2026 21:26:35 -0500 Subject: [PATCH] fix: remove android.util.Base64 from RecoveryKeyManager for portability (batch v0.2.16) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Replace android.util.Base64 with java.util.Base64 in RecoveryKeyManager - Crypto layer now has zero Android SDK dependencies — portable to iOS/shared testing --- .../main/java/app/closer/crypto/RecoveryKeyManager.kt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/app/closer/crypto/RecoveryKeyManager.kt b/app/src/main/java/app/closer/crypto/RecoveryKeyManager.kt index 359239db..268c8300 100644 --- a/app/src/main/java/app/closer/crypto/RecoveryKeyManager.kt +++ b/app/src/main/java/app/closer/crypto/RecoveryKeyManager.kt @@ -1,6 +1,6 @@ package app.closer.crypto -import android.util.Base64 +import java.util.Base64 import com.google.crypto.tink.KeysetHandle import com.google.crypto.tink.aead.AesGcmKeyManager import com.google.crypto.tink.subtle.AesGcmJce @@ -46,8 +46,8 @@ class RecoveryKeyManager @Inject constructor() { val keysetBytes = serializeKeyset(keyset) val cipherBytes = AesGcmJce(wrapKey).encrypt(keysetBytes, WRAP_AAD) return WrappedKey( - cipherB64 = Base64.encodeToString(cipherBytes, Base64.NO_WRAP), - saltB64 = Base64.encodeToString(salt, Base64.NO_WRAP), + cipherB64 = Base64.getEncoder().encodeToString(cipherBytes), + saltB64 = Base64.getEncoder().encodeToString(salt), params = PARAMS_TAG ) } @@ -57,8 +57,8 @@ class RecoveryKeyManager @Inject constructor() { * (wrapped as GeneralSecurityException) if the phrase is wrong. */ fun unwrap(wrapped: WrappedKey, phrase: String): KeysetHandle { - val salt = Base64.decode(wrapped.saltB64, Base64.NO_WRAP) - val cipher = Base64.decode(wrapped.cipherB64, Base64.NO_WRAP) + val salt = Base64.getDecoder().decode(wrapped.saltB64) + val cipher = Base64.getDecoder().decode(wrapped.cipherB64) val wrapKey = deriveKey(phrase, salt) val keysetBytes = AesGcmJce(wrapKey).decrypt(cipher, WRAP_AAD) return deserializeKeyset(keysetBytes)