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