Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

plat-versal: add support for the Versal Net variant #6738

Open
wants to merge 13 commits into
base: master
Choose a base branch
from
Open
79 changes: 51 additions & 28 deletions core/drivers/crypto/versal/authenc.c
Original file line number Diff line number Diff line change
Expand Up @@ -343,7 +343,9 @@ static TEE_Result do_init(struct drvcrypt_authenc_init *dinit)
}

/* Write the key */
versal_mbox_alloc(dinit->key.length, dinit->key.data, &key);
ret = versal_mbox_alloc(dinit->key.length, dinit->key.data, &key);
if (ret)
return ret;

arg.data[arg.dlen++] = key_len;
arg.data[arg.dlen++] = engine.key_src;
Expand All @@ -358,8 +360,12 @@ static TEE_Result do_init(struct drvcrypt_authenc_init *dinit)
memset(&arg, 0, sizeof(arg));

/* Send the initialization structure */
versal_mbox_alloc(sizeof(*init), NULL, &init_buf);
versal_mbox_alloc(dinit->nonce.length, dinit->nonce.data, &nonce);
ret = versal_mbox_alloc(sizeof(*init), NULL, &init_buf);
if (ret)
goto out1;
ret = versal_mbox_alloc(dinit->nonce.length, dinit->nonce.data, &nonce);
if (ret)
goto out2;

init = init_buf.buf;
init->iv_addr = virt_to_phys(nonce.buf);
Expand Down Expand Up @@ -400,9 +406,11 @@ static TEE_Result do_init(struct drvcrypt_authenc_init *dinit)

return TEE_SUCCESS;
error:
free(key.buf);
free(init_buf.buf);
free(nonce.buf);
versal_mbox_free(&nonce);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

since versal_mbox_free() NULL's the internal buffer reference, you don't need these numerous branch labels. The below instructions are enough:

error:
	versal_mbox_free(&nonce);
	versal_mbox_free(&init_buf);
	versal_mbox_free(&key);

	return ret;

out2:
versal_mbox_free(&init_buf);
out1:
versal_mbox_free(&key);

return ret;
}
Expand All @@ -427,7 +435,9 @@ static TEE_Result do_update_aad(struct drvcrypt_authenc_update_aad *dupdate)
if (engine.state == FINALIZED)
do_replay();

versal_mbox_alloc(dupdate->aad.length, dupdate->aad.data, &p);
ret = versal_mbox_alloc(dupdate->aad.length, dupdate->aad.data, &p);
if (ret)
return ret;

arg.data[arg.dlen++] = p.len % 16 ? p.alloc_len : p.len;
arg.ibuf[0].mem = p;
Expand Down Expand Up @@ -455,7 +465,7 @@ static TEE_Result do_update_aad(struct drvcrypt_authenc_update_aad *dupdate)

return TEE_SUCCESS;
error:
free(p.buf);
versal_mbox_free(&p);
return ret;
}

Expand All @@ -481,9 +491,15 @@ update_payload(struct drvcrypt_authenc_update_payload *dupdate, bool is_last)
return TEE_ERROR_BAD_PARAMETERS;
}

versal_mbox_alloc(dupdate->src.length, dupdate->src.data, &p);
versal_mbox_alloc(dupdate->dst.length, NULL, &q);
versal_mbox_alloc(sizeof(*input), NULL, &input_cmd);
ret = versal_mbox_alloc(dupdate->src.length, dupdate->src.data, &p);
if (ret)
return ret;
ret = versal_mbox_alloc(dupdate->dst.length, NULL, &q);
if (ret)
goto out1;
ret = versal_mbox_alloc(sizeof(*input), NULL, &input_cmd);
if (ret)
goto out2;

input = input_cmd.buf;
input->input_addr = virt_to_phys(p.buf);
Expand All @@ -505,7 +521,7 @@ update_payload(struct drvcrypt_authenc_update_payload *dupdate, bool is_last)
if (versal_crypto_request(id, &arg, &err)) {
EMSG("AES_UPDATE_PAYLOAD error: %s", versal_aes_error(err));
ret = TEE_ERROR_GENERIC;
goto out;
goto error;
}

if (dupdate->dst.data)
Expand All @@ -515,7 +531,7 @@ update_payload(struct drvcrypt_authenc_update_payload *dupdate, bool is_last)
node = calloc(1, sizeof(*node));
if (!node) {
ret = TEE_ERROR_OUT_OF_MEMORY;
goto out;
goto error;
}

node->is_aad = false;
Expand All @@ -527,10 +543,12 @@ update_payload(struct drvcrypt_authenc_update_payload *dupdate, bool is_last)

return TEE_SUCCESS;
}
out:
free(p.buf);
free(q.buf);
free(input_cmd.buf);
error:
versal_mbox_free(&input_cmd);
out2:
versal_mbox_free(&q);
out1:
versal_mbox_free(&p);

return ret;
}
Expand Down Expand Up @@ -594,7 +612,9 @@ static TEE_Result do_enc_final(struct drvcrypt_authenc_final *dfinal)

memcpy(dfinal->dst.data, last.dst.data, dfinal->dst.length);

versal_mbox_alloc(GCM_TAG_LEN, NULL, &p);
ret = versal_mbox_alloc(GCM_TAG_LEN, NULL, &p);
if (ret)
return ret;

arg.ibuf[0].mem = p;
if (versal_crypto_request(VERSAL_AES_ENCRYPT_FINAL, &arg, &err)) {
Expand All @@ -606,7 +626,7 @@ static TEE_Result do_enc_final(struct drvcrypt_authenc_final *dfinal)
memcpy(dfinal->tag.data, p.buf, GCM_TAG_LEN);
dfinal->tag.length = GCM_TAG_LEN;
out:
free(p.buf);
versal_mbox_free(&p);

if (refcount_val(&engine.refc) > 1)
engine.state = FINALIZED;
Expand Down Expand Up @@ -646,7 +666,10 @@ static TEE_Result do_dec_final(struct drvcrypt_authenc_final *dfinal)
if (ret)
return ret;

versal_mbox_alloc(dfinal->tag.length, dfinal->tag.data, &p);
ret = versal_mbox_alloc(dfinal->tag.length, dfinal->tag.data, &p);
if (ret)
return ret;

arg.ibuf[0].mem = p;

if (versal_crypto_request(VERSAL_AES_DECRYPT_FINAL, &arg, &err)) {
Expand All @@ -659,7 +682,7 @@ static TEE_Result do_dec_final(struct drvcrypt_authenc_final *dfinal)
memcpy(dfinal->tag.data, p.buf, GCM_TAG_LEN);
dfinal->tag.length = GCM_TAG_LEN;
out:
free(p.buf);
versal_mbox_free(&p);

if (refcount_val(&engine.refc) > 1)
engine.state = FINALIZED;
Expand Down Expand Up @@ -687,19 +710,19 @@ static void do_free(void *ctx)
release = true;
refcount_set(&engine.refc, 1);
engine.state = READY;
free(engine.init.init_buf.buf);
free(engine.init.nonce.buf);
free(engine.init.key.buf);
versal_mbox_free(&engine.init.init_buf);
versal_mbox_free(&engine.init.nonce);
versal_mbox_free(&engine.init.key);
memset(&engine.init, 0, sizeof(engine.init));
STAILQ_FOREACH_SAFE(node, &engine.replay_list, link, next) {
STAILQ_REMOVE(&engine.replay_list, node,
versal_node, link);
if (node->is_aad) {
free(node->aad.mem.buf);
versal_mbox_free(&node->aad.mem);
} else {
free(node->payload.dst.buf);
free(node->payload.src.buf);
free(node->payload.input_cmd.buf);
versal_mbox_free(&node->payload.dst);
versal_mbox_free(&node->payload.src);
versal_mbox_free(&node->payload.input_cmd);
}
free(node);
}
Expand Down
6 changes: 3 additions & 3 deletions core/drivers/crypto/versal/ipi.c
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ static TEE_Result versal_sha3_request(enum versal_crypto_api id,
cmd.ibuf[0].mem = arg->ibuf[0].mem;
}

return versal_mbox_notify(&cmd, NULL, NULL);
return versal_mbox_notify_pmc(&cmd, NULL, NULL);
}

static TEE_Result versal_aes_update_aad_request(enum versal_crypto_api id,
Expand All @@ -63,7 +63,7 @@ static TEE_Result versal_aes_update_aad_request(enum versal_crypto_api id,

cmd.ibuf[0].mem = arg->ibuf[0].mem;

return versal_mbox_notify(&cmd, NULL, NULL);
return versal_mbox_notify_pmc(&cmd, NULL, NULL);
}

TEE_Result versal_crypto_request(enum versal_crypto_api id,
Expand Down Expand Up @@ -106,5 +106,5 @@ TEE_Result versal_crypto_request(enum versal_crypto_api id,
for (i = 0; i < VERSAL_MAX_IPI_BUF; i++)
cmd.ibuf[i].mem = arg->ibuf[i].mem;
notify:
return versal_mbox_notify(&cmd, NULL, err);
return versal_mbox_notify_pmc(&cmd, NULL, err);
}
62 changes: 44 additions & 18 deletions core/drivers/crypto/versal/rsa.c
Original file line number Diff line number Diff line change
Expand Up @@ -72,15 +72,25 @@ static TEE_Result do_encrypt(struct drvcrypt_rsa_ed *rsa_data)
assert(0);
}

versal_mbox_alloc(RSA_MAX_MOD_LEN + RSA_MAX_PUB_EXP_LEN, NULL, &key);
ret = versal_mbox_alloc(RSA_MAX_MOD_LEN + RSA_MAX_PUB_EXP_LEN,
NULL, &key);
if (ret)
return ret;

crypto_bignum_bn2bin_pad(rsa_data->key.n_size, p->n, key.buf);
crypto_bignum_bn2bin_pad(RSA_MAX_PUB_EXP_LEN,
p->e, (uint8_t *)key.buf + RSA_MAX_MOD_LEN);

versal_mbox_alloc(rsa_data->message.length, rsa_data->message.data,
&msg);
versal_mbox_alloc(rsa_data->cipher.length, NULL, &cipher);
versal_mbox_alloc(sizeof(*cmd), NULL, &cmd_buf);
ret = versal_mbox_alloc(rsa_data->message.length,
rsa_data->message.data, &msg);
if (ret)
goto out1;
ret = versal_mbox_alloc(rsa_data->cipher.length, NULL, &cipher);
if (ret)
goto out2;
ret = versal_mbox_alloc(sizeof(*cmd), NULL, &cmd_buf);
if (ret)
goto out3;

cmd = cmd_buf.buf;
cmd->key_len = rsa_data->key.n_size;
Expand All @@ -107,10 +117,13 @@ static TEE_Result do_encrypt(struct drvcrypt_rsa_ed *rsa_data)
memcpy(rsa_data->cipher.data, cipher.buf, rsa_data->key.n_size);
}

free(cipher.buf);
free(cmd);
free(msg.buf);
free(key.buf);
versal_mbox_free(&cmd_buf);
out3:
versal_mbox_free(&cipher);
out2:
versal_mbox_free(&msg);
out1:
versal_mbox_free(&key);

return ret;
}
Expand Down Expand Up @@ -161,15 +174,25 @@ static TEE_Result do_decrypt(struct drvcrypt_rsa_ed *rsa_data)
assert(0);
}

versal_mbox_alloc(RSA_MAX_MOD_LEN + RSA_MAX_PRIV_EXP_LEN, NULL, &key);
ret = versal_mbox_alloc(RSA_MAX_MOD_LEN + RSA_MAX_PRIV_EXP_LEN,
NULL, &key);
if (ret)
return ret;

crypto_bignum_bn2bin_pad(rsa_data->key.n_size, p->n, key.buf);
crypto_bignum_bn2bin_pad(rsa_data->key.n_size, p->d,
(uint8_t *)key.buf + RSA_MAX_MOD_LEN);

versal_mbox_alloc(rsa_data->cipher.length, rsa_data->cipher.data,
&cipher);
versal_mbox_alloc(rsa_data->message.length, NULL, &msg);
versal_mbox_alloc(sizeof(*cmd), NULL, &cmd_buf);
ret = versal_mbox_alloc(rsa_data->cipher.length, rsa_data->cipher.data,
&cipher);
if (ret)
goto out1;
ret = versal_mbox_alloc(rsa_data->message.length, NULL, &msg);
if (ret)
goto out2;
ret = versal_mbox_alloc(sizeof(*cmd), NULL, &cmd_buf);
if (ret)
goto out3;

cmd = cmd_buf.buf;
cmd->key_len = rsa_data->key.n_size;
Expand All @@ -192,10 +215,13 @@ static TEE_Result do_decrypt(struct drvcrypt_rsa_ed *rsa_data)
memcpy(rsa_data->message.data, msg.buf, rsa_data->key.n_size);
}

free(cipher.buf);
free(cmd);
free(key.buf);
free(msg.buf);
versal_mbox_free(&cmd_buf);
out3:
versal_mbox_free(&msg);
out2:
versal_mbox_free(&cipher);
out1:
versal_mbox_free(&key);

return ret;
}
Expand Down