From: "Teh, Wen Ping" <wen.ping....@intel.com> commit 8e36efdb548233fb98d422099e9d3e4641f53f3f from https://github.com/altera-opensource/linux-socfpga.git
Add support for large file size AES encryption and decryption using new 'update' mailbox command. The large file will be splitted into smaller chunk and send using initialize, update and finalize mailbox command. Signed-off-by: Teh, Wen Ping <wen.ping....@intel.com> Signed-off-by: Wenlin Kang <wenlin.k...@windriver.com> --- drivers/crypto/intel_fcs.c | 140 +++++++++++++++++++++++-------------- 1 file changed, 86 insertions(+), 54 deletions(-) diff --git a/drivers/crypto/intel_fcs.c b/drivers/crypto/intel_fcs.c index 99955499c3b8..7c1b95ad7c64 100644 --- a/drivers/crypto/intel_fcs.c +++ b/drivers/crypto/intel_fcs.c @@ -272,7 +272,10 @@ static long fcs_ioctl(struct file *file, unsigned int cmd, void *d_buf; void *ps_buf; void *iv_field_buf; + void *input_file_pointer; + void *output_file_pointer; unsigned int buf_sz, in_sz, out_sz; + uint32_t remaining_size, data_size, total_out_size; int ret = 0; int i; int timeout; @@ -1556,7 +1559,7 @@ static long fcs_ioctl(struct file *file, unsigned int cmd, case INTEL_FCS_DEV_CRYPTO_AES_CRYPT: if (copy_from_user(data, (void __user *)arg, sizeof(*data))) { - dev_err(dev, "failure on copy_from_user\n"); + dev_err(dev, "failure on copy_from_user data\n"); mutex_unlock(&priv->lock); return -EFAULT; } @@ -1599,8 +1602,14 @@ static long fcs_ioctl(struct file *file, unsigned int cmd, fcs_free_memory(priv, iv_field_buf, NULL, NULL); + input_file_pointer = data->com_paras.a_crypt.src; + output_file_pointer = data->com_paras.a_crypt.dst; + + remaining_size = data->com_paras.a_crypt.src_size; + total_out_size = 0; + s_buf = stratix10_svc_allocate_memory(priv->chan, - data->com_paras.a_crypt.src_size); + AES_CRYPT_CMD_MAX_SZ); if (!s_buf) { dev_err(dev, "failed allocate source buf\n"); fcs_close_services(priv, NULL, NULL); @@ -1608,76 +1617,99 @@ static long fcs_ioctl(struct file *file, unsigned int cmd, } d_buf = stratix10_svc_allocate_memory(priv->chan, - data->com_paras.a_crypt.dst_size); + AES_CRYPT_CMD_MAX_SZ); if (!d_buf) { dev_err(dev, "failed allocate destation buf\n"); fcs_close_services(priv, s_buf, NULL); return -ENOMEM; } - ret = copy_from_user(s_buf, - data->com_paras.a_crypt.src, - data->com_paras.a_crypt.src_size); - - if (ret) { - dev_err(dev, "failure on copy_from_user\n"); - fcs_close_services(priv, s_buf, d_buf); - return -EFAULT; - } - - msg->command = COMMAND_FCS_CRYPTO_AES_CRYPT_FINALIZE; - msg->arg[0] = sid; - msg->arg[1] = cid; - msg->payload = s_buf; - msg->payload_length = data->com_paras.a_crypt.src_size; - msg->payload_output = d_buf; - msg->payload_length_output = data->com_paras.a_crypt.dst_size; - priv->client.receive_cb = fcs_attestation_callback; - ps_buf = stratix10_svc_allocate_memory(priv->chan, PS_BUF_SIZE); if (!ps_buf) { - dev_err(dev, "failed to allocate p-status buf\n"); - fcs_close_services(priv, s_buf, d_buf); - return -ENOMEM; + dev_err(dev, "failed to allocate p-status buf\n"); + fcs_close_services(priv, s_buf, d_buf); + return -ENOMEM; } - ret = fcs_request_service(priv, (void *)msg, - FCS_REQUEST_TIMEOUT); - if (!ret && !priv->status) { - /* to query the complete status */ - msg->payload = ps_buf; - msg->payload_length = PS_BUF_SIZE; - msg->command = COMMAND_POLL_SERVICE_STATUS; - priv->client.receive_cb = fcs_data_callback; + while (remaining_size > 0) { + if (remaining_size > AES_CRYPT_CMD_MAX_SZ) { + msg->command = COMMAND_FCS_CRYPTO_AES_CRYPT_UPDATE; + data_size = AES_CRYPT_CMD_MAX_SZ; + dev_dbg(dev, "AES crypt update. data_size=%d\n", data_size); + } else { + msg->command = COMMAND_FCS_CRYPTO_AES_CRYPT_FINALIZE; + data_size = remaining_size; + dev_dbg(dev, "AES crypt finalize. data_size=%d\n", data_size); + } + + ret = copy_from_user(s_buf, input_file_pointer, data_size); + + if (ret) { + dev_err(dev, "failure on copy_from_user s_buf\n"); + fcs_free_memory(priv, s_buf, d_buf, ps_buf); + fcs_close_services(priv, NULL, NULL); + return -EFAULT; + } + + msg->arg[0] = sid; + msg->arg[1] = cid; + msg->payload = s_buf; + msg->payload_length = data_size; + msg->payload_output = d_buf; + msg->payload_length_output = data_size; + priv->client.receive_cb = fcs_attestation_callback; ret = fcs_request_service(priv, (void *)msg, - FCS_COMPLETED_TIMEOUT); - dev_dbg(dev, "request service ret=%d\n", ret); + FCS_REQUEST_TIMEOUT); if (!ret && !priv->status) { - if (!priv->kbuf || priv->size != 16) { - dev_err(dev, "unregconize response\n"); - fcs_free_memory(priv, s_buf, d_buf, ps_buf); - fcs_close_services(priv, NULL, NULL); - return -EFAULT; - } + /* to query the complete status */ + msg->payload = ps_buf; + msg->payload_length = PS_BUF_SIZE; + msg->command = COMMAND_POLL_SERVICE_STATUS; + priv->client.receive_cb = fcs_data_callback; + + ret = fcs_request_service(priv, (void *)msg, + FCS_COMPLETED_TIMEOUT); + if (!ret && !priv->status) { + if (!priv->kbuf || priv->size != 16) { + dev_err(dev, "unregconize response\n"); + fcs_free_memory(priv, s_buf, d_buf, ps_buf); + fcs_close_services(priv, NULL, NULL); + return -EFAULT; + } - data->com_paras.a_crypt.dst_size = - ((u32 *)priv->kbuf)[3]; + buf_sz = ((u32 *)priv->kbuf)[3]; - ret = copy_to_user( - data->com_paras.a_crypt.dst, d_buf, - data->com_paras.a_crypt.dst_size); + ret = copy_to_user(output_file_pointer, d_buf, buf_sz); - if (ret) { - dev_err(dev, "failure on copy_to_user\n"); - fcs_free_memory(priv, s_buf, d_buf, ps_buf); - fcs_close_services(priv, NULL, NULL); - return -EFAULT; + total_out_size += buf_sz; + + if (ret) { + dev_err(dev, "failure on copy_to_user\n"); + fcs_free_memory(priv, s_buf, d_buf, ps_buf); + fcs_close_services(priv, NULL, NULL); + return -EFAULT; + } } + } else { + data->com_paras.a_crypt.dst = NULL; + data->com_paras.a_crypt.dst_size = 0; + dev_err(dev, "unregconize response. ret=%d. status=%d\n", + ret, priv->status); + break; + } + + remaining_size -= data_size; + if (remaining_size == 0) { + dev_dbg(dev, "AES crypt finish sending\n"); + data->com_paras.a_crypt.dst_size = total_out_size; + break; + } else { + input_file_pointer += data_size; + output_file_pointer += data_size; + dev_dbg(dev, "Complete one update. Remaining size = %d\n", + remaining_size); } - } else { - data->com_paras.a_crypt.dst = NULL; - data->com_paras.a_crypt.dst_size = 0; } data->status = priv->status; -- 2.25.1
-=-=-=-=-=-=-=-=-=-=-=- Links: You receive all messages sent to this group. View/Reply Online (#12569): https://lists.yoctoproject.org/g/linux-yocto/message/12569 Mute This Topic: https://lists.yoctoproject.org/mt/98921485/21656 Group Owner: linux-yocto+ow...@lists.yoctoproject.org Unsubscribe: https://lists.yoctoproject.org/g/linux-yocto/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-