summaryrefslogtreecommitdiff
path: root/keystore/java/android/security/KeyStoreOperation.java
diff options
context:
space:
mode:
authorTreehugger Robot <treehugger-gerrit@google.com>2020-11-16 22:51:03 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2020-11-16 22:51:03 +0000
commitaeb15e8592b9a74937afbb3fa232d2ced5971f3c (patch)
tree1d60d433579554151324eb04664f6205ba426d53 /keystore/java/android/security/KeyStoreOperation.java
parentfebaec9f3e70de992cc6cc72789aa95c0b80a66f (diff)
parent4392c6977ce935a084ab30baeed511f170a606d5 (diff)
Merge changes I9731d978,I9e325782,I441a4d4d,I86a85e48,I9268fd66, ...
* changes: Keystore 2.0 SPI: Install legacy Keystore provider as AndroidKeyStoreLegacy Keystore 2.0 SPI: Zygote install Keystore2 provider conditionally Keystore 2.0 SPI: Evolve the generator SPI. Keystore 2.0 SPI: Evolve Factory SPI Keystore 2.0 SPI: AndroidKeyStoreProvider loads keys from Keystore 2.0 Keystore 2.0 SPI: Evolve the Crypto SPI. Keystore 2.0 SPI: KeyParameter utilities. Keystore 2.0 SPI: Update the chunked streamer. Keystore 2.0 SPI: KeyStoreCryptoOperationUtils Keystore 2.0 SPI: KeyStoreKeys adopt Keystore 2.0 Keystore 2.0: Shim around the basic functionality of Keystore 2.0 Keystore 2.0 SPI: Duplicate Keystore SPI to android.security.keystore2 package
Diffstat (limited to 'keystore/java/android/security/KeyStoreOperation.java')
-rw-r--r--keystore/java/android/security/KeyStoreOperation.java141
1 files changed, 141 insertions, 0 deletions
diff --git a/keystore/java/android/security/KeyStoreOperation.java b/keystore/java/android/security/KeyStoreOperation.java
new file mode 100644
index 000000000000..9af15a5f4a16
--- /dev/null
+++ b/keystore/java/android/security/KeyStoreOperation.java
@@ -0,0 +1,141 @@
+/*
+ * 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.annotation.NonNull;
+import android.os.RemoteException;
+import android.os.ServiceSpecificException;
+import android.security.keymaster.KeymasterDefs;
+import android.system.keystore2.IKeystoreOperation;
+import android.system.keystore2.KeyParameter;
+import android.system.keystore2.ResponseCode;
+import android.util.Log;
+
+/**
+ * @hide
+ */
+public class KeyStoreOperation {
+ static final String TAG = "KeyStoreOperation";
+ private final IKeystoreOperation mOperation;
+ private final Long mChallenge;
+ private final KeyParameter[] mParameters;
+
+ public KeyStoreOperation(
+ @NonNull IKeystoreOperation operation,
+ Long challenge,
+ KeyParameter[] parameters
+ ) {
+ this.mOperation = operation;
+ this.mChallenge = challenge;
+ this.mParameters = parameters;
+ }
+
+ /**
+ * Gets the challenge associated with this operation.
+ * @return null if the operation does not required authorization. A 64bit operation
+ * challenge otherwise.
+ */
+ public Long getChallenge() {
+ return mChallenge;
+ }
+
+ /**
+ * Gets the parameters associated with this operation.
+ * @return
+ */
+ public KeyParameter[] getParameters() {
+ return mParameters;
+ }
+
+ private <R> R handleExceptions(@NonNull CheckedRemoteRequest<R> request)
+ throws KeyStoreException {
+ try {
+ return request.execute();
+ } catch (ServiceSpecificException e) {
+ switch(e.errorCode) {
+ case ResponseCode.OPERATION_BUSY: {
+ throw new IllegalThreadStateException(
+ "Cannot update the same operation concurrently."
+ );
+ }
+ default:
+ // TODO Human readable string. Use something like KeyStore.getKeyStoreException
+ throw new KeyStoreException(e.errorCode, "");
+ }
+ } catch (RemoteException e) {
+ // Log exception and report invalid operation handle.
+ // This should prompt the caller drop the reference to this operation and retry.
+ Log.e(
+ TAG,
+ "Remote exception while advancing a KeyStoreOperation.",
+ e
+ );
+ throw new KeyStoreException(KeymasterDefs.KM_ERROR_INVALID_OPERATION_HANDLE, "");
+ }
+ }
+
+ /**
+ * Updates the Keystore operation represented by this object with more associated data.
+ * @see IKeystoreOperation#updateAad(byte[]) for more details.
+ * @param input
+ * @throws KeyStoreException
+ */
+ public void updateAad(@NonNull byte[] input) throws KeyStoreException {
+ handleExceptions(() -> {
+ mOperation.updateAad(input);
+ return 0;
+ });
+ }
+
+ /**
+ * Updates the Keystore operation represented by this object.
+ * @see IKeystoreOperation#update(byte[]) for more details.
+ * @param input
+ * @return
+ * @throws KeyStoreException
+ * @hide
+ */
+ public byte[] update(@NonNull byte[] input) throws KeyStoreException {
+ return handleExceptions(() -> mOperation.update(input));
+ }
+
+ /**
+ * Finalizes the Keystore operation represented by this object.
+ * @see IKeystoreOperation#finish(byte[], byte[]) for more details.
+ * @param input
+ * @param signature
+ * @return
+ * @throws KeyStoreException
+ * @hide
+ */
+ public byte[] finish(byte[] input, byte[] signature) throws KeyStoreException {
+ return handleExceptions(() -> mOperation.finish(input, signature));
+ }
+
+ /**
+ * Aborts the Keystore operation represented by this object.
+ * @see IKeystoreOperation#abort() for more details.
+ * @throws KeyStoreException
+ * @hide
+ */
+ public void abort() throws KeyStoreException {
+ handleExceptions(() -> {
+ mOperation.abort();
+ return 0;
+ });
+ }
+}