Be prepared for no data from TA 37/202337/5
authorKrzysztof Jackiewicz <k.jackiewicz@samsung.com>
Thu, 21 Mar 2019 14:21:02 +0000 (15:21 +0100)
committerTomasz Swierczek <t.swierczek@samsung.com>
Mon, 20 May 2019 09:07:48 +0000 (11:07 +0200)
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

index 0b54bb4..eb42ff4 100644 (file)
@@ -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);
        }