| /* | |
| * Copyright (C) 2020 The Android Open Source Project | |
| * | |
| * Licensed under the Apache License, Version 2.0 (the "License"); | |
| * you may not use this file except in compliance with the License. | |
| * You may obtain a copy of the License at | |
| * | |
| * http://www.apache.org/licenses/LICENSE-2.0 | |
| * | |
| * Unless required by applicable law or agreed to in writing, software | |
| * distributed under the License is distributed on an "AS IS" BASIS, | |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| * See the License for the specific language governing permissions and | |
| * limitations under the License. | |
| */ | |
| package android.security; | |
| import android.os.RemoteException; | |
| import android.os.ServiceManager; | |
| import android.os.ServiceSpecificException; | |
| import android.security.apc.IConfirmationCallback; | |
| import android.security.apc.IProtectedConfirmation; | |
| import android.security.apc.ResponseCode; | |
| import android.util.Log; | |
| /** | |
| * @hide | |
| */ | |
| public class AndroidProtectedConfirmation { | |
| private static final String TAG = "AndroidProtectedConfirmation"; | |
| public static final int ERROR_OK = ResponseCode.OK; | |
| public static final int ERROR_CANCELED = ResponseCode.CANCELLED; | |
| public static final int ERROR_ABORTED = ResponseCode.ABORTED; | |
| public static final int ERROR_OPERATION_PENDING = ResponseCode.OPERATION_PENDING; | |
| public static final int ERROR_IGNORED = ResponseCode.IGNORED; | |
| public static final int ERROR_SYSTEM_ERROR = ResponseCode.SYSTEM_ERROR; | |
| public static final int ERROR_UNIMPLEMENTED = ResponseCode.UNIMPLEMENTED; | |
| public static final int FLAG_UI_OPTION_INVERTED = | |
| IProtectedConfirmation.FLAG_UI_OPTION_INVERTED; | |
| public static final int FLAG_UI_OPTION_MAGNIFIED = | |
| IProtectedConfirmation.FLAG_UI_OPTION_MAGNIFIED; | |
| private IProtectedConfirmation mProtectedConfirmation; | |
| public AndroidProtectedConfirmation() { | |
| mProtectedConfirmation = null; | |
| } | |
| private synchronized IProtectedConfirmation getService() { | |
| if (mProtectedConfirmation == null) { | |
| mProtectedConfirmation = IProtectedConfirmation.Stub.asInterface(ServiceManager | |
| .getService("android.security.apc")); | |
| } | |
| return mProtectedConfirmation; | |
| } | |
| /** | |
| * Requests keystore call into the confirmationui HAL to display a prompt. | |
| * | |
| * @param listener the binder to use for callbacks. | |
| * @param promptText the prompt to display. | |
| * @param extraData extra data / nonce from application. | |
| * @param locale the locale as a BCP 47 language tag. | |
| * @param uiOptionsAsFlags the UI options to use, as flags. | |
| * @return one of the {@code CONFIRMATIONUI_*} constants, for | |
| * example {@code KeyStore.CONFIRMATIONUI_OK}. | |
| */ | |
| public int presentConfirmationPrompt(IConfirmationCallback listener, String promptText, | |
| byte[] extraData, String locale, int uiOptionsAsFlags) { | |
| try { | |
| getService().presentPrompt(listener, promptText, extraData, locale, | |
| uiOptionsAsFlags); | |
| return ERROR_OK; | |
| } catch (RemoteException e) { | |
| Log.w(TAG, "Cannot connect to keystore", e); | |
| return ERROR_SYSTEM_ERROR; | |
| } catch (ServiceSpecificException e) { | |
| return e.errorCode; | |
| } | |
| } | |
| /** | |
| * Requests keystore call into the confirmationui HAL to cancel displaying a prompt. | |
| * | |
| * @param listener the binder passed to the {@link #presentConfirmationPrompt} method. | |
| * @return one of the {@code CONFIRMATIONUI_*} constants, for | |
| * example {@code KeyStore.CONFIRMATIONUI_OK}. | |
| */ | |
| public int cancelConfirmationPrompt(IConfirmationCallback listener) { | |
| try { | |
| getService().cancelPrompt(listener); | |
| return ERROR_OK; | |
| } catch (RemoteException e) { | |
| Log.w(TAG, "Cannot connect to keystore", e); | |
| return ERROR_SYSTEM_ERROR; | |
| } catch (ServiceSpecificException e) { | |
| return e.errorCode; | |
| } | |
| } | |
| /** | |
| * Requests keystore to check if the confirmationui HAL is available. | |
| * | |
| * @return whether the confirmationUI HAL is available. | |
| */ | |
| public boolean isConfirmationPromptSupported() { | |
| try { | |
| return getService().isSupported(); | |
| } catch (RemoteException e) { | |
| Log.w(TAG, "Cannot connect to keystore", e); | |
| return false; | |
| } | |
| } | |
| } |