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