You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
239 lines
8.3 KiB
239 lines
8.3 KiB
/*
|
|
* Copyright (c) Hisilicon Technologies Co., Ltd. 2019-2021. All rights reserved.
|
|
* Description: TEE keyladder test sample.
|
|
* Author: linux SDK team
|
|
* Create: 2019-07-25
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <unistd.h>
|
|
#include "td_type.h"
|
|
#include "tee_client_api.h"
|
|
|
|
#define sample_get_inputcmd(input_cmd) fgets((char *)(input_cmd), (sizeof(input_cmd) - 1), stdin)
|
|
|
|
#define ext_dbg_otp(format, arg...) printf("%s,%d: " format, __FUNCTION__, __LINE__, ## arg)
|
|
#define ext_fatal_otp(format, arg...) printf("%s,%d: " format, __FUNCTION__, __LINE__, ## arg)
|
|
#define ext_err_otp(format, arg...) printf("%s,%d: " format, __FUNCTION__, __LINE__, ## arg)
|
|
#define ext_warn_otp(format, arg...) printf("%s,%d: " format, __FUNCTION__, __LINE__, ## arg)
|
|
#define ext_info_otp(format, arg...) printf("%s,%d: " format, __FUNCTION__, __LINE__, ## arg)
|
|
|
|
#define print_err(val) ext_err_otp("%s\n", val)
|
|
|
|
#define print_dbg_hex(val) ext_info_otp("%s = 0x%08x\n", #val, val)
|
|
#define print_dbg_hex2(x, y) ext_info_otp("%s = 0x%08x %s = 0x%08x\n", #x, x, #y, y)
|
|
#define print_dbg_hex3(x, y, z) ext_info_otp("%s = 0x%08x %s = 0x%08x %s = 0x%08x\n", #x, x, #y, y, #z, z)
|
|
|
|
#define print_err_hex(val) ext_err_otp("%s = 0x%08x\n", #val, val)
|
|
#define print_err_hex2(x, y) ext_err_otp("%s = 0x%08x %s = 0x%08x\n", #x, x, #y, y)
|
|
#define print_err_hex3(x, y, z) ext_err_otp("%s = 0x%08x %s = 0x%08x %s = 0x%08x\n", #x, x, #y, y, #z, z)
|
|
#define print_err_hex4(w, x, y, z) ext_err_otp("%s = 0x%08x %s = 0x%08x %s = 0x%08x %s = 0x%08x\n", #w, \
|
|
w, #x, x, #y, y, #z, z)
|
|
|
|
#define print_dbg_func_hex(func, val) ext_info_otp("call [%s]%s = 0x%08x\n", #func, #val, val)
|
|
#define print_dbg_func_hex2(func, x, y) ext_info_otp("call [%s]%s = 0x%08x %s = 0x%08x\n", #func, #x, x, #y, y)
|
|
#define print_dbg_func_hex3(func, x, y, z) \
|
|
ext_info_otp("call [%s]%s = 0x%08x %s = 0x%08x %s = 0x%08x\n", #func, #x, x, #y, y, #z, z)
|
|
#define print_dbg_func_hex4(func, w, x, y, z) \
|
|
ext_info_otp("call [%s]%s = 0x%08x %s = 0x%08x %s = 0x%08x %s = 0x%08x\n", #func, #w, w, #x, x, #y, y, #z, z)
|
|
|
|
#define print_err_func_hex(func, val) ext_err_otp("call [%s]%s = 0x%08x\n", #func, #val, val)
|
|
#define print_err_func_hex2(func, x, y) ext_err_otp("call [%s]%s = 0x%08x %s = 0x%08x\n", #func, #x, x, #y, y)
|
|
#define print_err_func_hex3(func, x, y, z) \
|
|
ext_err_otp("call [%s]%s = 0x%08x %s = 0x%08x %s = 0x%08x\n", #func, #x, x, #y, y, #z, z)
|
|
#define print_err_func_hex4(func, w, x, y, z) \
|
|
ext_err_otp("call [%s]%s = 0x%08x %s = 0x%08x %s = 0x%08x %s = 0x%08x\n", #func, #w, w, #x, x, #y, y, #z, z)
|
|
|
|
#define dbg_print_dbg_hex(val) ext_dbg_otp("%s = 0x%08x\n", #val, val)
|
|
#define print_err_val(val) ext_err_otp("%s = %d\n", #val, val)
|
|
#define print_err_point(val) ext_err_otp("%s = %p\n", #val, val)
|
|
#define print_err_code(err_code) ext_err_otp("return [0x%08x]\n", err_code)
|
|
#define print_warn_code(err_code) ext_warn_otp("return [0x%08x]\n", err_code)
|
|
#define print_err_func(func, err_code) ext_err_otp("call [%s] return [0x%08x]\n", #func, err_code)
|
|
|
|
/*
|
|
* *********************************OTP****************************************
|
|
*/
|
|
#define OTP_CMD_READ_WORD 0x01
|
|
#define OTP_CMD_READ_BYTE 0x02
|
|
#define OTP_CMD_WRITE_BYTE 0x03
|
|
#define OTP_CMD_LOG_LEVEL 0xff
|
|
|
|
static int g_session_open = -1;
|
|
static TEEC_Context g_teec_context = {0};
|
|
static TEEC_Session g_teec_session = {0};
|
|
static TEEC_UUID g_teec_uuid = { 0x7ece101c, 0xe197, 0x11e8, { 0x9f, 0x32, 0xf2, 0x80, 0x1f, 0x1b, 0x9f, 0xd1 } };
|
|
|
|
int tee_otp_ta_init()
|
|
{
|
|
TEEC_Result teec_rst;
|
|
TEEC_Operation sess_op = {0};
|
|
uint32_t origin = 0;
|
|
|
|
if (g_session_open > 0) {
|
|
g_session_open++;
|
|
return 0;
|
|
}
|
|
|
|
teec_rst = TEEC_InitializeContext(NULL, &g_teec_context);
|
|
if (teec_rst != TEEC_SUCCESS) {
|
|
print_err_func(TEEC_InitializeContext, teec_rst);
|
|
return teec_rst;
|
|
}
|
|
sess_op.started = 1;
|
|
sess_op.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, TEEC_NONE,
|
|
TEEC_MEMREF_TEMP_INPUT,
|
|
TEEC_MEMREF_TEMP_INPUT);
|
|
teec_rst = TEEC_OpenSession(&g_teec_context,
|
|
&g_teec_session,
|
|
&g_teec_uuid,
|
|
TEEC_LOGIN_IDENTIFY,
|
|
NULL,
|
|
&sess_op,
|
|
&origin);
|
|
if (teec_rst != TEEC_SUCCESS) {
|
|
(void)TEEC_FinalizeContext(&g_teec_context);
|
|
print_err_func(TEEC_OpenSession, teec_rst);
|
|
return (int)teec_rst;
|
|
}
|
|
|
|
g_session_open = 1;
|
|
return 0;
|
|
}
|
|
|
|
int tee_otp_ta_deinit()
|
|
{
|
|
if (g_session_open > 0) {
|
|
g_session_open--;
|
|
}
|
|
|
|
if (g_session_open != 0) {
|
|
return 0;
|
|
}
|
|
(void)TEEC_CloseSession(&g_teec_session);
|
|
(void)TEEC_FinalizeContext(&g_teec_context);
|
|
|
|
g_session_open = -1;
|
|
|
|
return 0;
|
|
}
|
|
|
|
int tee_otp_log_level(td_u32 level)
|
|
{
|
|
TEEC_Result teec_result;
|
|
TEEC_Operation teec_operation = {0};
|
|
|
|
teec_operation.started = 1;
|
|
teec_operation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE);
|
|
teec_operation.params[0].value.a = (unsigned int)level;
|
|
|
|
teec_result = TEEC_InvokeCommand(&g_teec_session, OTP_CMD_LOG_LEVEL, &teec_operation, NULL);
|
|
if (teec_result != 0) {
|
|
print_err_func_hex2(OTP_CMD_LOG_LEVEL, teec_result, level);
|
|
return (int)teec_result;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
int tee_otp_ta_read_word(td_u32 addr, td_u32 *value)
|
|
{
|
|
TEEC_Result teec_result;
|
|
TEEC_Operation teec_operation = {0};
|
|
|
|
teec_operation.started = 1;
|
|
teec_operation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INOUT, TEEC_NONE, TEEC_NONE, TEEC_NONE);
|
|
teec_operation.params[0].value.a = (unsigned int)addr;
|
|
|
|
teec_result = TEEC_InvokeCommand(&g_teec_session, OTP_CMD_READ_WORD, &teec_operation, NULL);
|
|
if (teec_result != 0) {
|
|
print_err_func_hex2(OTP_CMD_READ_WORD, teec_result, addr);
|
|
return (int)teec_result;
|
|
}
|
|
*value = teec_operation.params[0].value.b;
|
|
return 0;
|
|
}
|
|
|
|
int tee_otp_ta_read_byte(td_u32 addr, td_u8 *value)
|
|
{
|
|
TEEC_Result teec_result;
|
|
TEEC_Operation teec_operation = {0};
|
|
|
|
if (value == TD_NULL) {
|
|
return -1;
|
|
}
|
|
|
|
teec_operation.started = 1;
|
|
teec_operation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INOUT, TEEC_NONE, TEEC_NONE, TEEC_NONE);
|
|
teec_operation.params[0].value.a = (unsigned int)addr;
|
|
|
|
teec_result = TEEC_InvokeCommand(&g_teec_session, OTP_CMD_READ_BYTE, &teec_operation, NULL);
|
|
if (teec_result != 0) {
|
|
print_err_func_hex2(OTP_CMD_READ_BYTE, teec_result, addr);
|
|
return (int)teec_result;
|
|
}
|
|
|
|
*value = (td_u8)teec_operation.params[0].value.b;
|
|
return 0;
|
|
}
|
|
|
|
int tee_otp_ta_write_byte(td_u32 addr, td_u8 value)
|
|
{
|
|
TEEC_Result teec_result;
|
|
TEEC_Operation teec_operation = {0};
|
|
|
|
teec_operation.started = 1;
|
|
teec_operation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INOUT, TEEC_NONE, TEEC_NONE, TEEC_NONE);
|
|
|
|
teec_operation.params[0].value.a = addr;
|
|
teec_operation.params[0].value.b = value;
|
|
teec_result = TEEC_InvokeCommand(&g_teec_session, OTP_CMD_WRITE_BYTE, &teec_operation, NULL);
|
|
if (teec_result != 0) {
|
|
print_err_func_hex3(OTP_CMD_WRITE_BYTE, teec_result, addr, value);
|
|
return (int)teec_result;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
int main(int argc, char *argv[])
|
|
{
|
|
td_s32 ret;
|
|
td_u8 otp_buf[0x1000] = {0};
|
|
td_u32 i;
|
|
td_s32 level;
|
|
|
|
if (argc < 0x2 || argv == TD_NULL) {
|
|
printf("An incorrect data is entered.\n");
|
|
return -1;
|
|
}
|
|
level = strtol(argv[1], NULL, 0);
|
|
|
|
ret = tee_otp_ta_init();
|
|
if (ret != 0) {
|
|
print_err_func(tee_otp_ta_init, ret);
|
|
return ret;
|
|
}
|
|
tee_otp_log_level(level);
|
|
|
|
for (i = 0; i < 0x1000; i++) {
|
|
ret = tee_otp_ta_read_byte(i, &otp_buf[i]);
|
|
if (ret != 0) {
|
|
print_err_func_hex2(tee_otp_ta_read_byte, i, ret);
|
|
}
|
|
}
|
|
|
|
for (i = 0; i < 0x1000; i += 0x4) {
|
|
if (i % 0x10 == 0) {
|
|
printf("%04x:", i);
|
|
}
|
|
printf(" %08x", *((unsigned int*)&otp_buf[i]));
|
|
if (i % 0x10 == 0x0c) {
|
|
printf("\n");
|
|
}
|
|
}
|
|
tee_otp_ta_deinit();
|
|
return 0;
|
|
}
|