Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9c6bc472 authored by Janis Danisevskis's avatar Janis Danisevskis Committed by Automerger Merge Worker
Browse files

DO NOT MERGE KeyStore ChunkedStreamer must tolerate update consuming 0 bytes. am: 395e56a7

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/15900956

Change-Id: I5cf3f948bf5e13f040cc34c2e98ae600270848ee
parents 5e6690be 395e56a7
Loading
Loading
Loading
Loading
+19 −9
Original line number Diff line number Diff line
@@ -139,18 +139,28 @@ class KeyStoreCryptoOperationChunkedStreamer implements KeyStoreCryptoOperationS
                } else if (opResult.resultCode != KeyStore.NO_ERROR) {
                    throw KeyStore.getKeyStoreException(opResult.resultCode);
                }
                if (opResult.inputConsumed <= 0) {
                if (opResult.inputConsumed == 0) {
                    // Some KM implementations do not consume data in certain block modes unless a
                    // full block of data was presented.
                    if (inputLength > 0) {
                        // More input is available, but it wasn't included into the previous chunk
                        // because the chunk reached its maximum permitted size.
                        // Shouldn't have happened.
                        throw new KeyStoreException(KeymasterDefs.KM_ERROR_INVALID_INPUT_LENGTH,
                        "Keystore consumed 0 of " + mChunkLength + " bytes provided.");
                } else if (opResult.inputConsumed > mChunkLength) {
                                "Keystore consumed nothing from max-sized chunk: " + mChunkLength
                                        + " bytes");
                    }
                } else if (opResult.inputConsumed > mChunkLength || opResult.inputConsumed < 0) {
                    throw new KeyStoreException(KeymasterDefs.KM_ERROR_UNKNOWN_ERROR,
                        "Keystore consumed more input than provided. Provided: "
                            + mChunkLength + ", consumed: " + opResult.inputConsumed);
                            "Keystore consumed more input than provided (or inputConsumed was "
                                    + "negative."
                                    + " Provided: " + mChunkLength
                                    + ", consumed: " + opResult.inputConsumed);
                }
                mChunkLength -= opResult.inputConsumed;

                if (mChunkLength > 0) {
                    // Partialy consumed, shift chunk contents
                    // Partially consumed, shift chunk contents
                    ArrayUtils.copy(mChunk, opResult.inputConsumed, mChunk, 0, mChunkLength);
                }