/* ************************************************************************************************************ * * function * * name : * * parmeters : * * return : * * note : * * ************************************************************************************************************ */ int sunxi_secure_storage_list(void) { int ret, index = 1; unsigned char *buf_start = secure_storage_map; unsigned char buffer[4096]; if(sunxi_secure_storage_init()) { printf("%s secure storage init err\n", __func__); return -1; } char name[64], length[32]; int i,j, len; while(*buf_start != '\0') { memset(name, 0, 64); memset(length, 0, 32); i=0; while(buf_start[i] != ':') { name[i] = buf_start[i]; i ++; } i ++;j=0; while( (buf_start[i] != ' ') && (buf_start[i] != '\0') ) { length[j] = buf_start[i]; i ++;j++; } printf("name in map %s\n", name); len = simple_strtoul((const char *)length, NULL, 10); ret = sunxi_secstorage_read(index, buffer, 4096); if(ret < 0) { printf("get secure storage index %d err\n", index); return -1; } else if(ret > 0) { printf("the secure storage index %d is empty\n", index); return -1; } else { printf("%d data:\n", index); sunxi_dump(buffer, len); } index ++; buf_start += strlen((const char *)buf_start) + 1; } return 0; }
/* ************************************************************************************************************ * * function * * name : * * parmeters : * * return : * * note : * * ************************************************************************************************************ */ int sunxi_secure_storage_init(void) { int ret; if(!secure_storage_inited) { ret = sunxi_secstorage_read(0, secure_storage_map, 4096); if(ret < 0) { printf("get secure storage map err\n"); return -1; } else { if((secure_storage_map[0] == 0xff) || (secure_storage_map[0] == 0x0)) { printf("the secure storage map is empty\n"); memset(secure_storage_map, 0, 4096); } } } secure_storage_inited = 1; return 0; }
/* ************************************************************************************************************ * * function * * name : * * parmeters : * * return : * * note : * * ************************************************************************************************************ */ int sunxi_secure_storage_read(const char *item_name, char *buffer, int buffer_len, int *data_len) { int ret, index; int len_in_store; unsigned char buffer_to_sec[4096]; if(!secure_storage_inited) { printf("%s err: secure storage has not been inited\n", __func__); return -1; } index = __probe_name_in_map(secure_storage_map, item_name, &len_in_store); if(index < 0) { printf("no item name %s in the map\n", item_name); return -2; } memset(buffer_to_sec, 0, 4096); ret = sunxi_secstorage_read(index, buffer_to_sec, 4096); if(ret<0) { printf("read secure storage block %d name %s err\n", index, item_name); return -3; } if(len_in_store > buffer_len) { memcpy(buffer, buffer_to_sec, buffer_len); } else { memcpy(buffer, buffer_to_sec, len_in_store); } *data_len = len_in_store; return 0; }
static int sunxi_secure_object_list(void) { int ret, index = 1; unsigned char *buf_start = _inner_buffer; unsigned char buffer[4096]; int retLen; if(sunxi_secure_storage_init()) { printf("%s secure storage init err\n", __func__); return -1; } if( sunxi_secstorage_read( 0 , _inner_buffer,4096 )<0){ printf("read map fail\n"); return -1 ; } char name[64], length[32]; int i,j, len; printf("Map: \n"); sunxi_dump(_inner_buffer,0x100 ); while(*buf_start != '\0') { memset(name, 0, 64); memset(length, 0, 32); i=0; while(buf_start[i] != ':') { name[i] = buf_start[i]; i ++; } i ++;j=0; while( (buf_start[i] != ' ') && (buf_start[i] != '\0') ) { length[j] = buf_start[i]; i ++;j++; } len = simple_strtoul((const char *)length, NULL, 10); printf("name in map %s, len 0x%x\n", name,len); memset(buffer, 0, 4096); if( !strncmp("key_burned_flag", name, strlen("key_burned_flag") )) ret = sunxi_secure_storage_read(name, (void *)buffer,4096, &retLen); else ret = sunxi_secure_object_read(name, (void *)buffer, 4096, &retLen); if(ret < 0) { printf("get secure storage index %d err\n", index); return -1; } else if(ret > 0) { printf("the secure storage index %d is empty\n", index); return -1; } else { printf("%d data:\n", index); sunxi_dump(buffer, retLen); } index ++; buf_start += strlen((const char *)buf_start) + 1; } return 0; }