blob: b910eaebfe650ef77e5af602af1be6ba63b33e54 [file] [log] [blame] [view]
Juan Castillod337aaa2015-06-10 15:27:52 +01001Abstracting a Chain of Trust
2============================
3
4Contents :
5
61. [Introduction](#1--introduction)
72. [Framework design](#2--framework-design)
83. [Specifying a Chain of Trust](#3--specifying-a-chain-of-trust)
94. [Implementation example](#4--implementation-example)
10
11
121. Introduction
13----------------
14
15The aim of this document is to describe the authentication framework implemented
16in the Trusted Firmware. This framework fulfills the following requirements:
17
181. It should be possible for a platform port to specify the Chain of Trust in
19 terms of certificate hierarchy and the mechanisms used to verify a
20 particular image/certificate.
21
222. The framework should distinguish between:
23
24 - The mechanism used to encode and transport information, e.g. DER encoded
25 X.509v3 certificates to ferry Subject Public Keys, hashes and non-volatile
26 counters.
27
28 - The mechanism used to verify the transported information i.e. the
29 cryptographic libraries.
30
31The framework has been designed following a modular approach illustrated in the
32next diagram:
33
34```
35 +---------------+---------------+------------+
36 | Trusted | Trusted | Trusted |
37 | Firmware | Firmware | Firmware |
38 | Generic | IO Framework | Platform |
39 | Code i.e. | (IO) | Port |
40 | BL1/BL2 (GEN) | | (PP) |
41 +---------------+---------------+------------+
42 ^ ^ ^
43 | | |
44 v v v
45 +-----------+ +-----------+ +-----------+
46 | | | | | Image |
47 | Crypto | | Auth | | Parser |
48 | Module |<->| Module |<->| Module |
49 | (CM) | | (AM) | | (IPM) |
50 | | | | | |
51 +-----------+ +-----------+ +-----------+
52 ^ ^
53 | |
54 v v
55 +----------------+ +-----------------+
56 | Cryptographic | | Image Parser |
57 | Libraries (CL) | | Libraries (IPL) |
58 +----------------+ +-----------------+
59 | |
60 | |
61 | |
62 v v
63 +-----------------+
64 | Misc. Libs e.g. |
65 | ASN.1 decoder |
66 | |
67 +-----------------+
68
69 DIAGRAM 1.
70```
71
72This document describes the inner details of the authentication framework and
73the abstraction mechanisms available to specify a Chain of Trust.
74
75
762. Framework design
77--------------------
78
79This section describes some aspects of the framework design and the rationale
80behind them. These aspects are key to verify a Chain of Trust.
81
82### 2.1 Chain of Trust
83
84A CoT is basically a sequence of authentication images which usually starts with
85a root of trust and culminates in a single data image. The following diagram
86illustrates how this maps to a CoT for the BL3-1 image described in the
87TBBR-Client specification.
88
89```
90 +------------------+ +-------------------+
91 | ROTPK/ROTPK Hash |------>| Trusted Key |
92 +------------------+ | Certificate |
93 | (Auth Image) |
94 /+-------------------+
95 / |
96 / |
97 / |
98 / |
99 L v
100 +------------------+ +-------------------+
101 | Trusted World |------>| BL3-1 Key |
102 | Public Key | | Certificate |
103 +------------------+ | (Auth Image) |
104 +-------------------+
105 / |
106 / |
107 / |
108 / |
109 / v
110 +------------------+ L +-------------------+
111 | BL3-1 Content |------>| BL3-1 Content |
112 | Certificate PK | | Certificate |
113 +------------------+ | (Auth Image) |
114 +-------------------+
115 / |
116 / |
117 / |
118 / |
119 / v
120 +------------------+ L +-------------------+
121 | BL3-1 Hash |------>| BL3-1 Image |
122 | | | (Data Image) |
123 +------------------+ | |
124 +-------------------+
125
126 DIAGRAM 2.
127```
128
129The root of trust is usually a public key (ROTPK) that has been burnt in the
130platform and cannot be modified.
131
132### 2.2 Image types
133
134Images in a CoT are categorised as authentication and data images. An
135authentication image contains information to authenticate a data image or
136another authentication image. A data image is usually a boot loader binary, but
137it could be any other data that requires authentication.
138
139### 2.3 Component responsibilities
140
141For every image in a Chain of Trust, the following high level operations are
142performed to verify it:
143
1441. Allocate memory for the image either statically or at runtime.
145
1462. Identify the image and load it in the allocated memory.
147
1483. Check the integrity of the image as per its type.
149
1504. Authenticate the image as per the cryptographic algorithms used.
151
1525. If the image is an authentication image, extract the information that will
153 be used to authenticate the next image in the CoT.
154
155In Diagram 1, each component is responsible for one or more of these operations.
156The responsibilities are briefly described below.
157
158
159#### 2.2.1 TF Generic code and IO framework (GEN/IO)
160
161These components are responsible for initiating the authentication process for a
162particular image in BL1 or BL2. For each BL image that requires authentication,
163the Generic code asks recursively the Authentication module what is the parent
164image until either an authenticated image or the ROT is reached. Then the
165Generic code calls the IO framewotk to load the image and calls the
166Authentication module to authenticate it, following the CoT from ROT to Image.
167
168
169#### 2.2.2 TF Platform Port (PP)
170
171The platform is responsible for:
172
1731. Specifying the CoT for each image that needs to be authenticated. Details of
174 how a CoT can be specified by the platform are explained later. The platform
175 also specifies the authentication methods and the parsing method used for
176 each image.
177
1782. Statically allocating memory for each parameter in each image which is
179 used for verifying the CoT, e.g. memory for public keys, hashes etc.
180
1813. Providing the ROTPK or a hash of it.
182
1834. Providing additional information to the IPM to enable it to identify and
184 extract authentication parameters contained in an image, e.g. if the
185 parameters are stored as X509v3 extensions, the corresponding OID must be
186 provided.
187
1885. Fulfill any other memory requirements of the IPM and the CM (not currently
189 described in this document).
190
1916. Export functions to verify an image which uses an authentication method that
192 cannot be interpreted by the CM, e.g. if an image has to be verified using a
193 NV counter, then the value of the counter to compare with can only be
194 provided by the platform.
195
1967. Export a custom IPM if a proprietary image format is being used (described
197 later).
198
199
200#### 2.2.3 Authentication Module (AM)
201
202It is responsible for:
203
2041. Providing the necessary abstraction mechanisms to describe a CoT. Amongst
205 other things, the authentication and image parsing methods must be specified
206 by the PP in the CoT.
207
2082. Verifying the CoT passed by GEN by utilising functionality exported by the
209 PP, IPM and CM.
210
2113. Tracking which images have been verified. In case an image is a part of
212 multiple CoTs then it should be verified only once e.g. the Trusted World
213 Key Certificate in the TBBR-Client spec. contains information to verify
214 BL3-0, BL3-1, BL3-2 each of which have a separate CoT. (This responsibility
215 has not been described in this document but should be trivial to implement).
216
2174. Reusing memory meant for a data image to verify authentication images e.g.
218 in the CoT described in Diagram 2, each certificate can be loaded and
219 verified in the memory reserved by the platform for the BL3-1 image. By the
220 time BL3-1 (the data image) is loaded, all information to authenticate it
221 will have been extracted from the parent image i.e. BL3-1 content
222 certificate. It is assumed that the size of an authentication image will
223 never exceed the size of a data image. It should be possible to verify this
224 at build time using asserts.
225
226
227#### 2.2.4 Cryptographic Module (CM)
228
229The CM is responsible for providing an API to:
230
2311. Verify a digital signature.
2322. Verify a hash.
233
234The CM does not include any cryptography related code, but it relies on an
235external library to perform the cryptographic operations. A Crypto-Library (CL)
236linking the CM and the external library must be implemented. The following
237functions must be provided by the CL:
238
239```
240void (*init)(void);
241int (*verify_signature)(void *data_ptr, unsigned int data_len,
242 void *sig_ptr, unsigned int sig_len,
243 void *sig_alg, unsigned int sig_alg_len,
244 void *pk_ptr, unsigned int pk_len);
245int (*verify_hash)(void *data_ptr, unsigned int data_len,
246 void *digest_info_ptr, unsigned int digest_info_len);
247```
248
249These functions are registered in the CM using the macro:
250```
251REGISTER_CRYPTO_LIB(_name, _init, _verify_signature, _verify_hash);
252```
253
254`_name` must be a string containing the name of the CL. This name is used for
255debugging purposes.
256
257#### 2.2.5 Image Parser Module (IPM)
258
259The IPM is responsible for:
260
2611. Checking the integrity of each image loaded by the IO framework.
2622. Extracting parameters used for authenticating an image based upon a
263 description provided by the platform in the CoT descriptor.
264
265Images may have different formats (for example, authentication images could be
266x509v3 certificates, signed ELF files or any other platform specific format).
267The IPM allows to register an Image Parser Library (IPL) for every image format
268used in the CoT. This library must implement the specific methods to parse the
269image. The IPM obtains the image format from the CoT and calls the right IPL to
270check the image integrity and extract the authentication parameters.
271
272See Section "Describing the image parsing methods" for more details about the
273mechanism the IPM provides to define and register IPLs.
274
275
276### 2.3 Authentication methods
277
278The AM supports the following authentication methods:
279
2801. Hash
2812. Digital signature
282
283The platform may specify these methods in the CoT in case it decides to define
284a custom CoT instead of reusing a predefined one.
285
286If a data image uses multiple methods, then all the methods must be a part of
287the same CoT. The number and type of parameters are method specific. These
288parameters should be obtained from the parent image using the IPM.
289
2901. Hash
291
292 Parameters:
293
294 1. A pointer to data to hash
295 2. Length of the data
296 4. A pointer to the hash
297 5. Length of the hash
298
299 The hash will be represented by the DER encoding of the following ASN.1
300 type:
301
302 ```
303 DigestInfo ::= SEQUENCE {
304 digestAlgorithm DigestAlgorithmIdentifier,
305 digest Digest
306 }
307 ```
308
309 This ASN.1 structure makes it possible to remove any assumption about the
310 type of hash algorithm used as this information accompanies the hash. This
311 should allow the Cryptography Library (CL) to support multiple hash
312 algorithm implementations.
313
3142. Digital Signature
315
316 Parameters:
317
318 1. A pointer to data to sign
319 2. Length of the data
320 3. Public Key Algorithm
321 4. Public Key value
322 5. Digital Signature Algorithm
323 6. Digital Signature value
324
325 The Public Key parameters will be represented by the DER encoding of the
326 following ASN.1 type:
327
328 ```
329 SubjectPublicKeyInfo ::= SEQUENCE {
330 algorithm AlgorithmIdentifier{PUBLIC-KEY,{PublicKeyAlgorithms}},
331 subjectPublicKey BIT STRING }
332 ```
333
334 The Digital Signature Algorithm will be represented by the DER encoding of
335 the following ASN.1 types.
336
337 ```
338 AlgorithmIdentifier {ALGORITHM:IOSet } ::= SEQUENCE {
339 algorithm ALGORITHM.&id({IOSet}),
340 parameters ALGORITHM.&Type({IOSet}{@algorithm}) OPTIONAL
341 }
342 ```
343
344 The digital signature will be represented by:
345 ```
346 signature ::= BIT STRING
347 ```
348
349The authentication framework will use the image descriptor to extract all the
350information related to authentication.
351
352
3533. Specifying a Chain of Trust
354-------------------------------
355
356A CoT can be described as a set of image descriptors linked together in a
357particular order. The order dictates the sequence in which they must be
358verified. Each image has a set of properties which allow the AM to verify it.
359These properties are described below.
360
361The PP is responsible for defining a single or multiple CoTs for a data image.
362Unless otherwise specified, the data structures described in the following
363sections are populated by the PP statically.
364
365
366### 3.1 Describing the image parsing methods
367
368The parsing method refers to the format of a particular image. For example, an
369authentication image that represents a certificate could be in the X.509v3
370format. A data image that represents a boot loader stage could be in raw binary
371or ELF format. The IPM supports three parsing methods. An image has to use one
372of the three methods described below. An IPL is responsible for interpreting a
373single parsing method. There has to be one IPL for every method used by the
374platform.
375
3761. Raw format: This format is effectively a nop as an image using this method
377 is treated as being in raw binary format e.g. boot loader images used by ARM
378 TF. This method should only be used by data images.
379
3802. X509V3 method: This method uses industry standards like X.509 to represent
381 PKI certificates (authentication images). It is expected that open source
382 libraries will be available which can be used to parse an image represented
383 by this method. Such libraries can be used to write the corresponding IPL
Juan Castillo649dbf62015-11-05 09:24:53 +0000384 e.g. the X.509 parsing library code in mbed TLS.
Juan Castillod337aaa2015-06-10 15:27:52 +0100385
3863. Platform defined method: This method caters for platform specific
387 proprietary standards to represent authentication or data images. For
388 example, The signature of a data image could be appended to the data image
389 raw binary. A header could be prepended to the combined blob to specify the
390 extents of each component. The platform will have to implement the
391 corresponding IPL to interpret such a format.
392
393The following enum can be used to define these three methods.
394
395```
396typedef enum img_type_enum {
397 IMG_RAW, /* Binary image */
398 IMG_PLAT, /* Platform specific format */
399 IMG_CERT, /* X509v3 certificate */
400 IMG_MAX_TYPES,
401} img_type_t;
402```
403
404An IPL must provide functions with the following prototypes:
405
406```
407void init(void);
408int check_integrity(void *img, unsigned int img_len);
409int get_auth_param(const auth_param_type_desc_t *type_desc,
410 void *img, unsigned int img_len,
411 void **param, unsigned int *param_len);
412```
413
414An IPL for each type must be registered using the following macro:
415
416```
417REGISTER_IMG_PARSER_LIB(_type, _name, _init, _check_int, _get_param)
418```
419
420* `_type`: one of the types described above.
421* `_name`: a string containing the IPL name for debugging purposes.
422* `_init`: initialization function pointer.
423* `_check_int`: check image integrity function pointer.
424* `_get_param`: extract authentication parameter funcion pointer.
425
426The `init()` function will be used to initialize the IPL.
427
428The `check_integrity()` function is passed a pointer to the memory where the
429image has been loaded by the IO framework and the image length. It should ensure
430that the image is in the format corresponding to the parsing method and has not
431been tampered with. For example, RFC-2459 describes a validation sequence for an
432X.509 certificate.
433
434The `get_auth_param()` function is passed a parameter descriptor containing
435information about the parameter (`type_desc` and `cookie`) to identify and
436extract the data corresponding to that parameter from an image. This data will
437be used to verify either the current or the next image in the CoT sequence.
438
439Each image in the CoT will specify the parsing method it uses. This information
440will be used by the IPM to find the right parser descriptor for the image.
441
442
443### 3.2 Describing the authentication method(s)
444
445As part of the CoT, each image has to specify one or more authentication methods
446which will be used to verify it. As described in the Section "Authentication
447methods", there are three methods supported by the AM.
448
449```
450typedef enum {
451 AUTH_METHOD_NONE,
452 AUTH_METHOD_HASH,
453 AUTH_METHOD_SIG,
454 AUTH_METHOD_NUM
455} auth_method_type_t;
456```
457
458The AM defines the type of each parameter used by an authentication method. It
459uses this information to:
460
4611. Specify to the `get_auth_param()` function exported by the IPM, which
462 parameter should be extracted from an image.
463
4642. Correctly marshall the parameters while calling the verification function
465 exported by the CM and PP.
466
4673. Extract authentication parameters from a parent image in order to verify a
468 child image e.g. to verify the certificate image, the public key has to be
469 obtained from the parent image.
470
471```
472typedef enum {
473 AUTH_PARAM_NONE,
474 AUTH_PARAM_RAW_DATA, /* Raw image data */
475 AUTH_PARAM_SIG, /* The image signature */
476 AUTH_PARAM_SIG_ALG, /* The image signature algorithm */
477 AUTH_PARAM_HASH, /* A hash (including the algorithm) */
478 AUTH_PARAM_PUB_KEY, /* A public key */
479} auth_param_type_t;
480```
481
482The AM defines the following structure to identify an authentication parameter
483required to verify an image.
484
485```
486typedef struct auth_param_type_desc_s {
487 auth_param_type_t type;
488 void *cookie;
489} auth_param_type_desc_t;
490```
491
492`cookie` is used by the platform to specify additional information to the IPM
493which enables it to uniquely identify the parameter that should be extracted
494from an image. For example, the hash of a BL3-x image in its corresponding
495content certificate is stored in an X509v3 custom extension field. An extension
496field can only be identified using an OID. In this case, the `cookie` could
497contain the pointer to the OID defined by the platform for the hash extension
498field while the `type` field could be set to `AUTH_PARAM_HASH`. A value of 0 for
499the `cookie` field means that it is not used.
500
501For each method, the AM defines a structure with the parameters required to
502verify the image.
503
504```
505/*
506 * Parameters for authentication by hash matching
507 */
508typedef struct auth_method_param_hash_s {
509 auth_param_type_desc_t *data; /* Data to hash */
510 auth_param_type_desc_t *hash; /* Hash to match with */
511} auth_method_param_hash_t;
512
513/*
514 * Parameters for authentication by signature
515 */
516typedef struct auth_method_param_sig_s {
517 auth_param_type_desc_t *pk; /* Public key */
518 auth_param_type_desc_t *sig; /* Signature to check */
519 auth_param_type_desc_t *alg; /* Signature algorithm */
520 auth_param_type_desc_t *tbs; /* Data signed */
521} auth_method_param_sig_t;
522
523```
524
525The AM defines the following structure to describe an authentication method for
526verifying an image
527
528```
529/*
530 * Authentication method descriptor
531 */
532typedef struct auth_method_desc_s {
533 auth_method_type_t type;
534 union {
535 auth_method_param_hash_t hash;
536 auth_method_param_sig_t sig;
537 } param;
538} auth_method_desc_t;
539```
540
541Using the method type specified in the `type` field, the AM finds out what field
542needs to access within the `param` union.
543
544### 3.3 Storing Authentication parameters
545
546A parameter described by `auth_param_type_desc_t` to verify an image could be
547obtained from either the image itself or its parent image. The memory allocated
548for loading the parent image will be reused for loading the child image. Hence
549parameters which are obtained from the parent for verifying a child image need
550to have memory allocated for them separately where they can be stored. This
551memory must be statically allocated by the platform port.
552
553The AM defines the following structure to store the data corresponding to an
554authentication parameter.
555
556```
557typedef struct auth_param_data_desc_s {
558 void *auth_param_ptr;
559 unsigned int auth_param_len;
560} auth_param_data_desc_t;
561```
562
563The `auth_param_ptr` field is initialized by the platform. The `auth_param_len`
564field is used to specify the length of the data in the memory.
565
566For parameters that can be obtained from the child image itself, the IPM is
567responsible for populating the `auth_param_ptr` and `auth_param_len` fields
568while executing the `img_get_auth_param()` function.
569
570The AM defines the following structure to enable an image to describe the
571parameters that should be extracted from it and used to verify the next image
572(child) in a CoT.
573
574```
575typedef struct auth_param_desc_s {
576 auth_param_type_desc_t type_desc;
577 auth_param_data_desc_t data;
578} auth_param_desc_t;
579```
580
581### 3.4 Describing an image in a CoT
582
583An image in a CoT is a consolidation of the following aspects of a CoT described
584above.
585
5861. A unique identifier specified by the platform which allows the IO framework
587 to locate the image in a FIP and load it in the memory reserved for the data
588 image in the CoT.
589
5902. A parsing method which is used by the AM to find the appropriate IPM.
591
5923. Authentication methods and their parameters as described in the previous
593 section. These are used to verify the current image.
594
5954. Parameters which are used to verify the next image in the current CoT. These
596 parameters are specified only by authentication images and can be extracted
597 from the current image once it has been verified.
598
599The following data structure describes an image in a CoT.
600```
601typedef struct auth_img_desc_s {
602 unsigned int img_id;
603 const struct auth_img_desc_s *parent;
604 img_type_t img_type;
605 auth_method_desc_t img_auth_methods[AUTH_METHOD_NUM];
606 auth_param_desc_t authenticated_data[COT_MAX_VERIFIED_PARAMS];
607} auth_img_desc_t;
608```
609A CoT is defined as an array of `auth_image_desc_t` structures linked together
610by the `parent` field. Those nodes with no parent must be authenticated using
611the ROTPK stored in the platform.
612
613
6144. Implementation example
615--------------------------
616
617This section is a detailed guide explaining a trusted boot implementation using
618the authentication framework. This example corresponds to the Applicative
619Functional Mode (AFM) as specified in the TBBR-Client document. It is
620recommended to read this guide along with the source code.
621
622### 4.1 The TBBR CoT
623
624The CoT can be found in `drivers/auth/tbbr/tbbr_cot.c`. This CoT consists of an
625array of image descriptors and it is registered in the framework using the macro
626`REGISTER_COT(cot_desc)`, where 'cot_desc' must be the name of the array
627(passing a pointer or any other type of indirection will cause the registration
628process to fail).
629
630The number of images participating in the boot process depends on the CoT. There
631is, however, a minimum set of images that are mandatory in the Trusted Firmware
632and thus all CoTs must present:
633
634* `BL2`
635* `BL3-0` (platform specific)
636* `BL3-1`
637* `BL3-2` (optional)
638* `BL3-3`
639
640The TBBR specifies the additional certificates that must accompany these images
641for a proper authentication. Details about the TBBR CoT may be found in the
642[Trusted Board Boot] document.
643
644Following the [Platform Porting Guide], a platform must provide unique
645identifiers for all the images and certificates that will be loaded during the
646boot process. If a platform is using the TBBR as a reference for trusted boot,
647these identifiers can be obtained from `include/common/tbbr/tbbr_img_def.h`.
648ARM platforms include this file in `include/plat/arm/common/arm_def.h`. Other
649platforms may also include this file or provide their own identifiers.
650
651**Important**: the authentication module uses these identifiers to index the
652CoT array, so the descriptors location in the array must match the identifiers.
653
654Each image descriptor must specify:
655
656* `img_id`: the corresponding image unique identifier defined by the platform.
657* `img_type`: the image parser module uses the image type to call the proper
658 parsing library to check the image integrity and extract the required
659 authentication parameters. Three types of images are currently supported:
660 * `IMG_RAW`: image is a raw binary. No parsing functions are available,
661 other than reading the whole image.
662 * `IMG_PLAT`: image format is platform specific. The platform may use this
663 type for custom images not directly supported by the authentication
664 framework.
665 * `IMG_CERT`: image is an x509v3 certificate.
666* `parent`: pointer to the parent image descriptor. The parent will contain
667 the information required to authenticate the current image. If the parent
668 is NULL, the authentication parameters will be obtained from the platform
669 (i.e. the BL2 and Trusted Key certificates are signed with the ROT private
670 key, whose public part is stored in the platform).
671* `img_auth_methods`: this array defines the authentication methods that must
672 be checked to consider an image authenticated. Each method consists of a
673 type and a list of parameter descriptors. A parameter descriptor consists of
674 a type and a cookie which will point to specific information required to
675 extract that parameter from the image (i.e. if the parameter is stored in an
676 x509v3 extension, the cookie will point to the extension OID). Depending on
677 the method type, a different number of parameters must be specified.
678 Supported methods are:
679 * `AUTH_METHOD_HASH`: the hash of the image must match the hash extracted
680 from the parent image. The following parameter descriptors must be
681 specified:
682 * `data`: data to be hashed (obtained from current image)
683 * `hash`: reference hash (obtained from parent image)
684 * `AUTH_METHOD_SIG`: the image (usually a certificate) must be signed with
685 the private key whose public part is extracted from the parent image (or
686 the platform if the parent is NULL). The following parameter descriptors
687 must be specified:
688 * `pk`: the public key (obtained from parent image)
689 * `sig`: the digital signature (obtained from current image)
690 * `alg`: the signature algorithm used (obtained from current image)
691 * `data`: the data to be signed (obtained from current image)
692* `authenticated_data`: this array indicates what authentication parameters
693 must be extracted from an image once it has been authenticated. Each
694 parameter consists of a parameter descriptor and the buffer address/size
695 to store the parameter. The CoT is responsible for allocating the required
696 memory to store the parameters.
697
698In the `tbbr_cot.c` file, a set of buffers are allocated to store the parameters
699extracted from the certificates. In the case of the TBBR CoT, these parameters
700are hashes and public keys. In DER format, an RSA-2048 public key requires 294
701bytes, and a hash requires 51 bytes. Depending on the CoT and the authentication
702process, some of the buffers may be reused at different stages during the boot.
703
704Next in that file, the parameter descriptors are defined. These descriptors will
705be used to extract the parameter data from the corresponding image.
706
707#### 4.1.1 Example: the BL3-1 Chain of Trust
708
709Four image descriptors form the BL3-1 Chain of Trust:
710
711```
712[TRUSTED_KEY_CERT_ID] = {
713 .img_id = TRUSTED_KEY_CERT_ID,
714 .img_type = IMG_CERT,
715 .parent = NULL,
716 .img_auth_methods = {
717 [0] = {
718 .type = AUTH_METHOD_SIG,
719 .param.sig = {
720 .pk = &subject_pk,
721 .sig = &sig,
722 .alg = &sig_alg,
723 .data = &raw_data,
724 }
725 }
726 },
727 .authenticated_data = {
728 [0] = {
Juan Castillo516beb52015-12-03 10:19:21 +0000729 .type_desc = &trusted_world_pk,
Juan Castillod337aaa2015-06-10 15:27:52 +0100730 .data = {
Juan Castillo516beb52015-12-03 10:19:21 +0000731 .ptr = (void *)trusted_world_pk_buf,
Juan Castillod337aaa2015-06-10 15:27:52 +0100732 .len = (unsigned int)PK_DER_LEN
733 }
734 },
735 [1] = {
Juan Castillo516beb52015-12-03 10:19:21 +0000736 .type_desc = &non_trusted_world_pk,
Juan Castillod337aaa2015-06-10 15:27:52 +0100737 .data = {
Juan Castillo516beb52015-12-03 10:19:21 +0000738 .ptr = (void *)non_trusted_world_pk_buf,
Juan Castillod337aaa2015-06-10 15:27:52 +0100739 .len = (unsigned int)PK_DER_LEN
740 }
741 }
742 }
743},
Juan Castillo516beb52015-12-03 10:19:21 +0000744[SOC_FW_KEY_CERT_ID] = {
745 .img_id = SOC_FW_KEY_CERT_ID,
Juan Castillod337aaa2015-06-10 15:27:52 +0100746 .img_type = IMG_CERT,
747 .parent = &cot_desc[TRUSTED_KEY_CERT_ID],
748 .img_auth_methods = {
749 [0] = {
750 .type = AUTH_METHOD_SIG,
751 .param.sig = {
Juan Castillo516beb52015-12-03 10:19:21 +0000752 .pk = &trusted_world_pk,
Juan Castillod337aaa2015-06-10 15:27:52 +0100753 .sig = &sig,
754 .alg = &sig_alg,
755 .data = &raw_data,
756 }
757 }
758 },
759 .authenticated_data = {
760 [0] = {
Juan Castillo516beb52015-12-03 10:19:21 +0000761 .type_desc = &soc_fw_content_pk,
Juan Castillod337aaa2015-06-10 15:27:52 +0100762 .data = {
Juan Castillo516beb52015-12-03 10:19:21 +0000763 .ptr = (void *)content_pk_buf,
Juan Castillod337aaa2015-06-10 15:27:52 +0100764 .len = (unsigned int)PK_DER_LEN
765 }
766 }
767 }
768},
Juan Castillo516beb52015-12-03 10:19:21 +0000769[SOC_FW_CONTENT_CERT_ID] = {
770 .img_id = SOC_FW_CONTENT_CERT_ID,
Juan Castillod337aaa2015-06-10 15:27:52 +0100771 .img_type = IMG_CERT,
Juan Castillo516beb52015-12-03 10:19:21 +0000772 .parent = &cot_desc[SOC_FW_KEY_CERT_ID],
Juan Castillod337aaa2015-06-10 15:27:52 +0100773 .img_auth_methods = {
774 [0] = {
775 .type = AUTH_METHOD_SIG,
776 .param.sig = {
Juan Castillo516beb52015-12-03 10:19:21 +0000777 .pk = &soc_fw_content_pk,
Juan Castillod337aaa2015-06-10 15:27:52 +0100778 .sig = &sig,
779 .alg = &sig_alg,
780 .data = &raw_data,
781 }
782 }
783 },
784 .authenticated_data = {
785 [0] = {
Juan Castillo516beb52015-12-03 10:19:21 +0000786 .type_desc = &soc_fw_hash,
Juan Castillod337aaa2015-06-10 15:27:52 +0100787 .data = {
Juan Castillo516beb52015-12-03 10:19:21 +0000788 .ptr = (void *)soc_fw_hash_buf,
Juan Castillod337aaa2015-06-10 15:27:52 +0100789 .len = (unsigned int)HASH_DER_LEN
790 }
791 }
792 }
793},
794[BL31_IMAGE_ID] = {
795 .img_id = BL31_IMAGE_ID,
796 .img_type = IMG_RAW,
Juan Castillo516beb52015-12-03 10:19:21 +0000797 .parent = &cot_desc[SOC_FW_CONTENT_CERT_ID],
Juan Castillod337aaa2015-06-10 15:27:52 +0100798 .img_auth_methods = {
799 [0] = {
800 .type = AUTH_METHOD_HASH,
801 .param.hash = {
802 .data = &raw_data,
Juan Castillo516beb52015-12-03 10:19:21 +0000803 .hash = &soc_fw_hash,
Juan Castillod337aaa2015-06-10 15:27:52 +0100804 }
805 }
806 }
807}
808```
809The **Trusted Key certificate** is signed with the ROT private key and contains
810the Trusted World public key and the Non-Trusted World public key as x509v3
811extensions. This must be specified in the image descriptor using the
812`img_auth_methods` and `authenticated_data` arrays, respectively.
813
814The Trusted Key certificate is authenticated by checking its digital signature
815using the ROTPK. Four parameters are required to check a signature: the public
816key, the algorithm, the signature and the data that has been signed. Therefore,
817four parameter descriptors must be specified with the authentication method:
818
819* `subject_pk`: parameter descriptor of type `AUTH_PARAM_PUB_KEY`. This type
820 is used to extract a public key from the parent image. If the cookie is an
821 OID, the key is extracted from the corresponding x509v3 extension. If the
822 cookie is NULL, the subject public key is retrieved. In this case, because
823 the parent image is NULL, the public key is obtained from the platform
824 (this key will be the ROTPK).
825* `sig`: parameter descriptor of type `AUTH_PARAM_SIG`. It is used to extract
826 the signature from the certificate.
827* `sig_alg`: parameter descriptor of type `AUTH_PARAM_SIG`. It is used to
828 extract the signature algorithm from the certificate.
829* `raw_data`: parameter descriptor of type `AUTH_PARAM_RAW_DATA`. It is used
830 to extract the data to be signed from the certificate.
831
832Once the signature has been checked and the certificate authenticated, the
833Trusted World public key needs to be extracted from the certificate. A new entry
834is created in the `authenticated_data` array for that purpose. In that entry,
835the corresponding parameter descriptor must be specified along with the buffer
836address to store the parameter value. In this case, the `tz_world_pk` descriptor
837is used to extract the public key from an x509v3 extension with OID
Juan Castillo516beb52015-12-03 10:19:21 +0000838`TRUSTED_WORLD_PK_OID`. The BL3-1 key certificate will use this descriptor as
Juan Castillod337aaa2015-06-10 15:27:52 +0100839parameter in the signature authentication method. The key is stored in the
840`plat_tz_world_pk_buf` buffer.
841
842The **BL3-1 Key certificate** is authenticated by checking its digital signature
843using the Trusted World public key obtained previously from the Trusted Key
844certificate. In the image descriptor, we specify a single authentication method
845by signature whose public key is the `tz_world_pk`. Once this certificate has
846been authenticated, we have to extract the BL3-1 public key, stored in the
847extension specified by `bl31_content_pk`. This key will be copied to the
848`plat_content_pk` buffer.
849
850The **BL3-1 certificate** is authenticated by checking its digital signature
851using the BL3-1 public key obtained previously from the BL3-1 Key certificate.
852We specify the authentication method using `bl31_content_pk` as public key.
853After authentication, we need to extract the BL3-1 hash, stored in the extension
854specified by `bl31_hash`. This hash will be copied to the `plat_bl31_hash_buf`
855buffer.
856
857The **BL3-1 image** is authenticated by calculating its hash and matching it
858with the hash obtained from the BL3-1 certificate. The image descriptor contains
859a single authentication method by hash. The parameters to the hash method are
860the reference hash, `bl31_hash`, and the data to be hashed. In this case, it is
861the whole image, so we specify `raw_data`.
862
863### 4.2 The image parser library
864
865The image parser module relies on libraries to check the image integrity and
866extract the authentication parameters. The number and type of parser libraries
867depend on the images used in the CoT. Raw images do not need a library, so
868only an x509v3 library is required for the TBBR CoT.
869
Juan Castillo649dbf62015-11-05 09:24:53 +0000870ARM platforms will use an x509v3 library based on mbed TLS. This library may be
Juan Castillod337aaa2015-06-10 15:27:52 +0100871found in `drivers/auth/mbedtls/mbedtls_x509_parser.c`. It exports three
872functions:
873
874```
875void init(void);
876int check_integrity(void *img, unsigned int img_len);
877int get_auth_param(const auth_param_type_desc_t *type_desc,
878 void *img, unsigned int img_len,
879 void **param, unsigned int *param_len);
880```
881
882The library is registered in the framework using the macro
883`REGISTER_IMG_PARSER_LIB()`. Each time the image parser module needs to access
884an image of type `IMG_CERT`, it will call the corresponding function exported
885in this file.
886
887The build system must be updated to include the corresponding library and
Juan Castillo649dbf62015-11-05 09:24:53 +0000888mbed TLS sources. ARM platforms use the `arm_common.mk` file to pull the
889sources.
Juan Castillod337aaa2015-06-10 15:27:52 +0100890
891### 4.3 The cryptographic library
892
893The cryptographic module relies on a library to perform the required operations,
894i.e. verify a hash or a digital signature. ARM platforms will use a library
Juan Castillo649dbf62015-11-05 09:24:53 +0000895based on mbed TLS, which can be found in
896`drivers/auth/mbedtls/mbedtls_crypto.c`. This library is registered in the
897authentication framework using the macro `REGISTER_CRYPTO_LIB()` and exports
898three functions:
Juan Castillod337aaa2015-06-10 15:27:52 +0100899
900```
901void init(void);
902int verify_signature(void *data_ptr, unsigned int data_len,
903 void *sig_ptr, unsigned int sig_len,
904 void *sig_alg, unsigned int sig_alg_len,
905 void *pk_ptr, unsigned int pk_len);
906int verify_hash(void *data_ptr, unsigned int data_len,
907 void *digest_info_ptr, unsigned int digest_info_len);
908```
909
910The key algorithm (rsa, ecdsa) must be specified in the build system using the
911`MBEDTLS_KEY_ALG` variable, so the Makefile can include the corresponding
912sources in the build.
913
914- - - - - - - - - - - - - - - - - - - - - - - - - -
915
916_Copyright (c) 2015, ARM Limited and Contributors. All rights reserved._
917
918
919[Trusted Board Boot]: ./trusted-board-boot.md
920[Platform Porting Guide]: ./porting-guide.md