Presented by
Date
HKG15-311:OP-TEE Basics
and Porting Review
Victor Chong
2015-2-9
Objectives
● Security Building Blocks
● Secure Boot
● Introduction to Trusted Applications
● OP-TEE Porting
OP-TEE
● Open-source Portable TEE
● Sponsored by ST
● GlobalPlatform (GP) compatible
● Compatible with ARM-TF
● Complete system
Security Building Blocks
● TrustZone-enabled chipset (Hardware)
● ARM Trusted Firmware aka ARM-TF (Firmware)
● Boot Services
● Run-time Services
● OP-TEE (OS)
● Client library (libteec.so)
● Driver (optee.ko)
● Trusted OS
● Client Applications
● OP-TEE Clients (Normal World)
● Trusted Applications (Secure World)
Security Building Blocks
Security Building Blocks
Secure Boot
● Prevent unauthorized executables from booting by verifying image
signatures
● Divided into stages
● Start with trusted source (ROM boot code) @ stage/level 1
● Root of Trust
● Every subsequent image (stage/level) to be loaded is verified first
by the one before it
● Chain of Trust
Secure Boot
Introduction to Trusted Applications
A Trusted Application typically consists of two parts
● Linux user space, client implementation
● Secure world Trusted Application (TA)
Introduction to Trusted Applications
Introduction to Trusted Applications
Typical normal world program flow based on GP Client API
● TEEC_InitializeContext
● Connect to the OP-TEE Linux driver
● TEEC_OpenSession
● Loads the TA
● TEEC_InvokeCommand
● Control TA functions
● TEEC_CloseSession
● TEEC_FinalizeContext
Hello World Example
root@host:/ hello_world
TEEC_InitializeContext
TEEC_OpenSession
TEEC_InvokeCommand(TA_HELLO_WORLD_CMD_INCVALUE)
TEEC_InvokeCommand(TA_HELLO_WORLD_CMD_INCVALUE) ==> 100+1 = 101
TEEC_InvokeCommand(TA_HELLO_WORLD_CMD_PRINT_HELLO_WORLD)
TEEC_InvokeCommand(TA_HELLO_WORLD_CMD_PRINT_HELLO_WORLD) done
…
TEEC_CloseSession
TEEC_FinalizeContex
Introduction to Trusted Applications
● GP Client API
● Not too flexible
● Somewhat limited in functionality
● GP Functional API forthcoming
● High level APIs, e.g. encrypt/decrypt
● Secure side TAs not required
Introduction to Trusted Applications
● Details
http://www.slideshare.net/linaroorg/lcu14103-how-to-create-and-run-trusted-
applications-on-optee
● Hello world example available at
http://github.com/jenswi-linaro/lcu14_optee_hello_world
● GlobalPlatform
http://www.globalplatform.org/
OP-TEE Porting
Prerequisites
● ARM-TF ported for ARMv8
https://github.com/ARM-software/arm-trusted-firmware/blob/master/docs/porting-guide.md
References
● Detailed design document
https://github.com/OP-TEE/optee_os/blob/master/documentation/optee_design.md
OP-TEE Trusted OS
Linux
Android
OP-TEE Porting - Main Blocks
TEE Driver
TEE Client
Client
Application
Client
Application
TEE Core
TEE functions
(crypto/mm)
TEE Internal API
Trusted
Application
Trusted
Application
TrustZone based chipset crypto timer efuse
HAL
TEE Client API
SMC
porting
OP-TEE Porting - Affected Gits
● OP-TEE Trusted OS (optee_os)
- Add new platform support (plat-<myplat>)
● OP-TEE Linux kernel driver (optee_linuxdriver)
- No changes needed.
- Built as module (optee.ko) by default and included in rootfs.
● OP-TEE Normal World user space (optee_client)
- No changes needed.
- Built as library (libteec.so) and included in rootfs.
OP-TEE Porting - Getting started
● Get OP-TEE source code
http://github.com/OP-TEE
● Get the toolchain
http://releases.linaro.org/14.09/components/toolchain/binaries/gcc-linaro-arm-
linux-gnueabihf-4.9-2014.09_linux.tar.xz
OP-TEE Porting - How to build
● Add toolchain path
export PATH=$PATH:path-to-toolchain-bin
● Define CROSS_PREFIX macro
export CROSS_PREFIX=arm-linux-gnueabihf
● Choose target platform
export PLATFORM=<myplat> (e.g. vexpress)
● Choose target flavor
export PLATFORM_FLAVOR=<myflav> (e.g. juno)
● Build OP-TEE
make (produces tee.bin)
OP-TEE Porting - Partition Map
BL2/BL3-1/BL3-2
fip.bin (includes bl2.bin, bl31.bin,
tee.bin, u-boot.bin/uefi)
BL1
bl1.bin
kernel Image
rootfs
Example partition map based on
Allwinner A80 board
● Clone from an existing platform
E.g. core/arch/arm32/plat-vexpress → core/arch/arm32/plat-<myplat>
OP-TEE Porting - Creating a New Platform
├── conf.mk
├── link.mk
├── sub.mk
├── ..
├── core_bootcfg.c
└── platform_config.h
├── conf.mk
├── link.mk
├── sub.mk
├── ..
├── core_bootcfg.c
└── platform_config.h
OP-TEE Porting - Compiler & Linker options
● Compiler options: conf.mk
● Linker options: link.mk
CROSS_PREFIX ?= arm-linux-gnueabihf
CROSS_COMPILE ?= $(CROSS_PREFIX)-
PLATFORM_FLAVOR ?= <myflav>
platform-cpuarch = cortex-a57 #default is cortex-a15
platform-cflags += ..
link-out-dir = $(out-dir)/core/
link-script = $(platform-dir)/kern.ld.S
link-ldflags = $(LDFLAGS)
OP-TEE Porting - Platform Configurations
● Platform-specific definitions: platform_config.h
#define STACK_TMP_SIZE 1024
#define STACK_ABT_SIZE 1024
#define STACK_THREAD_SIZE 8192
..
#define DRAM0_BASE 0x80000000
#define DRAM0_SIZE 0x7F000000
/* Location of trusted dram */
#define TZDRAM_BASE 0xFF000000
#define TZDRAM_SIZE 0x00E00000
..
#define CFG_TEE_CORE_NB_CORE 6
..
#define TEE_RAM_START (TZDRAM_BASE)
#define TEE_RAM_SIZE 0x0010000
#define CFG_SHMEM_START (DRAM0_BASE + DRAM0_SIZE - CFG_SHMEM_SIZE)
#define CFG_SHMEM_SIZE 0x100000
OP-TEE Porting - Platform Configurations
● platform_config.h also includes definitions for
● GIC base
● UART
OP-TEE Porting - Adding Source Files
● Source files list: sub.mk
srcs-y += file1.c
srcs-y += file2.c
…
subdirs-y += dir1
subdirs-y += dir2
OP-TEE Porting - Memory Map
OP-TEE Porting - Memory Configuration
● plat-<myplat>/
core_bootcfg.c
static struct map_area bootcfg_memory_map[] = {
{ /* teecore execution RAM */
.type = MEM_AREA_TEE_RAM,
.pa = CFG_TEE_RAM_START, .size = CFG_TEE_RAM_SIZE,
.cached = true, .secure = true, .rw = true, .exec = true,
},
{ /* teecore TA load/exec RAM - Secure, exec user only! */
.type = MEM_AREA_TA_RAM,
.pa = CFG_TA_RAM_START, .size = CFG_TA_RAM_SIZE,
.cached = true, .secure = true, .rw = true, .exec = false,
},
{ /* teecore public RAM - NonSecure, non-exec. */
.type = MEM_AREA_NSEC_SHM,
.pa = CFG_PUB_RAM_START, .size = SECTION_SIZE,
.cached = true, .secure = false, .rw = true, .exec = false,
},
{ /* Add platform IO devices like UART, GIC, etc. */
.type = MEM_AREA_IO_SEC,
.pa = (GIC_BASE + GICD_OFFSET) & ~SECTION_MASK, .size = SECTION_SIZE,
.device = true, .secure = true, .rw = true,
},
{.type = MEM_AREA_NOTYPE}
};
OP-TEE Porting - Platform Initialization
(_start) (kern.ld.S)
1. _start (entry.S)
a. CPU basic init (v7 only)
b. Cache/MMU init
c. BSS init (v7 only)
d. Jump to main_init
2. main_init (main.c)
a. Init UART, canaries, GIC
b. Clear BSS (v8 only)
c. Init monitor (v7 only)
d. Init thread stacks
e. Register handlers
(stdcall/fiq/svc/abort)
f. Init core
g. Return to non-secure entry
OP-TEE Porting - Running and Debug
(_start) (kern.ld.S)
4. sm_smc_entry (v7 only)
(sm_asm.S)
a. Save caller world context
b. Restore world context
c. Update SCR bits (NS/FIQ)
5. Thread handle (thread_asm.S,
thread.c)
a. Check if fiq handle request
b. Thread allocate
c. Thread context restore
6. main_tee_entry (main.c)
7. tee_entry (entry.c)
OP-TEE Porting - Test/Verify
● Build normal world program and corresponding TA
● Copy both to rootfs
● Run normal world program
● Details
http://www.slideshare.net/linaroorg/lcu14103-how-to-create-and-run-
trusted-applications-on-optee
● Hello world example available at
http://github.com/jenswi-linaro/lcu14_optee_hello_world
OP-TEE Porting - Sample Test Log
root@Vexpress:/ modprobe optee
misc teetz: no TZ l2cc mutex service supported
misc teetz: outer cache shared mutex disabled
root@Vexpress:/ tee-supplicant&
root@Vexpress:/ hello_world
Invoking TA to increment 42
TA incremented value to 43
root@Vexpress:/
OP-TEE Porting - Initial Task Checklist
- [ ] Port ARM-TF with U-Boot/UEFI (as bl33.bin) but without optee_os (bl32.bin)
- [ ] Make platform-specific changes to optee_os
- [ ] Add new platform
- [ ] conf.mk, link.mk, platform_config.h, core_bootcfg.c
- [ ] Add new source files (if required)
- [ ] Platform initialization (if required)
- [ ] Thread handlers (if required)
- [ ] Build optee_os
- [ ] Rebuild ARM-TF with U-Boot/UEFI as bl33.bin and optee_os as bl32.bin
- [ ] Build other required system components (kernel, rootfs, etc.)
- [ ] Test/Verify
OP-TEE documentation
● OP-TEE OS Documents
https://github.com/OP-TEE/optee_os/tree/master/documentation
● OP-TEE Wiki FAQ
https://wiki.linaro.org/WorkingGroups/Security/OP-TEE
Thank You!
HKG15-311: OP-TEE for Beginners and Porting Review

More Related Content

PDF
BKK16-110 A Gentle Introduction to Trusted Execution and OP-TEE
PDF
SFO15-503: Secure storage in OP-TEE
PDF
LCU14-103: How to create and run Trusted Applications on OP-TEE
PDF
Secure Boot on ARM systems – Building a complete Chain of Trust upon existing...
PPTX
Rust programming-language
PPTX
Arm: Enabling CXL devices within the Data Center with Arm Solutions
PDF
Android OTA updates
PDF
An introduction to Rust: the modern programming language to develop safe and ...
BKK16-110 A Gentle Introduction to Trusted Execution and OP-TEE
SFO15-503: Secure storage in OP-TEE
LCU14-103: How to create and run Trusted Applications on OP-TEE
Secure Boot on ARM systems – Building a complete Chain of Trust upon existing...
Rust programming-language
Arm: Enabling CXL devices within the Data Center with Arm Solutions
Android OTA updates
An introduction to Rust: the modern programming language to develop safe and ...

What's hot (20)

PDF
Lcu14 107- op-tee on ar mv8
PDF
LCU14 302- How to port OP-TEE to another platform
PDF
SFO15-200: Linux kernel generic TEE driver
PDF
Lcu14 306 - OP-TEE Future Enhancements
PDF
LCA14: LCA14-502: The way to a generic TrustZone® solution
PDF
HKG18-402 - Build secure key management services in OP-TEE
PDF
TEE - kernel support is now upstream. What this means for open source security
PDF
Secure storage updates - SFO17-309
ODP
Introduction to Optee (26 may 2016)
PDF
SFO15-205: OP-TEE Content Decryption with Microsoft PlayReady on ARM
PDF
BUD17-400: Secure Data Path with OPTEE
PDF
LCA14: LCA14-418: Testing a secure framework
PDF
LAS16 111 - Raspberry pi3, op-tee and jtag debugging
PDF
BKK16-201 Play Ready OPTEE Integration with Secure Video Path lhg-1
PDF
Trusted firmware deep_dive_v1.0_
PDF
LCU14 500 ARM Trusted Firmware
TXT
OPTEE on QEMU - Build Tutorial
PDF
LAS16-406: Android Widevine on OP-TEE
PDF
LAS16-111: Easing Access to ARM TrustZone – OP-TEE and Raspberry Pi 3
PDF
LAS16-402: ARM Trusted Firmware – from Enterprise to Embedded
Lcu14 107- op-tee on ar mv8
LCU14 302- How to port OP-TEE to another platform
SFO15-200: Linux kernel generic TEE driver
Lcu14 306 - OP-TEE Future Enhancements
LCA14: LCA14-502: The way to a generic TrustZone® solution
HKG18-402 - Build secure key management services in OP-TEE
TEE - kernel support is now upstream. What this means for open source security
Secure storage updates - SFO17-309
Introduction to Optee (26 may 2016)
SFO15-205: OP-TEE Content Decryption with Microsoft PlayReady on ARM
BUD17-400: Secure Data Path with OPTEE
LCA14: LCA14-418: Testing a secure framework
LAS16 111 - Raspberry pi3, op-tee and jtag debugging
BKK16-201 Play Ready OPTEE Integration with Secure Video Path lhg-1
Trusted firmware deep_dive_v1.0_
LCU14 500 ARM Trusted Firmware
OPTEE on QEMU - Build Tutorial
LAS16-406: Android Widevine on OP-TEE
LAS16-111: Easing Access to ARM TrustZone – OP-TEE and Raspberry Pi 3
LAS16-402: ARM Trusted Firmware – from Enterprise to Embedded
Ad

Similar to HKG15-311: OP-TEE for Beginners and Porting Review (20)

PPTX
U-Boot presentation 2013
PDF
U-Boot - An universal bootloader
PPTX
Embedded Fest 2019. Игорь Опанюк. Das U-boot v2019: a look under the hood
PPTX
U-Boot Porting on New Hardware
PPT
U Boot or Universal Bootloader
PDF
LAS16-504: Secure Storage updates in OP-TEE
PPT
Developing a Windows CE OAL.ppt
PDF
Embedded Android
PDF
[OpenStack Day in Korea 2015] Track 1-6 - 갈라파고스의 이구아나, 인프라에 오픈소스를 올리다. 그래서 보이...
PPTX
Labs_BT_20221017.pptx
PPT
Slimline Open Firmware
PDF
Jagan Teki - U-boot from scratch
PDF
RISC-V-Day-Tokyo2018-suzaki
PDF
HKG18-116 - RAS Solutions for Arm64 Servers
PPTX
Track c-High speed transaction-based hw-sw coverification -eve
PPT
Virtual platform
PPTX
U-boot and Android Verified Boot 2.0
PDF
Study on Android Emulator
PDF
Attack your Trusted Core
ODP
Extending OpenShift Origin: Build Your Own Cartridge with Bill DeCoste of Red...
U-Boot presentation 2013
U-Boot - An universal bootloader
Embedded Fest 2019. Игорь Опанюк. Das U-boot v2019: a look under the hood
U-Boot Porting on New Hardware
U Boot or Universal Bootloader
LAS16-504: Secure Storage updates in OP-TEE
Developing a Windows CE OAL.ppt
Embedded Android
[OpenStack Day in Korea 2015] Track 1-6 - 갈라파고스의 이구아나, 인프라에 오픈소스를 올리다. 그래서 보이...
Labs_BT_20221017.pptx
Slimline Open Firmware
Jagan Teki - U-boot from scratch
RISC-V-Day-Tokyo2018-suzaki
HKG18-116 - RAS Solutions for Arm64 Servers
Track c-High speed transaction-based hw-sw coverification -eve
Virtual platform
U-boot and Android Verified Boot 2.0
Study on Android Emulator
Attack your Trusted Core
Extending OpenShift Origin: Build Your Own Cartridge with Bill DeCoste of Red...
Ad

More from Linaro (20)

PDF
Deep Learning Neural Network Acceleration at the Edge - Andrea Gallo
PDF
Arm Architecture HPC Workshop Santa Clara 2018 - Kanta Vekaria
PDF
Huawei’s requirements for the ARM based HPC solution readiness - Joshua Mora
PDF
Bud17 113: distribution ci using qemu and open qa
PDF
OpenHPC Automation with Ansible - Renato Golin - Linaro Arm HPC Workshop 2018
PDF
HPC network stack on ARM - Linaro HPC Workshop 2018
PDF
It just keeps getting better - SUSE enablement for Arm - Linaro HPC Workshop ...
PDF
Intelligent Interconnect Architecture to Enable Next Generation HPC - Linaro ...
PDF
Yutaka Ishikawa - Post-K and Arm HPC Ecosystem - Linaro Arm HPC Workshop Sant...
PDF
Andrew J Younge - Vanguard Astra - Petascale Arm Platform for U.S. DOE/ASC Su...
PDF
HKG18-501 - EAS on Common Kernel 4.14 and getting (much) closer to mainline
PDF
HKG18-100K1 - George Grey: Opening Keynote
PDF
HKG18-318 - OpenAMP Workshop
PDF
HKG18-501 - EAS on Common Kernel 4.14 and getting (much) closer to mainline
PDF
HKG18-315 - Why the ecosystem is a wonderful thing, warts and all
PDF
HKG18- 115 - Partitioning ARM Systems with the Jailhouse Hypervisor
PDF
HKG18-TR08 - Upstreaming SVE in QEMU
PDF
HKG18-113- Secure Data Path work with i.MX8M
PPTX
HKG18-120 - Devicetree Schema Documentation and Validation
PPTX
HKG18-223 - Trusted FirmwareM: Trusted boot
Deep Learning Neural Network Acceleration at the Edge - Andrea Gallo
Arm Architecture HPC Workshop Santa Clara 2018 - Kanta Vekaria
Huawei’s requirements for the ARM based HPC solution readiness - Joshua Mora
Bud17 113: distribution ci using qemu and open qa
OpenHPC Automation with Ansible - Renato Golin - Linaro Arm HPC Workshop 2018
HPC network stack on ARM - Linaro HPC Workshop 2018
It just keeps getting better - SUSE enablement for Arm - Linaro HPC Workshop ...
Intelligent Interconnect Architecture to Enable Next Generation HPC - Linaro ...
Yutaka Ishikawa - Post-K and Arm HPC Ecosystem - Linaro Arm HPC Workshop Sant...
Andrew J Younge - Vanguard Astra - Petascale Arm Platform for U.S. DOE/ASC Su...
HKG18-501 - EAS on Common Kernel 4.14 and getting (much) closer to mainline
HKG18-100K1 - George Grey: Opening Keynote
HKG18-318 - OpenAMP Workshop
HKG18-501 - EAS on Common Kernel 4.14 and getting (much) closer to mainline
HKG18-315 - Why the ecosystem is a wonderful thing, warts and all
HKG18- 115 - Partitioning ARM Systems with the Jailhouse Hypervisor
HKG18-TR08 - Upstreaming SVE in QEMU
HKG18-113- Secure Data Path work with i.MX8M
HKG18-120 - Devicetree Schema Documentation and Validation
HKG18-223 - Trusted FirmwareM: Trusted boot

Recently uploaded (20)

PDF
SOFTWARE ENGINEERING Software Engineering (3rd Edition) by K.K. Aggarwal & Yo...
PDF
Sun and Bloombase Spitfire StoreSafe End-to-end Storage Security Solution
PPTX
Human-Computer Interaction for Lecture 2
PDF
Cloud Native Aachen Meetup - Aug 21, 2025
PDF
CapCut PRO for PC Crack New Download (Fully Activated 2025)
PPTX
Presentation by Samna Perveen And Subhan Afzal.pptx
DOCX
Modern SharePoint Intranet Templates That Boost Employee Engagement in 2025.docx
PPTX
Lecture 5 Software Requirement Engineering
PDF
CCleaner 6.39.11548 Crack 2025 License Key
PDF
Internet Download Manager IDM Crack powerful download accelerator New Version...
PDF
PDF-XChange Editor Plus 10.7.0.398.0 Crack Free Download Latest 2025
PPTX
Plex Media Server 1.28.2.6151 With Crac5 2022 Free .
PPTX
hospital managemt ,san.dckldnklcdnkdnkdnjadnjdjn
DOC
UTEP毕业证学历认证,宾夕法尼亚克拉里恩大学毕业证未毕业
PPTX
R-Studio Crack Free Download 2025 Latest
PDF
E-Commerce Website Development Companyin india
PPTX
Matchmaking for JVMs: How to Pick the Perfect GC Partner
PDF
AI Guide for Business Growth - Arna Softech
PDF
Guide to Food Delivery App Development.pdf
PPTX
ROI Analysis for Newspaper Industry with Odoo ERP
SOFTWARE ENGINEERING Software Engineering (3rd Edition) by K.K. Aggarwal & Yo...
Sun and Bloombase Spitfire StoreSafe End-to-end Storage Security Solution
Human-Computer Interaction for Lecture 2
Cloud Native Aachen Meetup - Aug 21, 2025
CapCut PRO for PC Crack New Download (Fully Activated 2025)
Presentation by Samna Perveen And Subhan Afzal.pptx
Modern SharePoint Intranet Templates That Boost Employee Engagement in 2025.docx
Lecture 5 Software Requirement Engineering
CCleaner 6.39.11548 Crack 2025 License Key
Internet Download Manager IDM Crack powerful download accelerator New Version...
PDF-XChange Editor Plus 10.7.0.398.0 Crack Free Download Latest 2025
Plex Media Server 1.28.2.6151 With Crac5 2022 Free .
hospital managemt ,san.dckldnklcdnkdnkdnjadnjdjn
UTEP毕业证学历认证,宾夕法尼亚克拉里恩大学毕业证未毕业
R-Studio Crack Free Download 2025 Latest
E-Commerce Website Development Companyin india
Matchmaking for JVMs: How to Pick the Perfect GC Partner
AI Guide for Business Growth - Arna Softech
Guide to Food Delivery App Development.pdf
ROI Analysis for Newspaper Industry with Odoo ERP

HKG15-311: OP-TEE for Beginners and Porting Review

  • 1. Presented by Date HKG15-311:OP-TEE Basics and Porting Review Victor Chong 2015-2-9
  • 2. Objectives ● Security Building Blocks ● Secure Boot ● Introduction to Trusted Applications ● OP-TEE Porting
  • 3. OP-TEE ● Open-source Portable TEE ● Sponsored by ST ● GlobalPlatform (GP) compatible ● Compatible with ARM-TF ● Complete system
  • 4. Security Building Blocks ● TrustZone-enabled chipset (Hardware) ● ARM Trusted Firmware aka ARM-TF (Firmware) ● Boot Services ● Run-time Services ● OP-TEE (OS) ● Client library (libteec.so) ● Driver (optee.ko) ● Trusted OS ● Client Applications ● OP-TEE Clients (Normal World) ● Trusted Applications (Secure World)
  • 7. Secure Boot ● Prevent unauthorized executables from booting by verifying image signatures ● Divided into stages ● Start with trusted source (ROM boot code) @ stage/level 1 ● Root of Trust ● Every subsequent image (stage/level) to be loaded is verified first by the one before it ● Chain of Trust
  • 9. Introduction to Trusted Applications A Trusted Application typically consists of two parts ● Linux user space, client implementation ● Secure world Trusted Application (TA)
  • 10. Introduction to Trusted Applications
  • 11. Introduction to Trusted Applications Typical normal world program flow based on GP Client API ● TEEC_InitializeContext ● Connect to the OP-TEE Linux driver ● TEEC_OpenSession ● Loads the TA ● TEEC_InvokeCommand ● Control TA functions ● TEEC_CloseSession ● TEEC_FinalizeContext
  • 12. Hello World Example root@host:/ hello_world TEEC_InitializeContext TEEC_OpenSession TEEC_InvokeCommand(TA_HELLO_WORLD_CMD_INCVALUE) TEEC_InvokeCommand(TA_HELLO_WORLD_CMD_INCVALUE) ==> 100+1 = 101 TEEC_InvokeCommand(TA_HELLO_WORLD_CMD_PRINT_HELLO_WORLD) TEEC_InvokeCommand(TA_HELLO_WORLD_CMD_PRINT_HELLO_WORLD) done … TEEC_CloseSession TEEC_FinalizeContex
  • 13. Introduction to Trusted Applications ● GP Client API ● Not too flexible ● Somewhat limited in functionality ● GP Functional API forthcoming ● High level APIs, e.g. encrypt/decrypt ● Secure side TAs not required
  • 14. Introduction to Trusted Applications ● Details http://www.slideshare.net/linaroorg/lcu14103-how-to-create-and-run-trusted- applications-on-optee ● Hello world example available at http://github.com/jenswi-linaro/lcu14_optee_hello_world ● GlobalPlatform http://www.globalplatform.org/
  • 15. OP-TEE Porting Prerequisites ● ARM-TF ported for ARMv8 https://github.com/ARM-software/arm-trusted-firmware/blob/master/docs/porting-guide.md References ● Detailed design document https://github.com/OP-TEE/optee_os/blob/master/documentation/optee_design.md
  • 16. OP-TEE Trusted OS Linux Android OP-TEE Porting - Main Blocks TEE Driver TEE Client Client Application Client Application TEE Core TEE functions (crypto/mm) TEE Internal API Trusted Application Trusted Application TrustZone based chipset crypto timer efuse HAL TEE Client API SMC porting
  • 17. OP-TEE Porting - Affected Gits ● OP-TEE Trusted OS (optee_os) - Add new platform support (plat-<myplat>) ● OP-TEE Linux kernel driver (optee_linuxdriver) - No changes needed. - Built as module (optee.ko) by default and included in rootfs. ● OP-TEE Normal World user space (optee_client) - No changes needed. - Built as library (libteec.so) and included in rootfs.
  • 18. OP-TEE Porting - Getting started ● Get OP-TEE source code http://github.com/OP-TEE ● Get the toolchain http://releases.linaro.org/14.09/components/toolchain/binaries/gcc-linaro-arm- linux-gnueabihf-4.9-2014.09_linux.tar.xz
  • 19. OP-TEE Porting - How to build ● Add toolchain path export PATH=$PATH:path-to-toolchain-bin ● Define CROSS_PREFIX macro export CROSS_PREFIX=arm-linux-gnueabihf ● Choose target platform export PLATFORM=<myplat> (e.g. vexpress) ● Choose target flavor export PLATFORM_FLAVOR=<myflav> (e.g. juno) ● Build OP-TEE make (produces tee.bin)
  • 20. OP-TEE Porting - Partition Map BL2/BL3-1/BL3-2 fip.bin (includes bl2.bin, bl31.bin, tee.bin, u-boot.bin/uefi) BL1 bl1.bin kernel Image rootfs Example partition map based on Allwinner A80 board
  • 21. ● Clone from an existing platform E.g. core/arch/arm32/plat-vexpress → core/arch/arm32/plat-<myplat> OP-TEE Porting - Creating a New Platform ├── conf.mk ├── link.mk ├── sub.mk ├── .. ├── core_bootcfg.c └── platform_config.h ├── conf.mk ├── link.mk ├── sub.mk ├── .. ├── core_bootcfg.c └── platform_config.h
  • 22. OP-TEE Porting - Compiler & Linker options ● Compiler options: conf.mk ● Linker options: link.mk CROSS_PREFIX ?= arm-linux-gnueabihf CROSS_COMPILE ?= $(CROSS_PREFIX)- PLATFORM_FLAVOR ?= <myflav> platform-cpuarch = cortex-a57 #default is cortex-a15 platform-cflags += .. link-out-dir = $(out-dir)/core/ link-script = $(platform-dir)/kern.ld.S link-ldflags = $(LDFLAGS)
  • 23. OP-TEE Porting - Platform Configurations ● Platform-specific definitions: platform_config.h #define STACK_TMP_SIZE 1024 #define STACK_ABT_SIZE 1024 #define STACK_THREAD_SIZE 8192 .. #define DRAM0_BASE 0x80000000 #define DRAM0_SIZE 0x7F000000 /* Location of trusted dram */ #define TZDRAM_BASE 0xFF000000 #define TZDRAM_SIZE 0x00E00000 .. #define CFG_TEE_CORE_NB_CORE 6 .. #define TEE_RAM_START (TZDRAM_BASE) #define TEE_RAM_SIZE 0x0010000 #define CFG_SHMEM_START (DRAM0_BASE + DRAM0_SIZE - CFG_SHMEM_SIZE) #define CFG_SHMEM_SIZE 0x100000
  • 24. OP-TEE Porting - Platform Configurations ● platform_config.h also includes definitions for ● GIC base ● UART
  • 25. OP-TEE Porting - Adding Source Files ● Source files list: sub.mk srcs-y += file1.c srcs-y += file2.c … subdirs-y += dir1 subdirs-y += dir2
  • 26. OP-TEE Porting - Memory Map
  • 27. OP-TEE Porting - Memory Configuration ● plat-<myplat>/ core_bootcfg.c static struct map_area bootcfg_memory_map[] = { { /* teecore execution RAM */ .type = MEM_AREA_TEE_RAM, .pa = CFG_TEE_RAM_START, .size = CFG_TEE_RAM_SIZE, .cached = true, .secure = true, .rw = true, .exec = true, }, { /* teecore TA load/exec RAM - Secure, exec user only! */ .type = MEM_AREA_TA_RAM, .pa = CFG_TA_RAM_START, .size = CFG_TA_RAM_SIZE, .cached = true, .secure = true, .rw = true, .exec = false, }, { /* teecore public RAM - NonSecure, non-exec. */ .type = MEM_AREA_NSEC_SHM, .pa = CFG_PUB_RAM_START, .size = SECTION_SIZE, .cached = true, .secure = false, .rw = true, .exec = false, }, { /* Add platform IO devices like UART, GIC, etc. */ .type = MEM_AREA_IO_SEC, .pa = (GIC_BASE + GICD_OFFSET) & ~SECTION_MASK, .size = SECTION_SIZE, .device = true, .secure = true, .rw = true, }, {.type = MEM_AREA_NOTYPE} };
  • 28. OP-TEE Porting - Platform Initialization (_start) (kern.ld.S) 1. _start (entry.S) a. CPU basic init (v7 only) b. Cache/MMU init c. BSS init (v7 only) d. Jump to main_init 2. main_init (main.c) a. Init UART, canaries, GIC b. Clear BSS (v8 only) c. Init monitor (v7 only) d. Init thread stacks e. Register handlers (stdcall/fiq/svc/abort) f. Init core g. Return to non-secure entry
  • 29. OP-TEE Porting - Running and Debug (_start) (kern.ld.S) 4. sm_smc_entry (v7 only) (sm_asm.S) a. Save caller world context b. Restore world context c. Update SCR bits (NS/FIQ) 5. Thread handle (thread_asm.S, thread.c) a. Check if fiq handle request b. Thread allocate c. Thread context restore 6. main_tee_entry (main.c) 7. tee_entry (entry.c)
  • 30. OP-TEE Porting - Test/Verify ● Build normal world program and corresponding TA ● Copy both to rootfs ● Run normal world program ● Details http://www.slideshare.net/linaroorg/lcu14103-how-to-create-and-run- trusted-applications-on-optee ● Hello world example available at http://github.com/jenswi-linaro/lcu14_optee_hello_world
  • 31. OP-TEE Porting - Sample Test Log root@Vexpress:/ modprobe optee misc teetz: no TZ l2cc mutex service supported misc teetz: outer cache shared mutex disabled root@Vexpress:/ tee-supplicant& root@Vexpress:/ hello_world Invoking TA to increment 42 TA incremented value to 43 root@Vexpress:/
  • 32. OP-TEE Porting - Initial Task Checklist - [ ] Port ARM-TF with U-Boot/UEFI (as bl33.bin) but without optee_os (bl32.bin) - [ ] Make platform-specific changes to optee_os - [ ] Add new platform - [ ] conf.mk, link.mk, platform_config.h, core_bootcfg.c - [ ] Add new source files (if required) - [ ] Platform initialization (if required) - [ ] Thread handlers (if required) - [ ] Build optee_os - [ ] Rebuild ARM-TF with U-Boot/UEFI as bl33.bin and optee_os as bl32.bin - [ ] Build other required system components (kernel, rootfs, etc.) - [ ] Test/Verify
  • 33. OP-TEE documentation ● OP-TEE OS Documents https://github.com/OP-TEE/optee_os/tree/master/documentation ● OP-TEE Wiki FAQ https://wiki.linaro.org/WorkingGroups/Security/OP-TEE