Do not allocate zero sized buffers - cipher

pull/10232/head
itayzafrir 2019-03-27 14:37:29 +02:00
parent 19952d990c
commit f3294ef338
1 changed files with 35 additions and 21 deletions

View File

@ -1009,30 +1009,39 @@ static void psa_symmetric_operation(void)
} }
case PSA_CIPHER_UPDATE: { case PSA_CIPHER_UPDATE: {
size_t input_length = msg.in_size[1]; size_t input_length = msg.in_size[1],
size_t output_size = msg.out_size[0]; output_size = msg.out_size[0],
size_t output_length = 0; output_length = 0;
uint8_t *input = NULL; uint8_t *input = NULL;
unsigned char *output = NULL; unsigned char *output = NULL;
input = mbedtls_calloc(1, input_length); if (input_length > 0) {
output = mbedtls_calloc(1, output_size); input = mbedtls_calloc(1, input_length);
if (input == NULL || output == NULL) { if (input == NULL) {
psa_cipher_abort(msg.rhandle); status = PSA_ERROR_INSUFFICIENT_MEMORY;
status = PSA_ERROR_INSUFFICIENT_MEMORY; } else {
} else { bytes_read = psa_read(msg.handle, 1, input, input_length);
bytes_read = psa_read(msg.handle, 1, input, input_length); if (bytes_read != input_length) {
if (bytes_read != input_length) { SPM_PANIC("SPM read length mismatch");
SPM_PANIC("SPM read length mismatch"); }
} }
}
if (status == PSA_SUCCESS && output_size > 0) {
output = mbedtls_calloc(1, output_size);
if (output == NULL) {
status = PSA_ERROR_INSUFFICIENT_MEMORY;
}
}
if (status == PSA_SUCCESS) {
status = psa_cipher_update(msg.rhandle, input, input_length, output, output_size, status = psa_cipher_update(msg.rhandle, input, input_length, output, output_size,
&output_length); &output_length);
if (status == PSA_SUCCESS) { if (status == PSA_SUCCESS) {
psa_write(msg.handle, 0, output, output_length); psa_write(msg.handle, 0, output, output_length);
psa_write(msg.handle, 1, &output_length, sizeof(output_length)); psa_write(msg.handle, 1, &output_length, sizeof(output_length));
} }
} else {
psa_cipher_abort(msg.rhandle);
} }
mbedtls_free(input); mbedtls_free(input);
@ -1045,21 +1054,26 @@ static void psa_symmetric_operation(void)
} }
case PSA_CIPHER_FINISH: { case PSA_CIPHER_FINISH: {
uint8_t *output; uint8_t *output = NULL;
size_t output_size = msg.out_size[0]; size_t output_size = msg.out_size[0],
size_t output_length = 0; output_length = 0;
output = mbedtls_calloc(1, output_size); if (output_size > 0) {
if (output == NULL) { output = mbedtls_calloc(1, output_size);
psa_cipher_abort(msg.rhandle); if (output == NULL) {
status = PSA_ERROR_INSUFFICIENT_MEMORY; status = PSA_ERROR_INSUFFICIENT_MEMORY;
} else { }
}
if (status == PSA_SUCCESS) {
status = psa_cipher_finish(msg.rhandle, output, output_size, &output_length); status = psa_cipher_finish(msg.rhandle, output, output_size, &output_length);
if (status == PSA_SUCCESS) { if (status == PSA_SUCCESS) {
psa_write(msg.handle, 0, output, output_length); psa_write(msg.handle, 0, output, output_length);
psa_write(msg.handle, 1, &output_length, sizeof(output_length)); psa_write(msg.handle, 1, &output_length, sizeof(output_length));
} }
mbedtls_free(output); mbedtls_free(output);
} else {
psa_cipher_abort(msg.rhandle);
} }
mbedtls_free(msg.rhandle); mbedtls_free(msg.rhandle);