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

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

Change-Id: Id0df567907cdc7e5a8d73f749e660609ac99c632
This commit is contained in:
Janis Danisevskis
2021-10-06 20:54:08 +00:00
committed by Automerger Merge Worker

View File

@@ -126,8 +126,8 @@ class KeyStoreCryptoOperationChunkedStreamer implements KeyStoreCryptoOperationS
if (mChunkLength > mChunkSizeMax) {
throw new KeyStoreException(KeymasterDefs.KM_ERROR_INVALID_INPUT_LENGTH,
"Chunk size exceeded max chunk size. Max: " + mChunkSizeMax
+ " Actual: " + mChunkLength);
"Chunk size exceeded max chunk size. Max: " + mChunkSizeMax
+ " Actual: " + mChunkLength);
}
if (mChunkLength >= mChunkSizeThreshold) {
@@ -139,18 +139,28 @@ class KeyStoreCryptoOperationChunkedStreamer implements KeyStoreCryptoOperationS
} else if (opResult.resultCode != KeyStore.NO_ERROR) {
throw KeyStore.getKeyStoreException(opResult.resultCode);
}
if (opResult.inputConsumed <= 0) {
throw new KeyStoreException(KeymasterDefs.KM_ERROR_INVALID_INPUT_LENGTH,
"Keystore consumed 0 of " + mChunkLength + " bytes provided.");
} else if (opResult.inputConsumed > mChunkLength) {
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 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);
}