summaryrefslogtreecommitdiff
path: root/docs/auth-framework.md
diff options
context:
space:
mode:
Diffstat (limited to 'docs/auth-framework.md')
-rw-r--r--docs/auth-framework.md925
1 files changed, 0 insertions, 925 deletions
diff --git a/docs/auth-framework.md b/docs/auth-framework.md
deleted file mode 100644
index b416acfc..00000000
--- a/docs/auth-framework.md
+++ /dev/null
@@ -1,925 +0,0 @@
-Abstracting a Chain of Trust
-============================
-
-Contents :
-
-1. [Introduction](#1--introduction)
-2. [Framework design](#2--framework-design)
-3. [Specifying a Chain of Trust](#3--specifying-a-chain-of-trust)
-4. [Implementation example](#4--implementation-example)
-
-
-1. Introduction
-----------------
-
-The aim of this document is to describe the authentication framework implemented
-in the Trusted Firmware. This framework fulfills the following requirements:
-
-1. It should be possible for a platform port to specify the Chain of Trust in
- terms of certificate hierarchy and the mechanisms used to verify a
- particular image/certificate.
-
-2. The framework should distinguish between:
-
- - The mechanism used to encode and transport information, e.g. DER encoded
- X.509v3 certificates to ferry Subject Public Keys, hashes and non-volatile
- counters.
-
- - The mechanism used to verify the transported information i.e. the
- cryptographic libraries.
-
-The framework has been designed following a modular approach illustrated in the
-next diagram:
-
-```
- +---------------+---------------+------------+
- | Trusted | Trusted | Trusted |
- | Firmware | Firmware | Firmware |
- | Generic | IO Framework | Platform |
- | Code i.e. | (IO) | Port |
- | BL1/BL2 (GEN) | | (PP) |
- +---------------+---------------+------------+
- ^ ^ ^
- | | |
- v v v
- +-----------+ +-----------+ +-----------+
- | | | | | Image |
- | Crypto | | Auth | | Parser |
- | Module |<->| Module |<->| Module |
- | (CM) | | (AM) | | (IPM) |
- | | | | | |
- +-----------+ +-----------+ +-----------+
- ^ ^
- | |
- v v
- +----------------+ +-----------------+
- | Cryptographic | | Image Parser |
- | Libraries (CL) | | Libraries (IPL) |
- +----------------+ +-----------------+
- | |
- | |
- | |
- v v
- +-----------------+
- | Misc. Libs e.g. |
- | ASN.1 decoder |
- | |
- +-----------------+
-
- DIAGRAM 1.
-```
-
-This document describes the inner details of the authentication framework and
-the abstraction mechanisms available to specify a Chain of Trust.
-
-
-2. Framework design
---------------------
-
-This section describes some aspects of the framework design and the rationale
-behind them. These aspects are key to verify a Chain of Trust.
-
-### 2.1 Chain of Trust
-
-A CoT is basically a sequence of authentication images which usually starts with
-a root of trust and culminates in a single data image. The following diagram
-illustrates how this maps to a CoT for the BL31 image described in the
-TBBR-Client specification.
-
-```
- +------------------+ +-------------------+
- | ROTPK/ROTPK Hash |------>| Trusted Key |
- +------------------+ | Certificate |
- | (Auth Image) |
- /+-------------------+
- / |
- / |
- / |
- / |
- L v
- +------------------+ +-------------------+
- | Trusted World |------>| BL31 Key |
- | Public Key | | Certificate |
- +------------------+ | (Auth Image) |
- +-------------------+
- / |
- / |
- / |
- / |
- / v
- +------------------+ L +-------------------+
- | BL31 Content |------>| BL31 Content |
- | Certificate PK | | Certificate |
- +------------------+ | (Auth Image) |
- +-------------------+
- / |
- / |
- / |
- / |
- / v
- +------------------+ L +-------------------+
- | BL31 Hash |------>| BL31 Image |
- | | | (Data Image) |
- +------------------+ | |
- +-------------------+
-
- DIAGRAM 2.
-```
-
-The root of trust is usually a public key (ROTPK) that has been burnt in the
-platform and cannot be modified.
-
-### 2.2 Image types
-
-Images in a CoT are categorised as authentication and data images. An
-authentication image contains information to authenticate a data image or
-another authentication image. A data image is usually a boot loader binary, but
-it could be any other data that requires authentication.
-
-### 2.3 Component responsibilities
-
-For every image in a Chain of Trust, the following high level operations are
-performed to verify it:
-
-1. Allocate memory for the image either statically or at runtime.
-
-2. Identify the image and load it in the allocated memory.
-
-3. Check the integrity of the image as per its type.
-
-4. Authenticate the image as per the cryptographic algorithms used.
-
-5. If the image is an authentication image, extract the information that will
- be used to authenticate the next image in the CoT.
-
-In Diagram 1, each component is responsible for one or more of these operations.
-The responsibilities are briefly described below.
-
-
-#### 2.2.1 TF Generic code and IO framework (GEN/IO)
-
-These components are responsible for initiating the authentication process for a
-particular image in BL1 or BL2. For each BL image that requires authentication,
-the Generic code asks recursively the Authentication module what is the parent
-image until either an authenticated image or the ROT is reached. Then the
-Generic code calls the IO framewotk to load the image and calls the
-Authentication module to authenticate it, following the CoT from ROT to Image.
-
-
-#### 2.2.2 TF Platform Port (PP)
-
-The platform is responsible for:
-
-1. Specifying the CoT for each image that needs to be authenticated. Details of
- how a CoT can be specified by the platform are explained later. The platform
- also specifies the authentication methods and the parsing method used for
- each image.
-
-2. Statically allocating memory for each parameter in each image which is
- used for verifying the CoT, e.g. memory for public keys, hashes etc.
-
-3. Providing the ROTPK or a hash of it.
-
-4. Providing additional information to the IPM to enable it to identify and
- extract authentication parameters contained in an image, e.g. if the
- parameters are stored as X509v3 extensions, the corresponding OID must be
- provided.
-
-5. Fulfill any other memory requirements of the IPM and the CM (not currently
- described in this document).
-
-6. Export functions to verify an image which uses an authentication method that
- cannot be interpreted by the CM, e.g. if an image has to be verified using a
- NV counter, then the value of the counter to compare with can only be
- provided by the platform.
-
-7. Export a custom IPM if a proprietary image format is being used (described
- later).
-
-
-#### 2.2.3 Authentication Module (AM)
-
-It is responsible for:
-
-1. Providing the necessary abstraction mechanisms to describe a CoT. Amongst
- other things, the authentication and image parsing methods must be specified
- by the PP in the CoT.
-
-2. Verifying the CoT passed by GEN by utilising functionality exported by the
- PP, IPM and CM.
-
-3. Tracking which images have been verified. In case an image is a part of
- multiple CoTs then it should be verified only once e.g. the Trusted World
- Key Certificate in the TBBR-Client spec. contains information to verify
- SCP_BL2, BL31, BL32 each of which have a separate CoT. (This
- responsibility has not been described in this document but should be
- trivial to implement).
-
-4. Reusing memory meant for a data image to verify authentication images e.g.
- in the CoT described in Diagram 2, each certificate can be loaded and
- verified in the memory reserved by the platform for the BL31 image. By the
- time BL31 (the data image) is loaded, all information to authenticate it
- will have been extracted from the parent image i.e. BL31 content
- certificate. It is assumed that the size of an authentication image will
- never exceed the size of a data image. It should be possible to verify this
- at build time using asserts.
-
-
-#### 2.2.4 Cryptographic Module (CM)
-
-The CM is responsible for providing an API to:
-
-1. Verify a digital signature.
-2. Verify a hash.
-
-The CM does not include any cryptography related code, but it relies on an
-external library to perform the cryptographic operations. A Crypto-Library (CL)
-linking the CM and the external library must be implemented. The following
-functions must be provided by the CL:
-
-```
-void (*init)(void);
-int (*verify_signature)(void *data_ptr, unsigned int data_len,
- void *sig_ptr, unsigned int sig_len,
- void *sig_alg, unsigned int sig_alg_len,
- void *pk_ptr, unsigned int pk_len);
-int (*verify_hash)(void *data_ptr, unsigned int data_len,
- void *digest_info_ptr, unsigned int digest_info_len);
-```
-
-These functions are registered in the CM using the macro:
-```
-REGISTER_CRYPTO_LIB(_name, _init, _verify_signature, _verify_hash);
-```
-
-`_name` must be a string containing the name of the CL. This name is used for
-debugging purposes.
-
-#### 2.2.5 Image Parser Module (IPM)
-
-The IPM is responsible for:
-
-1. Checking the integrity of each image loaded by the IO framework.
-2. Extracting parameters used for authenticating an image based upon a
- description provided by the platform in the CoT descriptor.
-
-Images may have different formats (for example, authentication images could be
-x509v3 certificates, signed ELF files or any other platform specific format).
-The IPM allows to register an Image Parser Library (IPL) for every image format
-used in the CoT. This library must implement the specific methods to parse the
-image. The IPM obtains the image format from the CoT and calls the right IPL to
-check the image integrity and extract the authentication parameters.
-
-See Section "Describing the image parsing methods" for more details about the
-mechanism the IPM provides to define and register IPLs.
-
-
-### 2.3 Authentication methods
-
-The AM supports the following authentication methods:
-
-1. Hash
-2. Digital signature
-
-The platform may specify these methods in the CoT in case it decides to define
-a custom CoT instead of reusing a predefined one.
-
-If a data image uses multiple methods, then all the methods must be a part of
-the same CoT. The number and type of parameters are method specific. These
-parameters should be obtained from the parent image using the IPM.
-
-1. Hash
-
- Parameters:
-
- 1. A pointer to data to hash
- 2. Length of the data
- 4. A pointer to the hash
- 5. Length of the hash
-
- The hash will be represented by the DER encoding of the following ASN.1
- type:
-
- ```
- DigestInfo ::= SEQUENCE {
- digestAlgorithm DigestAlgorithmIdentifier,
- digest Digest
- }
- ```
-
- This ASN.1 structure makes it possible to remove any assumption about the
- type of hash algorithm used as this information accompanies the hash. This
- should allow the Cryptography Library (CL) to support multiple hash
- algorithm implementations.
-
-2. Digital Signature
-
- Parameters:
-
- 1. A pointer to data to sign
- 2. Length of the data
- 3. Public Key Algorithm
- 4. Public Key value
- 5. Digital Signature Algorithm
- 6. Digital Signature value
-
- The Public Key parameters will be represented by the DER encoding of the
- following ASN.1 type:
-
- ```
- SubjectPublicKeyInfo ::= SEQUENCE {
- algorithm AlgorithmIdentifier{PUBLIC-KEY,{PublicKeyAlgorithms}},
- subjectPublicKey BIT STRING }
- ```
-
- The Digital Signature Algorithm will be represented by the DER encoding of
- the following ASN.1 types.
-
- ```
- AlgorithmIdentifier {ALGORITHM:IOSet } ::= SEQUENCE {
- algorithm ALGORITHM.&id({IOSet}),
- parameters ALGORITHM.&Type({IOSet}{@algorithm}) OPTIONAL
- }
- ```
-
- The digital signature will be represented by:
- ```
- signature ::= BIT STRING
- ```
-
-The authentication framework will use the image descriptor to extract all the
-information related to authentication.
-
-
-3. Specifying a Chain of Trust
--------------------------------
-
-A CoT can be described as a set of image descriptors linked together in a
-particular order. The order dictates the sequence in which they must be
-verified. Each image has a set of properties which allow the AM to verify it.
-These properties are described below.
-
-The PP is responsible for defining a single or multiple CoTs for a data image.
-Unless otherwise specified, the data structures described in the following
-sections are populated by the PP statically.
-
-
-### 3.1 Describing the image parsing methods
-
-The parsing method refers to the format of a particular image. For example, an
-authentication image that represents a certificate could be in the X.509v3
-format. A data image that represents a boot loader stage could be in raw binary
-or ELF format. The IPM supports three parsing methods. An image has to use one
-of the three methods described below. An IPL is responsible for interpreting a
-single parsing method. There has to be one IPL for every method used by the
-platform.
-
-1. Raw format: This format is effectively a nop as an image using this method
- is treated as being in raw binary format e.g. boot loader images used by ARM
- TF. This method should only be used by data images.
-
-2. X509V3 method: This method uses industry standards like X.509 to represent
- PKI certificates (authentication images). It is expected that open source
- libraries will be available which can be used to parse an image represented
- by this method. Such libraries can be used to write the corresponding IPL
- e.g. the X.509 parsing library code in mbed TLS.
-
-3. Platform defined method: This method caters for platform specific
- proprietary standards to represent authentication or data images. For
- example, The signature of a data image could be appended to the data image
- raw binary. A header could be prepended to the combined blob to specify the
- extents of each component. The platform will have to implement the
- corresponding IPL to interpret such a format.
-
-The following enum can be used to define these three methods.
-
-```
-typedef enum img_type_enum {
- IMG_RAW, /* Binary image */
- IMG_PLAT, /* Platform specific format */
- IMG_CERT, /* X509v3 certificate */
- IMG_MAX_TYPES,
-} img_type_t;
-```
-
-An IPL must provide functions with the following prototypes:
-
-```
-void init(void);
-int check_integrity(void *img, unsigned int img_len);
-int get_auth_param(const auth_param_type_desc_t *type_desc,
- void *img, unsigned int img_len,
- void **param, unsigned int *param_len);
-```
-
-An IPL for each type must be registered using the following macro:
-
-```
-REGISTER_IMG_PARSER_LIB(_type, _name, _init, _check_int, _get_param)
-```
-
-* `_type`: one of the types described above.
-* `_name`: a string containing the IPL name for debugging purposes.
-* `_init`: initialization function pointer.
-* `_check_int`: check image integrity function pointer.
-* `_get_param`: extract authentication parameter funcion pointer.
-
-The `init()` function will be used to initialize the IPL.
-
-The `check_integrity()` function is passed a pointer to the memory where the
-image has been loaded by the IO framework and the image length. It should ensure
-that the image is in the format corresponding to the parsing method and has not
-been tampered with. For example, RFC-2459 describes a validation sequence for an
-X.509 certificate.
-
-The `get_auth_param()` function is passed a parameter descriptor containing
-information about the parameter (`type_desc` and `cookie`) to identify and
-extract the data corresponding to that parameter from an image. This data will
-be used to verify either the current or the next image in the CoT sequence.
-
-Each image in the CoT will specify the parsing method it uses. This information
-will be used by the IPM to find the right parser descriptor for the image.
-
-
-### 3.2 Describing the authentication method(s)
-
-As part of the CoT, each image has to specify one or more authentication methods
-which will be used to verify it. As described in the Section "Authentication
-methods", there are three methods supported by the AM.
-
-```
-typedef enum {
- AUTH_METHOD_NONE,
- AUTH_METHOD_HASH,
- AUTH_METHOD_SIG,
- AUTH_METHOD_NUM
-} auth_method_type_t;
-```
-
-The AM defines the type of each parameter used by an authentication method. It
-uses this information to:
-
-1. Specify to the `get_auth_param()` function exported by the IPM, which
- parameter should be extracted from an image.
-
-2. Correctly marshall the parameters while calling the verification function
- exported by the CM and PP.
-
-3. Extract authentication parameters from a parent image in order to verify a
- child image e.g. to verify the certificate image, the public key has to be
- obtained from the parent image.
-
-```
-typedef enum {
- AUTH_PARAM_NONE,
- AUTH_PARAM_RAW_DATA, /* Raw image data */
- AUTH_PARAM_SIG, /* The image signature */
- AUTH_PARAM_SIG_ALG, /* The image signature algorithm */
- AUTH_PARAM_HASH, /* A hash (including the algorithm) */
- AUTH_PARAM_PUB_KEY, /* A public key */
-} auth_param_type_t;
-```
-
-The AM defines the following structure to identify an authentication parameter
-required to verify an image.
-
-```
-typedef struct auth_param_type_desc_s {
- auth_param_type_t type;
- void *cookie;
-} auth_param_type_desc_t;
-```
-
-`cookie` is used by the platform to specify additional information to the IPM
-which enables it to uniquely identify the parameter that should be extracted
-from an image. For example, the hash of a BL3x image in its corresponding
-content certificate is stored in an X509v3 custom extension field. An extension
-field can only be identified using an OID. In this case, the `cookie` could
-contain the pointer to the OID defined by the platform for the hash extension
-field while the `type` field could be set to `AUTH_PARAM_HASH`. A value of 0 for
-the `cookie` field means that it is not used.
-
-For each method, the AM defines a structure with the parameters required to
-verify the image.
-
-```
-/*
- * Parameters for authentication by hash matching
- */
-typedef struct auth_method_param_hash_s {
- auth_param_type_desc_t *data; /* Data to hash */
- auth_param_type_desc_t *hash; /* Hash to match with */
-} auth_method_param_hash_t;
-
-/*
- * Parameters for authentication by signature
- */
-typedef struct auth_method_param_sig_s {
- auth_param_type_desc_t *pk; /* Public key */
- auth_param_type_desc_t *sig; /* Signature to check */
- auth_param_type_desc_t *alg; /* Signature algorithm */
- auth_param_type_desc_t *tbs; /* Data signed */
-} auth_method_param_sig_t;
-
-```
-
-The AM defines the following structure to describe an authentication method for
-verifying an image
-
-```
-/*
- * Authentication method descriptor
- */
-typedef struct auth_method_desc_s {
- auth_method_type_t type;
- union {
- auth_method_param_hash_t hash;
- auth_method_param_sig_t sig;
- } param;
-} auth_method_desc_t;
-```
-
-Using the method type specified in the `type` field, the AM finds out what field
-needs to access within the `param` union.
-
-### 3.3 Storing Authentication parameters
-
-A parameter described by `auth_param_type_desc_t` to verify an image could be
-obtained from either the image itself or its parent image. The memory allocated
-for loading the parent image will be reused for loading the child image. Hence
-parameters which are obtained from the parent for verifying a child image need
-to have memory allocated for them separately where they can be stored. This
-memory must be statically allocated by the platform port.
-
-The AM defines the following structure to store the data corresponding to an
-authentication parameter.
-
-```
-typedef struct auth_param_data_desc_s {
- void *auth_param_ptr;
- unsigned int auth_param_len;
-} auth_param_data_desc_t;
-```
-
-The `auth_param_ptr` field is initialized by the platform. The `auth_param_len`
-field is used to specify the length of the data in the memory.
-
-For parameters that can be obtained from the child image itself, the IPM is
-responsible for populating the `auth_param_ptr` and `auth_param_len` fields
-while executing the `img_get_auth_param()` function.
-
-The AM defines the following structure to enable an image to describe the
-parameters that should be extracted from it and used to verify the next image
-(child) in a CoT.
-
-```
-typedef struct auth_param_desc_s {
- auth_param_type_desc_t type_desc;
- auth_param_data_desc_t data;
-} auth_param_desc_t;
-```
-
-### 3.4 Describing an image in a CoT
-
-An image in a CoT is a consolidation of the following aspects of a CoT described
-above.
-
-1. A unique identifier specified by the platform which allows the IO framework
- to locate the image in a FIP and load it in the memory reserved for the data
- image in the CoT.
-
-2. A parsing method which is used by the AM to find the appropriate IPM.
-
-3. Authentication methods and their parameters as described in the previous
- section. These are used to verify the current image.
-
-4. Parameters which are used to verify the next image in the current CoT. These
- parameters are specified only by authentication images and can be extracted
- from the current image once it has been verified.
-
-The following data structure describes an image in a CoT.
-```
-typedef struct auth_img_desc_s {
- unsigned int img_id;
- const struct auth_img_desc_s *parent;
- img_type_t img_type;
- auth_method_desc_t img_auth_methods[AUTH_METHOD_NUM];
- auth_param_desc_t authenticated_data[COT_MAX_VERIFIED_PARAMS];
-} auth_img_desc_t;
-```
-A CoT is defined as an array of `auth_image_desc_t` structures linked together
-by the `parent` field. Those nodes with no parent must be authenticated using
-the ROTPK stored in the platform.
-
-
-4. Implementation example
---------------------------
-
-This section is a detailed guide explaining a trusted boot implementation using
-the authentication framework. This example corresponds to the Applicative
-Functional Mode (AFM) as specified in the TBBR-Client document. It is
-recommended to read this guide along with the source code.
-
-### 4.1 The TBBR CoT
-
-The CoT can be found in `drivers/auth/tbbr/tbbr_cot.c`. This CoT consists of an
-array of image descriptors and it is registered in the framework using the macro
-`REGISTER_COT(cot_desc)`, where 'cot_desc' must be the name of the array
-(passing a pointer or any other type of indirection will cause the registration
-process to fail).
-
-The number of images participating in the boot process depends on the CoT. There
-is, however, a minimum set of images that are mandatory in the Trusted Firmware
-and thus all CoTs must present:
-
-* `BL2`
-* `SCP_BL2` (platform specific)
-* `BL31`
-* `BL32` (optional)
-* `BL33`
-
-The TBBR specifies the additional certificates that must accompany these images
-for a proper authentication. Details about the TBBR CoT may be found in the
-[Trusted Board Boot] document.
-
-Following the [Platform Porting Guide], a platform must provide unique
-identifiers for all the images and certificates that will be loaded during the
-boot process. If a platform is using the TBBR as a reference for trusted boot,
-these identifiers can be obtained from `include/common/tbbr/tbbr_img_def.h`.
-ARM platforms include this file in `include/plat/arm/common/arm_def.h`. Other
-platforms may also include this file or provide their own identifiers.
-
-**Important**: the authentication module uses these identifiers to index the
-CoT array, so the descriptors location in the array must match the identifiers.
-
-Each image descriptor must specify:
-
-* `img_id`: the corresponding image unique identifier defined by the platform.
-* `img_type`: the image parser module uses the image type to call the proper
- parsing library to check the image integrity and extract the required
- authentication parameters. Three types of images are currently supported:
- * `IMG_RAW`: image is a raw binary. No parsing functions are available,
- other than reading the whole image.
- * `IMG_PLAT`: image format is platform specific. The platform may use this
- type for custom images not directly supported by the authentication
- framework.
- * `IMG_CERT`: image is an x509v3 certificate.
-* `parent`: pointer to the parent image descriptor. The parent will contain
- the information required to authenticate the current image. If the parent
- is NULL, the authentication parameters will be obtained from the platform
- (i.e. the BL2 and Trusted Key certificates are signed with the ROT private
- key, whose public part is stored in the platform).
-* `img_auth_methods`: this array defines the authentication methods that must
- be checked to consider an image authenticated. Each method consists of a
- type and a list of parameter descriptors. A parameter descriptor consists of
- a type and a cookie which will point to specific information required to
- extract that parameter from the image (i.e. if the parameter is stored in an
- x509v3 extension, the cookie will point to the extension OID). Depending on
- the method type, a different number of parameters must be specified.
- Supported methods are:
- * `AUTH_METHOD_HASH`: the hash of the image must match the hash extracted
- from the parent image. The following parameter descriptors must be
- specified:
- * `data`: data to be hashed (obtained from current image)
- * `hash`: reference hash (obtained from parent image)
- * `AUTH_METHOD_SIG`: the image (usually a certificate) must be signed with
- the private key whose public part is extracted from the parent image (or
- the platform if the parent is NULL). The following parameter descriptors
- must be specified:
- * `pk`: the public key (obtained from parent image)
- * `sig`: the digital signature (obtained from current image)
- * `alg`: the signature algorithm used (obtained from current image)
- * `data`: the data to be signed (obtained from current image)
-* `authenticated_data`: this array indicates what authentication parameters
- must be extracted from an image once it has been authenticated. Each
- parameter consists of a parameter descriptor and the buffer address/size
- to store the parameter. The CoT is responsible for allocating the required
- memory to store the parameters.
-
-In the `tbbr_cot.c` file, a set of buffers are allocated to store the parameters
-extracted from the certificates. In the case of the TBBR CoT, these parameters
-are hashes and public keys. In DER format, an RSA-2048 public key requires 294
-bytes, and a hash requires 51 bytes. Depending on the CoT and the authentication
-process, some of the buffers may be reused at different stages during the boot.
-
-Next in that file, the parameter descriptors are defined. These descriptors will
-be used to extract the parameter data from the corresponding image.
-
-#### 4.1.1 Example: the BL31 Chain of Trust
-
-Four image descriptors form the BL31 Chain of Trust:
-
-```
-[TRUSTED_KEY_CERT_ID] = {
- .img_id = TRUSTED_KEY_CERT_ID,
- .img_type = IMG_CERT,
- .parent = NULL,
- .img_auth_methods = {
- [0] = {
- .type = AUTH_METHOD_SIG,
- .param.sig = {
- .pk = &subject_pk,
- .sig = &sig,
- .alg = &sig_alg,
- .data = &raw_data,
- }
- }
- },
- .authenticated_data = {
- [0] = {
- .type_desc = &trusted_world_pk,
- .data = {
- .ptr = (void *)trusted_world_pk_buf,
- .len = (unsigned int)PK_DER_LEN
- }
- },
- [1] = {
- .type_desc = &non_trusted_world_pk,
- .data = {
- .ptr = (void *)non_trusted_world_pk_buf,
- .len = (unsigned int)PK_DER_LEN
- }
- }
- }
-},
-[SOC_FW_KEY_CERT_ID] = {
- .img_id = SOC_FW_KEY_CERT_ID,
- .img_type = IMG_CERT,
- .parent = &cot_desc[TRUSTED_KEY_CERT_ID],
- .img_auth_methods = {
- [0] = {
- .type = AUTH_METHOD_SIG,
- .param.sig = {
- .pk = &trusted_world_pk,
- .sig = &sig,
- .alg = &sig_alg,
- .data = &raw_data,
- }
- }
- },
- .authenticated_data = {
- [0] = {
- .type_desc = &soc_fw_content_pk,
- .data = {
- .ptr = (void *)content_pk_buf,
- .len = (unsigned int)PK_DER_LEN
- }
- }
- }
-},
-[SOC_FW_CONTENT_CERT_ID] = {
- .img_id = SOC_FW_CONTENT_CERT_ID,
- .img_type = IMG_CERT,
- .parent = &cot_desc[SOC_FW_KEY_CERT_ID],
- .img_auth_methods = {
- [0] = {
- .type = AUTH_METHOD_SIG,
- .param.sig = {
- .pk = &soc_fw_content_pk,
- .sig = &sig,
- .alg = &sig_alg,
- .data = &raw_data,
- }
- }
- },
- .authenticated_data = {
- [0] = {
- .type_desc = &soc_fw_hash,
- .data = {
- .ptr = (void *)soc_fw_hash_buf,
- .len = (unsigned int)HASH_DER_LEN
- }
- }
- }
-},
-[BL31_IMAGE_ID] = {
- .img_id = BL31_IMAGE_ID,
- .img_type = IMG_RAW,
- .parent = &cot_desc[SOC_FW_CONTENT_CERT_ID],
- .img_auth_methods = {
- [0] = {
- .type = AUTH_METHOD_HASH,
- .param.hash = {
- .data = &raw_data,
- .hash = &soc_fw_hash,
- }
- }
- }
-}
-```
-The **Trusted Key certificate** is signed with the ROT private key and contains
-the Trusted World public key and the Non-Trusted World public key as x509v3
-extensions. This must be specified in the image descriptor using the
-`img_auth_methods` and `authenticated_data` arrays, respectively.
-
-The Trusted Key certificate is authenticated by checking its digital signature
-using the ROTPK. Four parameters are required to check a signature: the public
-key, the algorithm, the signature and the data that has been signed. Therefore,
-four parameter descriptors must be specified with the authentication method:
-
-* `subject_pk`: parameter descriptor of type `AUTH_PARAM_PUB_KEY`. This type
- is used to extract a public key from the parent image. If the cookie is an
- OID, the key is extracted from the corresponding x509v3 extension. If the
- cookie is NULL, the subject public key is retrieved. In this case, because
- the parent image is NULL, the public key is obtained from the platform
- (this key will be the ROTPK).
-* `sig`: parameter descriptor of type `AUTH_PARAM_SIG`. It is used to extract
- the signature from the certificate.
-* `sig_alg`: parameter descriptor of type `AUTH_PARAM_SIG`. It is used to
- extract the signature algorithm from the certificate.
-* `raw_data`: parameter descriptor of type `AUTH_PARAM_RAW_DATA`. It is used
- to extract the data to be signed from the certificate.
-
-Once the signature has been checked and the certificate authenticated, the
-Trusted World public key needs to be extracted from the certificate. A new entry
-is created in the `authenticated_data` array for that purpose. In that entry,
-the corresponding parameter descriptor must be specified along with the buffer
-address to store the parameter value. In this case, the `tz_world_pk` descriptor
-is used to extract the public key from an x509v3 extension with OID
-`TRUSTED_WORLD_PK_OID`. The BL31 key certificate will use this descriptor as
-parameter in the signature authentication method. The key is stored in the
-`plat_tz_world_pk_buf` buffer.
-
-The **BL31 Key certificate** is authenticated by checking its digital signature
-using the Trusted World public key obtained previously from the Trusted Key
-certificate. In the image descriptor, we specify a single authentication method
-by signature whose public key is the `tz_world_pk`. Once this certificate has
-been authenticated, we have to extract the BL31 public key, stored in the
-extension specified by `bl31_content_pk`. This key will be copied to the
-`plat_content_pk` buffer.
-
-The **BL31 certificate** is authenticated by checking its digital signature
-using the BL31 public key obtained previously from the BL31 Key certificate.
-We specify the authentication method using `bl31_content_pk` as public key.
-After authentication, we need to extract the BL31 hash, stored in the extension
-specified by `bl31_hash`. This hash will be copied to the `plat_bl31_hash_buf`
-buffer.
-
-The **BL31 image** is authenticated by calculating its hash and matching it
-with the hash obtained from the BL31 certificate. The image descriptor contains
-a single authentication method by hash. The parameters to the hash method are
-the reference hash, `bl31_hash`, and the data to be hashed. In this case, it is
-the whole image, so we specify `raw_data`.
-
-### 4.2 The image parser library
-
-The image parser module relies on libraries to check the image integrity and
-extract the authentication parameters. The number and type of parser libraries
-depend on the images used in the CoT. Raw images do not need a library, so
-only an x509v3 library is required for the TBBR CoT.
-
-ARM platforms will use an x509v3 library based on mbed TLS. This library may be
-found in `drivers/auth/mbedtls/mbedtls_x509_parser.c`. It exports three
-functions:
-
-```
-void init(void);
-int check_integrity(void *img, unsigned int img_len);
-int get_auth_param(const auth_param_type_desc_t *type_desc,
- void *img, unsigned int img_len,
- void **param, unsigned int *param_len);
-```
-
-The library is registered in the framework using the macro
-`REGISTER_IMG_PARSER_LIB()`. Each time the image parser module needs to access
-an image of type `IMG_CERT`, it will call the corresponding function exported
-in this file.
-
-The build system must be updated to include the corresponding library and
-mbed TLS sources. ARM platforms use the `arm_common.mk` file to pull the
-sources.
-
-### 4.3 The cryptographic library
-
-The cryptographic module relies on a library to perform the required operations,
-i.e. verify a hash or a digital signature. ARM platforms will use a library
-based on mbed TLS, which can be found in
-`drivers/auth/mbedtls/mbedtls_crypto.c`. This library is registered in the
-authentication framework using the macro `REGISTER_CRYPTO_LIB()` and exports
-three functions:
-
-```
-void init(void);
-int verify_signature(void *data_ptr, unsigned int data_len,
- void *sig_ptr, unsigned int sig_len,
- void *sig_alg, unsigned int sig_alg_len,
- void *pk_ptr, unsigned int pk_len);
-int verify_hash(void *data_ptr, unsigned int data_len,
- void *digest_info_ptr, unsigned int digest_info_len);
-```
-
-The key algorithm (rsa, ecdsa) must be specified in the build system using the
-`TF_MBEDTLS_KEY_ALG` variable, so the Makefile can include the corresponding
-sources in the build.
-
-Note: If code size is a concern, the build option `MBEDTLS_SHA256_SMALLER` can
-be defined in the platform Makefile. It will make mbed TLS use an implementation
-of SHA-256 with smaller memory footprint (~1.5 KB less) but slower (~30%).
-
-- - - - - - - - - - - - - - - - - - - - - - - - - -
-
-_Copyright (c) 2015, ARM Limited and Contributors. All rights reserved._
-
-
-[Trusted Board Boot]: ./trusted-board-boot.md
-[Platform Porting Guide]: ./porting-guide.md