diff options
author | Robin van der Gracht <robin@protonic.nl> | 2020-11-30 13:28:08 +0100 |
---|---|---|
committer | Jérôme Forissier <jerome@forissier.org> | 2021-01-07 15:50:37 +0100 |
commit | a1bc38c87d17705fafa716b12ec1abaf910ecd78 (patch) | |
tree | dc9996d8ee2754ecc69a412c02e7580c134ffc30 | |
parent | 7fb5f45422e6ca95dc63da1a0fe48f752eefcd38 (diff) |
core: tee_rpmb_fs: Return error when block decryption fails
When decrypt_block fails (although unlikely) it shouldn't be silently
ignored. In such case the data in the buffer pointed to by *out is
unmodified or bogus while the return code is TEE_SUCCESS.
Signed-off-by: Robin van der Gracht <robin@protonic.nl>
Reviewed-by: Jerome Forissier <jerome@forissier.org>
-rw-r--r-- | core/tee/tee_rpmb_fs.c | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/core/tee/tee_rpmb_fs.c b/core/tee/tee_rpmb_fs.c index 57ee7516..dc9fafa5 100644 --- a/core/tee/tee_rpmb_fs.c +++ b/core/tee/tee_rpmb_fs.c @@ -507,6 +507,7 @@ static TEE_Result decrypt(uint8_t *out, const struct rpmb_data_frame *frm, const TEE_UUID *uuid) { uint8_t *tmp __maybe_unused; + TEE_Result res = TEE_SUCCESS; if ((size + offset < size) || (size + offset > RPMB_DATA_SIZE)) @@ -528,15 +529,16 @@ static TEE_Result decrypt(uint8_t *out, const struct rpmb_data_frame *frm, tmp = malloc(RPMB_DATA_SIZE); if (!tmp) return TEE_ERROR_OUT_OF_MEMORY; - decrypt_block(tmp, frm->data, blk_idx, fek, uuid); - memcpy(out, tmp + offset, size); + res = decrypt_block(tmp, frm->data, blk_idx, fek, uuid); + if (res == TEE_SUCCESS) + memcpy(out, tmp + offset, size); free(tmp); } else { - decrypt_block(out, frm->data, blk_idx, fek, uuid); + res = decrypt_block(out, frm->data, blk_idx, fek, uuid); } } - return TEE_SUCCESS; + return res; } static TEE_Result tee_rpmb_req_pack(struct rpmb_req *req, |