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