README on how boot images are created for secure TI devices 
 | 
  
 | 
CONFIG_TI_SECURE_DEVICE: 
 | 
Secure TI devices require a boot image that is authenticated by ROM 
 | 
code to function. Without this, even JTAG remains locked and the 
 | 
device is essentially useless. In order to create a valid boot image for 
 | 
a secure device from TI, the initial public software image must be signed 
 | 
and combined with various headers, certificates, and other binary images. 
 | 
  
 | 
Information on the details on the complete boot image format can be obtained 
 | 
from Texas Instruments. The tools used to generate boot images for secure 
 | 
devices are part of a secure development package (SECDEV) that can be 
 | 
downloaded from: 
 | 
  
 | 
    http://www.ti.com/mysecuresoftware (login required) 
 | 
  
 | 
The secure development package is access controlled due to NDA and export 
 | 
control restrictions. Access must be requested and granted by TI before the 
 | 
package is viewable and downloadable. Contact TI, either online or by way 
 | 
of a local TI representative, to request access. 
 | 
  
 | 
Booting of U-Boot SPL 
 | 
===================== 
 | 
  
 | 
    When CONFIG_TI_SECURE_DEVICE is set, the U-Boot SPL build process 
 | 
    requires the presence and use of these tools in order to create a 
 | 
    viable boot image. The build process will look for the environment 
 | 
    variable TI_SECURE_DEV_PKG, which should be the path of the installed 
 | 
    SECDEV package. If the TI_SECURE_DEV_PKG variable is not defined or 
 | 
    if it is defined but doesn't point to a valid SECDEV package, a 
 | 
    warning is issued during the build to indicate that a final secure 
 | 
    bootable image was not created. 
 | 
  
 | 
    Within the SECDEV package exists an image creation script: 
 | 
  
 | 
    ${TI_SECURE_DEV_PKG}/scripts/create-boot-image.sh 
 | 
  
 | 
    This is called as part of the SPL/u-boot build process. As the secure 
 | 
    boot image formats and requirements differ between secure SOC from TI, 
 | 
    the purpose of this script is to abstract these details as much as 
 | 
    possible. 
 | 
  
 | 
    The script is basically the only required interface to the TI SECDEV 
 | 
    package for creating a bootable SPL image for secure TI devices. 
 | 
  
 | 
    Invoking the script for AM33xx Secure Devices 
 | 
    ============================================= 
 | 
  
 | 
    create-boot-image.sh \ 
 | 
        <IMAGE_FLAG> <INPUT_FILE> <OUTPUT_FILE> <SPL_LOAD_ADDR> 
 | 
  
 | 
    <IMAGE_FLAG> is a value that specifies the type of the image to 
 | 
    generate OR the action the image generation tool will take. Valid 
 | 
    values are: 
 | 
        SPI_X-LOADER - Generates an image for SPI flash (byte swapped) 
 | 
        X-LOADER - Generates an image for non-XIP flash 
 | 
        MLO - Generates an image for SD/MMC/eMMC media 
 | 
        2ND - Generates an image for USB, UART and Ethernet 
 | 
        XIP_X-LOADER - Generates a single stage u-boot for NOR/QSPI XiP 
 | 
  
 | 
    <INPUT_FILE> is the full path and filename of the public world boot 
 | 
    loaderbinary file (depending on the boot media, this is usually 
 | 
    either u-boot-spl.bin or u-boot.bin). 
 | 
  
 | 
    <OUTPUT_FILE> is the full path and filename of the final secure 
 | 
    image. The output binary images should be used in place of the standard 
 | 
    non-secure binary images (see the platform-specific user's guides and 
 | 
    releases notes for how the non-secure images are typically used) 
 | 
    u-boot-spl_HS_SPI_X-LOADER - byte swapped boot image for SPI flash 
 | 
    u-boot-spl_HS_X-LOADER - boot image for NAND or SD/MMC/eMMC rawmode 
 | 
    u-boot-spl_HS_MLO - boot image for SD/MMC/eMMC media 
 | 
    u-boot-spl_HS_2ND - boot image for USB, UART and Ethernet 
 | 
    u-boot_HS_XIP_X-LOADER - boot image for NOR or QSPI Xip flash 
 | 
  
 | 
    <SPL_LOAD_ADDR> is the address at which SOC ROM should load the 
 | 
    <INPUT_FILE> 
 | 
  
 | 
    Invoking the script for AM43xx Secure Devices 
 | 
    ============================================= 
 | 
  
 | 
    create-boot-image.sh \ 
 | 
        <IMAGE_FLAG> <INPUT_FILE> <OUTPUT_FILE> <SPL_LOAD_ADDR> 
 | 
  
 | 
    <IMAGE_FLAG> is a value that specifies the type of the image to 
 | 
    generate OR the action the image generation tool will take. Valid 
 | 
    values are: 
 | 
        SPI_X-LOADER - Generates an image for SPI flash (byte 
 | 
            swapped) 
 | 
        XIP_X-LOADER - Generates a single stage u-boot for 
 | 
            NOR/QSPI XiP 
 | 
        ISSW - Generates an image for all other boot modes 
 | 
  
 | 
    <INPUT_FILE> is the full path and filename of the public world boot 
 | 
    loaderbinary file (depending on the boot media, this is usually 
 | 
    either u-boot-spl.bin or u-boot.bin). 
 | 
  
 | 
    <OUTPUT_FILE> is the full path and filename of the final secure 
 | 
    image. The output binary images should be used in place of the standard 
 | 
    non-secure binary images (see the platform-specific user's guides and 
 | 
    releases notes for how the non-secure images are typically used) 
 | 
    u-boot-spl_HS_SPI_X-LOADER - byte swapped boot image for SPI flash 
 | 
    u-boot_HS_XIP_X-LOADER - boot image for NOR or QSPI flash 
 | 
    u-boot-spl_HS_ISSW - boot image for all other boot media 
 | 
  
 | 
    <SPL_LOAD_ADDR> is the address at which SOC ROM should load the 
 | 
    <INPUT_FILE> 
 | 
  
 | 
    Invoking the script for DRA7xx/AM57xx Secure Devices 
 | 
    ==================================================== 
 | 
  
 | 
    create-boot-image.sh <IMAGE_TYPE> <INPUT_FILE> <OUTPUT_FILE> 
 | 
  
 | 
    <IMAGE_TYPE> is a value that specifies the type of the image to 
 | 
    generate OR the action the image generation tool will take. Valid 
 | 
    values are: 
 | 
        X-LOADER - Generates an image for NOR or QSPI boot modes 
 | 
        MLO - Generates an image for SD/MMC/eMMC boot modes 
 | 
        ULO - Generates an image for USB/UART peripheral boot modes 
 | 
        Note: ULO is not yet used by the u-boot build process 
 | 
  
 | 
    <INPUT_FILE> is the full path and filename of the public world boot 
 | 
    loader binary file (for this platform, this is always u-boot-spl.bin). 
 | 
  
 | 
    <OUTPUT_FILE> is the full path and filename of the final secure image. 
 | 
    The output binary images should be used in place of the standard 
 | 
    non-secure binary images (see the platform-specific user's guides 
 | 
    and releases notes for how the non-secure images are typically used) 
 | 
    u-boot-spl_HS_MLO - boot image for SD/MMC/eMMC. This image is 
 | 
        copied to a file named MLO, which is the name that 
 | 
        the device ROM bootloader requires for loading from 
 | 
        the FAT partition of an SD card (same as on 
 | 
        non-secure devices) 
 | 
    u-boot-spl_HS_X-LOADER - boot image for all other flash memories 
 | 
        including QSPI and NOR flash 
 | 
  
 | 
    Invoking the script for Keystone2 Secure Devices 
 | 
    ============================================= 
 | 
  
 | 
    create-boot-image.sh \ 
 | 
        <UNUSED> <INPUT_FILE> <OUTPUT_FILE> <UNUSED> 
 | 
  
 | 
    <UNUSED> is currently ignored and reserved for future use. 
 | 
  
 | 
    <INPUT_FILE> is the full path and filename of the public world boot 
 | 
    loader binary file (only u-boot.bin is currently supported on 
 | 
    Keystone2 devices, u-boot-spl.bin is not currently supported). 
 | 
  
 | 
    <OUTPUT_FILE> is the full path and filename of the final secure image. 
 | 
    The output binary images should be used in place of the standard 
 | 
    non-secure binary images (see the platform-specific user's guides 
 | 
    and releases notes for how the non-secure images are typically used) 
 | 
    u-boot_HS_MLO - signed and encrypted boot image that can be used to 
 | 
        boot from all media. Secure boot from SPI NOR flash is not 
 | 
        currently supported. 
 | 
  
 | 
Booting of Primary U-Boot (u-boot.img) 
 | 
====================================== 
 | 
  
 | 
    The SPL image is responsible for loading the next stage boot loader, 
 | 
    which is the main u-boot image. For secure TI devices, the SPL will 
 | 
    be authenticated, as described above, as part of the particular 
 | 
    device's ROM boot process. In order to continue the secure boot 
 | 
    process, the authenticated SPL must authenticate the main u-boot 
 | 
    image that it loads. 
 | 
  
 | 
    The configurations for secure TI platforms are written to make the boot 
 | 
    process use the FIT image format for the u-boot.img (CONFIG_SPL_FRAMEWORK 
 | 
    and CONFIG_SPL_LOAD_FIT). With these configurations the binary 
 | 
    components that the SPL loads include a specific DTB image and u-boot 
 | 
    image. These DTB image may be one of many available to the boot 
 | 
    process. In order to secure these components so that they can be 
 | 
    authenticated by the SPL as they are loaded from the FIT image,    the 
 | 
    build procedure for secure TI devices will secure these images before 
 | 
    they are integrated into the FIT image. When those images are extracted 
 | 
    from the FIT image at boot time, they are post-processed to verify that 
 | 
    they are still secure. The outlined security-related SPL post-processing 
 | 
    is enabled through the CONFIG_SPL_FIT_IMAGE_POST_PROCESS option which 
 | 
    must be enabled for the secure boot scheme to work. In order to allow 
 | 
    verifying proper operation of the secure boot chain in case of successful 
 | 
    authentication messages like "Authentication passed: CERT_U-BOOT-NOD" are 
 | 
    output by the SPL to the console for each blob that got extracted from the 
 | 
    FIT image. Note that the last part of this log message is the (truncated) 
 | 
    name of the signing certificate embedded into the blob that got processed. 
 | 
  
 | 
    The exact details of the how the images are secured is handled by the 
 | 
    SECDEV package. Within the SECDEV package exists a script to process 
 | 
    an input binary image: 
 | 
  
 | 
    ${TI_SECURE_DEV_PKG}/scripts/secure-binary-image.sh 
 | 
  
 | 
    This is called as part of the u-boot build process. As the secure 
 | 
    image formats and requirements can differ between the various secure 
 | 
    SOCs from TI, this script in the SECDEV package abstracts these 
 | 
    details. This script is essentially the only required interface to the 
 | 
    TI SECDEV package for creating a u-boot.img image for secure TI 
 | 
    devices. 
 | 
  
 | 
    The SPL/u-boot code contains calls to dedicated secure ROM functions 
 | 
    to perform the validation on the secured images. The details of the 
 | 
    interface to those functions is shown in the code. The summary 
 | 
    is that they are accessed by invoking an ARM secure monitor call to 
 | 
    the device's secure ROM (fixed read-only-memory that is secure and 
 | 
    only accessible when the ARM core is operating in the secure mode). 
 | 
  
 | 
    Invoking the secure-binary-image script for Secure Devices 
 | 
    ========================================================== 
 | 
  
 | 
    secure-binary-image.sh <INPUT_FILE> <OUTPUT_FILE> 
 | 
  
 | 
    <INPUT_FILE> is the full path and filename of the input binary image 
 | 
  
 | 
    <OUTPUT_FILE> is the full path and filename of the output secure image. 
 |