10db29820SClement Faure // SPDX-License-Identifier: BSD-2-Clause
20db29820SClement Faure /*
30db29820SClement Faure * Copyright 2018-2019, 2023 NXP
40db29820SClement Faure */
50db29820SClement Faure #include <drivers/caam_extension.h>
60db29820SClement Faure #include <kernel/pseudo_ta.h>
70db29820SClement Faure #include <kernel/user_ta.h>
80db29820SClement Faure #include <pta_imx_manufacturing_protection.h>
90db29820SClement Faure #include <stdint.h>
100db29820SClement Faure #include <string.h>
110db29820SClement Faure #include <tee_api_types.h>
120db29820SClement Faure
130db29820SClement Faure #define PTA_NAME "manufacturing_protection.pta"
140db29820SClement Faure
mp_get_public_key(uint32_t param_types,TEE_Param params[TEE_NUM_PARAMS])150db29820SClement Faure static TEE_Result mp_get_public_key(uint32_t param_types,
160db29820SClement Faure TEE_Param params[TEE_NUM_PARAMS])
170db29820SClement Faure {
180db29820SClement Faure uint8_t *data = NULL;
190db29820SClement Faure size_t size = 0;
200db29820SClement Faure TEE_Result res = TEE_ERROR_GENERIC;
210db29820SClement Faure uint32_t exp_param_types = TEE_PARAM_TYPES(TEE_PARAM_TYPE_MEMREF_OUTPUT,
220db29820SClement Faure TEE_PARAM_TYPE_NONE,
230db29820SClement Faure TEE_PARAM_TYPE_NONE,
240db29820SClement Faure TEE_PARAM_TYPE_NONE);
250db29820SClement Faure
260db29820SClement Faure if (param_types != exp_param_types)
270db29820SClement Faure return TEE_ERROR_BAD_PARAMETERS;
280db29820SClement Faure
290db29820SClement Faure data = params[0].memref.buffer;
300db29820SClement Faure size = params[0].memref.size;
310db29820SClement Faure
320db29820SClement Faure res = caam_mp_export_publickey(data, &size);
330db29820SClement Faure if (res != TEE_SUCCESS)
340db29820SClement Faure EMSG("MP public key export failed with code 0x%" PRIx32, res);
350db29820SClement Faure
360db29820SClement Faure params[0].memref.size = size;
370db29820SClement Faure return res;
380db29820SClement Faure }
390db29820SClement Faure
mp_signature(uint32_t param_types,TEE_Param params[TEE_NUM_PARAMS])400db29820SClement Faure static TEE_Result mp_signature(uint32_t param_types,
410db29820SClement Faure TEE_Param params[TEE_NUM_PARAMS])
420db29820SClement Faure {
430db29820SClement Faure TEE_Result res = TEE_ERROR_GENERIC;
440db29820SClement Faure uint8_t *msg = NULL;
450db29820SClement Faure uint8_t *sig = NULL;
460db29820SClement Faure uint8_t *mpmr = NULL;
470db29820SClement Faure size_t msg_size = 0;
480db29820SClement Faure size_t sig_size = 0;
490db29820SClement Faure size_t mpmr_size = 0;
500db29820SClement Faure uint32_t exp_param_types = TEE_PARAM_TYPES(TEE_PARAM_TYPE_MEMREF_INPUT,
510db29820SClement Faure TEE_PARAM_TYPE_MEMREF_OUTPUT,
520db29820SClement Faure TEE_PARAM_TYPE_MEMREF_OUTPUT,
530db29820SClement Faure TEE_PARAM_TYPE_NONE);
540db29820SClement Faure
550db29820SClement Faure if (param_types != exp_param_types)
560db29820SClement Faure return TEE_ERROR_BAD_PARAMETERS;
570db29820SClement Faure
580db29820SClement Faure DMSG("MPSign function");
590db29820SClement Faure
600db29820SClement Faure msg = params[0].memref.buffer;
610db29820SClement Faure msg_size = params[0].memref.size;
620db29820SClement Faure sig = params[1].memref.buffer;
630db29820SClement Faure sig_size = params[1].memref.size;
640db29820SClement Faure mpmr = params[2].memref.buffer;
650db29820SClement Faure mpmr_size = params[2].memref.size;
660db29820SClement Faure
670db29820SClement Faure memset(sig, 0, sig_size);
680db29820SClement Faure memset(mpmr, 0, mpmr_size);
690db29820SClement Faure
700db29820SClement Faure res = caam_mp_sign(msg, &msg_size, sig, &sig_size);
710db29820SClement Faure
720db29820SClement Faure params[1].memref.size = sig_size;
730db29820SClement Faure
740db29820SClement Faure if (res != TEE_SUCCESS) {
750db29820SClement Faure EMSG("Manufacturing Protection signature failed 0x%" PRIx32,
760db29820SClement Faure res);
770db29820SClement Faure return res;
780db29820SClement Faure }
790db29820SClement Faure
800db29820SClement Faure res = caam_mp_export_mpmr(mpmr, &mpmr_size);
810db29820SClement Faure
820db29820SClement Faure params[2].memref.size = mpmr_size;
830db29820SClement Faure
840db29820SClement Faure if (res != TEE_SUCCESS)
850db29820SClement Faure EMSG("Manufacturing Protection export MPRM failed 0x%" PRIx32,
860db29820SClement Faure res);
870db29820SClement Faure
880db29820SClement Faure return res;
890db29820SClement Faure }
900db29820SClement Faure
910db29820SClement Faure static TEE_Result
pta_mp_open_session(uint32_t param_types __unused,TEE_Param params[TEE_NUM_PARAMS]__unused,void ** sess_ctx __unused)920db29820SClement Faure pta_mp_open_session(uint32_t param_types __unused,
930db29820SClement Faure TEE_Param params[TEE_NUM_PARAMS] __unused,
940db29820SClement Faure void **sess_ctx __unused)
950db29820SClement Faure {
960db29820SClement Faure struct ts_session *s = NULL;
970db29820SClement Faure
98*0eaf51c3SJorge Ramirez-Ortiz if (IS_ENABLED(CFG_NXP_CAAM_MP_NO_ACCESS_CTRL))
99*0eaf51c3SJorge Ramirez-Ortiz return TEE_SUCCESS;
100*0eaf51c3SJorge Ramirez-Ortiz
1010db29820SClement Faure s = ts_get_calling_session();
1020db29820SClement Faure if (!s || !is_user_ta_ctx(s->ctx))
1030db29820SClement Faure return TEE_ERROR_ACCESS_DENIED;
1040db29820SClement Faure
1050db29820SClement Faure return TEE_SUCCESS;
1060db29820SClement Faure }
1070db29820SClement Faure
pta_mp_invoke_cmd(void * sess_ctx __unused,uint32_t cmd_id,uint32_t param_types,TEE_Param params[TEE_NUM_PARAMS])1080db29820SClement Faure static TEE_Result pta_mp_invoke_cmd(void *sess_ctx __unused,
1090db29820SClement Faure uint32_t cmd_id, uint32_t param_types,
1100db29820SClement Faure TEE_Param params[TEE_NUM_PARAMS])
1110db29820SClement Faure {
1120db29820SClement Faure switch (cmd_id) {
1130db29820SClement Faure case PTA_IMX_MP_CMD_SIGNATURE_MPMR:
1140db29820SClement Faure return mp_signature(param_types, params);
1150db29820SClement Faure case PTA_IMX_MP_CMD_GET_PUBLIC_KEY:
1160db29820SClement Faure return mp_get_public_key(param_types, params);
1170db29820SClement Faure default:
1180db29820SClement Faure return TEE_ERROR_BAD_PARAMETERS;
1190db29820SClement Faure }
1200db29820SClement Faure }
1210db29820SClement Faure
1220db29820SClement Faure pseudo_ta_register(.uuid = PTA_MANUFACT_PROTEC_UUID, .name = PTA_NAME,
1230db29820SClement Faure .flags = PTA_DEFAULT_FLAGS,
1240db29820SClement Faure .open_session_entry_point = pta_mp_open_session,
1250db29820SClement Faure .invoke_command_entry_point = pta_mp_invoke_cmd);
126