| .. _faq: |
| |
| ########################## |
| Frequently Asked Questions |
| ########################## |
| |
| .. contents:: Table of Contents |
| |
| ---- |
| |
| Abbreviations |
| ************* |
| :OP-TEE: Open Portable TEE |
| :TA: Trusted Application |
| :TEE: Trusted Execution Environment |
| :TZASC: TrustZone Address Space Controller |
| :TZPC: TrustZone Protection Controller |
| |
| ---- |
| |
| Architecture |
| ************ |
| Q: Which platforms/architectures are supported? |
| =============================================== |
| - The :ref:`platforms_supported` page lists all platforms and architectures |
| currently supported in the official tree. |
| |
| Q: Are 32-bit as well as 64-bit support? |
| ======================================== |
| - Both 32- and 64-bit are fully supported for all OP-TEE components. |
| |
| Q: Does OP-TEE support mixed-mode, i.e., both AArch32 and AArch64 Trusted Applications on top of an AArch64 core? |
| ================================================================================================================= |
| - Yes! |
| |
| Q: What’s the maximum size for heap and stack? Can it be changed? |
| ================================================================= |
| - Yes, it can be changed. In the current setup (for vexpress for example), |
| there are ``32MB DDR`` dedicated for OP-TEE. ``1MB`` for ``TEE RAM`` and |
| ``1MB`` for ``PUB RAM``, this leaves ``30MB`` for Trusted Applications. In |
| the Trusted Applications, you set ``TA_STACK_SIZE`` and ``TA_DATA_SIZE``. |
| Typically, we set stack to ``2KB`` and data to ``32K``. But you are free |
| to adjust those according to the amount of memory you have available. If |
| you need them to be bigger than ``1MB`` then you also must adjust TA’s MMU |
| L1 table accordingly, since default section mapping is 1MB. |
| |
| Q: What is the size of OP-TEE itself? |
| ===================================== |
| - As of 2016.01, optee_os is about ``244KB`` (release build). It is |
| preferred to run :ref:`optee_os` entierly in SRAM, but if there is not |
| enough room, DRAM can be used and protected with TZASC. We are also |
| looking into the possibility of creating a ‘minimal’ OP-TEE, i.e. a |
| limited OP-TEE usable even in a very memory constrained environment, by |
| eliminating as many memory-hungry parts as possible. There is however no |
| ETA for this at the moment. |
| |
| - You can check the memory usage by using the ``make mem_usage`` target in |
| :ref:`optee_os`, for example: |
| |
| .. code-block:: bash |
| |
| $ make ... mem_usage |
| # Which will output a file with the figures here: |
| # out/arm/core/tee.mem_usage |
| |
| You will of course get different sizes depending on what compile time |
| flags you have enabled when running `make mem_usage`. |
| |
| Q: Can NEON optimizations be done in OP-TEE? |
| ============================================ |
| - Yes (for additional information, please also see `Issue#953`_) |
| |
| Q: Can I use C++ libraries in OP-TEE? |
| ===================================== |
| - C++ libraries are currently not supported. Technically, it is possible but |
| will require a fair amount of work to implement, especially more so if |
| exceptions are required. There are currently no plans to do this. |
| |
| - See `Issue#2628`_ for related information. |
| |
| Q: Would using `malloc()` in OP-TEE give physically contiguous memory? |
| ====================================================================== |
| - ``malloc()`` in OP-TEE currently gives physically contiguous memory. It is |
| not guaranteed as it is not mentioned anywhere in the documentation, but |
| in practice the heap only has physically contiguous memory in the pool(s). |
| The heap in OP-TEE is normally quite small, ~24KiB, and could be a bit |
| fragmented. |
| |
| Q: Can I limit what CPUs / cores OP-TEE runs on? |
| ================================================ |
| - Currently it’s up to the kernel to decide which core it runs on, i.e, it |
| will be the same core as the one initiating the SMC in Linux. Please also |
| see `Issue#1194`_. |
| |
| Q: How is OP-TEE being scheduled? |
| ================================= |
| - OP-TEE does not have its own scheduler, instead it is being scheduled by |
| Linux kernel. For more information, please see `Issue#1036` and |
| `Issue#1183`_. |
| |
| ---- |
| |
| Board support |
| ************* |
| Q: How do I port OP-TEE to another platform? |
| ============================================ |
| - Start by reading the :ref:`porting_guidelines`. |
| |
| - See the :ref:`presentations` page. There might be some interesting |
| information in the "LCU14-302 How To Port OP-TEE To Another Platform" deck |
| and video. Beware that the presentation is more than five years old, so |
| even though it is a good source, there might be parts that are not |
| relevant any longer. |
| |
| - As a good example for |
| |
| - **Armv8-A** patch enabling OP-TEE support on a new device, please see |
| the `ZynqMP port`_ that enabled support for running OP-TEE on `Xilinx |
| UltraScale+ Zynq MPSoC`. Besides that there are similar patches for |
| `Juno port`_, `Raspberry Pi3 port`_, `HiKey port`_. |
| |
| - **ARMv7-A**, please have a look at the `Freescale ls1021a port`_, |
| another example would be the `TI DRA7xx port`_. |
| |
| ---- |
| |
| Building |
| ******** |
| Q: I got build errors running latest, why? |
| ========================================== |
| - What did you try to build? Only :ref:`optee_os`? A full OP-TEE developer |
| setup using QEMU, HiKey, RPi3, Juno using repo? AOSP? OpenEmbedded? What |
| we build on daily basis are the OP-TEE developer setups (see |
| :ref:`optee_developer_setup`) , but other builds like AOSP and |
| OpenEmbedded are builds that we try from time to time, but we have no |
| CI/regression testing configured for those builds. |
| |
| - By running latest instead of stable also comes with a risk of getting |
| build errors due to version and/or interdependency skew which can result |
| in build error. Now, such issues most often affects running xtest and not |
| the building. If you however clean all gits and do a ``repo sync -d``. Then |
| we're almost 100% sure you will get back to a working state again, since |
| as mentioned in next bullet, we build (and run xtest) on all QEMU on all |
| patches sent to OP-TEE. |
| |
| - Every pull request in OP-TEE are tested on hardware (see |
| :ref:`how_are_you_testing_optee`). |
| |
| Q: I got build errors running stable tag x.y.z, why? |
| ==================================================== |
| - Stable releases are quite well tested both in terms of building for all |
| supported platforms and running xtest on all platforms, so if you cannot |
| get that to build and run, then there is a great chance you have something |
| wrong on your side. All platforms that has been tested on a stable release |
| can be found in `CHANGELOG.md`_ file. Having that said, we do make mistakes |
| on stable builds also from time to time. |
| |
| Q: I get `gcc XYZ` or `g++ XYZ` compiler error messages? |
| ======================================================== |
| - Most likely you're trying to build OP-TEE using the regular x86 compiler |
| and not the using the Arm toolchain. Please install the |
| :ref:`prerequisites` and make sure you have gotten and installed the Arm |
| toolchains as described at the :ref:`toolchains` page. (for additional |
| information, please see `Issue#846`_). |
| |
| Q: I found this build.git, what is that? |
| ======================================== |
| - :ref:`build` is a git that is used in conjunction with the |
| :ref:`manifest` to create full OP-TEE developer builds. It contains |
| helper makefiles that makes it easy to get OP-TEE up and running on the |
| setups that are using repo. |
| |
| Q: When running `make` from build.git it fails to download the toolchains? |
| ========================================================================== |
| - We try to stay somewhat up to date with running recent ``GCC`` versions. But |
| just like everywhere else on the net things moves around. In some cases like |
| `Issue#1195`_, the URL was changed without us noticing it. If you find and fix |
| such an issue, please send the fix as pull request and we will be happy to |
| merge it. |
| |
| .. _faq_try_optee: |
| |
| Q: What is the quickest and easiest way to try OP-TEE? |
| ====================================================== |
| - That would be running it on QEMU on a local PC. To do that you would need to: |
| |
| - Install the OP-TEE :ref:`prerequisites`. |
| - Build for QEMU according to the instructions at :ref:`qemu_v7`. |
| - And :ref:`optee_test_run_xtest`. |
| |
| - By summarizing the above, you would need to: |
| .. code-block:: bash |
| |
| $ sudo apt-get install [pre-reqs] |
| $ mkdir optee-qemu && cd optee-qemu |
| $ repo init -u https://github.com/OP-TEE/manifest.git |
| $ repo sync |
| $ cd build |
| $ make toolchains -j2 |
| $ make run |
| QEMU console: (qemu) c |
| Normal world shell: # xtest |
| |
| ---- |
| |
| Certification and security reviews |
| ********************************** |
| Q: Will TrustedFirmware.org be involved in GlobalPlatform certification/qualification? |
| ====================================================================================== |
| - No, not as of now. Most often certification is performed using a certain |
| software version and on a unique device. I.e., it is the combination |
| software + hardware that gets certified. This is typically something that |
| the SoC or OEM needs to do on their own. |
| |
| - But it is worth mentioning that since OP-TEE is coming from a proprietary |
| TEE solution that was GlobalPlatform certified on some products in the |
| past and we regularly have people from some member companies running the |
| extended test suite from GlobalPlatform we know that the gap to become |
| GlobalPlatform certified/qualified isn’t that big. |
| |
| .. _q_has_any_test_lab_been_testing_op-tee: |
| |
| Q: Has any test lab been testing OP-TEE? |
| ======================================== |
| - `Applus Laboratories`_ have done some side-channel attack testing and |
| fault injection testing on OP-TEE using the :ref:`hikey` device. Their |
| findings and fixes can be found at the `Security Advisories`_ page at |
| optee.org. |
| |
| - Riscure_ did a mini-audit of OP-TEE which generated a couple of patches |
| (see `PR#2745`). The `Security Advisories`_ page at optee.org will be |
| updated with more information regarding that in the future. |
| |
| |
| Q: Have there been any code audit / code review done? |
| ===================================================== |
| - Full audit? No! But in the past Linaro have been collaborating with |
| Riscure trying to identify and fix potential security issues. There has |
| also been some companies that have done audits internally and they have |
| then shared the result with us and where relevant, we have created patches |
| resolving the issues reported to us (see |
| :ref:`q_has_any_test_lab_been_testing_op-tee`). |
| |
| - Code review, yes! Every single patch going into OP-TEE has been reviewed |
| in a pull request on GitHub. We more or less have a requirement that every |
| patch going into OP-TEE shall at least have one "Reviewed-by" tag in the |
| patch. |
| |
| - Third party / test lab code review, no! Again some companies have reviewed |
| internally and shared the result with us, but other than that no (see |
| related :ref:`q_has_any_test_lab_been_testing_op-tee`) |
| |
| |
| Contribution |
| ************ |
| Q: How do I contribute? |
| ======================= |
| - Please see the :ref:`contribute` page. |
| |
| Q: Where can I get help? |
| ======================== |
| - Please see the :ref:`contact` page. |
| |
| Q: I'm new to OP-TEE but I would like to help out, what can I do? |
| ================================================================= |
| - We always need help with code reviews, feel free to review any of the open |
| `OP-TEE OS Pull Requests`_. Please also note that there could be open pull |
| request in the other :ref:`optee_gits` that needs reviews too. |
| |
| - We always need help answering all the questions asked at `OP-TEE OS |
| Issues`_. |
| |
| - If you want to try to solve a bug, please have a look at the `OP-TEE OS |
| Bugs`_ or the `OP-TEE OS Enhancements`_. |
| |
| - Documentation tends to become obsolete if not maintained on regular basis. |
| We try to do our best, but we're not perfect. Please have a look at |
| :ref:`optee_docs` and try to update where you find gaps. |
| |
| - Enable `repo` for the device in :ref:`manifest` and :ref:`build` (and also |
| :ref:`platforms_supported`) currently not using repo. |
| |
| - If you would like to implement a bigger feature, please reach out to us |
| (see :ref:`contact`) and we can discuss what is most relevant to look into |
| for the moment. If you already have an idea, feel free to send the |
| proposal to us. |
| |
| ---- |
| |
| Interfaces |
| ********** |
| Q: Which API’s have been implemented in OP-TEE? |
| =============================================== |
| - GlobalPlatform (see :ref:`globalplatform_api` for more details). |
| - GlobalPlatform's TEE Client API v1.1 specification |
| - GlobalPlatform's TEE Internal Core API v1.1 specification. |
| - GlobalPlatform's Secure Elements v1.0 (**now deprecated**, see ``git |
| log``). |
| - GlobalPlatform's Socket API v1.0 (TCP and UDP, but not TLS). |
| |
| - AOSP Keymaster_ (v3) and AOSP Gatekeeper_ (see :ref:`aosp` for more |
| details). |
| |
| - `Android Verified Boot 2.0`_ (AVB 2.0) |
| |
| ---- |
| |
| Hardware and peripherals |
| ************************ |
| Q: Can I use my own hardware IP for crypto acceleration? |
| ======================================================== |
| - Yes, OP-TEE has a Crypto Abstraction Layer (see |
| :ref:`cryptographic_implementation` that was designed mainly to make it |
| easy to add support for hardware crypto acceleration. There you will find |
| information about the abstraction layer itself and what you need to do to |
| be able to support new software/hardware “drivers” in OP-TEE. |
| |
| ---- |
| |
| License |
| ******* |
| Q: Under what license is OP-TEE released? |
| ========================================= |
| - The software is mostly provided under the `BSD 2-Clause`_ license. |
| |
| - The TEE kernel driver is released under GPLv2 for obvious reasons. |
| |
| - xtest (:ref:`optee_test`) uses BSD 2-Clause for code running in secure |
| world (Trusted Applications etc) and GPLv2 for code running in normal |
| world (client code). |
| |
| Q: GlobalPlatform click-through license |
| ======================================= |
| - Since OP-TEE is a GlobalPlatform based TEE which implements the APIs as |
| specified by GlobalPlatform one has to accept, the click-through license |
| which is presented when trying to download the :ref:`globalplatform_api` |
| specifications before start using OP-TEE. |
| |
| Q: I've modified OP-TEE by using code with non BSD 2-Clause license, will you accept it? |
| ======================================================================================== |
| - That is something we deal with case by case. But as a general answer, if |
| it does not contaminate the BSD 2-Clause license we will accept it. Reach |
| out to us (see :ref:`contact`) and we will take it from there. |
| |
| ---- |
| |
| Promotion |
| ********* |
| Q: I want to get my company logo on op-tee.org, how? |
| ==================================================== |
| - If your company has done significant contributions to OP-TEE, then please |
| :ref:`contact` us and we will do our best to include your company. Pay |
| attention to that we will review this on regular basis and inactive |
| supporting companies might be removed in the future again. |
| |
| ---- |
| |
| Security vulnerabilities |
| ************************ |
| Q: I have a found a security flaw in OP-TEE, how can I disclose it with you? |
| ============================================================================ |
| - Please see the :ref:`Contact` page. |
| |
| ---- |
| |
| Source code |
| *********** |
| Q: Where is the source code? |
| ============================ |
| - It is located on GitHub under the project `OP-TEE`_ and `linaro-swg`_. |
| |
| Q: Where do I download the test suite called xtest? |
| =================================================== |
| - All the source code for that can be found in the git called |
| :ref:`optee_test`. |
| |
| - The :ref:`globalplatform_tests` can be purchased separately. |
| |
| Q: Where is the Linux kernel TEE driver? |
| ======================================== |
| - You can find both the generic TEE framework including the OP-TEE driver |
| included in the official Linux kernel project since v4.12. Having that |
| said, we "buffer up" pending patches on a our :ref:`linux_kernel` branch. |
| I.e., that is where we keep new features being developed for OP-TEE. In |
| the long run we aim to completely stop using our own branch and just send |
| all patches to the official Linux kernel tree directly. But as of now we |
| cannot do that. |
| |
| ---- |
| |
| Testing |
| ******* |
| |
| .. _how_are_you_testing_optee: |
| |
| Q: How are you testing OP-TEE? |
| ============================== |
| - There is a test suite called xtest that tests the complete TEE-solution to |
| ensure that the communication between all architectural layers is working |
| as it should. The test suite also tests the majority of the GlobalPlatform |
| TEE Internal Core API. It has close to 50,000 and ever increasing test |
| cases, and is also extendable to include the official GlobalPlatform test |
| suite (see :ref:`globalplatform_tests`). |
| |
| - Every pull request in OP-TEE are built for a multitude of different platforms |
| automatically using Travis_, Shippable_ and IBART_. Please have a look |
| there to see whether it failed building on the platform you're using |
| before submitting any issue about build errors. |
| |
| - For more information see :ref:`optee_test`. |
| |
| ---- |
| |
| Trusted Applications |
| ******************** |
| Q: How do I write a Trusted Application (TA)? |
| ============================================= |
| - Have a look at the :ref:`build_trusted_applications` page as well as the |
| :ref:`optee_examples` page. Those provides guidelines and examples on how |
| to implement basic Trusted Applications. |
| |
| - If you want to see more advanced uses cases of Trusted Applications, then |
| we encourage that you have a look at the Trusted Applications |
| :ref:`optee_test`. |
| |
| Q: How do I link a library into a Trusted Application? |
| ====================================================== |
| - See the example in :ref:`build_trusted_applications_submk`. |
| |
| - Also see `Issue#280`_, `Issue#601`_, `Issue#901`_, `Issue#1003`_. |
| |
| Q: Where should I put my compiled Trusted Application on the device? |
| ==================================================================== |
| - ``/lib/optee_armtz``, that is the default location where tee-supplicant |
| will look for Trusted Applications. |
| |
| .. _what_is_a_pseudo_ta_and_how_do_i_write_one: |
| |
| Q: What is a Pseudo TA and how do I write one? |
| ============================================== |
| - A Pseudo TA is an OP-TEE firmware service offered through the generic API |
| used to invoke Trusted Applications. Pseudo TA interface and services all |
| runs in TEE kernel / core context. I.e., it will have access to the same |
| functions, memory and hardware etc as the TEE core itself. If we're |
| talking ARMv8-A it is running in ``S-EL1``. |
| |
| Q: Are Pseudo **user space** TAs supported? |
| =========================================== |
| - No! |
| |
| Q: Can a static TA Open/Invoke dynamic TA? |
| ========================================== |
| - Yes, for a longer discussion see `Issue#967`_, `Issue#1085`_, |
| `Issue#1132`_. |
| |
| Q: How can I extend the GlobalPlatform Internal Core API? |
| ========================================================= |
| - You may develop your own “Pseudo TA”, which is part of the core (see |
| :ref:`what_is_a_pseudo_ta_and_how_do_i_write_one` for more information |
| about the Pseudo TA). |
| |
| Q: How are Trusted Applications verified? |
| ========================================= |
| - Please see the section :ref:`core_pub_priv_keypair` in the |
| :ref:`porting_guidelines`. |
| |
| - Alternatively one can also build a Trusted Application and embed its raw |
| binary content into the OP-TEE firmware binary. At runtime, if invoked, |
| the Trusted Application will be loaded from the OP-TEE firmware image |
| instead of being fetched from the normal world and authenticated in the |
| secure world (see :ref:`early_ta` for more information). |
| |
| Q: Is multi-core TA supported? |
| ============================== |
| - Yes, you can have two or more TAs running simultaneously. Please see also |
| `Issue#1194`_. |
| |
| Q: Is multi-threading supported in a TA? |
| ======================================== |
| - No, there is no such concept as ``pthreads`` or similar. I.e, you cannot |
| spawn thread from a TA. If you need to run tasks in parallel, then you |
| should probably look into running two TAs or more simultaneously and then |
| let them communicate with each other using the ``TA2TA`` interface. |
| |
| Q: How can I use or call OP-TEE from native Android (apk) applications? |
| ======================================================================= |
| - Use the `Java Native Interface`_ (JNI). |
| - First get familiar with `sample_hellojni.html`_ and make sure you can run |
| the sample. After that, replace the C-side Implementation with for example |
| :ref:`hello_world` or one of the other examples in :ref:`optee_examples`. |
| |
| .. note:: |
| |
| Note that :ref:`hello_world` and other binaries in optee_examples are built |
| as executables, and have to be modified to be built as a .so shared library |
| instead so that it can be loaded by the Java-side Implementation. |
| |
| - Note that ``*.apk`` apps by default have no access to the TEE driver. See |
| `Issue#903`_ for details. The workaround is to disable SELinux before |
| launching any ``*.apk`` app that calls into OP-TEE. The solution is to |
| create/write SELinux domains/rules to allow any required access, but since |
| this is not a TEE-related issue, it is left as an exercise for the users. |
| |
| Q: I've heard that there is a Widevine and PlayReady TA, how do I get access? |
| ============================================================================= |
| - TrustedFirmware have no such implementation, but Linaro do have reference |
| implementations for that that they share with their members who have |
| signed the WMLA and NDA/MLA with Google and Microsoft. So the advice is to |
| reach out to Linaro if you have questions about that. |
| |
| .. _Issue#280: https://github.com/OP-TEE/optee_os/issues/280 |
| .. _Issue#601: https://github.com/OP-TEE/optee_os/issues/601 |
| .. _Issue#846: https://github.com/OP-TEE/optee_os/issues/846 |
| .. _Issue#901: https://github.com/OP-TEE/optee_os/issues/901 |
| .. _Issue#903: https://github.com/OP-TEE/optee_os/issues/903 |
| .. _Issue#953: https://github.com/OP-TEE/optee_os/issues/953 |
| .. _Issue#967: https://github.com/OP-TEE/optee_os/issues/967 |
| .. _Issue#1003: https://github.com/OP-TEE/optee_os/issues/1003 |
| .. _Issue#1036: https://github.com/OP-TEE/optee_os/issues/1036 |
| .. _Issue#1085: https://github.com/OP-TEE/optee_os/issues/1085 |
| .. _Issue#1132: https://github.com/OP-TEE/optee_os/issues/1132 |
| .. _Issue#1183: https://github.com/OP-TEE/optee_os/issues/1183 |
| .. _Issue#1194: https://github.com/OP-TEE/optee_os/issues/1194 |
| .. _Issue#1195: https://github.com/OP-TEE/optee_os/issues/1195 |
| .. _Issue#2628: https://github.com/OP-TEE/optee_os/issues/2628 |
| |
| .. _PR#2745: https://github.com/OP-TEE/optee_os/pull/2745 |
| |
| .. _Android Verified Boot 2.0: https://android.googlesource.com/platform/external/avb/+/master/README.md |
| .. _Applus Laboratories: http://www.appluslaboratories.com/en/ |
| .. _BSD 2-Clause: http://opensource.org/licenses/BSD-2-Clause |
| .. _CHANGELOG.md: https://github.com/OP-TEE/optee_os/blob/master/CHANGELOG.md |
| .. _Freescale ls1021a port: https://github.com/OP-TEE/optee_os/commit/85278139a8f914dddb36808861c86a472ecb0271 |
| .. _Gatekeeper: https://source.android.com/security/authentication/gatekeeper |
| .. _HiKey port: https://github.com/OP-TEE/optee_os/commit/d70e78c49fc9c63b2d37c596b7ad3cbd38f8e574 |
| .. _IBART: https://optee.mooo.com:5000 |
| .. _Java Native Interface: http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/jniTOC.html |
| .. _Juno port: https://github.com/OP-TEE/optee_os/commit/90e7497e0480892e2c262cec64e6c47242d4db7f |
| .. _Keymaster: https://source.android.com/security/keystore |
| .. _linaro-swg: https://github.com/linaro-swg |
| .. _OP-TEE: https://github.com/OP-TEE |
| .. _OP-TEE OS Bugs: https://github.com/OP-TEE/optee_os/labels/bug |
| .. _OP-TEE OS Enhancements: https://github.com/OP-TEE/optee_os/labels/enhancement |
| .. _OP-TEE OS Issues: https://github.com/OP-TEE/optee_os/issues |
| .. _OP-TEE OS Pull Requests: https://github.com/OP-TEE/optee_os/pulls |
| .. _Raspberry Pi3 port: https://github.com/OP-TEE/optee_os/commit/66d9cacf37e6bd4b0d86e7b32e4e5edefe8decfd |
| .. _Riscure: https://www.riscure.com |
| .. _sample_hellojni.html: https://developer.android.com/ndk/samples/sample_hellojni.html |
| .. _Security Advisories: https://www.op-tee.org/security-advisories/ |
| .. _Shippable: https://app.shippable.com/github/OP-TEE/optee_os/dashboard |
| .. _TI DRA7xx port: https://github.com/OP-TEE/optee_os/commit/9b5060cd92a19b4d114a1ce8a338b18424974037 |
| .. _Travis: https://travis-ci.org/OP-TEE |
| .. _ZynqMP port: https://github.com/OP-TEE/optee_os/commit/dc57f5a0e8f3b502fc958bc64a5ec0b0f46ef11a |