コード例 #1
0
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;
}
コード例 #2
0
ファイル: part.c プロジェクト: SteveHuang27/Thunder-Kernel
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;
}