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

Commit 8ee4e2e6 authored by Janis Danisevskis's avatar Janis Danisevskis Committed by Android Build Coastguard Worker
Browse files

DO NOT MERGE KeyStore ChunkedStreamer must tolerate update consuming 0 bytes.

Some older versions of Keymster do not consume any data in certain block
modes unless a full block of data was presented.

Bug: 199032140
Bug: 200041882
Test: CtsKeyStoreTestcases with KM1.0 backend.
Merged-In: Ic2da6e5c12628f11603f51c7a3408aad70947d95
Change-Id: Ic2da6e5c12628f11603f51c7a3408aad70947d95
(cherry picked from commit 395e56a7)
parent dfc99fc2
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);
                }