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
printAttestationIds(const AttestationIds * ids)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 */
read_id_attestation_digest(const char * ids_digest_file,uint32_t * ids_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
write_id_attestation(const char * ids_file,AttestationIds * ids,uint32_t ids_len)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
write_id_attestation_to_secure_storage(u8 * received_data,uint32_t len)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,let's update it!");
84 #if DEBUG
85 printAttestationIds(&ids_read);
86 #endif
87 }
88 ret = write_id_attestation(ids_file, &ids, ids_len);
89 printf("write id attestation : ret=%d\n", ret);
90 return ret;
91 }
92