case TEE_ALG_GENERATE_SECRET_KEY:
rc = handle->PRNG_get(handle, key->secret.size, key->secret.buffer);
/* Ignore return value to avoid CRYPTO_PANIC. Only SDRM_X931_ConditionalTest() can return TEE_ERROR.*/
- rc = TEE_SUCCESS;
+ rc = 0;
break;
case TEE_ALG_GENERATE_RSA_KEY:
{
processing_len = out_size;
if (crypto_update_engine(operation, operation->data, operation->data_len, out_data, &processing_len)) {
- goto error;
+ return -1;
}
total_processing_len += processing_len;
out_size -= processing_len;
{
processing_len = out_size-total_processing_len;
if (crypto_update_engine(operation, in_data, should_be_processed_of_bytes, out_data, &processing_len)) {
- goto error;
+ return -1;
}
total_processing_len += processing_len;
in_size -= processing_len;
operation->data_len += remaining_number_of_bytes;
if (dst_len && *dst_len < total_processing_len+operation->block_len) {
- return TEE_ERROR_SHORT_BUFFER;
+ return -2;
}
pad_byte = operation->block_len - remaining_number_of_bytes;
}
if (crypto_final_engine(operation, operation->data, should_be_processed_of_pad_bytes, out_data, &processing_len)) {
- goto error;
+ return -1;
}
total_processing_len += processing_len;
operation->data_len += remaining_number_of_bytes;
if (crypto_final_engine(operation, operation->data, remaining_number_of_bytes, out_data, &processing_len)) {
- goto error;
+ return -1;
}
total_processing_len += remaining_number_of_bytes;
}
} else {
- goto error;
+ return -1;
}
}
} else if (operation->info.operationClass == TEE_OPERATION_MAC || operation->info.operationClass == TEE_OPERATION_DIGEST) {
/* accumulated data is full */
if (operation->data_len == operation->block_len) {
if (crypto_update_engine(operation, operation->data, operation->data_len, NULL, NULL)) {
- goto error;
+ return -1;
}
operation->data_len = 0;
}
if (in_size != 0) {
if (crypto_final_engine(operation, in_data, in_size, out_data, &out_size)) {
- goto error;
+ return -1;
}
total_processing_len += in_size;
}
} else {
if (crypto_final_engine(operation, in_data, in_size, out_data, &out_size)) {
- goto error;
+ return -1;
}
total_processing_len += in_size;
}
*dst_len = out_size;
}
return 0;
-error:
- LOGE(MODULE_SSF_LIB, "THIS HERE!!!");
- CRYPTO_INTERNAL_LOG("--------------------------------------------------------------");
- return -1;
}
if (!(op->info.handleState & TEE_HANDLE_FLAG_INITIALIZED)) {
TEE_DigestInit(operation);
}
- if(crypto_internal_final(op, (unsigned char*)chunk, chunkLen, (unsigned char*)hash, hashLen)) {
+ int ret = crypto_internal_final(op, (unsigned char*)chunk, chunkLen, (unsigned char*)hash, hashLen);
+ switch (ret) {
+ case 0:
+ return TEE_SUCCESS;
+ case -1:
+ case -2:
+ default:
CRYPTO_PANIC;
}
- return TEE_SUCCESS;
}
// Symmetric Cipher Functions
PERMISSION_CHECK(PERM_CRYPTO);
crypto_internal_operation * op = (crypto_internal_operation*) operation;
- if (*destLen < srcLen) {
- return TEE_ERROR_SHORT_BUFFER;
- }
if (op->info.operationClass != TEE_OPERATION_CIPHER) {
CRYPTO_PANIC;
}
if (!(op->info.handleState & TEE_HANDLE_FLAG_INITIALIZED)) {
CRYPTO_PANIC;
}
- if (crypto_internal_final(op, (unsigned char*)srcData, srcLen, (unsigned char*)destData, destLen)) {
+ int ret = crypto_internal_final(op, (unsigned char*)srcData, srcLen, (unsigned char*)destData, destLen);
+ switch (ret) {
+ case 0:
+ return TEE_SUCCESS;
+ case -2:
+ return TEE_ERROR_SHORT_BUFFER;
+ case -1:
+ default:
CRYPTO_PANIC;
}
- return TEE_SUCCESS;
}
// MAC Functions
if (!(op->info.handleState & TEE_HANDLE_FLAG_INITIALIZED)) {
CRYPTO_PANIC;
}
- if(crypto_internal_final(op, (unsigned char*)message, messageLen, (unsigned char*)mac, macLen)) {
+ int ret = crypto_internal_final(op, (unsigned char*)message, messageLen, (unsigned char*)mac, macLen);
+ return TEE_SUCCESS;
+ switch (ret) {
+ case 0:
+ return TEE_SUCCESS;
+ case -1:
+ case -2:
+ default:
CRYPTO_PANIC;
}
- return TEE_SUCCESS;
}
TEE_Result TEE_MACCompareFinal(TEE_OperationHandle operation, void* message, size_t messageLen, void* mac, size_t *macLen)
if (crypto_internal_init(op, &key, NULL, 0)) {
CRYPTO_PANIC;
}
- if (crypto_internal_final(op, (unsigned char*)srcData, srcLen, (unsigned char*)destData, destLen)) {
- return TEE_ERROR_SIGNATURE_INVALID;
+ int ret = crypto_internal_final(op, (unsigned char*)srcData, srcLen, (unsigned char*)destData, destLen);
+ switch (ret) {
+ case 0:
+ return TEE_SUCCESS;
+ case -1:
+ return TEE_ERROR_BAD_PARAMETERS;
+ case -2:
+ return TEE_ERROR_SHORT_BUFFER;
+ default:
+ CRYPTO_PANIC;
}
- return TEE_SUCCESS;
}
TEE_Result TEE_AsymmetricDecrypt(TEE_OperationHandle operation, const TEE_Attribute* params, uint32_t paramCount, const void* srcData, size_t srcLen, void* destData, size_t *destLen)
if (crypto_internal_init(op, &key, NULL, 0)) {
CRYPTO_PANIC;
}
- if (crypto_internal_final(op, (unsigned char*)srcData, srcLen, (unsigned char*)destData, destLen)) {
+ int ret = crypto_internal_final(op, (unsigned char*)srcData, srcLen, (unsigned char*)destData, destLen);
+ switch (ret) {
+ case 0:
+ return TEE_SUCCESS;
+ case -1:
+ return TEE_ERROR_BAD_PARAMETERS;
+ case -2:
+ return TEE_ERROR_SHORT_BUFFER;
+ default:
CRYPTO_PANIC;
}
- return TEE_SUCCESS;
}
TEE_Result TEE_AsymmetricSignDigest( TEE_OperationHandle operation, const TEE_Attribute* params, uint32_t paramCount, const void* digest, size_t digestLen, void* signature, size_t *signatureLen)
if (crypto_internal_init(op, &key, NULL, 0)) {
CRYPTO_PANIC;
}
- if (crypto_internal_final(op, (unsigned char*)digest, digestLen, (unsigned char*)signature, signatureLen)) {
+ int ret = crypto_internal_final(op, (unsigned char*)digest, digestLen, (unsigned char*)signature, signatureLen);
+ switch (ret) {
+ case 0:
+ return TEE_SUCCESS;
+ case -2:
return TEE_ERROR_SHORT_BUFFER;
+ case -1:
+ default:
+ CRYPTO_PANIC;
}
- return TEE_SUCCESS;
}
TEE_Result TEE_AsymmetricVerifyDigest( TEE_OperationHandle operation, const TEE_Attribute* params, uint32_t paramCount, const void* digest, size_t digestLen, void* signature, size_t signatureLen)
if (crypto_internal_init(op, &key, NULL, 0)) {
CRYPTO_PANIC;
}
- if (crypto_internal_final(op, (unsigned char*)digest, digestLen, (unsigned char*)signature, &sign_len)) {
+ int ret = crypto_internal_final(op, (unsigned char*)digest, digestLen, (unsigned char*)signature, &sign_len);
+ switch (ret) {
+ case 0:
+ return TEE_SUCCESS;
+ case -1:
return TEE_ERROR_SIGNATURE_INVALID;
+ case -2:
+ default:
+ CRYPTO_PANIC;
}
- return TEE_SUCCESS;
}
// Key Derivation Functions