xref: /optee_os/core/pta/imx/manufacturing_protection.c (revision 0eaf51c3fe799a73b3afdcca21c07e139bc64500)
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