xref: /rk3399_ARM-atf/plat/arm/board/fvp/fvp_el3_token_sign.c (revision 63912657b992b3abffc5a1516479aac402c896c8)
1*6a88ec8bSRaghu Krishnamurthy /*
2*6a88ec8bSRaghu Krishnamurthy  * Copyright (c) 2024, NVIDIA Corporation. All rights reserved.
3*6a88ec8bSRaghu Krishnamurthy  *
4*6a88ec8bSRaghu Krishnamurthy  * SPDX-License-Identifier: BSD-3-Clause
5*6a88ec8bSRaghu Krishnamurthy  */
6*6a88ec8bSRaghu Krishnamurthy 
7*6a88ec8bSRaghu Krishnamurthy #include <errno.h>
8*6a88ec8bSRaghu Krishnamurthy #include <string.h>
9*6a88ec8bSRaghu Krishnamurthy 
10*6a88ec8bSRaghu Krishnamurthy #include <plat/common/platform.h>
11*6a88ec8bSRaghu Krishnamurthy #include <services/rmm_el3_token_sign.h>
12*6a88ec8bSRaghu Krishnamurthy 
13*6a88ec8bSRaghu Krishnamurthy static struct el3_token_sign_request el3_req = { 0 };
14*6a88ec8bSRaghu Krishnamurthy static bool el3_req_valid;
15*6a88ec8bSRaghu Krishnamurthy 
16*6a88ec8bSRaghu Krishnamurthy /*
17*6a88ec8bSRaghu Krishnamurthy  * According to https://www.secg.org/sec1-v2.pdf 2.3.3
18*6a88ec8bSRaghu Krishnamurthy  * the size of the ECDSA P384 public key is 97 bytes,
19*6a88ec8bSRaghu Krishnamurthy  * with the first byte being 0x04.
20*6a88ec8bSRaghu Krishnamurthy  */
21*6a88ec8bSRaghu Krishnamurthy static uint8_t sample_attest_pub_key[] = {
22*6a88ec8bSRaghu Krishnamurthy 	0x04, 0x76, 0xf9, 0x88, 0x09, 0x1b, 0xe5, 0x85, 0xed, 0x41,
23*6a88ec8bSRaghu Krishnamurthy 	0x80, 0x1a, 0xec, 0xfa, 0xb8, 0x58, 0x54, 0x8c, 0x63, 0x05,
24*6a88ec8bSRaghu Krishnamurthy 	0x7e, 0x16, 0xb0, 0xe6, 0x76, 0x12, 0x0b, 0xbd, 0x0d, 0x2f,
25*6a88ec8bSRaghu Krishnamurthy 	0x9c, 0x29, 0xe0, 0x56, 0xc5, 0xd4, 0x1a, 0x01, 0x30, 0xeb,
26*6a88ec8bSRaghu Krishnamurthy 	0x9c, 0x21, 0x51, 0x78, 0x99, 0xdc, 0x23, 0x14, 0x6b, 0x28,
27*6a88ec8bSRaghu Krishnamurthy 	0xe1, 0xb0, 0x62, 0xbd, 0x3e, 0xa4, 0xb3, 0x15, 0xfd, 0x21,
28*6a88ec8bSRaghu Krishnamurthy 	0x9f, 0x1c, 0xbb, 0x52, 0x8c, 0xb6, 0xe7, 0x4c, 0xa4, 0x9b,
29*6a88ec8bSRaghu Krishnamurthy 	0xe1, 0x67, 0x73, 0x73, 0x4f, 0x61, 0xa1, 0xca, 0x61, 0x03,
30*6a88ec8bSRaghu Krishnamurthy 	0x1b, 0x2b, 0xbf, 0x3d, 0x91, 0x8f, 0x2f, 0x94, 0xff, 0xc4,
31*6a88ec8bSRaghu Krishnamurthy 	0x22, 0x8e, 0x50, 0x91, 0x95, 0x44, 0xae
32*6a88ec8bSRaghu Krishnamurthy };
33*6a88ec8bSRaghu Krishnamurthy 
34*6a88ec8bSRaghu Krishnamurthy /*
35*6a88ec8bSRaghu Krishnamurthy  * FVP does not support HES, so provide 0's as keys.
36*6a88ec8bSRaghu Krishnamurthy  */
plat_rmmd_el3_token_sign_get_rak_pub(uintptr_t buf,size_t * len,unsigned int type)37*6a88ec8bSRaghu Krishnamurthy int plat_rmmd_el3_token_sign_get_rak_pub(uintptr_t buf, size_t *len,
38*6a88ec8bSRaghu Krishnamurthy 					 unsigned int type)
39*6a88ec8bSRaghu Krishnamurthy {
40*6a88ec8bSRaghu Krishnamurthy 	(void)type;
41*6a88ec8bSRaghu Krishnamurthy 	if (*len < sizeof(sample_attest_pub_key)) {
42*6a88ec8bSRaghu Krishnamurthy 		return E_RMM_INVAL;
43*6a88ec8bSRaghu Krishnamurthy 	}
44*6a88ec8bSRaghu Krishnamurthy 
45*6a88ec8bSRaghu Krishnamurthy 	if (type != ATTEST_KEY_CURVE_ECC_SECP384R1) {
46*6a88ec8bSRaghu Krishnamurthy 		ERROR("Invalid ECC curve specified\n");
47*6a88ec8bSRaghu Krishnamurthy 		return E_RMM_INVAL;
48*6a88ec8bSRaghu Krishnamurthy 	}
49*6a88ec8bSRaghu Krishnamurthy 
50*6a88ec8bSRaghu Krishnamurthy 	*len = sizeof(sample_attest_pub_key);
51*6a88ec8bSRaghu Krishnamurthy 
52*6a88ec8bSRaghu Krishnamurthy 	(void)memcpy((void *)buf, sample_attest_pub_key,
53*6a88ec8bSRaghu Krishnamurthy 		     sizeof(sample_attest_pub_key));
54*6a88ec8bSRaghu Krishnamurthy 
55*6a88ec8bSRaghu Krishnamurthy 	return 0;
56*6a88ec8bSRaghu Krishnamurthy }
57*6a88ec8bSRaghu Krishnamurthy 
plat_rmmd_el3_token_sign_push_req(const struct el3_token_sign_request * req)58*6a88ec8bSRaghu Krishnamurthy int plat_rmmd_el3_token_sign_push_req(const struct el3_token_sign_request *req)
59*6a88ec8bSRaghu Krishnamurthy {
60*6a88ec8bSRaghu Krishnamurthy 	/*
61*6a88ec8bSRaghu Krishnamurthy 	 * TODO: Today this function is called with a lock held on the
62*6a88ec8bSRaghu Krishnamurthy 	 * RMM<->EL3 shared buffer. In the future, we may move to a
63*6a88ec8bSRaghu Krishnamurthy 	 * different design that may require handling multi-threaded
64*6a88ec8bSRaghu Krishnamurthy 	 * calls to this function, for example, if we have a per CPU
65*6a88ec8bSRaghu Krishnamurthy 	 * buffer between RMM and EL3.
66*6a88ec8bSRaghu Krishnamurthy 	 */
67*6a88ec8bSRaghu Krishnamurthy 	if (el3_req_valid) {
68*6a88ec8bSRaghu Krishnamurthy 		return E_RMM_AGAIN;
69*6a88ec8bSRaghu Krishnamurthy 	}
70*6a88ec8bSRaghu Krishnamurthy 
71*6a88ec8bSRaghu Krishnamurthy 	el3_req = *req;
72*6a88ec8bSRaghu Krishnamurthy 
73*6a88ec8bSRaghu Krishnamurthy 	if ((el3_req.hash_alg_id != EL3_TOKEN_SIGN_HASH_ALG_SHA384) ||
74*6a88ec8bSRaghu Krishnamurthy 	    (el3_req.sig_alg_id != ATTEST_KEY_CURVE_ECC_SECP384R1)) {
75*6a88ec8bSRaghu Krishnamurthy 		return E_RMM_INVAL;
76*6a88ec8bSRaghu Krishnamurthy 	}
77*6a88ec8bSRaghu Krishnamurthy 
78*6a88ec8bSRaghu Krishnamurthy 	el3_req_valid = true;
79*6a88ec8bSRaghu Krishnamurthy 
80*6a88ec8bSRaghu Krishnamurthy 	return 0;
81*6a88ec8bSRaghu Krishnamurthy }
82*6a88ec8bSRaghu Krishnamurthy 
plat_rmmd_el3_token_sign_pull_resp(struct el3_token_sign_response * resp)83*6a88ec8bSRaghu Krishnamurthy int plat_rmmd_el3_token_sign_pull_resp(struct el3_token_sign_response *resp)
84*6a88ec8bSRaghu Krishnamurthy {
85*6a88ec8bSRaghu Krishnamurthy 	if (!el3_req_valid) {
86*6a88ec8bSRaghu Krishnamurthy 		return E_RMM_AGAIN;
87*6a88ec8bSRaghu Krishnamurthy 	}
88*6a88ec8bSRaghu Krishnamurthy 
89*6a88ec8bSRaghu Krishnamurthy 	resp->rec_granule = el3_req.rec_granule;
90*6a88ec8bSRaghu Krishnamurthy 	resp->req_ticket = el3_req.req_ticket;
91*6a88ec8bSRaghu Krishnamurthy 	resp->sig_len = (uint16_t)sizeof(resp->signature_buf);
92*6a88ec8bSRaghu Krishnamurthy 	/* TODO: Provide real signature */
93*6a88ec8bSRaghu Krishnamurthy 	memset(resp->signature_buf, 0, sizeof(resp->signature_buf));
94*6a88ec8bSRaghu Krishnamurthy 
95*6a88ec8bSRaghu Krishnamurthy 	el3_req_valid = false;
96*6a88ec8bSRaghu Krishnamurthy 
97*6a88ec8bSRaghu Krishnamurthy 	return 0;
98*6a88ec8bSRaghu Krishnamurthy }
99