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

Commit 395e56a7 authored by Janis Danisevskis's avatar Janis Danisevskis
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
parent f4c5136d
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);
                }