xref: /rk3399_rockchip-uboot/common/id_attestation.c (revision 0fdc247d095757934a48b7855f9b181a8f1e0fda)
167d79ab2Scallen.cai /*
267d79ab2Scallen.cai  * Copyright 2023, Rockchip Electronics Co., Ltd
367d79ab2Scallen.cai  * callen, <callen.cai@rock-chips.com>
467d79ab2Scallen.cai  *
567d79ab2Scallen.cai  * SPDX-License-Identifier:	GPL-2.0+
667d79ab2Scallen.cai  */
767d79ab2Scallen.cai 
867d79ab2Scallen.cai #include <common.h>
967d79ab2Scallen.cai #include <malloc.h>
1067d79ab2Scallen.cai #include <keymaster.h>
1167d79ab2Scallen.cai #include "id_attestation.h"
1267d79ab2Scallen.cai 
1367d79ab2Scallen.cai 
1467d79ab2Scallen.cai #define ID_ATTESTATION_FILE "attestation_ids"
1567d79ab2Scallen.cai /* Maximum file name size.*/
1667d79ab2Scallen.cai #define STORAGE_ID_LENGTH_MAX  64
1767d79ab2Scallen.cai 
printAttestationIds(const AttestationIds * ids)1867d79ab2Scallen.cai void printAttestationIds(const AttestationIds *ids)
1967d79ab2Scallen.cai {
2067d79ab2Scallen.cai 	printf("AttestationIds:\n");
2167d79ab2Scallen.cai 	printf("  brand:             %s\n", ids->brand);
2267d79ab2Scallen.cai 	printf("  device:            %s\n", ids->device);
2367d79ab2Scallen.cai 	printf("  product:           %s\n", ids->product);
2467d79ab2Scallen.cai 	printf("  serial:            %s\n", ids->serial);
2567d79ab2Scallen.cai 	printf("  imei:              %s\n", ids->imei);
2667d79ab2Scallen.cai 	printf("  second_imei:       %s\n", ids->second_imei);
2767d79ab2Scallen.cai 	printf("  meid:              %s\n", ids->meid);
2867d79ab2Scallen.cai 	printf("  manufacturer:      %s\n", ids->manufacturer);
2967d79ab2Scallen.cai 	printf("  model:             %s\n", ids->model);
3067d79ab2Scallen.cai }
3167d79ab2Scallen.cai uint32_t write_to_keymaster(u8 *filename, uint32_t filename_size,
3267d79ab2Scallen.cai 			    u8 *data, uint32_t data_size);
3367d79ab2Scallen.cai 
3467d79ab2Scallen.cai /* read id attestation digest len */
read_id_attestation_digest(const char * ids_digest_file,uint32_t * ids_digest_len)3567d79ab2Scallen.cai uint32_t read_id_attestation_digest(const char *ids_digest_file, uint32_t *ids_digest_len)
3667d79ab2Scallen.cai {
3767d79ab2Scallen.cai 	int len = sizeof(AttestationIds);
3867d79ab2Scallen.cai 	u8 ids_digest[len];
3967d79ab2Scallen.cai 
4067d79ab2Scallen.cai 	TEEC_Result ret = read_from_keymaster((u8 *)ids_digest_file, strlen(ids_digest_file),
4167d79ab2Scallen.cai 					      (u8 *)ids_digest, len);
4267d79ab2Scallen.cai 	if (ret != TEEC_SUCCESS)
4367d79ab2Scallen.cai 		*ids_digest_len = 0;
4467d79ab2Scallen.cai 	else
4567d79ab2Scallen.cai 		*ids_digest_len = len;
4667d79ab2Scallen.cai 	MSG("%s file:%s ,digest_len=%d,ret=%x\n", __func__, ids_digest_file, *ids_digest_len, ret);
4767d79ab2Scallen.cai 	return ret;
4867d79ab2Scallen.cai }
4967d79ab2Scallen.cai 
write_id_attestation(const char * ids_file,AttestationIds * ids,uint32_t ids_len)5067d79ab2Scallen.cai uint32_t write_id_attestation(const char *ids_file, AttestationIds *ids, uint32_t ids_len)
5167d79ab2Scallen.cai {
5267d79ab2Scallen.cai 	TEEC_Result ret = write_to_keymaster((u8 *)ids_file, strlen(ids_file),
5367d79ab2Scallen.cai 					     (u8 *)ids, ids_len);
5467d79ab2Scallen.cai 	MSG("%s ids_file=%s ret=%0x\n", __func__, ids_file, ret);
5567d79ab2Scallen.cai 	return ret;
5667d79ab2Scallen.cai }
5767d79ab2Scallen.cai 
write_id_attestation_to_secure_storage(u8 * received_data,uint32_t len)5867d79ab2Scallen.cai atap_result write_id_attestation_to_secure_storage(u8* received_data, uint32_t len)
5967d79ab2Scallen.cai {
6067d79ab2Scallen.cai 	AttestationIds ids;
6167d79ab2Scallen.cai 	u32 ids_len;
6267d79ab2Scallen.cai 	AttestationIds ids_read;
6367d79ab2Scallen.cai 	char ids_file[STORAGE_ID_LENGTH_MAX] = { 0 };
6467d79ab2Scallen.cai 
6567d79ab2Scallen.cai 	ids_len = (received_data[5] << 8) | received_data[4];
6667d79ab2Scallen.cai 	printf("%s size=%d\n", __func__, ids_len);
6767d79ab2Scallen.cai 	if (ids_len != sizeof(AttestationIds)) {
6867d79ab2Scallen.cai 		printf("%s AttestationIds size is %zu)\n", __func__, sizeof(AttestationIds));
6967d79ab2Scallen.cai 		return ATAP_RESULT_ERROR_INVALID_HEAD;
7067d79ab2Scallen.cai 	}
7167d79ab2Scallen.cai 	memcpy(&ids, received_data + 8, len);
7267d79ab2Scallen.cai #if DEBUG
7367d79ab2Scallen.cai 	printAttestationIds(&ids);
7467d79ab2Scallen.cai #endif
7567d79ab2Scallen.cai 	/* now you have got the whole AttestationIds data....*/
7667d79ab2Scallen.cai 	memcpy(ids_file, ID_ATTESTATION_FILE, sizeof(ID_ATTESTATION_FILE));
7767d79ab2Scallen.cai 	TEEC_Result ret = read_from_keymaster((u8 *)ids_file,
7867d79ab2Scallen.cai 					      strlen(ids_file),
7967d79ab2Scallen.cai 					      (u8*)&ids_read,
8067d79ab2Scallen.cai 					      sizeof(AttestationIds));
8167d79ab2Scallen.cai 	MSG("read id attestation   ret=%0x\n", ret);
8267d79ab2Scallen.cai 	if (ret == TEEC_SUCCESS) {
83*0fdc247dScallen.cai 		printf("id attestation already exsit,let's update it!");
8467d79ab2Scallen.cai #if DEBUG
8567d79ab2Scallen.cai 		printAttestationIds(&ids_read);
8667d79ab2Scallen.cai #endif
8767d79ab2Scallen.cai 	}
8867d79ab2Scallen.cai 	ret = write_id_attestation(ids_file, &ids, ids_len);
8967d79ab2Scallen.cai 	printf("write id attestation : ret=%d\n", ret);
9067d79ab2Scallen.cai 	return ret;
9167d79ab2Scallen.cai }
92