#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include //define in optee_os/core/arch/arm/plat-novatek #include //define in optee_os/core/arch/arm/plat-novatek #include /** * Call with struct optee_msg_arg as argument * * Call register usage: * a0 SMC Function ID, OPTEE_SMC*CALL_WITH_ARG * a1 Upper 32 bits of a 64-bit physical pointer to a struct optee_msg_arg * a2 Lower 32 bits of a 64-bit physical pointer to a struct optee_msg_arg * a3 Cache settings, not used if physical pointer is in a predefined shared * memory area else per OPTEE_SMC_SHM_* * a4-6 Not used * a7 Hypervisor Client ID register * * Normal return register usage: * a0 Return value, OPTEE_SMC_RETURN_* * a1-3 Not used * a4-7 Preserved **/ static int atoi(const char *str) { return (int)simple_strtoul(str, '\0', 10); } static int nvt_init_fast(void) { int ret=0; struct arm_smccc_res return_val={0}; struct TEST_DATA{ char test_intput[10]; }; unsigned long shm_size=0; unsigned long shm_addr=0; if(nvt_dts_optee_nsmem(&shm_addr, &shm_size)!=0) { printf("parsing share memory fail\r\n"); return -1; } struct TEST_DATA * driver_data= (struct TEST_DATA *)shm_addr; sprintf(driver_data->test_intput,"hello~~\n"); //a0: for smc cmd, a2: for share memory , others not use __arm_smccc_smc( NVT_HELLO_WORD, 0x00, shm_addr, 0x00,0x00,0x00,0x00, 0x00, &return_val, NULL); printf("intput data:%s\n",driver_data->test_intput); printf("return value :%x %x %x %x\n",return_val.a0,return_val.a1,return_val.a2,return_val.a3); return 0; } static int nvt_optee_init_fast(void) { struct arm_smccc_res return_val={0}; __arm_smccc_smc( NVT_OPTEE_INIT, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, &return_val, NULL); return 0; } static int nvt_sample_send_fast(void) { int ret=0; struct arm_smccc_res return_val={0}; struct TEST_DATA{ char test_intput[10]; }; unsigned long shm_size=0; unsigned long shm_addr=0; if(nvt_dts_optee_nsmem(&shm_addr, &shm_size)!=0) { printf("parsing share memory fail\r\n"); return -1; } struct TEST_DATA * driver_data= (struct TEST_DATA *)shm_addr; sprintf(driver_data->test_intput,"hello~~\n"); //a0: for smc cmd, a2: for share memory , others not use __arm_smccc_smc( NVT_HELLO_WORD, 0x00, shm_addr, 0x00,0x00,0x00,0x00, 0x00, &return_val, NULL); printf("intput data:%s\n",driver_data->test_intput); printf("return value :%x %x %x %x\n",return_val.a0,return_val.a1,return_val.a2,return_val.a3); return 0; } #ifdef CONFIG_NVT_IVOT_OPTEE_SECBOOT_SUPPORT static void efuse_is_secure_enable(void) { NVT_SMC_EFUSE_DATA efuse_data = {0}; int ret=0; efuse_data.cmd = NVT_SMC_EFUSE_IS_SECURE; ret = nvt_ivot_optee_efuse_operation(&efuse_data); if(ret < 0) { printf("nvt_ivot_optee_efuse_operation error ret:%d\r\n",ret); } printf("secure enable:%d\n",ret); } static void write_efuse_key(UINT32 keyset) { int ret=0; NVT_SMC_EFUSE_DATA efuse_data = {0}; NVT_SMC_EFUSE_KEY_DATA key_data={0}; unsigned char key[16]={0x4,0x3,0x2,0x1,0x8,0x7,0x6,0x5,0x12,0x11,0x10,0x9,0x16,0x15,0x14,0x13}; efuse_data.cmd = NVT_SMC_EFUSE_WRITE_KEY; efuse_data.key_data.field = keyset; memcpy(efuse_data.key_data.data , key, 16); ret = nvt_ivot_optee_efuse_operation(&efuse_data); if(ret < 0){ printf("write_key error ret:%d\n",ret); } printf("write key finish\r\n"); } static void compare_efuse_key(void) { int ret=0; NVT_SMC_EFUSE_DATA efuse_data = {0}; NVT_SMC_EFUSE_KEY_DATA key_data={0}; unsigned char key[16]={0x4,0x3,0x2,0x1,0x8,0x7,0x6,0x5,0x12,0x11,0x10,0x9,0x16,0x15,0x14,0x13}; efuse_data.cmd = NVT_SMC_EFUSE_COMPARE_KEY; efuse_data.key_data.field = EFUSE_OTP_1ST_KEY_SET_FIELD; memcpy(efuse_data.key_data.data , key, 16); ret = nvt_ivot_optee_efuse_operation(&efuse_data); if(ret < 0){ printf("write_key error ret:%d\n",ret); } printf("key compare ret:%d\n",ret); } static void efuse_secure_enable(void) { int ret=0; NVT_SMC_EFUSE_DATA efuse_data = {0}; efuse_data.cmd = NVT_SMC_EFUSE_ENABLE_SECURE; ret = nvt_ivot_optee_efuse_operation(&efuse_data); if(ret < 0) { printf("nvt_ivot_optee_efuse_operation error ret:%d\r\n",ret); } } static void efuse_data_encrypted_enable(void) { int ret=0; NVT_SMC_EFUSE_DATA efuse_data = {0}; efuse_data.cmd = NVT_SMC_EFUSE_ENABLE_DATA_ENCRYPTED; ret = nvt_ivot_optee_efuse_operation(&efuse_data); if(ret < 0) { printf("nvt_ivot_optee_efuse_operation error ret:%d\r\n",ret); } } static void efuse_rsa_key_check_enable(void) { int ret=0; NVT_SMC_EFUSE_DATA efuse_data = {0}; efuse_data.cmd = NVT_SMC_EFUSE_ENABLE_RSA_KEY_CHECK; ret = nvt_ivot_optee_efuse_operation(&efuse_data); if(ret < 0) { printf("nvt_ivot_optee_efuse_operation error ret:%d\r\n",ret); } } static void efuse_check_key_field(void) { int ret=0; NVT_SMC_EFUSE_DATA efuse_data = {0}; efuse_data.cmd = NVT_SMC_EFUSE_CHECK_KEY_FIELD; efuse_data.key_data.field = EFUSE_OTP_1ST_KEY_SET_FIELD; ret = nvt_ivot_optee_efuse_operation(&efuse_data); if(ret < 0) { printf("nvt_ivot_optee_efuse_operation error ret:%d\r\n",ret); return; } printf("key field %d :status :%d\r\n",EFUSE_OTP_1ST_KEY_SET_FIELD, ret); return; } static void efuse_lock_engine_read_key_field(void) { int ret=0; NVT_SMC_EFUSE_DATA efuse_data = {0}; efuse_data.cmd = NVT_SMC_EFUSE_LOCK_ENGINE_READ_KEY_FIELD; efuse_data.key_data.field = EFUSE_OTP_1ST_KEY_SET_FIELD; ret = nvt_ivot_optee_efuse_operation(&efuse_data); if(ret < 0) { printf("nvt_ivot_optee_efuse_operation error ret:%d\r\n",ret); return; } return; } static void efuse_lock_read_key_field(UINT32 keyset) { int ret=0; NVT_SMC_EFUSE_DATA efuse_data = {0}; efuse_data.cmd = NVT_SMC_EFUSE_LOCK_READ_KEY_FIELD; if(keyset < SECUREBOOT_READ_LOCK_KEY_SET_START || keyset> SECUREBOOT_READ_LOCK_KEY_SET_END) { printf("nvt_ivot_optee_efuse_operation error unknow enum => %d\r\n",keyset); return; } if(keyset == SECUREBOOT_2ND_KEY_SET_READ_LOCK || keyset == SECUREBOOT_3RD_KEY_SET_READ_LOCK) { printf("Error => 2nd & 3rd key set are RSA checksum area => can not configure as read lock\r\n",keyset); return; } efuse_data.key_data.field = keyset; ret = nvt_ivot_optee_efuse_operation(&efuse_data); if(ret < 0) { printf("nvt_ivot_optee_efuse_operation error ret:%d\r\n",ret); return; } return; } static void efuse_read_key_field(UINT32 keyset) { int ret=0; int i=0; NVT_SMC_EFUSE_DATA efuse_data = {0}; efuse_data.cmd = NVT_SMC_EFUSE_READ_KEY_FIELD; efuse_data.key_data.field = keyset; ret = nvt_ivot_optee_efuse_operation(&efuse_data); if(ret < 0) { printf("nvt_ivot_optee_efuse_operation error ret:%d\r\n",ret); return; } printf("key filed:%d\r\n",keyset); printf("value: "); for(i=0;i<16;i++) { printf("%x ",efuse_data.key_data.data[i]); } printf("\n"); return; } static void efuse_trigger_key_field(UINT32 keyset) { int ret=0; int i=0; NVT_SMC_EFUSE_DATA efuse_data = {0}; efuse_data.cmd = NVT_SMC_EFUSE_TRIGGER_KEY_SET; efuse_data.key_data.field = keyset; ret = nvt_ivot_optee_efuse_operation(&efuse_data); if(ret < 0) { printf("nvt_ivot_optee_efuse_operation error ret:%d\r\n",ret); return; } printf("key filed:%d\r\n",keyset); printf("value: \r\n"); #ifdef CONFIG_TARGET_NA51090_A64 //NT98560 for(i=0;i<4;i++) { printf("[0x%lx]=[0x%08x]\r\n", (IOADDR_CRYPTO_REG_BASE + 0x10+i*4), readl(IOADDR_CRYPTO_REG_BASE + 0x10+i*4)); } #else for(i=0;i<4;i++) { printf("[0x%08x]=[0x%08x]\r\n", (IOADDR_CRYPTO_REG_BASE + 0x10 +i*4), *(UINT32 *)((IOADDR_CRYPTO_REG_BASE + 0x10 +i*4))); } #endif printf("\n"); return; } static void is_ras_key_check_enable(void) { int ret=0; NVT_SMC_EFUSE_DATA efuse_data = {0}; efuse_data.cmd = NVT_SMC_EFUSE_IS_RSA_KEY_CHECK; ret = nvt_ivot_optee_efuse_operation(&efuse_data); if(ret < 0) { printf("nvt_ivot_optee_efuse_operation error ret:%d\r\n",ret); } printf("rsa key check enable:%d\n",ret); } static void is_data_encrypted_enable(void) { int ret=0; NVT_SMC_EFUSE_DATA efuse_data = {0}; efuse_data.cmd = NVT_SMC_EFUSE_IS_DATA_ENCRYPTED; ret = nvt_ivot_optee_efuse_operation(&efuse_data); if(ret < 0) { printf("nvt_ivot_optee_efuse_operation error ret:%d\r\n",ret); } printf("data encrypted enable:%d\n",ret); } static unsigned char N_key[]={ 0xD3,0xA2,0x63,0xB3,0x09,0xCC,0x0D,0x6E,0x29,0x63,0xB1,0xFD,0x1D,0xC4,0x21,0xB2,0x40,0x68,0x4C,0xF2,0x48,0x10,0xE0,0x89,0xF5,0x3E,0x5A,0xDE,0x66,0xD5,0xF6,0xD5,0x28,0x9B,0x04,0xD7,0xF6,0x74,0x80,0xA9,0xCE,0x7E,0xC3,0x16,0x41,0x84,0xA3,0x62,0x59,0xFC,0xC8,0x1C,0x76,0x11,0x18,0x70,0xF8,0x4E,0xE1,0xE1,0x90,0x99,0x7A,0x2C,0xD6,0x3B,0xB4,0x2E,0x23,0x60,0xB9,0x68,0xFC,0xC6,0x0C,0xF7,0x12,0x41,0x65,0xA9,0xD7,0x52,0x7B,0x35,0xA5,0x3E,0xB7,0x33,0x1A,0x66,0x4D,0x5E,0x29,0x3D,0x12,0x46,0x9D,0xF1,0x68,0xF5,0x65,0x64,0x2B,0xC9,0xAE,0xDA,0x1C,0x46,0x53,0xC2,0x2D,0xD5,0xEA,0x87,0xB4,0x2B,0x94,0x6D,0x80,0x50,0x8A,0x3A,0x51,0x13,0xDA,0xE4,0xD9,0x3D,0x50,0x34,0x55,0xC7,0xC5,0x2A,0x32,0xAC,0x1E,0x66,0xCA,0x0D,0x28,0x8F,0x58,0x7F,0xC7,0x41,0x9B,0x96,0xF3,0xCF,0xBF,0x64,0x1C,0xAA,0x9C,0x6E,0x21,0x0D,0x15,0xAF,0x1E,0xE6,0x91,0x02,0xCF,0xF1,0x2A,0x71,0xC2,0xF2,0x97,0x9F,0x1B,0x85,0x7A,0xCF,0xA8,0x67,0x44,0x27,0xFB,0x2C,0xDC,0x5A,0xC5,0xAB,0xDA,0x43,0x7E,0xA3,0xCA,0x84,0x1C,0x7E,0x48,0xE2,0xBA,0x59,0x23,0x4F,0x37,0xA4,0x3F,0x7C,0xA1,0xE1,0x60,0x96,0xB1,0xC8,0x1C,0xF5,0x21,0xFE,0x9F,0xB3,0x37,0x89,0x98,0x7F,0x2B,0x4D,0x2A,0xEC,0x6E,0xE6,0x6D,0x33,0x42,0x7E,0xA7,0x7F,0x5C,0x3E,0xED,0xEC,0xDE,0x27,0x13,0xE0,0xA8,0x9B,0x8E,0xC6,0x11,0x6A,0xD0,0xFD,0xD0,0x0D,0x9E,0x3F,0xB4,0xA0,0xAF,0x67}; static unsigned char E_key[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01}; static unsigned char D_key[]={ 0x0A,0x49,0x66,0xE2,0x31,0x74,0x37,0x24,0xE7,0x23,0x1E,0xE8,0x28,0x35,0xBB,0xD3,0x8F,0xB8,0xE2,0x20,0x96,0xAB,0x27,0x56,0xDD,0x52,0x4A,0x15,0x6C,0x57,0x33,0x17,0xBA,0x51,0x0A,0xA3,0xBA,0xA9,0x80,0x05,0x80,0xF1,0x7D,0x67,0x0C,0x09,0x37,0xED,0xD4,0x64,0xEA,0x8F,0x23,0x98,0x02,0x21,0x9F,0x98,0x29,0xF7,0x8E,0x51,0x3F,0x74,0x85,0x77,0x42,0x73,0x49,0xA9,0xEE,0x69,0x31,0x7C,0x28,0xEE,0x2B,0x77,0x7D,0x4B,0x0B,0x99,0xC9,0x3E,0x5A,0xC9,0x59,0x1B,0x45,0x49,0xBA,0xB1,0xFC,0x7C,0x28,0xF2,0xC0,0xC3,0x96,0xAF,0xF2,0xDD,0x33,0x19,0xAB,0x03,0x94,0x03,0x41,0x17,0xFB,0xA5,0x5D,0xB0,0x79,0xEB,0xF2,0x5B,0x7E,0x34,0xAB,0xFB,0x58,0xAC,0x87,0xE3,0xBE,0xC1,0x5B,0x0E,0xD3,0xB7,0x43,0x09,0xAB,0xC6,0x31,0xBB,0x83,0x0F,0x3C,0x31,0xCB,0x53,0x79,0xC6,0x20,0xA8,0xD2,0xE6,0x95,0xA2,0x5E,0x7A,0x0D,0x0C,0xB9,0xB9,0x56,0x78,0xC7,0x99,0xB0,0x68,0x48,0xE3,0x99,0x19,0xA1,0xED,0xA0,0xB8,0xA4,0xDD,0x1E,0x81,0x63,0x62,0x50,0xE2,0x8F,0x7D,0x77,0x6F,0x1E,0x26,0x28,0xD3,0x34,0xA7,0x86,0x88,0x63,0xD3,0xAE,0x8E,0xC3,0xB8,0x7B,0x5F,0xD9,0x5B,0x4D,0x0A,0xD6,0x61,0x2C,0x5A,0xB9,0x0F,0x40,0xCF,0xAB,0xA5,0x51,0x0C,0x68,0xA3,0x59,0x2B,0x20,0x6B,0x26,0xBF,0xD3,0xEE,0x0F,0x1E,0x7E,0x3F,0xB7,0x9D,0x05,0x2D,0x3B,0xBA,0x0B,0x22,0xCB,0x0E,0x93,0x80,0x87,0x39,0x1C,0xA9,0xFB,0x2C,0xDE,0xBF,0x8A,0x24,0x7A,0xE1,0x01,0x29}; static void rsa_encryped_decrypted_test(void) { #define MAX_RSA_SIZE 256 unsigned char *input_buf = NULL; unsigned char *output_buf = NULL; unsigned char *output_buf2 = NULL; unsigned int i=0; int ret=0; //set test input buf input_buf = (unsigned char *)malloc(MAX_RSA_SIZE); for(i=0;i < MAX_RSA_SIZE ; i++) { input_buf[i] = i; } output_buf = (unsigned char *)malloc(MAX_RSA_SIZE); //encrypted NVT_SMC_RSA_DATA rsa_data={0}; rsa_data.rsa_mode = NVT_SMC_RSA_MODE_2048; rsa_data.n_key = N_key; rsa_data.n_key_size = sizeof(N_key); rsa_data.ed_key = D_key; rsa_data.ed_key_size = sizeof(D_key); rsa_data.input_data = input_buf; rsa_data.input_size = MAX_RSA_SIZE; rsa_data.output_data = output_buf; ret = nvt_ivot_optee_rsa_operation(&rsa_data); if(ret != 0){ printf("nvt_ivot_optee_rsa_decrypt fail ret:%d\n",ret); free(input_buf); free(output_buf); return ; } //decrypted output_buf2 = (unsigned char *)malloc(MAX_RSA_SIZE); NVT_SMC_RSA_DATA rsa_data1={0}; rsa_data1.rsa_mode = NVT_SMC_RSA_MODE_2048; rsa_data1.n_key = N_key; rsa_data1.n_key_size = sizeof(N_key); rsa_data1.ed_key = E_key; rsa_data1.ed_key_size = sizeof(E_key); rsa_data1.input_data = output_buf; rsa_data1.input_size = MAX_RSA_SIZE; rsa_data1.output_data = output_buf2; ret = nvt_ivot_optee_rsa_operation(&rsa_data1); if(ret != 0){ printf("nvt_ivot_optee_rsa_decrypt fail ret:%d\n",ret); free(input_buf); free(output_buf); free(output_buf2); return ; } printf("intput:%x %x %x %x\r\n",input_buf[0],input_buf[1],input_buf[2],input_buf[3]); printf("output:%x %x %x %x\r\n",output_buf2[0],output_buf2[1],output_buf2[2],output_buf2[3]); printf("input data:\r\n"); for(i=0;i