xref: /rk3399_rockchip-uboot/common/id_attestation.c (revision 67d79ab2462607c62e2eec07ab87f826dbb5a0e5)
1*67d79ab2Scallen.cai /*
2*67d79ab2Scallen.cai  * Copyright 2023, Rockchip Electronics Co., Ltd
3*67d79ab2Scallen.cai  * callen, <callen.cai@rock-chips.com>
4*67d79ab2Scallen.cai  *
5*67d79ab2Scallen.cai  * SPDX-License-Identifier:	GPL-2.0+
6*67d79ab2Scallen.cai  */
7*67d79ab2Scallen.cai 
8*67d79ab2Scallen.cai #include <common.h>
9*67d79ab2Scallen.cai #include <malloc.h>
10*67d79ab2Scallen.cai #include <keymaster.h>
11*67d79ab2Scallen.cai #include "id_attestation.h"
12*67d79ab2Scallen.cai 
13*67d79ab2Scallen.cai 
14*67d79ab2Scallen.cai #define ID_ATTESTATION_FILE "attestation_ids"
15*67d79ab2Scallen.cai /* Maximum file name size.*/
16*67d79ab2Scallen.cai #define STORAGE_ID_LENGTH_MAX  64
17*67d79ab2Scallen.cai 
18*67d79ab2Scallen.cai void printAttestationIds(const AttestationIds *ids)
19*67d79ab2Scallen.cai {
20*67d79ab2Scallen.cai 	printf("AttestationIds:\n");
21*67d79ab2Scallen.cai 	printf("  brand:             %s\n", ids->brand);
22*67d79ab2Scallen.cai 	printf("  device:            %s\n", ids->device);
23*67d79ab2Scallen.cai 	printf("  product:           %s\n", ids->product);
24*67d79ab2Scallen.cai 	printf("  serial:            %s\n", ids->serial);
25*67d79ab2Scallen.cai 	printf("  imei:              %s\n", ids->imei);
26*67d79ab2Scallen.cai 	printf("  second_imei:       %s\n", ids->second_imei);
27*67d79ab2Scallen.cai 	printf("  meid:              %s\n", ids->meid);
28*67d79ab2Scallen.cai 	printf("  manufacturer:      %s\n", ids->manufacturer);
29*67d79ab2Scallen.cai 	printf("  model:             %s\n", ids->model);
30*67d79ab2Scallen.cai }
31*67d79ab2Scallen.cai uint32_t write_to_keymaster(u8 *filename, uint32_t filename_size,
32*67d79ab2Scallen.cai 			    u8 *data, uint32_t data_size);
33*67d79ab2Scallen.cai 
34*67d79ab2Scallen.cai /* read id attestation digest len */
35*67d79ab2Scallen.cai uint32_t read_id_attestation_digest(const char *ids_digest_file, uint32_t *ids_digest_len)
36*67d79ab2Scallen.cai {
37*67d79ab2Scallen.cai 	int len = sizeof(AttestationIds);
38*67d79ab2Scallen.cai 	u8 ids_digest[len];
39*67d79ab2Scallen.cai 
40*67d79ab2Scallen.cai 	TEEC_Result ret = read_from_keymaster((u8 *)ids_digest_file, strlen(ids_digest_file),
41*67d79ab2Scallen.cai 					      (u8 *)ids_digest, len);
42*67d79ab2Scallen.cai 	if (ret != TEEC_SUCCESS)
43*67d79ab2Scallen.cai 		*ids_digest_len = 0;
44*67d79ab2Scallen.cai 	else
45*67d79ab2Scallen.cai 		*ids_digest_len = len;
46*67d79ab2Scallen.cai 	MSG("%s file:%s ,digest_len=%d,ret=%x\n", __func__, ids_digest_file, *ids_digest_len, ret);
47*67d79ab2Scallen.cai 	return ret;
48*67d79ab2Scallen.cai }
49*67d79ab2Scallen.cai 
50*67d79ab2Scallen.cai uint32_t write_id_attestation(const char *ids_file, AttestationIds *ids, uint32_t ids_len)
51*67d79ab2Scallen.cai {
52*67d79ab2Scallen.cai 	TEEC_Result ret = write_to_keymaster((u8 *)ids_file, strlen(ids_file),
53*67d79ab2Scallen.cai 					     (u8 *)ids, ids_len);
54*67d79ab2Scallen.cai 	MSG("%s ids_file=%s ret=%0x\n", __func__, ids_file, ret);
55*67d79ab2Scallen.cai 	return ret;
56*67d79ab2Scallen.cai }
57*67d79ab2Scallen.cai 
58*67d79ab2Scallen.cai atap_result write_id_attestation_to_secure_storage(u8* received_data, uint32_t len)
59*67d79ab2Scallen.cai {
60*67d79ab2Scallen.cai 	AttestationIds ids;
61*67d79ab2Scallen.cai 	u32 ids_len;
62*67d79ab2Scallen.cai 	AttestationIds ids_read;
63*67d79ab2Scallen.cai 	char ids_file[STORAGE_ID_LENGTH_MAX] = { 0 };
64*67d79ab2Scallen.cai 
65*67d79ab2Scallen.cai 	ids_len = (received_data[5] << 8) | received_data[4];
66*67d79ab2Scallen.cai 	printf("%s size=%d\n", __func__, ids_len);
67*67d79ab2Scallen.cai 	if (ids_len != sizeof(AttestationIds)) {
68*67d79ab2Scallen.cai 		printf("%s AttestationIds size is %zu)\n", __func__, sizeof(AttestationIds));
69*67d79ab2Scallen.cai 		return ATAP_RESULT_ERROR_INVALID_HEAD;
70*67d79ab2Scallen.cai 	}
71*67d79ab2Scallen.cai 	memcpy(&ids, received_data + 8, len);
72*67d79ab2Scallen.cai #if DEBUG
73*67d79ab2Scallen.cai 	printAttestationIds(&ids);
74*67d79ab2Scallen.cai #endif
75*67d79ab2Scallen.cai 	/* now you have got the whole AttestationIds data....*/
76*67d79ab2Scallen.cai 	memcpy(ids_file, ID_ATTESTATION_FILE, sizeof(ID_ATTESTATION_FILE));
77*67d79ab2Scallen.cai 	TEEC_Result ret = read_from_keymaster((u8 *)ids_file,
78*67d79ab2Scallen.cai 					      strlen(ids_file),
79*67d79ab2Scallen.cai 					      (u8*)&ids_read,
80*67d79ab2Scallen.cai 					      sizeof(AttestationIds));
81*67d79ab2Scallen.cai 	MSG("read id attestation   ret=%0x\n", ret);
82*67d79ab2Scallen.cai 	if (ret == TEEC_SUCCESS) {
83*67d79ab2Scallen.cai 		printf("id attestation already exsit,you cannot update it!");
84*67d79ab2Scallen.cai #if DEBUG
85*67d79ab2Scallen.cai 		printAttestationIds(&ids_read);
86*67d79ab2Scallen.cai #endif
87*67d79ab2Scallen.cai 		ret = ATAP_RESULT_ERROR_ALREADY_EXSIT;
88*67d79ab2Scallen.cai 		return ret;
89*67d79ab2Scallen.cai 	}
90*67d79ab2Scallen.cai 	ret = write_id_attestation(ids_file, &ids, ids_len);
91*67d79ab2Scallen.cai 	printf("write id attestation : ret=%d\n", ret);
92*67d79ab2Scallen.cai 	return ret;
93*67d79ab2Scallen.cai }
94