天天看點

快速搭建平頭哥安全處理器的可信執行環境

快速搭建平頭哥安全處理器的可信執行環境

安全平台移植介紹

平頭哥的安全處理器和安全SoC安全機制具有良好的相容性和健壯性,基于TEE OS接口的擴充性和移植性,可以友善地快速地移植到其他平頭哥安全處理器的晶片平台上。

快速搭建平頭哥安全處理器的可信執行環境

根據底層硬體的安全機制,可以将安全平台元件分為5大部分:

安全晶片ROM

主要負責和低功耗子產品相關的安全功能。

安全處理器可信執行環境機制

基于處理器核心的可信執行環境硬體機制, 主要負責安全核心切換的上下文管理,安全中斷管理,核心切換異常處理等。

正常平台驅動

主要是平台的基本驅動,比如中斷,序列槽,NV操作驅動等。

系統低功耗

用于管理低功耗指令處理和系統喚醒機制。

安全IP驅動

涉及所有和硬體安全相關的驅動。

安全平台的移植元件

從官網下載下傳TEE SDK,解壓縮後可以看下如下目錄

vincent@cui:~/csky/work/csky-tee$ ls 
arch   config  driver   lib       project  tee     test
build  csi     include  makefile  ree      tee_ca
           

目錄說明如下:

├── arch        安全處理器架構部分
├── build        編譯臨時檔案存放目錄
├── config        安全平台配置檔案
├── csi            中天标準接口
├── driver        平台驅動包
├── include        TEE OS頭檔案
├── lib            系統庫檔案
├── makefile    主makefile編譯腳本
├── ree            REE OS第三方算法庫
├── tee            TEE OS以及TA源檔案
├── tee_ca        TEE CA源檔案
└── test        平台測試檔案           

TEE SDK 輸出檔案,我們需要關注以下四個檔案, 以ch2201平台為例,

ree_os
tee_os
./tee_ca/lib/libtee_os_ch2201.a
./tee_ca/lib/libcsiteeca.a
           

其中ree_os和tee_os用來本地測試, libtee_os_ch2201.a和libcsiteeca.a用于部署到YoC SDK裡去,分别用于生成TEE OS和開發安全應用程式。

注意,如果新平台名字為sample, 那就會生成libtee_os_sample.a

以上就是對TEE SDK的大體描述,現在大家TEE SDK有了一個整體概念,接下來我們按照具體的安全元件一個一個細化說明,講解如何移植。

晶片ROM是系統上電後第一個執行的鏡像,其固化在晶片的ROM媒體,具有執行速度快,初始化系統到一個已知狀态,為後續的引導做準備。當系統喚醒的時候,晶片ROM會判斷本次啟動時正常重新開機還是低功耗喚醒,如果是低功耗喚醒就直接跳轉到喚醒點,進行系統上下文恢複。由于本元件和系統低功耗安全相關,是以在這裡描述下,可以更好的了解整個可信執行環境平台移植。

建立處理器目錄

在arch目錄下建立新處理器型号sample目錄,通常做法複制一份ck802t,改名為sample。

vincent@cui:~/csky/work/csky-tee/arch$ ls
ck802t samp
           

在./arch/ck802t/tw/inc目錄下建立新的平台檔案夾,且删掉原來的平台檔案夾。

vincent@cui:~/csky/work/csky-tee/arch/ck802t/tw/inc$ ls
sample_pt  tee_misc.h           

第一次核心切換的上下文管理

啟動過程中第一次由TEE跳轉到REE的上下文管理比較特殊,利用核心硬體切換機制,需要在REE的SP寄存器訓示的堆棧出預先寫入跳轉的PC和PSR寄存器的值,然後執行RTE指令,處理器就就根據目前的SP寄存器的值去擷取PC和PSR的值,然後加載到REE的PC和PSR寄存器後繼續執行,此時GPR寄存器的值是預置的0,如果跳轉後需要傳遞參數的情況下,可以改變R0,R1,R2,R3. 第一次的核心切換處理接口位于./arch/sample/tw/exception.S 檔案裡的rte_to_ntw 函數,部分參考代碼如下:

/* 3. save psr to epsr, because SC == 1 in PSR */
    mfcr    r0, psr
    mtcr    r0, epsr

    /* 4. disable EE/IE clear SP */
    bclri   r0, 29  /* clear SP */
    bclri   r0, 8   /* disable EE */
    bclri   r0, 6   /* disable IE */
    mtcr    r0, psr

    /* 5. set non-secure SP */
    lrw  r0, NTW_RW_ADDR + NTW_RW_SIZE
    subi r0, 8
    mtcr r0, cr<6, 3>

    /* 6. prepare non-secure stack */
    lrw     r1, g_ntw_addr  /* set pc */
    ldw     r1, (r1, 0)

    ldw     r3, (r1, 4)
    lrw     r2, 0x594B5343
    cmpne   r3, r2
    bf      __magic_path
    ldw     r1, (r1, 0)
__magic_path:
    movi    r2, 0
    bseti   r2, 31              /* set psr */
    stw     r2, (r0, 0)
    stw     r1, (r0, 4)

    movi r0, 0
    movi r1, 0
    movi r2, 0
    movi r3, 0
    /* Ready to NTW */
    rte           

其中NTW_RW_ADDR和NTW_RW_SIZE定義在./arch/ck802t/tw/inc/sample_pt/tee_addr_map.h, 示例代碼如下:

#define NTW_RO_ADDR     0x10010000
#define NTW_RO_SIZE     0x00010000
#define NTW_RW_ADDR     0x60001000
#define NTW_RW_SIZE     0x00008000           

可以根據平台的實際位址空間更改。

核心切換異常處理

核心切換異常處理發生在REE OS執行WSC指令後, 這時候處理器切換到可信核心後,從EBR寄存器裡取出核心切換異常處理函數入口,然後開始執行。

EBR寄存器在系統啟動的時候裝置,位于./arch/sample/tw/startup.S裡_start函數裡

核心切換異常處理函數的入口定義的示例代碼:

ckcpu_vsr_table:

/* 0: Rest */
.long wsc_intr_handler   /* Use ckcpu_vsr_table[0] as ebr entry */           

EBR寄存器的初始化示例代碼:

lrw      a2, ckcpu_vsr_table
    mtcr     a2, vbr
    mtcr     a2, cr<1,1>      /* Use ckcpu_vsr_table[0] as ebr entry. cr<1,1> is T_EBR */           

核心切換的異常處理函數定義在./arch/sample/tw/exception.S裡的wsc_intr_handler函數,示例代碼如下

/* 1. save NTW GP registers to stack */
    subi sp, GP_CONTEXT_SIZE
    addi sp, 8
    stm r4-r13, (sp)
    subi sp, 8
    stw r15,    (sp, 0x30)

    /* 2. restore TW GP registers from stack */
    addi sp, GP_CONTEXT_SIZE
    ldw r15,    (sp, 0x28)
    ldm r4-r13, (sp)

    /* 3. restore sp */
    subi sp, GP_CONTEXT_SIZE

    /* 4. enable ie */
    psrset ie
    /* now we are ready for TEE dispatcher! */
    bsr     dispatcher_main
    psrclr ie

    /* we have finished one command */

    /* 1. save TW GP registers */
    addi sp, GP_CONTEXT_SIZE
    addi sp, 8
    stm r4-r13, (sp)
    subi sp, 8
    stw r15,    (sp, 0x30)

    /* 2. restore NTW GP registers */
    subi sp, GP_CONTEXT_SIZE
    ldw r15,    (sp, 0x28)
    ldm r4-r13, (sp)

    /* 3. restore sp */
    addi sp, GP_CONTEXT_SIZE

    /* now we are ready to return */
    rte           

上下文的大小定義在位于./arch/sample/tw/inc/tee_misc.h檔案裡的GP_CONTEXT_SIZE這個宏,目前隻需要儲存GPR寄存器即可, 如果需要更改,可以修改這個宏,然後在wsc_intr_handler處理函數裡增加需要格外儲存的寄存器資源代碼即可。

安全中斷管理

安全中斷向量表定義在./arch/ck802t/tw/startup.S檔案裡,示例代碼如下

ckcpu_vsr_table:
.long Default_Handler         /*  0:  GPIOA          */
.long Default_Handler         /*  1:  core Timer     */
.long Default_Handler         /*  2:  TimerA0         */
.long Default_Handler         /*  3:  TimerA1         */
.long Default_Handler
.long Default_Handler         /*  5:  WDT            */
.long Default_Handler         /*  6:  UART0          */
.long USART1_IRQHandler       /*  7:  UART1          */
.long Default_Handler         /*  8:  UART2          */
.long Default_Handler         /*  9:  I2C0           */
.long Default_Handler         /*  10: I2C1           */
.long Default_Handler         /*  11: SPI1           */
.long Default_Handler         /*  12: SPI0           */
.long Default_Handler         /*  13: RTC            */
.long Default_Handler
.long Default_Handler
.long Default_Handler
.long Default_Handler          /*  17: DMAC           */
.long Default_Handler
.long Default_Handler          /*  19: PWM            */
.long Default_Handler
.long Default_Handler          /*  21: UART3          */
.long Default_Handler
.long Default_Handler          /*  23: TimerB0        */
.long Default_Handler          /*  24: TimerB1        */
.long Default_Handler
.long AES_IRQHandler           /*  26:  AES            */
.long Default_Handler          /*  27:  GPIOB          */
.long Default_Handler
.long SHA_IRQHandler           /*  29:  SHA            */
.long Default_Handler
.long Default_Handler           

再通過在啟動代碼裡配置到VBR寄存器裡去, 示例代碼如下:

/*
     * Setup secure initial vector base table for interrupts and exceptions
     */
    lrw      a2, ckcpu_vsr_table
    mtcr     a2, vbr           

對于需要設定安全中斷的IRQ,可以通過如下接口來完成設定。

void drv_nvic_enable_sirq(int32_t IRQn)
           

安全堆棧寄存器配置

在./arch/ck802t/tw/startup.S檔案裡的啟動代碼裡配置安全堆棧寄存器,示例代碼如下:

/* Initialize the normal stack pointer from the end of TW volatile mem. */
    lrw      a1, TW_RW_ADDR + TW_RW_SIZE
    bclri    a1, 0  /* Make sure 4Bytes align */
    bclri    a1, 1

    mov      sp, a1           

其中TW_RW_ADDR和TW_RW_SIZE定義在./arch/ck802t/tw/inc/sample_pt/tee_addr_map.h, 示例代碼如下:

#define TW_RO_ADDR      0x10001000
#define TW_RO_SIZE      0x00006000
#define TW_RW_ADDR      0x60000000
#define TW_RW_SIZE      0x00001000           

增加平台編譯宏定義

arch目錄下新增目錄可以通過在makefile裡定義平台宏來編譯,示例代碼如下:

ifeq ($(CONFIG_PLATFORM_SAMPLE),y)
TARGET_PLATEFORM = sample_pt
endif           

通過将arch下的檔案加到makefile檔案裡的TEE_SRCS宏裡,示例代碼如下:

TEE_SRCS += $(ROOTDIR)/arch/sample/tw/startup.S \
            $(ROOTDIR)/arch/sample/tw/exception.S
           

正确設定後,在最後編譯的時候就會指定處理器平台檔案進行編譯。

在./driver/下複制一個新的檔案夾,然後改名為sample,如下

vincent@cui:~/csky/work/csky-tee/driver$ ls
common  driver.mk  hobbit1_2  hobbit3  include  phobos  zx297100 sample
           

實作./driver/sample/platform.c裡的hal_platform_init接口,示例代碼如下:

int hal_platform_init(void)
{
    hal_intc_init();

#if (CONFIG_SECURE_SPACE > 0)
    eflash_secure_config();
    sram_secure_config();
#endif
    drv_pmu_initialize(0, 0);

    return 0;
}           

我們可以在hal_platform_init接口裡實作系統需要實作的平台驅動程式。

在./driver/sample/uart.c裡實作console_init接口,實作列印log的序列槽初始化,如果CSI已經實作了新平台的序列槽實作,則可以忽略該接口實作。

在./driver/common/intc.c裡實作hal_intc_init的初始化,完成中斷預設優先級的配置,示例代碼如下

void hal_intc_init(void)
{
    volatile uint32_t *intc_reg_addr = (volatile uint32_t *)HOBBIT_VIC_BASE;

    intc_reg_addr[VIC_IPR0 >> 2] = 0x00000000;
    intc_reg_addr[VIC_IPR1 >> 2] = 0x00000000;
    intc_reg_addr[VIC_IPR2 >> 2] = 0x00000000;
    intc_reg_addr[VIC_IPR3 >> 2] = 0x00000000;
    intc_reg_addr[VIC_IPR4 >> 2] = 0x00000000;
    intc_reg_addr[VIC_IPR5 >> 2] = 0x00000000;
    intc_reg_addr[VIC_IPR6 >> 2] = 0x00000000;
    intc_reg_addr[VIC_IPR7 >> 2] = 0x00000000;

    __asm__ volatile("psrclr sie");
}           

其他的平台驅動,比如FLASH操作等驅動,可以參考CSI的代碼實作具 體參考CSI接口章節。

安全通路區域配置

安全通路區域屬性設定的驅動包括FLASH和RAM兩部分,因為在SoC上屬于不同的兩個安全通路控制器,我們主要實作如下兩個區域。其在hal_platform_init接口中調用實作。

void sram_secure_config(void);
void eflash_secure_config(void);
           

安全算法引擎的驅動包括SHA, AES, RSA, TRNG等,取決于硬體有沒有實作該類的加速器。具體接口定義和參考示例詳見後面的章節。

SHA移植接口

tee_crypto_result tee_hash_get_ctx_size(hash_type_t type, 
                                        size_t *size);
tee_crypto_result tee_hash_init(hash_type_t type, void *context);
tee_crypto_result tee_hash_update(const uint8_t *src, size_t size, void *context);
tee_crypto_result tee_hash_final(uint8_t *dgst, void *context);
tee_crypto_result tee_hash_reset(void *context);
tee_crypto_result tee_hash_copy_context(void *dst_ctx, void *src_ctx);
tee_crypto_result tee_hash_digest(hash_type_t type, const uint8_t *src, size_t size,
                                  uint8_t *dgst);           

AES移植接口

tee_crypto_result tee_aes_get_ctx_size(aes_type_t type, size_t *size);
tee_crypto_result tee_aes_init(aes_type_t type, bool is_enc, const uint8_t *key1,
                               const uint8_t *key2, size_t keybytes,                                                  uint8_t *iv, void *context);
tee_crypto_result tee_aes_process(const uint8_t *src, uint8_t *dst, 
                                  size_t size, void *context);
tee_crypto_result tee_aes_finish(const uint8_t *src, size_t src_size,                                                  uint8_t *dst, size_t *dst_size,                                                        sym_padding_t padding, 
                                 void *context);
tee_crypto_result tee_aes_reset(void *context);
tee_crypto_result tee_aes_copy_context(void *dst_ctx, void *src_ctx);           

DES移植接口

tee_crypto_result tee_des_get_ctx_size(des_type_t type, size_t *size);
tee_crypto_result tee_des_init(des_type_t type, bool is_enc, 
                               const uint8_t *key, size_t keybytes,                                                  const uint8_t *iv, void *context);
tee_crypto_result tee_des_process(const uint8_t *src, uint8_t *dst,                                                     size_t size, void *context);
tee_crypto_result tee_des_finish(const uint8_t *src, size_t src_size,                                                  uint8_t *dst,size_t *dst_size,                                                        sym_padding_t padding, 
                                 void *context);
tee_crypto_result tee_des_reset(void *context);
tee_crypto_result tee_des_copy_context(void *dst_ctx, void *src_ctx);           

RSA移植接口

tee_crypto_result tee_rsa_get_keypair_size(size_t keybits, 
                                           size_t *size);
tee_crypto_result tee_rsa_get_pubkey_size(size_t keybits, 
                                          size_t *size);
tee_crypto_result tee_rsa_init_keypair(size_t keybits,
                                       const uint8_t *n, size_t n_size,
                                       const uint8_t *e, size_t e_size,
                                       const uint8_t *d, size_t d_size,
                                       const uint8_t *p, size_t p_size,
                                       const uint8_t *q, size_t q_size,
                                       const uint8_t *dp, size_t dp_size,
                                       const uint8_t *dq, size_t dq_size,
                                       const uint8_t *qp, size_t qp_size,
                                       rsa_keypair_t *keypair);
tee_crypto_result tee_rsa_init_pubkey(size_t keybits,
                                      const uint8_t *n, size_t n_size,
                                      const uint8_t *e, size_t e_size,
                                      rsa_pubkey_t *pubkey);
tee_crypto_result tee_rsa_gen_keypair(size_t keybits,
                                      const uint8_t *e, size_t e_size,
                                      rsa_keypair_t *keypair);
tee_crypto_result tee_rsa_get_key_attr(rsa_key_attr_t attr,
                                       rsa_keypair_t *keypair, 
                                       void *buffer, size_t *size);
tee_crypto_result tee_rsa_public_encrypt(const rsa_pubkey_t *pub_key,
                                         const uint8_t *src, 
                                         size_t src_size,
                                         uint8_t *dst, 
                                         size_t *dst_size,
                                         tee_rsa_padding_t padding);
tee_crypto_result tee_rsa_private_decrypt(const rsa_keypair_t *priv_key,
                                          const uint8_t *src, 
                                          size_t src_size,
                                          uint8_t *dst, 
                                          size_t *dst_size,
                                          tee_rsa_padding_t padding);
tee_crypto_result tee_rsa_sign(const rsa_keypair_t *priv_key,
                               const uint8_t *dig, size_t dig_size,
                               uint8_t *sig, size_t *sig_size, 
                               tee_rsa_padding_t padding);
tee_crypto_result tee_rsa_verify(const rsa_pubkey_t *pub_key,
                                 const uint8_t *dig, size_t dig_size,
                                 const uint8_t *sig, size_t sig_size,
                                 tee_rsa_padding_t padding, bool *result);           

TRNG移植接口

tee_crypto_result tee_seed(uint8_t *seed, size_t seed_len);
tee_crypto_result tee_rand_gen(uint8_t *buf, size_t len);           

安全裝置控制配置

安全裝置控制通過在安全模式下通路TIPC控制寄存器來實作,該寄存器的每一個BIT表示一個裝置,具體可以參考平台手冊。結合安全中斷的配置,一旦裝置被配制成安全裝置,其中斷也必須配置成安全中斷。

快速搭建平頭哥安全處理器的可信執行環境

Key Provision解析

KP用于是密鑰和隐私資訊的集合,在生産的時候寫入安全OTP或eFUSE區域, TEE OS通過解析KP檔案擷取密鑰和其他安全資訊。KP檔案需要符合YoC安全應用方案,如果需要擴充新的密鑰類型,可以更新密鑰類型結構體:

typedef enum {
    KEY_MANIFEST = 1,
    KEY_JTAGKEY,
    KEY_PUBKEY,
    KEY_DEVID,
    KEY_DEVIDPRIVKEY,
    KEY_SOCCONFIG,
    KEY_LPM,
    KEY_INVAILD
} key_type_e;           

主要實作的接口如下:

int kp_get_key(key_type_e key_type, uint32_t *key);
int kp_version();
int kp_get_manifest_addr(uint32_t *addr);           

如果KP檔案格式不變,可跳過該元件移植。

Manifest TaBle解析

類似KP檔案,MTB是一套系統鏡像的資訊集合,其格式符合YoC安全應用方案,TEE TA服務可以提供MTB的功能,主要功能接口如下:

int mtb_get_img_info(char *name, mtb_img_info_t *img_info);
int mtb_get_os_version(uint8_t *buf, uint32_t *size);
int mtb_get_img_buf(uint8_t *buf, uint32_t *size, char *name);
int mtb_get_partition_buf(uint8_t *buf, uint32_t *size);
int mtb_get_ntw_addr(uint32_t *addr);
int mtb_verify_image(const char *name);
int mtb_get_key_info(key_info_t *info);
int mtb_get_pubkey_info(key_info_t *info);           

如果MTB檔案格式不變,可以跳過該元件移植。

TEE OS提供的低功耗服務接口位于LPM TA裡,支援如下四種低功耗模式:

WAIT

DOZE

STOP

STANDBY

進入深睡眠前,需要儲存系統上下文到NV裡,通過調用以下接口實作,

int32_t arch_do_cpu_save(void);           

其利用彙編實作,位于./arch/ck802t/tw/cpu_ctx.S檔案裡,示例代碼如下:

arch_do_cpu_save:
    subi    r14, 4
    stw r0, (r14, 0x0)
    lrw r0, arch_tw_cpu_saved
    stw r1, (r0, 0x4)
    stw r2, (r0, 0x8)
    stw r3, (r0, 0xc)
    stw r4, (r0, 0x10)
    stw r5, (r0, 0x14)
    stw r6, (r0, 0x18)
    stw r7, (r0, 0x1c)
    stw r8, (r0, 0x20)
    stw r9, (r0, 0x24)
    stw r10, (r0, 0x28)
    stw r11, (r0, 0x2c)
    stw r12, (r0, 0x30)
    stw r13, (r0, 0x34)
    stw r15, (r0, 0x3c)
    mfcr    r2, psr
    stw r2, (r0, 0x40)
    mfcr    r2, vbr
    stw r2, (r0, 0x44)
    mfcr    r2, epsr
    stw r2, (r0, 0x48)
    mfcr    r2, epc
    stw r2, (r0, 0x4c)
    // save NT_SSP
    mfcr    r2, cr<6, 3>
    stw r2, (r0, 0x50)
    // save NT_PSR
    mfcr    r2, cr<0, 3>
    stw r2, (r0, 0x54)
    // save NT_VBR
    mfcr    r2, cr<1, 3>
    stw r2, (r0, 0x58)
    // save NT_EPSR
    mfcr    r2, cr<2, 3>
    stw r2, (r0, 0x5c)
    // save NT_EPC
    mfcr    r2, cr<4, 3>
    stw r2, (r0, 0x60)
    // save NT_EBR
    mfcr    r2, cr<10,3>
    stw r2, (r0, 0x64)
    // save T_EBR
    mfcr    r2, cr<1,1>
    stw r2, (r0, 0x68)
    //save jtag
    mfcr    r2, cr<8, 3>
    stw r2, (r0, 0x6c)

    ldw r2, (r14, 0x0)
    addi    r14, 4
    stw r14, (r0, 0x38)
    stw r2, (r0, 0x0)
    movi    r0, 0
    jmp r15           

系統被喚醒後,晶片ROM裡的低功耗代碼會直接跳轉到上下文恢複入口位址(該位址在系統進入低功耗前設定在一塊NV空間), 然後調用arch_resume_context進行上下文恢複,示例代碼如下:

arch_resume_context:
    lrw     r0, SOC_CONIG_ADDR
    ldw     r0, (r0, 0)
    btsti   r0, 4
    bf      .LRECV
    mfcr    r0, cr<8, 3>
    bseti   r0, 1
    bseti   r0, 0
    mtcr    r0, cr<8, 3>
.LRECV:
    lrw     r0, EFLASH_CONTROL_BASE
    movi    r1, 0x35
    stw     r1, (r0, 0x24)
    movi    r1, 0x16
    stw     r1, (r0, 0x28)
    movi    r1, 0x35
    stw     r1, (r0, 0x2c)
    movi    r1, 0x1b9
    stw     r1, (r0, 0x30)
    movi    r1, 0x8b10
    stw     r1, (r0, 0x34)
    lrw r0, CSKY_LPM_BASE
    ldw r1, (r0, 0x0)
    btsti r1, 3
    bt arch_sp_resume_from_stop
    bf arch_sp_resume_from_standby           

建立平台配置檔案

在./config目錄下複制一個新檔案,然後改名為sample_release_defconfig,如下

vincent@cui:~/csky/work/csky-tee/config$ ls
hobbit1_2_release_defconfig  phobos_release_defconfig  zx297100_release_defconfig
sample_release_defconfig           

根據系統需求的配置檔案,示例代碼如下:

#
# TEE Platform
#
# CONFIG_PLATFORM_PHOBOS is not set
# CONFIG_PLATFORM_ZX297100 is not set
CONFIG_PLATFORM_SAMPLE=y
CONFIG_CSKY=y

#
# TEE Feature
#
CONFIG_TB_KP=y
CONFIG_STACK_PROTECT=y
CONFIG_SECURE_SPACE=y
CONFIG_DEVID=y
CONFIG_ALGO_SHA=y
CONFIG_ALGO_TRNG=y
CONFIG_ALGO_AES=y
CONFIG_ALGO_RSA=y
CONFIG_ALGO_LPM=y
CONFIG_ALGO_BASE64=y
CONFIG_ALGO_HMAC=y
# CONFIG_ALGO_DES3 is not set
# CONFIG_REE_VERIFY is not set
CONFIG_TEE_DEBUG=n
CONFIG_MBEDTLS=y
CONFIG_TEE_VERSION="2.1.10"
CONFIG_USART=y
CONFIG_TRNG=y
CONFIG_AES=y
CONFIG_RSA=y
CONFIG_SHA=y
CONFIG_WDT=y
CONFIG_PMU=y
CONFIG_EFLASH=y
#
# TEE TEST
#
CONFIG_TEST=y           

平台移植編譯

所有元件開發和配置完成後,就可以I在根目錄下執行make指令來完成整個TEE的編譯,執行完以後可以在根目錄下找到以下檔案:

./tee_os
./ree_os
./tee_ca/lib/libtee_os_sample.a
./tee_ca/lib/libcsiteeca.a           

其中libtee_os_sample.a和libcsiteeca.a是部署在YoC SDK裡的,具體如何使用參考安全應用開發文檔。

tee_os和ree_os用于測試。

新平台運作

利用燒寫工具将tee_os和ree_os燒寫到SAMPLE開發闆裡,利用GDB運作。

在序列槽出看到如下列印表示xor TA運作成功。

xor value: 55aa55aa
xor length: 4           

文章來源:晶片開放社群

文章連結:

https://occ.t-head.cn/community/post/detail?spm=a2cl5.14300636.0.0.1b87180f3qWo3R&id=614186779771142144

繼續閱讀