third_party/tpm2: fix bound checks BUG=b:260626924 TEST=TCG tests on Cr50 / Simulator Change-Id: I832db548fe8f887edb79b37b0ec54ea29cf4adb1 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/third_party/tpm2/+/4064430 Commit-Queue: Vadim Bendebury <vbendeb@chromium.org> Auto-Submit: Vadim Sukhomlinov <sukhomlinov@chromium.org> Commit-Queue: Vadim Sukhomlinov <sukhomlinov@chromium.org> Reviewed-by: Vadim Bendebury <vbendeb@chromium.org> Reviewed-by: Nick Peterson <nrpeter@google.com> Reviewed-by: Mary Ruthven <mruthven@chromium.org> Reviewed-by: Vadim Sukhomlinov <sukhomlinov@chromium.org> Code-Coverage: Vadim Sukhomlinov <sukhomlinov@chromium.org> Tested-by: Vadim Sukhomlinov <sukhomlinov@chromium.org>
diff --git a/CryptUtil.c b/CryptUtil.c index bf9263e..2aa3941 100644 --- a/CryptUtil.c +++ b/CryptUtil.c
@@ -2745,6 +2745,10 @@ TPM2B_HMAC_KEY key; // decryption key UINT32 cipherSize = 0; // size of cipher text pAssert(session->sessionKey.t.size + extraKey->t.size <= sizeof(key.t.buffer)); + + if (bufferSize < leadingSizeInByte) + return TPM_RC_INSUFFICIENT; + // Retrieve encrypted data size. if(leadingSizeInByte == 2) { @@ -2752,6 +2756,7 @@ // data to be decrypted cipherSize = (UINT32)BYTE_ARRAY_TO_UINT16(buffer); buffer = &buffer[2]; // advance the buffer + bufferSize -= 2; } #ifdef TPM4B else if(leadingSizeInByte == 4) @@ -2759,6 +2764,7 @@ // the leading size is four bytes so get the four byte size field cipherSize = BYTE_ARRAY_TO_UINT32(buffer); buffer = &buffer[4]; //advance pointer + bufferSize -= 4; } #endif else