From 6a9b2661d5ebf635c46200632873cccfb154dae8 Mon Sep 17 00:00:00 2001 From: Krzysztof Jackiewicz Date: Thu, 21 Mar 2019 15:21:02 +0100 Subject: Be prepared for no data from TA Deserialization may return an empty buffer with no error. Adjust code to handle that case. Change-Id: Ife80b4d35914eda700798e0515812b3b638e735e --- src/manager/crypto/tz-backend/tz-context.cpp | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/src/manager/crypto/tz-backend/tz-context.cpp b/src/manager/crypto/tz-backend/tz-context.cpp index 0b54bb41..eb42ff41 100644 --- a/src/manager/crypto/tz-backend/tz-context.cpp +++ b/src/manager/crypto/tz-backend/tz-context.cpp @@ -553,8 +553,11 @@ void TrustZoneContext::executeCrypt(tz_command cmd, } // data_size should contain how much memory we actually took for our cipher operation - out.resize(outData->data_size); - memcpy(out.data(), outData->data, outData->data_size); + out.clear(); + if (outData) { + out.resize(outData->data_size); + memcpy(out.data(), outData->data, outData->data_size); + } } void TrustZoneContext::executeEncryptAE(const RawBuffer &keyId, @@ -670,10 +673,14 @@ void TrustZoneContext::executeEncryptAE(const RawBuffer &keyId, ThrowErr(Exc::Crypto::InternalError, "Failed to deserialize tag data: ", ret); } - out.resize(outData->data_size); - memcpy(out.data(), outData->data, outData->data_size); + out.clear(); + if (outData) { + out.resize(outData->data_size); + memcpy(out.data(), outData->data, outData->data_size); + } - if (tagData->data_size) { + tag.clear(); + if (tagData && tagData->data_size) { tag.resize(tagData->data_size); memcpy(tag.data(), tagData->data, tagData->data_size); } @@ -790,8 +797,11 @@ void TrustZoneContext::executeDecryptAE(const RawBuffer &keyId, ThrowErr(Exc::Crypto::InternalError, "Failed to deserialize output data: ", ret); } - out.resize(outData->data_size); - memcpy(out.data(), outData->data, outData->data_size); + out.clear(); + if (outData) { + out.resize(outData->data_size); + memcpy(out.data(), outData->data, outData->data_size); + } } void TrustZoneContext::executeSign(tz_algo_type algo, @@ -885,7 +895,7 @@ void TrustZoneContext::executeSign(tz_algo_type algo, KM_OutData* outData = nullptr; ret = KM_ParamsDeserializeOutData(output, &outData); - if (ret) { + if (ret || !outData || outData->data_size == 0) { ThrowErr(Exc::Crypto::InternalError, "Failed to deserialize output data: ", ret); } -- cgit v1.2.3