1ae8ec5e1SHisping Lin /* 2ae8ec5e1SHisping Lin * Copyright 2017, Rockchip Electronics Co., Ltd 3ae8ec5e1SHisping Lin * hisping lin, <hisping.lin@rock-chips.com> 4ae8ec5e1SHisping Lin * 5ae8ec5e1SHisping Lin * SPDX-License-Identifier: GPL-2.0+ 6ae8ec5e1SHisping Lin */ 7ae8ec5e1SHisping Lin 8ae8ec5e1SHisping Lin #include <common.h> 9ae8ec5e1SHisping Lin #include <optee_include/OpteeClientApiLib.h> 10ae8ec5e1SHisping Lin #include <optee_include/tee_client_api.h> 1178ef5fbdSqiujian #include <optee_include/tee_api_defines.h> 123251364cSHisping Lin #include <boot_rkimg.h> 13a7df4868Stony.xu #include <stdlib.h> 141e8c0e44STony Xu #include <attestation_key.h> 15a7df4868Stony.xu 16a7df4868Stony.xu #define BOOT_FROM_EMMC (1 << 1) 17c7de5349SHisping Lin #define STORAGE_CMD_READ_ATTRIBUTE_HASH 0 18c7de5349SHisping Lin #define STORAGE_CMD_WRITE_ATTRIBUTE_HASH 1 19c7de5349SHisping Lin #define STORAGE_CMD_UBOOT_END_OTP 2 20c7de5349SHisping Lin #define STORAGE_CMD_READ_VBOOTKEY_HASH 3 21c7de5349SHisping Lin #define STORAGE_CMD_WRITE_VBOOTKEY_HASH 4 22c7de5349SHisping Lin #define STORAGE_CMD_READ_ENABLE_FLAG 5 231ef63c75SHisping Lin #define STORAGE_CMD_WRITE_TA_ENCRYPTION_KEY 9 24fbf29bfbSHisping Lin #define STORAGE_CMD_CHECK_SECURITY_LEVEL_FLAG 10 25f39d4289SHisping Lin #define STORAGE_CMD_WRITE_OEM_HUK 11 26*d5913350SHisping Lin #define STORAGE_CMD_WRITE_OEM_NS_OTP 12 27*d5913350SHisping Lin #define STORAGE_CMD_READ_OEM_NS_OTP 13 28ae8ec5e1SHisping Lin 29ae8ec5e1SHisping Lin static uint8_t b2hs_add_base(uint8_t in) 30ae8ec5e1SHisping Lin { 31ae8ec5e1SHisping Lin if (in > 9) 32ae8ec5e1SHisping Lin return in + 55; 33ae8ec5e1SHisping Lin else 34ae8ec5e1SHisping Lin return in + 48; 35ae8ec5e1SHisping Lin } 36ae8ec5e1SHisping Lin 37c7de5349SHisping Lin static uint32_t b2hs(uint8_t *b, uint8_t *hs, uint32_t blen, uint32_t hslen) 38ae8ec5e1SHisping Lin { 39ae8ec5e1SHisping Lin uint32_t i = 0; 40ae8ec5e1SHisping Lin 41ae8ec5e1SHisping Lin if (blen * 2 + 1 > hslen) 42ae8ec5e1SHisping Lin return 0; 43ae8ec5e1SHisping Lin 44ae8ec5e1SHisping Lin for (; i < blen; i++) { 45ae8ec5e1SHisping Lin hs[i * 2 + 1] = b2hs_add_base(b[i] & 0xf); 46ae8ec5e1SHisping Lin hs[i * 2] = b2hs_add_base(b[i] >> 4); 47ae8ec5e1SHisping Lin } 48ae8ec5e1SHisping Lin hs[blen * 2] = 0; 49ae8ec5e1SHisping Lin 50ae8ec5e1SHisping Lin return blen * 2; 51ae8ec5e1SHisping Lin } 52ae8ec5e1SHisping Lin 53c7de5349SHisping Lin static uint32_t trusty_base_write_security_data(char *filename, 54c7de5349SHisping Lin uint32_t filename_size, 55c7de5349SHisping Lin uint8_t *data, 56c7de5349SHisping Lin uint32_t data_size) 57ae8ec5e1SHisping Lin { 58ae8ec5e1SHisping Lin TEEC_Result TeecResult; 59ae8ec5e1SHisping Lin TEEC_Context TeecContext; 60ae8ec5e1SHisping Lin TEEC_Session TeecSession; 61ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 62ae8ec5e1SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 63ae8ec5e1SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 64ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 65ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 663251364cSHisping Lin struct blk_desc *dev_desc; 673251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 686651d4c0SJason Zhu if (!dev_desc) { 696651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 706651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 716651d4c0SJason Zhu } 723251364cSHisping Lin 73f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 74f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 75f4e1db95SHisping Lin return TeecResult; 76ae8ec5e1SHisping Lin 77ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 78f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 79f4e1db95SHisping Lin return TeecResult; 80ae8ec5e1SHisping Lin 813251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 823251364cSHisping Lin TEEC_NONE, 833251364cSHisping Lin TEEC_NONE, 843251364cSHisping Lin TEEC_NONE); 853251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 86b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 87b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 88b9a7e756SHisping Lin else 89b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 903251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 913251364cSHisping Lin TeecOperation.params[0].value.a = 0; 923251364cSHisping Lin #endif 933251364cSHisping Lin 94ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 95ae8ec5e1SHisping Lin &TeecSession, 96ae8ec5e1SHisping Lin TeecUuid, 97ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 98ae8ec5e1SHisping Lin NULL, 993251364cSHisping Lin &TeecOperation, 100ae8ec5e1SHisping Lin &ErrorOrigin); 101f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 102f4e1db95SHisping Lin return TeecResult; 103ae8ec5e1SHisping Lin 104ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 105ae8ec5e1SHisping Lin 106c7de5349SHisping Lin SharedMem0.size = filename_size; 107ae8ec5e1SHisping Lin SharedMem0.flags = 0; 108ae8ec5e1SHisping Lin 109ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 110f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 111f4e1db95SHisping Lin goto exit; 112ae8ec5e1SHisping Lin 113c7de5349SHisping Lin memcpy(SharedMem0.buffer, filename, SharedMem0.size); 114ae8ec5e1SHisping Lin 115ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 116ae8ec5e1SHisping Lin 117c7de5349SHisping Lin SharedMem1.size = data_size; 118c7de5349SHisping Lin SharedMem1.flags = 0; 119c7de5349SHisping Lin 120c7de5349SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 121c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 122c7de5349SHisping Lin goto exit; 123c7de5349SHisping Lin 124c7de5349SHisping Lin memcpy(SharedMem1.buffer, data, SharedMem1.size); 125c7de5349SHisping Lin 126c7de5349SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 127c7de5349SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 128c7de5349SHisping Lin 129c7de5349SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 130c7de5349SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 131c7de5349SHisping Lin 132c7de5349SHisping Lin 133c7de5349SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 134c7de5349SHisping Lin TEEC_MEMREF_TEMP_INOUT, 135c7de5349SHisping Lin TEEC_NONE, 136c7de5349SHisping Lin TEEC_NONE); 137c7de5349SHisping Lin 138c7de5349SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 139c7de5349SHisping Lin 1, 140c7de5349SHisping Lin &TeecOperation, 141c7de5349SHisping Lin &ErrorOrigin); 142c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 143c7de5349SHisping Lin goto exit; 144c7de5349SHisping Lin exit: 145c7de5349SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 146c7de5349SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 147c7de5349SHisping Lin TEEC_CloseSession(&TeecSession); 148c7de5349SHisping Lin TEEC_FinalizeContext(&TeecContext); 149c7de5349SHisping Lin 150c7de5349SHisping Lin return TeecResult; 151c7de5349SHisping Lin } 152c7de5349SHisping Lin 153c7de5349SHisping Lin static uint32_t trusty_base_read_security_data(char *filename, 154c7de5349SHisping Lin uint32_t filename_size, 155c7de5349SHisping Lin uint8_t *data, 156c7de5349SHisping Lin uint32_t data_size) 157c7de5349SHisping Lin { 158c7de5349SHisping Lin TEEC_Result TeecResult; 159c7de5349SHisping Lin TEEC_Context TeecContext; 160c7de5349SHisping Lin TEEC_Session TeecSession; 161c7de5349SHisping Lin uint32_t ErrorOrigin; 162c7de5349SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 163c7de5349SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 164c7de5349SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 165c7de5349SHisping Lin TEEC_Operation TeecOperation = {0}; 166c7de5349SHisping Lin 167c7de5349SHisping Lin struct blk_desc *dev_desc; 168c7de5349SHisping Lin dev_desc = rockchip_get_bootdev(); 169c7de5349SHisping Lin if (!dev_desc) { 170c7de5349SHisping Lin printf("%s: dev_desc is NULL!\n", __func__); 171c7de5349SHisping Lin return -TEEC_ERROR_GENERIC; 172c7de5349SHisping Lin } 173c7de5349SHisping Lin 174c7de5349SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 175c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 176c7de5349SHisping Lin return TeecResult; 177c7de5349SHisping Lin 178c7de5349SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 179c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 180c7de5349SHisping Lin return TeecResult; 181c7de5349SHisping Lin 182c7de5349SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 183c7de5349SHisping Lin TEEC_NONE, 184c7de5349SHisping Lin TEEC_NONE, 185c7de5349SHisping Lin TEEC_NONE); 186c7de5349SHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 187c7de5349SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 188c7de5349SHisping Lin TeecOperation.params[0].value.a = 1; 189c7de5349SHisping Lin else 190c7de5349SHisping Lin TeecOperation.params[0].value.a = 0; 191c7de5349SHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 192c7de5349SHisping Lin TeecOperation.params[0].value.a = 0; 193c7de5349SHisping Lin #endif 194c7de5349SHisping Lin 195c7de5349SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 196c7de5349SHisping Lin &TeecSession, 197c7de5349SHisping Lin TeecUuid, 198c7de5349SHisping Lin TEEC_LOGIN_PUBLIC, 199c7de5349SHisping Lin NULL, 200c7de5349SHisping Lin &TeecOperation, 201c7de5349SHisping Lin &ErrorOrigin); 202c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 203c7de5349SHisping Lin return TeecResult; 204c7de5349SHisping Lin 205c7de5349SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 206c7de5349SHisping Lin 207c7de5349SHisping Lin SharedMem0.size = filename_size; 208c7de5349SHisping Lin SharedMem0.flags = 0; 209c7de5349SHisping Lin 210c7de5349SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 211c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 212c7de5349SHisping Lin goto exit; 213c7de5349SHisping Lin 214c7de5349SHisping Lin memcpy(SharedMem0.buffer, filename, SharedMem0.size); 215c7de5349SHisping Lin 216c7de5349SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 217c7de5349SHisping Lin 218c7de5349SHisping Lin SharedMem1.size = data_size; 219ae8ec5e1SHisping Lin SharedMem1.flags = 0; 220ae8ec5e1SHisping Lin 221ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 222f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 223f4e1db95SHisping Lin goto exit; 224ae8ec5e1SHisping Lin 225ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 226ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 227ae8ec5e1SHisping Lin 228ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 229ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 230ae8ec5e1SHisping Lin 231ae8ec5e1SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 232ae8ec5e1SHisping Lin TEEC_MEMREF_TEMP_INOUT, 233ae8ec5e1SHisping Lin TEEC_NONE, 234ae8ec5e1SHisping Lin TEEC_NONE); 235ae8ec5e1SHisping Lin 236ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 237ae8ec5e1SHisping Lin 0, 238ae8ec5e1SHisping Lin &TeecOperation, 239ae8ec5e1SHisping Lin &ErrorOrigin); 24046b2a054SHisping Lin if (TeecResult == TEEC_SUCCESS) 241c7de5349SHisping Lin memcpy(data, SharedMem1.buffer, SharedMem1.size); 242f4e1db95SHisping Lin exit: 243ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 244ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 245ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 24646b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 247ae8ec5e1SHisping Lin 248ae8ec5e1SHisping Lin return TeecResult; 249ae8ec5e1SHisping Lin } 250ae8ec5e1SHisping Lin 251c7de5349SHisping Lin static uint32_t trusty_base_end_security_data(void) 252c7de5349SHisping Lin { 253c7de5349SHisping Lin TEEC_Result TeecResult; 254c7de5349SHisping Lin TEEC_Context TeecContext; 255c7de5349SHisping Lin TEEC_Session TeecSession; 256c7de5349SHisping Lin uint32_t ErrorOrigin; 257c7de5349SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 258c7de5349SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 259c7de5349SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 260c7de5349SHisping Lin TEEC_Operation TeecOperation = {0}; 261c7de5349SHisping Lin 262c7de5349SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 263c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 264c7de5349SHisping Lin return TeecResult; 265c7de5349SHisping Lin 266c7de5349SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 267c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 268c7de5349SHisping Lin return TeecResult; 269c7de5349SHisping Lin 270c7de5349SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 271c7de5349SHisping Lin &TeecSession, 272c7de5349SHisping Lin TeecUuid, 273c7de5349SHisping Lin TEEC_LOGIN_PUBLIC, 274c7de5349SHisping Lin NULL, 275c7de5349SHisping Lin NULL, 276c7de5349SHisping Lin &ErrorOrigin); 277c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 278c7de5349SHisping Lin return TeecResult; 279c7de5349SHisping Lin 280c7de5349SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, 281c7de5349SHisping Lin TEEC_NONE, 282c7de5349SHisping Lin TEEC_NONE, 283c7de5349SHisping Lin TEEC_NONE); 284c7de5349SHisping Lin 285c7de5349SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 286c7de5349SHisping Lin 2, 287c7de5349SHisping Lin &TeecOperation, 288c7de5349SHisping Lin &ErrorOrigin); 289c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 290c7de5349SHisping Lin goto exit; 291c7de5349SHisping Lin exit: 292c7de5349SHisping Lin TEEC_CloseSession(&TeecSession); 293c7de5349SHisping Lin TEEC_FinalizeContext(&TeecContext); 294c7de5349SHisping Lin 295c7de5349SHisping Lin return TeecResult; 296c7de5349SHisping Lin } 297c7de5349SHisping Lin 298c7de5349SHisping Lin uint32_t trusty_read_rollback_index(uint32_t slot, uint64_t *value) 299c7de5349SHisping Lin { 300c7de5349SHisping Lin char hs[9]; 301c7de5349SHisping Lin 302c7de5349SHisping Lin b2hs((uint8_t *)&slot, (uint8_t *)hs, 4, 9); 303c7de5349SHisping Lin 304c7de5349SHisping Lin return trusty_base_read_security_data(hs, 8, (uint8_t *)value, 8); 305c7de5349SHisping Lin } 306c7de5349SHisping Lin 307ae8ec5e1SHisping Lin uint32_t trusty_write_rollback_index(uint32_t slot, uint64_t value) 308ae8ec5e1SHisping Lin { 309c7de5349SHisping Lin char hs[9]; 3103251364cSHisping Lin 311c7de5349SHisping Lin b2hs((uint8_t *)&slot, (uint8_t *)hs, 4, 9); 312ae8ec5e1SHisping Lin 313c7de5349SHisping Lin return trusty_base_write_security_data(hs, 8, (uint8_t *)&value, 8); 314ae8ec5e1SHisping Lin } 315ae8ec5e1SHisping Lin 316ae8ec5e1SHisping Lin uint32_t trusty_read_permanent_attributes(uint8_t *attributes, uint32_t size) 317ae8ec5e1SHisping Lin { 318c7de5349SHisping Lin return trusty_base_read_security_data("attributes", 319c7de5349SHisping Lin sizeof("attributes"), attributes, size); 320ae8ec5e1SHisping Lin } 321ae8ec5e1SHisping Lin 322ae8ec5e1SHisping Lin uint32_t trusty_write_permanent_attributes(uint8_t *attributes, uint32_t size) 323ae8ec5e1SHisping Lin { 324c7de5349SHisping Lin return trusty_base_write_security_data("attributes", 325c7de5349SHisping Lin sizeof("attributes"), attributes, size); 3266651d4c0SJason Zhu } 327ae8ec5e1SHisping Lin 328c7de5349SHisping Lin uint32_t trusty_read_permanent_attributes_flag(uint8_t *attributes) 329c7de5349SHisping Lin { 330c7de5349SHisping Lin return trusty_base_read_security_data("attributes_flag", 331c7de5349SHisping Lin sizeof("attributes_flag"), attributes, 1); 332c7de5349SHisping Lin } 333ae8ec5e1SHisping Lin 334c7de5349SHisping Lin uint32_t trusty_write_permanent_attributes_flag(uint8_t attributes) 335c7de5349SHisping Lin { 336c7de5349SHisping Lin return trusty_base_write_security_data("attributes_flag", 337c7de5349SHisping Lin sizeof("attributes_flag"), &attributes, 1); 338ae8ec5e1SHisping Lin } 339ae8ec5e1SHisping Lin 340564654ebSJason Zhu uint32_t trusty_read_permanent_attributes_cer(uint8_t *attributes, 341564654ebSJason Zhu uint32_t size) 342564654ebSJason Zhu { 343c7de5349SHisping Lin return trusty_base_read_security_data("rsacer", 344c7de5349SHisping Lin sizeof("rsacer"), attributes, size); 345564654ebSJason Zhu } 346564654ebSJason Zhu 347564654ebSJason Zhu uint32_t trusty_write_permanent_attributes_cer(uint8_t *attributes, 348564654ebSJason Zhu uint32_t size) 349564654ebSJason Zhu { 350c7de5349SHisping Lin return trusty_base_write_security_data("rsacer", 351c7de5349SHisping Lin sizeof("rsacer"), attributes, size); 352564654ebSJason Zhu } 353564654ebSJason Zhu 354ae8ec5e1SHisping Lin uint32_t trusty_read_lock_state(uint8_t *lock_state) 355ae8ec5e1SHisping Lin { 356c7de5349SHisping Lin return trusty_base_read_security_data("lock_state", 357c7de5349SHisping Lin sizeof("lock_state"), lock_state, 1); 358ae8ec5e1SHisping Lin } 359ae8ec5e1SHisping Lin 360ae8ec5e1SHisping Lin uint32_t trusty_write_lock_state(uint8_t lock_state) 361ae8ec5e1SHisping Lin { 362c7de5349SHisping Lin return trusty_base_write_security_data("lock_state", 363c7de5349SHisping Lin sizeof("lock_state"), &lock_state, 1); 364ae8ec5e1SHisping Lin } 365ae8ec5e1SHisping Lin 366ae8ec5e1SHisping Lin uint32_t trusty_read_flash_lock_state(uint8_t *flash_lock_state) 367ae8ec5e1SHisping Lin { 368c7de5349SHisping Lin return trusty_base_read_security_data("flash_lock_state", 369c7de5349SHisping Lin sizeof("flash_lock_state"), flash_lock_state, 1); 370c7de5349SHisping Lin } 371c7de5349SHisping Lin 372c7de5349SHisping Lin uint32_t trusty_write_flash_lock_state(uint8_t flash_lock_state) 373c7de5349SHisping Lin { 374c7de5349SHisping Lin return trusty_base_write_security_data("flash_lock_state", 375c7de5349SHisping Lin sizeof("flash_lock_state"), &flash_lock_state, 1); 376c7de5349SHisping Lin } 377c7de5349SHisping Lin 378c7de5349SHisping Lin static uint32_t trusty_base_end_efuse_or_otp(void) 379c7de5349SHisping Lin { 380ae8ec5e1SHisping Lin TEEC_Result TeecResult; 381ae8ec5e1SHisping Lin TEEC_Context TeecContext; 382ae8ec5e1SHisping Lin TEEC_Session TeecSession; 383ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 384c7de5349SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 385c7de5349SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 386c7de5349SHisping Lin 387ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 388ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 389ae8ec5e1SHisping Lin 390f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 391f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 392f4e1db95SHisping Lin return TeecResult; 393ae8ec5e1SHisping Lin 394ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 395f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 396f4e1db95SHisping Lin return TeecResult; 397ae8ec5e1SHisping Lin 398ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 399ae8ec5e1SHisping Lin &TeecSession, 400ae8ec5e1SHisping Lin TeecUuid, 401ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 402ae8ec5e1SHisping Lin NULL, 403c7de5349SHisping Lin NULL, 404ae8ec5e1SHisping Lin &ErrorOrigin); 405f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 406f4e1db95SHisping Lin return TeecResult; 407ae8ec5e1SHisping Lin 408c7de5349SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, 409c7de5349SHisping Lin TEEC_NONE, 410ae8ec5e1SHisping Lin TEEC_NONE, 411ae8ec5e1SHisping Lin TEEC_NONE); 412ae8ec5e1SHisping Lin 413ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 414c7de5349SHisping Lin STORAGE_CMD_UBOOT_END_OTP, 415ae8ec5e1SHisping Lin &TeecOperation, 416ae8ec5e1SHisping Lin &ErrorOrigin); 417c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 418c7de5349SHisping Lin goto exit; 419f4e1db95SHisping Lin exit: 420ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 42146b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 422ae8ec5e1SHisping Lin 423ae8ec5e1SHisping Lin return TeecResult; 424ae8ec5e1SHisping Lin } 425ae8ec5e1SHisping Lin 426c7de5349SHisping Lin static uint32_t trusty_base_efuse_or_otp_operation(uint32_t cmd, 427c7de5349SHisping Lin uint8_t is_write, 428c7de5349SHisping Lin uint32_t *buf, 429c7de5349SHisping Lin uint32_t length) 430ae8ec5e1SHisping Lin { 431ae8ec5e1SHisping Lin TEEC_Result TeecResult; 432ae8ec5e1SHisping Lin TEEC_Context TeecContext; 433ae8ec5e1SHisping Lin TEEC_Session TeecSession; 434ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 435c7de5349SHisping Lin 436c7de5349SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 437c7de5349SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 438ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 439ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 440ae8ec5e1SHisping Lin 441f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 442f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 443f4e1db95SHisping Lin return TeecResult; 444ae8ec5e1SHisping Lin 445ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 446f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 447f4e1db95SHisping Lin return TeecResult; 448ae8ec5e1SHisping Lin 449ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 450ae8ec5e1SHisping Lin &TeecSession, 451ae8ec5e1SHisping Lin TeecUuid, 452ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 453ae8ec5e1SHisping Lin NULL, 454c7de5349SHisping Lin NULL, 455ae8ec5e1SHisping Lin &ErrorOrigin); 456f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 457f4e1db95SHisping Lin return TeecResult; 458ae8ec5e1SHisping Lin 459ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 460ae8ec5e1SHisping Lin 461c7de5349SHisping Lin SharedMem0.size = length * sizeof(uint32_t); 462ae8ec5e1SHisping Lin SharedMem0.flags = 0; 463ae8ec5e1SHisping Lin 464ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 465f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 466f4e1db95SHisping Lin goto exit; 467ae8ec5e1SHisping Lin 468ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 469ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 470ae8ec5e1SHisping Lin 471c7de5349SHisping Lin if (is_write) { 472c7de5349SHisping Lin memcpy(SharedMem0.buffer, buf, SharedMem0.size); 473ae8ec5e1SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 474c7de5349SHisping Lin TEEC_NONE, 475ae8ec5e1SHisping Lin TEEC_NONE, 476ae8ec5e1SHisping Lin TEEC_NONE); 477ae8ec5e1SHisping Lin 478c7de5349SHisping Lin } else { 479c7de5349SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT, 480c7de5349SHisping Lin TEEC_NONE, 481c7de5349SHisping Lin TEEC_NONE, 482c7de5349SHisping Lin TEEC_NONE); 483c7de5349SHisping Lin } 484c7de5349SHisping Lin 485ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 486c7de5349SHisping Lin cmd, 487ae8ec5e1SHisping Lin &TeecOperation, 488ae8ec5e1SHisping Lin &ErrorOrigin); 489f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 490f4e1db95SHisping Lin goto exit; 491c7de5349SHisping Lin 492c7de5349SHisping Lin if (!is_write) 493c7de5349SHisping Lin memcpy(buf, SharedMem0.buffer, SharedMem0.size); 494c7de5349SHisping Lin 495f4e1db95SHisping Lin exit: 496ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 497ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 49846b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 499ae8ec5e1SHisping Lin 500ae8ec5e1SHisping Lin return TeecResult; 501ae8ec5e1SHisping Lin } 502ae8ec5e1SHisping Lin 5036ef445a4SHisping Lin uint32_t trusty_read_attribute_hash(uint32_t *buf, uint32_t length) 5046ef445a4SHisping Lin { 505c7de5349SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_ATTRIBUTE_HASH, 506c7de5349SHisping Lin false, buf, length); 5076ef445a4SHisping Lin } 5086ef445a4SHisping Lin 5096ef445a4SHisping Lin uint32_t trusty_write_attribute_hash(uint32_t *buf, uint32_t length) 5106ef445a4SHisping Lin { 511c7de5349SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_ATTRIBUTE_HASH, 512c7de5349SHisping Lin true, buf, length); 51316539616SHisping Lin } 51416539616SHisping Lin 51516539616SHisping Lin uint32_t trusty_notify_optee_uboot_end(void) 51616539616SHisping Lin { 51716539616SHisping Lin TEEC_Result res; 518c7de5349SHisping Lin 519c7de5349SHisping Lin res = trusty_base_end_security_data(); 520c7de5349SHisping Lin res |= trusty_base_end_efuse_or_otp(); 52116539616SHisping Lin return res; 52216539616SHisping Lin } 5232cd27853SHisping Lin 5242cd27853SHisping Lin uint32_t trusty_read_vbootkey_hash(uint32_t *buf, uint32_t length) 5252cd27853SHisping Lin { 526c7de5349SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_VBOOTKEY_HASH, 527c7de5349SHisping Lin false, buf, length); 5282cd27853SHisping Lin } 529c7de5349SHisping Lin 5302cd27853SHisping Lin uint32_t trusty_write_vbootkey_hash(uint32_t *buf, uint32_t length) 5312cd27853SHisping Lin { 532c7de5349SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_VBOOTKEY_HASH, 533c7de5349SHisping Lin true, buf, length); 5342cd27853SHisping Lin } 535095e2a82SHisping Lin 536468df3b2SHisping Lin uint32_t trusty_read_vbootkey_enable_flag(uint8_t *flag) 537468df3b2SHisping Lin { 538468df3b2SHisping Lin uint32_t bootflag; 539c7de5349SHisping Lin TEEC_Result TeecResult; 540468df3b2SHisping Lin 541c7de5349SHisping Lin TeecResult = trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_ENABLE_FLAG, 542c7de5349SHisping Lin false, &bootflag, 1); 543468df3b2SHisping Lin 544468df3b2SHisping Lin if (TeecResult == TEEC_SUCCESS) { 5450202ee8aSHisping Lin #if defined(CONFIG_ROCKCHIP_RK3288) 5460202ee8aSHisping Lin if (bootflag == 0x00000001) 5470202ee8aSHisping Lin *flag = 1; 5480202ee8aSHisping Lin #else 549468df3b2SHisping Lin if (bootflag == 0x000000FF) 550468df3b2SHisping Lin *flag = 1; 5510202ee8aSHisping Lin #endif 552468df3b2SHisping Lin } 553095e2a82SHisping Lin return TeecResult; 554095e2a82SHisping Lin } 5554aa61755SAndy Ye 5561ef63c75SHisping Lin uint32_t trusty_write_ta_encryption_key(uint32_t *buf, uint32_t length) 5571ef63c75SHisping Lin { 5581ef63c75SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_TA_ENCRYPTION_KEY, 5591ef63c75SHisping Lin true, buf, length); 5601ef63c75SHisping Lin } 5611ef63c75SHisping Lin 562fbf29bfbSHisping Lin uint32_t trusty_check_security_level_flag(uint8_t flag) 563fbf29bfbSHisping Lin { 564fbf29bfbSHisping Lin uint32_t levelflag; 565fbf29bfbSHisping Lin 566fbf29bfbSHisping Lin levelflag = flag; 567fbf29bfbSHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_CHECK_SECURITY_LEVEL_FLAG, 568fbf29bfbSHisping Lin true, &levelflag, 1); 569fbf29bfbSHisping Lin } 570fbf29bfbSHisping Lin 571f39d4289SHisping Lin uint32_t trusty_write_oem_huk(uint32_t *buf, uint32_t length) 572f39d4289SHisping Lin { 573f39d4289SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_OEM_HUK, 574f39d4289SHisping Lin true, buf, length); 575f39d4289SHisping Lin } 576f39d4289SHisping Lin 5777504da74SHisping Lin void trusty_select_security_level(void) 5787504da74SHisping Lin { 5797504da74SHisping Lin #if (CONFIG_OPTEE_SECURITY_LEVEL > 0) 5807504da74SHisping Lin TEEC_Result TeecResult; 5817504da74SHisping Lin 5827504da74SHisping Lin TeecResult = trusty_check_security_level_flag(CONFIG_OPTEE_SECURITY_LEVEL); 5837504da74SHisping Lin if (TeecResult == TEE_ERROR_CANCEL) { 5847504da74SHisping Lin run_command("download", 0); 5857504da74SHisping Lin return; 5867504da74SHisping Lin } 5877504da74SHisping Lin 5887504da74SHisping Lin if (TeecResult == TEEC_SUCCESS) 5897504da74SHisping Lin debug("optee select security level success!"); 5907504da74SHisping Lin else 5917504da74SHisping Lin panic("optee select security level fail!"); 5927504da74SHisping Lin 5937504da74SHisping Lin return; 5947504da74SHisping Lin #endif 5957504da74SHisping Lin } 5967504da74SHisping Lin 597*d5913350SHisping Lin uint32_t trusty_write_oem_ns_otp(uint32_t byte_off, uint8_t *byte_buf, uint32_t byte_len) 598*d5913350SHisping Lin { 599*d5913350SHisping Lin TEEC_Result TeecResult; 600*d5913350SHisping Lin TEEC_Context TeecContext; 601*d5913350SHisping Lin TEEC_Session TeecSession; 602*d5913350SHisping Lin uint32_t ErrorOrigin; 603*d5913350SHisping Lin 604*d5913350SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 605*d5913350SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 606*d5913350SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 607*d5913350SHisping Lin TEEC_Operation TeecOperation = {0}; 608*d5913350SHisping Lin 609*d5913350SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 610*d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 611*d5913350SHisping Lin return TeecResult; 612*d5913350SHisping Lin 613*d5913350SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 614*d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 615*d5913350SHisping Lin return TeecResult; 616*d5913350SHisping Lin 617*d5913350SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 618*d5913350SHisping Lin &TeecSession, 619*d5913350SHisping Lin TeecUuid, 620*d5913350SHisping Lin TEEC_LOGIN_PUBLIC, 621*d5913350SHisping Lin NULL, 622*d5913350SHisping Lin NULL, 623*d5913350SHisping Lin &ErrorOrigin); 624*d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 625*d5913350SHisping Lin return TeecResult; 626*d5913350SHisping Lin 627*d5913350SHisping Lin TeecOperation.params[0].value.a = byte_off; 628*d5913350SHisping Lin 629*d5913350SHisping Lin TEEC_SharedMemory SharedMem = {0}; 630*d5913350SHisping Lin 631*d5913350SHisping Lin SharedMem.size = byte_len; 632*d5913350SHisping Lin SharedMem.flags = 0; 633*d5913350SHisping Lin 634*d5913350SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem); 635*d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 636*d5913350SHisping Lin goto exit; 637*d5913350SHisping Lin 638*d5913350SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem.buffer; 639*d5913350SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem.size; 640*d5913350SHisping Lin 641*d5913350SHisping Lin memcpy(SharedMem.buffer, byte_buf, SharedMem.size); 642*d5913350SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 643*d5913350SHisping Lin TEEC_MEMREF_TEMP_INPUT, 644*d5913350SHisping Lin TEEC_NONE, 645*d5913350SHisping Lin TEEC_NONE); 646*d5913350SHisping Lin 647*d5913350SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 648*d5913350SHisping Lin STORAGE_CMD_WRITE_OEM_NS_OTP, 649*d5913350SHisping Lin &TeecOperation, 650*d5913350SHisping Lin &ErrorOrigin); 651*d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 652*d5913350SHisping Lin goto exit; 653*d5913350SHisping Lin 654*d5913350SHisping Lin exit: 655*d5913350SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem); 656*d5913350SHisping Lin TEEC_CloseSession(&TeecSession); 657*d5913350SHisping Lin TEEC_FinalizeContext(&TeecContext); 658*d5913350SHisping Lin 659*d5913350SHisping Lin return TeecResult; 660*d5913350SHisping Lin } 661*d5913350SHisping Lin 662*d5913350SHisping Lin uint32_t trusty_read_oem_ns_otp(uint32_t byte_off, uint8_t *byte_buf, uint32_t byte_len) 663*d5913350SHisping Lin { 664*d5913350SHisping Lin TEEC_Result TeecResult; 665*d5913350SHisping Lin TEEC_Context TeecContext; 666*d5913350SHisping Lin TEEC_Session TeecSession; 667*d5913350SHisping Lin uint32_t ErrorOrigin; 668*d5913350SHisping Lin 669*d5913350SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 670*d5913350SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 671*d5913350SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 672*d5913350SHisping Lin TEEC_Operation TeecOperation = {0}; 673*d5913350SHisping Lin 674*d5913350SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 675*d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 676*d5913350SHisping Lin return TeecResult; 677*d5913350SHisping Lin 678*d5913350SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 679*d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 680*d5913350SHisping Lin return TeecResult; 681*d5913350SHisping Lin 682*d5913350SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 683*d5913350SHisping Lin &TeecSession, 684*d5913350SHisping Lin TeecUuid, 685*d5913350SHisping Lin TEEC_LOGIN_PUBLIC, 686*d5913350SHisping Lin NULL, 687*d5913350SHisping Lin NULL, 688*d5913350SHisping Lin &ErrorOrigin); 689*d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 690*d5913350SHisping Lin return TeecResult; 691*d5913350SHisping Lin 692*d5913350SHisping Lin TeecOperation.params[0].value.a = byte_off; 693*d5913350SHisping Lin 694*d5913350SHisping Lin TEEC_SharedMemory SharedMem = {0}; 695*d5913350SHisping Lin 696*d5913350SHisping Lin SharedMem.size = byte_len; 697*d5913350SHisping Lin SharedMem.flags = 0; 698*d5913350SHisping Lin 699*d5913350SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem); 700*d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 701*d5913350SHisping Lin goto exit; 702*d5913350SHisping Lin 703*d5913350SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem.buffer; 704*d5913350SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem.size; 705*d5913350SHisping Lin 706*d5913350SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 707*d5913350SHisping Lin TEEC_MEMREF_TEMP_OUTPUT, 708*d5913350SHisping Lin TEEC_NONE, 709*d5913350SHisping Lin TEEC_NONE); 710*d5913350SHisping Lin 711*d5913350SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 712*d5913350SHisping Lin STORAGE_CMD_READ_OEM_NS_OTP, 713*d5913350SHisping Lin &TeecOperation, 714*d5913350SHisping Lin &ErrorOrigin); 715*d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 716*d5913350SHisping Lin goto exit; 717*d5913350SHisping Lin 718*d5913350SHisping Lin memcpy(byte_buf, SharedMem.buffer, SharedMem.size); 719*d5913350SHisping Lin 720*d5913350SHisping Lin exit: 721*d5913350SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem); 722*d5913350SHisping Lin TEEC_CloseSession(&TeecSession); 723*d5913350SHisping Lin TEEC_FinalizeContext(&TeecContext); 724*d5913350SHisping Lin 725*d5913350SHisping Lin return TeecResult; 726*d5913350SHisping Lin } 727*d5913350SHisping Lin 7284aa61755SAndy Ye uint32_t trusty_attest_dh(uint8_t *dh, uint32_t *dh_size) 7294aa61755SAndy Ye { 7304aa61755SAndy Ye TEEC_Result TeecResult; 7314aa61755SAndy Ye TEEC_Context TeecContext; 7324aa61755SAndy Ye TEEC_Session TeecSession; 7334aa61755SAndy Ye uint32_t ErrorOrigin; 7344aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 7354aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 7364aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 7374aa61755SAndy Ye } 7384aa61755SAndy Ye }; 7394aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 7404aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 7413251364cSHisping Lin struct blk_desc *dev_desc; 7423251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 7436651d4c0SJason Zhu if (!dev_desc) { 7446651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 7456651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 7466651d4c0SJason Zhu } 7474aa61755SAndy Ye 748f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 749f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 750f4e1db95SHisping Lin return TeecResult; 7514aa61755SAndy Ye 7524aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 753f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 754f4e1db95SHisping Lin return TeecResult; 7554aa61755SAndy Ye 7563251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 7573251364cSHisping Lin TEEC_NONE, 7583251364cSHisping Lin TEEC_NONE, 7593251364cSHisping Lin TEEC_NONE); 7603251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 761b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 762b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 763b9a7e756SHisping Lin else 764b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 765b9a7e756SHisping Lin 7663251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 7673251364cSHisping Lin TeecOperation.params[0].value.a = 0; 7683251364cSHisping Lin #endif 7693251364cSHisping Lin 7704aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 7714aa61755SAndy Ye &TeecSession, 7724aa61755SAndy Ye TeecUuid, 7734aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 7744aa61755SAndy Ye NULL, 7753251364cSHisping Lin &TeecOperation, 7764aa61755SAndy Ye &ErrorOrigin); 777f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 778f4e1db95SHisping Lin return TeecResult; 7794aa61755SAndy Ye 7804aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 7814aa61755SAndy Ye 7824aa61755SAndy Ye SharedMem0.size = *dh_size; 7834aa61755SAndy Ye SharedMem0.flags = 0; 7844aa61755SAndy Ye 7854aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 786f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 787f4e1db95SHisping Lin goto exit; 7884aa61755SAndy Ye 7894aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 7904aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 7914aa61755SAndy Ye 7924aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 7934aa61755SAndy Ye TEEC_NONE, 7944aa61755SAndy Ye TEEC_NONE, 7954aa61755SAndy Ye TEEC_NONE); 7964aa61755SAndy Ye 7974aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 7984aa61755SAndy Ye 143, 7994aa61755SAndy Ye &TeecOperation, 8004aa61755SAndy Ye &ErrorOrigin); 801f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 802f4e1db95SHisping Lin goto exit; 8034aa61755SAndy Ye 8044aa61755SAndy Ye *dh_size = TeecOperation.params[0].tmpref.size; 8054aa61755SAndy Ye memcpy(dh, SharedMem0.buffer, SharedMem0.size); 806f4e1db95SHisping Lin exit: 8074aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 8084aa61755SAndy Ye TEEC_CloseSession(&TeecSession); 809f4e1db95SHisping Lin TEEC_FinalizeContext(&TeecContext); 8104aa61755SAndy Ye 8114aa61755SAndy Ye return TeecResult; 8124aa61755SAndy Ye } 8134aa61755SAndy Ye 8144aa61755SAndy Ye uint32_t trusty_attest_uuid(uint8_t *uuid, uint32_t *uuid_size) 8154aa61755SAndy Ye { 8164aa61755SAndy Ye TEEC_Result TeecResult; 8174aa61755SAndy Ye TEEC_Context TeecContext; 8184aa61755SAndy Ye TEEC_Session TeecSession; 8194aa61755SAndy Ye uint32_t ErrorOrigin; 8204aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 8214aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 8224aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 8234aa61755SAndy Ye } 8244aa61755SAndy Ye }; 8254aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 8264aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 8273251364cSHisping Lin struct blk_desc *dev_desc; 8283251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 8296651d4c0SJason Zhu if (!dev_desc) { 8306651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 8316651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 8326651d4c0SJason Zhu } 8334aa61755SAndy Ye 834f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 835f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 836f4e1db95SHisping Lin return TeecResult; 8374aa61755SAndy Ye 8384aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 839f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 840f4e1db95SHisping Lin return TeecResult; 8414aa61755SAndy Ye 8423251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 8433251364cSHisping Lin TEEC_NONE, 8443251364cSHisping Lin TEEC_NONE, 8453251364cSHisping Lin TEEC_NONE); 8463251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 847b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 848b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 849b9a7e756SHisping Lin else 850b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 851b9a7e756SHisping Lin 8523251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 8533251364cSHisping Lin TeecOperation.params[0].value.a = 0; 8543251364cSHisping Lin #endif 8553251364cSHisping Lin 8564aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 8574aa61755SAndy Ye &TeecSession, 8584aa61755SAndy Ye TeecUuid, 8594aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 8604aa61755SAndy Ye NULL, 8613251364cSHisping Lin &TeecOperation, 8624aa61755SAndy Ye &ErrorOrigin); 863f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 864f4e1db95SHisping Lin return TeecResult; 8654aa61755SAndy Ye 8664aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 8674aa61755SAndy Ye 8684aa61755SAndy Ye SharedMem0.size = *uuid_size; 8694aa61755SAndy Ye SharedMem0.flags = 0; 8704aa61755SAndy Ye 8714aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 872f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 873f4e1db95SHisping Lin goto exit; 8744aa61755SAndy Ye 8754aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 8764aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 8774aa61755SAndy Ye 8784aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 8794aa61755SAndy Ye TEEC_NONE, 8804aa61755SAndy Ye TEEC_NONE, 8814aa61755SAndy Ye TEEC_NONE); 8824aa61755SAndy Ye 8834aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 8844aa61755SAndy Ye 144, 8854aa61755SAndy Ye &TeecOperation, 8864aa61755SAndy Ye &ErrorOrigin); 887f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 888f4e1db95SHisping Lin goto exit; 8894aa61755SAndy Ye 8904aa61755SAndy Ye *uuid_size = TeecOperation.params[0].tmpref.size; 8914aa61755SAndy Ye memcpy(uuid, SharedMem0.buffer, SharedMem0.size); 892f4e1db95SHisping Lin exit: 8934aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 8944aa61755SAndy Ye TEEC_CloseSession(&TeecSession); 895f4e1db95SHisping Lin TEEC_FinalizeContext(&TeecContext); 8964aa61755SAndy Ye 8974aa61755SAndy Ye return TeecResult; 8984aa61755SAndy Ye } 8994aa61755SAndy Ye 9004aa61755SAndy Ye uint32_t trusty_attest_get_ca(uint8_t *operation_start, 9014aa61755SAndy Ye uint32_t *operation_size, 9024aa61755SAndy Ye uint8_t *out, 9034aa61755SAndy Ye uint32_t *out_len) 9044aa61755SAndy Ye { 9054aa61755SAndy Ye TEEC_Result TeecResult; 9064aa61755SAndy Ye TEEC_Context TeecContext; 9074aa61755SAndy Ye TEEC_Session TeecSession; 9084aa61755SAndy Ye uint32_t ErrorOrigin; 9094aa61755SAndy Ye 9104aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 9114aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 9124aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 9134aa61755SAndy Ye } 9144aa61755SAndy Ye }; 9154aa61755SAndy Ye 9164aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 9174aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 9183251364cSHisping Lin struct blk_desc *dev_desc; 9193251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 9206651d4c0SJason Zhu if (!dev_desc) { 9216651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 9226651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 9236651d4c0SJason Zhu } 9244aa61755SAndy Ye 925f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 926f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 927f4e1db95SHisping Lin return TeecResult; 9284aa61755SAndy Ye 9294aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 930f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 931f4e1db95SHisping Lin return TeecResult; 9324aa61755SAndy Ye 9333251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 9343251364cSHisping Lin TEEC_NONE, 9353251364cSHisping Lin TEEC_NONE, 9363251364cSHisping Lin TEEC_NONE); 9373251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 938b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 939b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 940b9a7e756SHisping Lin else 941b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 942b9a7e756SHisping Lin 9433251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 9443251364cSHisping Lin TeecOperation.params[0].value.a = 0; 9453251364cSHisping Lin #endif 9463251364cSHisping Lin 9474aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 9484aa61755SAndy Ye &TeecSession, 9494aa61755SAndy Ye TeecUuid, 9504aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 9514aa61755SAndy Ye NULL, 9523251364cSHisping Lin &TeecOperation, 9534aa61755SAndy Ye &ErrorOrigin); 954f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 955f4e1db95SHisping Lin return TeecResult; 9564aa61755SAndy Ye 9574aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 9584aa61755SAndy Ye 9594aa61755SAndy Ye SharedMem0.size = *operation_size; 9604aa61755SAndy Ye SharedMem0.flags = 0; 9614aa61755SAndy Ye 9624aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 963f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 964f4e1db95SHisping Lin goto exit; 9654aa61755SAndy Ye 9664aa61755SAndy Ye memcpy(SharedMem0.buffer, operation_start, SharedMem0.size); 9674aa61755SAndy Ye 9684aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 9694aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 9704aa61755SAndy Ye 9714aa61755SAndy Ye TEEC_SharedMemory SharedMem1 = {0}; 9724aa61755SAndy Ye 9734aa61755SAndy Ye SharedMem1.size = *out_len; 9744aa61755SAndy Ye SharedMem1.flags = 0; 9754aa61755SAndy Ye 9764aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 977f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 978f4e1db95SHisping Lin goto exit; 9794aa61755SAndy Ye 9804aa61755SAndy Ye TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 9814aa61755SAndy Ye TeecOperation.params[1].tmpref.size = SharedMem1.size; 9824aa61755SAndy Ye 9834aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 9844aa61755SAndy Ye TEEC_MEMREF_TEMP_INOUT, 9854aa61755SAndy Ye TEEC_NONE, 9864aa61755SAndy Ye TEEC_NONE); 9874aa61755SAndy Ye 9884aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 9894aa61755SAndy Ye 145, 9904aa61755SAndy Ye &TeecOperation, 9914aa61755SAndy Ye &ErrorOrigin); 992f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 993f4e1db95SHisping Lin goto exit; 9944aa61755SAndy Ye 9954aa61755SAndy Ye *out_len = TeecOperation.params[1].tmpref.size; 9964aa61755SAndy Ye memcpy(out, SharedMem1.buffer, SharedMem1.size); 997f4e1db95SHisping Lin exit: 9984aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 9994aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem1); 1000f4e1db95SHisping Lin TEEC_CloseSession(&TeecSession); 1001f4e1db95SHisping Lin TEEC_FinalizeContext(&TeecContext); 10024aa61755SAndy Ye 10034aa61755SAndy Ye return TeecResult; 10044aa61755SAndy Ye } 10054aa61755SAndy Ye 10064aa61755SAndy Ye uint32_t trusty_attest_set_ca(uint8_t *ca_response, uint32_t *ca_response_size) 10074aa61755SAndy Ye { 10084aa61755SAndy Ye TEEC_Result TeecResult; 10094aa61755SAndy Ye TEEC_Context TeecContext; 10104aa61755SAndy Ye TEEC_Session TeecSession; 10114aa61755SAndy Ye uint32_t ErrorOrigin; 10124aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 10134aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 10144aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 10154aa61755SAndy Ye } 10164aa61755SAndy Ye }; 10174aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 10184aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 10193251364cSHisping Lin struct blk_desc *dev_desc; 10203251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 10216651d4c0SJason Zhu if (!dev_desc) { 10226651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 10236651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 10246651d4c0SJason Zhu } 1025f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1026f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1027f4e1db95SHisping Lin return TeecResult; 10284aa61755SAndy Ye 10294aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1030f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1031f4e1db95SHisping Lin return TeecResult; 10324aa61755SAndy Ye 10333251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 10343251364cSHisping Lin TEEC_NONE, 10353251364cSHisping Lin TEEC_NONE, 10363251364cSHisping Lin TEEC_NONE); 10373251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 1038b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 1039b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 1040b9a7e756SHisping Lin else 1041b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 1042b9a7e756SHisping Lin 10433251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 10443251364cSHisping Lin TeecOperation.params[0].value.a = 0; 10453251364cSHisping Lin #endif 10463251364cSHisping Lin 10474aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 10484aa61755SAndy Ye &TeecSession, 10494aa61755SAndy Ye TeecUuid, 10504aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 10514aa61755SAndy Ye NULL, 10523251364cSHisping Lin &TeecOperation, 10534aa61755SAndy Ye &ErrorOrigin); 1054f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1055f4e1db95SHisping Lin return TeecResult; 10564aa61755SAndy Ye 10574aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 10584aa61755SAndy Ye 10594aa61755SAndy Ye SharedMem0.size = *ca_response_size; 10604aa61755SAndy Ye SharedMem0.flags = 0; 10614aa61755SAndy Ye 10624aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 1063f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1064f4e1db95SHisping Lin goto exit; 10654aa61755SAndy Ye 10664aa61755SAndy Ye memcpy(SharedMem0.buffer, ca_response, SharedMem0.size); 10674aa61755SAndy Ye 10684aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 10694aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 10704aa61755SAndy Ye 10714aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 10724aa61755SAndy Ye TEEC_NONE, 10734aa61755SAndy Ye TEEC_NONE, 10744aa61755SAndy Ye TEEC_NONE); 10754aa61755SAndy Ye 10764aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 10774aa61755SAndy Ye 146, 10784aa61755SAndy Ye &TeecOperation, 10794aa61755SAndy Ye &ErrorOrigin); 1080f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1081f4e1db95SHisping Lin goto exit; 1082f4e1db95SHisping Lin exit: 10834aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 10844aa61755SAndy Ye TEEC_CloseSession(&TeecSession); 1085f4e1db95SHisping Lin TEEC_FinalizeContext(&TeecContext); 10864aa61755SAndy Ye 10874aa61755SAndy Ye return TeecResult; 10884aa61755SAndy Ye } 1089