PeachCredentialProviderService.kt

2.5 KB · raw

1package com.peachpasswords.passkeys23import android.os.Build4import android.os.CancellationSignal5import androidx.credentials.provider.BeginCreateCredentialRequest6import androidx.credentials.provider.BeginCreateCredentialResponse7import androidx.credentials.provider.BeginGetCredentialRequest8import androidx.credentials.provider.BeginGetCredentialResponse9import androidx.credentials.provider.CredentialProviderService10import androidx.credentials.provider.ProviderClearCredentialStateRequest11import android.os.OutcomeReceiver12import androidx.credentials.exceptions.ClearCredentialException13import androidx.credentials.exceptions.CreateCredentialException14import androidx.credentials.exceptions.GetCredentialException15import androidx.annotation.RequiresApi1617/**18 * Android 14+ credential provider surface for Peach passkeys.19 *20 * The Begin* callbacks MUST be answered or the Credential Manager times out and21 * reports a provider error; the previous scaffold left them uninvoked. This22 * version always completes the callbacks with a valid (currently empty)23 * response, so Peach registers cleanly as a provider without erroring.24 *25 * Surfacing real passkey entries and running the WebAuthn ceremony is gated on26 * one data-model addition: [com.peachpasswords.vault.PasskeyData] stores only27 * the public COSE key, so an assertion (get) cannot be signed yet. Completing28 * passkeys means persisting the per-credential ES256 private key in the vault29 * envelope, then emitting PublicKeyCredentialEntry rows here with a30 * PendingIntent into the same branded sheet the autofill picker uses.31 */32@RequiresApi(Build.VERSION_CODES.UPSIDE_DOWN_CAKE)33class PeachCredentialProviderService : CredentialProviderService() {34    override fun onBeginGetCredentialRequest(35        request: BeginGetCredentialRequest,36        cancellationSignal: CancellationSignal,37        callback: OutcomeReceiver<BeginGetCredentialResponse, GetCredentialException>,38    ) {39        callback.onResult(BeginGetCredentialResponse())40    }4142    override fun onBeginCreateCredentialRequest(43        request: BeginCreateCredentialRequest,44        cancellationSignal: CancellationSignal,45        callback: OutcomeReceiver<BeginCreateCredentialResponse, CreateCredentialException>,46    ) {47        callback.onResult(BeginCreateCredentialResponse())48    }4950    override fun onClearCredentialStateRequest(51        request: ProviderClearCredentialStateRequest,52        cancellationSignal: CancellationSignal,53        callback: OutcomeReceiver<Void?, ClearCredentialException>,54    ) {55        callback.onResult(null)56    }57}