int tee_verify_image(u32 *addr, u32 size) { u32 haddr = *addr; /* tee header address */ int ret; ret = 0; #if TEE_ENABLE_VERIFY /* verify tee image and addr is updated to pointer entry point */ ret = trustonic_tee_verify(addr, size, tee_img_vfy_pubk); if (ret) goto verify_end; ret = trustonic_tee_decrypt(haddr, size); #else DBG_MSG("%s tee_verify_image : 0x%x, 0x%x (before)\n", MOD, *addr, size); *addr = *addr + 0x240; DBG_MSG("%s tee_verify_image : 0x%x, 0x%x (after)\n", MOD, *addr, size); #endif verify_end: if(ret){ DBG_MSG("%s tee_verify_image : failed (%d)\n", MOD, ret); DBG_MSG("%s DUMP 0x%x: 0x%x, 0x%x, 0x%x, 0x%x\n", MOD, *addr, *(u32*)(*addr), *(u32*)(*addr+4), *(u32*)(*addr+8), *(u32*)(*addr+12)); DBG_MSG("%s DUMP 0x%x: 0x%x, 0x%x, 0x%x, 0x%x\n", MOD, *addr+0x240, *(u32*)(*addr+0x240), *(u32*)(*addr+0x244), *(u32*)(*addr+0x248), *(u32*)(*addr+0x24C)); }else{ DBG_MSG("%s tee_verify_image : passed\n", MOD); } return ret; }
int part_load(blkdev_t *bdev, part_t *part, u32 *addr, u32 offset, u32 size) { int ret; img_hdr_t *hdr = img_hdr_buf; part_hdr_t *part_hdr = &hdr->part_hdr; gfh_file_info_t *file_info_hdr = &hdr->file_info_hdr; /* specify the read offset */ u64 src = part->startblk * bdev->blksz + offset; u32 dsize = 0, maddr = 0, mode = 0; u32 ms; /* retrieve partition header. */ if (blkdev_read(bdev, src, sizeof(img_hdr_t), (u8*)hdr) != 0) { print("[%s] bdev(%d) read error (%s)\n", MOD, bdev->type, part->name); return -1; } if (part_hdr->info.magic == PART_MAGIC) { /* load image with partition header */ part_hdr->info.name[31] = '\0'; print("[%s] Image with part header\n", MOD); print("[%s] name : %s\n", MOD, part_hdr->info.name); print("[%s] addr : %xh mode : %d\n", MOD, part_hdr->info.maddr, part_hdr->info.mode); print("[%s] size : %d\n", MOD, part_hdr->info.dsize); print("[%s] magic: %xh\n", MOD, part_hdr->info.magic); maddr = part_hdr->info.maddr; dsize = part_hdr->info.dsize; mode = part_hdr->info.mode; src += sizeof(part_hdr_t); memcpy(part_info + part_num, part_hdr, sizeof(part_hdr_t)); part_num++; } else { print("[%s] %s image doesn't exist\n", MOD, part->name); return -1; } if (maddr == PART_HEADER_MEMADDR) { maddr = *addr; } else if (mode == LOAD_ADDR_MODE_BACKWARD) { /* note: if more than one TEE are loaded/verified, the later loaded tee * MUST BE the active TEE due to secure momory allocation algorithm */ g_secure_dram_size = maddr; /* secure memory is allocated to secure world already */ maddr = CFG_DRAM_ADDR + memory_size(); } ms = get_timer(0); if (0 == (ret = blkdev_read(bdev, src, dsize, (u8*)maddr))) *addr = maddr; ms = get_timer(ms); print("\n[%s] load \"%s\" from 0x%llx (dev) to 0x%x (mem) [%s]\n", MOD, part->name, src, maddr, (ret == 0) ? "SUCCESS" : "FAILED"); if( ms == 0 ) ms+=1; print("[%s] load speed: %dKB/s, %d bytes, %dms\n", MOD, ((dsize / ms) * 1000) / 1024, dsize, ms); #if CFG_TRUSTONIC_TEE_SUPPORT if (part_is_TEE(part)) { u32 tee_hdr_size = 0; print("verifying TEE..."); /* verify TEE */ ret = trustonic_tee_verify(addr, dsize, tee_img_vfy_pubk); if (ret) { print("fail, ret = 0x%x\n", ret); return ret; } print("ok\n"); ret = trustonic_tee_decrypt(maddr, dsize); if (ret) return ret; /* return memory occupied by tee hdr to normal world */ tee_hdr_size = *addr - maddr; g_secure_dram_size -= tee_hdr_size; } #endif return ret; }