blob: 38a1173dbf8d7ffa77f47f8357e3a1598ef2feff [file] [log] [blame]
Paul Beesleyfc9ee362019-03-07 15:47:15 +00001Authentication Framework & Chain of Trust
2=========================================
Douglas Raillardd7c21b72017-06-28 15:23:03 +01003
Dan Handley610e7e12018-03-01 18:44:00 +00004The aim of this document is to describe the authentication framework
5implemented in Trusted Firmware-A (TF-A). This framework fulfills the
6following requirements:
Douglas Raillardd7c21b72017-06-28 15:23:03 +01007
8#. It should be possible for a platform port to specify the Chain of Trust in
9 terms of certificate hierarchy and the mechanisms used to verify a
10 particular image/certificate.
11
12#. The framework should distinguish between:
13
14 - The mechanism used to encode and transport information, e.g. DER encoded
15 X.509v3 certificates to ferry Subject Public Keys, hashes and non-volatile
16 counters.
17
18 - The mechanism used to verify the transported information i.e. the
19 cryptographic libraries.
20
21The framework has been designed following a modular approach illustrated in the
22next diagram:
23
24::
25
26 +---------------+---------------+------------+
27 | Trusted | Trusted | Trusted |
28 | Firmware | Firmware | Firmware |
29 | Generic | IO Framework | Platform |
30 | Code i.e. | (IO) | Port |
31 | BL1/BL2 (GEN) | | (PP) |
32 +---------------+---------------+------------+
33 ^ ^ ^
34 | | |
35 v v v
36 +-----------+ +-----------+ +-----------+
37 | | | | | Image |
38 | Crypto | | Auth | | Parser |
39 | Module |<->| Module |<->| Module |
40 | (CM) | | (AM) | | (IPM) |
41 | | | | | |
42 +-----------+ +-----------+ +-----------+
43 ^ ^
44 | |
45 v v
46 +----------------+ +-----------------+
47 | Cryptographic | | Image Parser |
48 | Libraries (CL) | | Libraries (IPL) |
49 +----------------+ +-----------------+
50 | |
51 | |
52 | |
53 v v
54 +-----------------+
55 | Misc. Libs e.g. |
56 | ASN.1 decoder |
57 | |
58 +-----------------+
59
60 DIAGRAM 1.
61
62This document describes the inner details of the authentication framework and
63the abstraction mechanisms available to specify a Chain of Trust.
64
65Framework design
66----------------
67
68This section describes some aspects of the framework design and the rationale
69behind them. These aspects are key to verify a Chain of Trust.
70
71Chain of Trust
72~~~~~~~~~~~~~~
73
74A CoT is basically a sequence of authentication images which usually starts with
75a root of trust and culminates in a single data image. The following diagram
76illustrates how this maps to a CoT for the BL31 image described in the
Sandrine Bailleux30918422019-04-24 10:41:24 +020077`TBBR-Client specification`_.
Douglas Raillardd7c21b72017-06-28 15:23:03 +010078
79::
80
81 +------------------+ +-------------------+
82 | ROTPK/ROTPK Hash |------>| Trusted Key |
83 +------------------+ | Certificate |
84 | (Auth Image) |
85 /+-------------------+
86 / |
87 / |
88 / |
89 / |
90 L v
91 +------------------+ +-------------------+
92 | Trusted World |------>| BL31 Key |
93 | Public Key | | Certificate |
94 +------------------+ | (Auth Image) |
95 +-------------------+
96 / |
97 / |
98 / |
99 / |
100 / v
101 +------------------+ L +-------------------+
102 | BL31 Content |------>| BL31 Content |
103 | Certificate PK | | Certificate |
104 +------------------+ | (Auth Image) |
105 +-------------------+
106 / |
107 / |
108 / |
109 / |
110 / v
111 +------------------+ L +-------------------+
112 | BL31 Hash |------>| BL31 Image |
113 | | | (Data Image) |
114 +------------------+ | |
115 +-------------------+
116
117 DIAGRAM 2.
118
119The root of trust is usually a public key (ROTPK) that has been burnt in the
120platform and cannot be modified.
121
122Image types
123~~~~~~~~~~~
124
125Images in a CoT are categorised as authentication and data images. An
126authentication image contains information to authenticate a data image or
127another authentication image. A data image is usually a boot loader binary, but
128it could be any other data that requires authentication.
129
130Component responsibilities
131~~~~~~~~~~~~~~~~~~~~~~~~~~
132
133For every image in a Chain of Trust, the following high level operations are
134performed to verify it:
135
136#. Allocate memory for the image either statically or at runtime.
137
138#. Identify the image and load it in the allocated memory.
139
140#. Check the integrity of the image as per its type.
141
142#. Authenticate the image as per the cryptographic algorithms used.
143
144#. If the image is an authentication image, extract the information that will
145 be used to authenticate the next image in the CoT.
146
147In Diagram 1, each component is responsible for one or more of these operations.
148The responsibilities are briefly described below.
149
Dan Handley610e7e12018-03-01 18:44:00 +0000150TF-A Generic code and IO framework (GEN/IO)
151^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Douglas Raillardd7c21b72017-06-28 15:23:03 +0100152
153These components are responsible for initiating the authentication process for a
154particular image in BL1 or BL2. For each BL image that requires authentication,
155the Generic code asks recursively the Authentication module what is the parent
156image until either an authenticated image or the ROT is reached. Then the
Paul Beesley1fbc97b2019-01-11 18:26:51 +0000157Generic code calls the IO framework to load the image and calls the
Douglas Raillardd7c21b72017-06-28 15:23:03 +0100158Authentication module to authenticate it, following the CoT from ROT to Image.
159
Dan Handley610e7e12018-03-01 18:44:00 +0000160TF-A Platform Port (PP)
161^^^^^^^^^^^^^^^^^^^^^^^
Douglas Raillardd7c21b72017-06-28 15:23:03 +0100162
163The platform is responsible for:
164
165#. Specifying the CoT for each image that needs to be authenticated. Details of
166 how a CoT can be specified by the platform are explained later. The platform
167 also specifies the authentication methods and the parsing method used for
168 each image.
169
170#. Statically allocating memory for each parameter in each image which is
171 used for verifying the CoT, e.g. memory for public keys, hashes etc.
172
173#. Providing the ROTPK or a hash of it.
174
175#. Providing additional information to the IPM to enable it to identify and
176 extract authentication parameters contained in an image, e.g. if the
177 parameters are stored as X509v3 extensions, the corresponding OID must be
178 provided.
179
180#. Fulfill any other memory requirements of the IPM and the CM (not currently
181 described in this document).
182
183#. Export functions to verify an image which uses an authentication method that
184 cannot be interpreted by the CM, e.g. if an image has to be verified using a
185 NV counter, then the value of the counter to compare with can only be
186 provided by the platform.
187
188#. Export a custom IPM if a proprietary image format is being used (described
189 later).
190
191Authentication Module (AM)
192^^^^^^^^^^^^^^^^^^^^^^^^^^
193
194It is responsible for:
195
196#. Providing the necessary abstraction mechanisms to describe a CoT. Amongst
197 other things, the authentication and image parsing methods must be specified
198 by the PP in the CoT.
199
200#. Verifying the CoT passed by GEN by utilising functionality exported by the
201 PP, IPM and CM.
202
203#. Tracking which images have been verified. In case an image is a part of
204 multiple CoTs then it should be verified only once e.g. the Trusted World
205 Key Certificate in the TBBR-Client spec. contains information to verify
Sandrine Bailleux15530dd2019-02-08 15:26:36 +0100206 SCP_BL2, BL31, BL32 each of which have a separate CoT. (This
Douglas Raillardd7c21b72017-06-28 15:23:03 +0100207 responsibility has not been described in this document but should be
208 trivial to implement).
209
210#. Reusing memory meant for a data image to verify authentication images e.g.
211 in the CoT described in Diagram 2, each certificate can be loaded and
212 verified in the memory reserved by the platform for the BL31 image. By the
213 time BL31 (the data image) is loaded, all information to authenticate it
214 will have been extracted from the parent image i.e. BL31 content
215 certificate. It is assumed that the size of an authentication image will
216 never exceed the size of a data image. It should be possible to verify this
217 at build time using asserts.
218
219Cryptographic Module (CM)
220^^^^^^^^^^^^^^^^^^^^^^^^^
221
222The CM is responsible for providing an API to:
223
224#. Verify a digital signature.
225#. Verify a hash.
226
227The CM does not include any cryptography related code, but it relies on an
228external library to perform the cryptographic operations. A Crypto-Library (CL)
229linking the CM and the external library must be implemented. The following
230functions must be provided by the CL:
231
232.. code:: c
233
234 void (*init)(void);
235 int (*verify_signature)(void *data_ptr, unsigned int data_len,
236 void *sig_ptr, unsigned int sig_len,
237 void *sig_alg, unsigned int sig_alg_len,
238 void *pk_ptr, unsigned int pk_len);
Manish V Badarkhe149e8e02023-03-09 22:23:49 +0000239 int (*calc_hash)(enum crypto_md_algo alg, void *data_ptr,
240 unsigned int data_len,
241 unsigned char output[CRYPTO_MD_MAX_SIZE])
Douglas Raillardd7c21b72017-06-28 15:23:03 +0100242 int (*verify_hash)(void *data_ptr, unsigned int data_len,
243 void *digest_info_ptr, unsigned int digest_info_len);
244
245These functions are registered in the CM using the macro:
246
247.. code:: c
248
Manish V Badarkhe149e8e02023-03-09 22:23:49 +0000249 REGISTER_CRYPTO_LIB(_name,
250 _init,
251 _verify_signature,
252 _calc_hash,
253 _verify_hash);
Douglas Raillardd7c21b72017-06-28 15:23:03 +0100254
255``_name`` must be a string containing the name of the CL. This name is used for
256debugging purposes.
257
Manish V Badarkhe149e8e02023-03-09 22:23:49 +0000258Crypto module provides a function ``_calc_hash`` to calculate and
259return the hash of the given data using the provided hash algorithm.
260This function is mainly used in the ``MEASURED_BOOT`` and ``DRTM_SUPPORT``
261features to calculate the hashes of various images/data.
262
Douglas Raillardd7c21b72017-06-28 15:23:03 +0100263Image Parser Module (IPM)
264^^^^^^^^^^^^^^^^^^^^^^^^^
265
266The IPM is responsible for:
267
268#. Checking the integrity of each image loaded by the IO framework.
269#. Extracting parameters used for authenticating an image based upon a
270 description provided by the platform in the CoT descriptor.
271
272Images may have different formats (for example, authentication images could be
273x509v3 certificates, signed ELF files or any other platform specific format).
274The IPM allows to register an Image Parser Library (IPL) for every image format
275used in the CoT. This library must implement the specific methods to parse the
276image. The IPM obtains the image format from the CoT and calls the right IPL to
277check the image integrity and extract the authentication parameters.
278
279See Section "Describing the image parsing methods" for more details about the
280mechanism the IPM provides to define and register IPLs.
281
282Authentication methods
283~~~~~~~~~~~~~~~~~~~~~~
284
285The AM supports the following authentication methods:
286
287#. Hash
288#. Digital signature
289
290The platform may specify these methods in the CoT in case it decides to define
291a custom CoT instead of reusing a predefined one.
292
293If a data image uses multiple methods, then all the methods must be a part of
294the same CoT. The number and type of parameters are method specific. These
295parameters should be obtained from the parent image using the IPM.
296
297#. Hash
298
299 Parameters:
300
301 #. A pointer to data to hash
302 #. Length of the data
303 #. A pointer to the hash
304 #. Length of the hash
305
306 The hash will be represented by the DER encoding of the following ASN.1
307 type:
308
309 ::
310
311 DigestInfo ::= SEQUENCE {
312 digestAlgorithm DigestAlgorithmIdentifier,
313 digest Digest
314 }
315
316 This ASN.1 structure makes it possible to remove any assumption about the
317 type of hash algorithm used as this information accompanies the hash. This
318 should allow the Cryptography Library (CL) to support multiple hash
319 algorithm implementations.
320
321#. Digital Signature
322
323 Parameters:
324
325 #. A pointer to data to sign
326 #. Length of the data
327 #. Public Key Algorithm
328 #. Public Key value
329 #. Digital Signature Algorithm
330 #. Digital Signature value
331
332 The Public Key parameters will be represented by the DER encoding of the
333 following ASN.1 type:
334
335 ::
336
337 SubjectPublicKeyInfo ::= SEQUENCE {
338 algorithm AlgorithmIdentifier{PUBLIC-KEY,{PublicKeyAlgorithms}},
339 subjectPublicKey BIT STRING }
340
341 The Digital Signature Algorithm will be represented by the DER encoding of
342 the following ASN.1 types.
343
344 ::
345
346 AlgorithmIdentifier {ALGORITHM:IOSet } ::= SEQUENCE {
347 algorithm ALGORITHM.&id({IOSet}),
348 parameters ALGORITHM.&Type({IOSet}{@algorithm}) OPTIONAL
349 }
350
351 The digital signature will be represented by:
352
353 ::
354
355 signature ::= BIT STRING
356
357The authentication framework will use the image descriptor to extract all the
358information related to authentication.
359
360Specifying a Chain of Trust
361---------------------------
362
363A CoT can be described as a set of image descriptors linked together in a
364particular order. The order dictates the sequence in which they must be
365verified. Each image has a set of properties which allow the AM to verify it.
366These properties are described below.
367
368The PP is responsible for defining a single or multiple CoTs for a data image.
369Unless otherwise specified, the data structures described in the following
370sections are populated by the PP statically.
371
372Describing the image parsing methods
373~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
374
375The parsing method refers to the format of a particular image. For example, an
376authentication image that represents a certificate could be in the X.509v3
377format. A data image that represents a boot loader stage could be in raw binary
378or ELF format. The IPM supports three parsing methods. An image has to use one
379of the three methods described below. An IPL is responsible for interpreting a
380single parsing method. There has to be one IPL for every method used by the
381platform.
382
383#. Raw format: This format is effectively a nop as an image using this method
Dan Handley610e7e12018-03-01 18:44:00 +0000384 is treated as being in raw binary format e.g. boot loader images used by
385 TF-A. This method should only be used by data images.
Douglas Raillardd7c21b72017-06-28 15:23:03 +0100386
387#. X509V3 method: This method uses industry standards like X.509 to represent
388 PKI certificates (authentication images). It is expected that open source
389 libraries will be available which can be used to parse an image represented
390 by this method. Such libraries can be used to write the corresponding IPL
391 e.g. the X.509 parsing library code in mbed TLS.
392
393#. Platform defined method: This method caters for platform specific
394 proprietary standards to represent authentication or data images. For
395 example, The signature of a data image could be appended to the data image
396 raw binary. A header could be prepended to the combined blob to specify the
397 extents of each component. The platform will have to implement the
398 corresponding IPL to interpret such a format.
399
400The following enum can be used to define these three methods.
401
402.. code:: c
403
404 typedef enum img_type_enum {
405 IMG_RAW, /* Binary image */
406 IMG_PLAT, /* Platform specific format */
407 IMG_CERT, /* X509v3 certificate */
408 IMG_MAX_TYPES,
409 } img_type_t;
410
411An IPL must provide functions with the following prototypes:
412
413.. code:: c
414
415 void init(void);
416 int check_integrity(void *img, unsigned int img_len);
417 int get_auth_param(const auth_param_type_desc_t *type_desc,
418 void *img, unsigned int img_len,
419 void **param, unsigned int *param_len);
420
421An IPL for each type must be registered using the following macro:
422
Paul Beesley493e3492019-03-13 15:11:04 +0000423.. code:: c
Douglas Raillardd7c21b72017-06-28 15:23:03 +0100424
425 REGISTER_IMG_PARSER_LIB(_type, _name, _init, _check_int, _get_param)
426
427- ``_type``: one of the types described above.
428- ``_name``: a string containing the IPL name for debugging purposes.
429- ``_init``: initialization function pointer.
430- ``_check_int``: check image integrity function pointer.
Paul Beesley1fbc97b2019-01-11 18:26:51 +0000431- ``_get_param``: extract authentication parameter function pointer.
Douglas Raillardd7c21b72017-06-28 15:23:03 +0100432
433The ``init()`` function will be used to initialize the IPL.
434
435The ``check_integrity()`` function is passed a pointer to the memory where the
436image has been loaded by the IO framework and the image length. It should ensure
437that the image is in the format corresponding to the parsing method and has not
438been tampered with. For example, RFC-2459 describes a validation sequence for an
439X.509 certificate.
440
441The ``get_auth_param()`` function is passed a parameter descriptor containing
442information about the parameter (``type_desc`` and ``cookie``) to identify and
443extract the data corresponding to that parameter from an image. This data will
444be used to verify either the current or the next image in the CoT sequence.
445
446Each image in the CoT will specify the parsing method it uses. This information
447will be used by the IPM to find the right parser descriptor for the image.
448
449Describing the authentication method(s)
450~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
451
452As part of the CoT, each image has to specify one or more authentication methods
453which will be used to verify it. As described in the Section "Authentication
454methods", there are three methods supported by the AM.
455
456.. code:: c
457
458 typedef enum {
459 AUTH_METHOD_NONE,
460 AUTH_METHOD_HASH,
461 AUTH_METHOD_SIG,
462 AUTH_METHOD_NUM
463 } auth_method_type_t;
464
465The AM defines the type of each parameter used by an authentication method. It
466uses this information to:
467
468#. Specify to the ``get_auth_param()`` function exported by the IPM, which
469 parameter should be extracted from an image.
470
471#. Correctly marshall the parameters while calling the verification function
472 exported by the CM and PP.
473
474#. Extract authentication parameters from a parent image in order to verify a
475 child image e.g. to verify the certificate image, the public key has to be
476 obtained from the parent image.
477
478.. code:: c
479
480 typedef enum {
481 AUTH_PARAM_NONE,
482 AUTH_PARAM_RAW_DATA, /* Raw image data */
483 AUTH_PARAM_SIG, /* The image signature */
484 AUTH_PARAM_SIG_ALG, /* The image signature algorithm */
485 AUTH_PARAM_HASH, /* A hash (including the algorithm) */
486 AUTH_PARAM_PUB_KEY, /* A public key */
487 } auth_param_type_t;
488
489The AM defines the following structure to identify an authentication parameter
490required to verify an image.
491
492.. code:: c
493
494 typedef struct auth_param_type_desc_s {
495 auth_param_type_t type;
496 void *cookie;
497 } auth_param_type_desc_t;
498
499``cookie`` is used by the platform to specify additional information to the IPM
500which enables it to uniquely identify the parameter that should be extracted
501from an image. For example, the hash of a BL3x image in its corresponding
502content certificate is stored in an X509v3 custom extension field. An extension
503field can only be identified using an OID. In this case, the ``cookie`` could
504contain the pointer to the OID defined by the platform for the hash extension
505field while the ``type`` field could be set to ``AUTH_PARAM_HASH``. A value of 0 for
506the ``cookie`` field means that it is not used.
507
508For each method, the AM defines a structure with the parameters required to
509verify the image.
510
511.. code:: c
512
513 /*
514 * Parameters for authentication by hash matching
515 */
516 typedef struct auth_method_param_hash_s {
517 auth_param_type_desc_t *data; /* Data to hash */
518 auth_param_type_desc_t *hash; /* Hash to match with */
519 } auth_method_param_hash_t;
520
521 /*
522 * Parameters for authentication by signature
523 */
524 typedef struct auth_method_param_sig_s {
525 auth_param_type_desc_t *pk; /* Public key */
526 auth_param_type_desc_t *sig; /* Signature to check */
527 auth_param_type_desc_t *alg; /* Signature algorithm */
528 auth_param_type_desc_t *tbs; /* Data signed */
529 } auth_method_param_sig_t;
530
531The AM defines the following structure to describe an authentication method for
532verifying an image
533
534.. code:: c
535
536 /*
537 * Authentication method descriptor
538 */
539 typedef struct auth_method_desc_s {
540 auth_method_type_t type;
541 union {
542 auth_method_param_hash_t hash;
543 auth_method_param_sig_t sig;
544 } param;
545 } auth_method_desc_t;
546
547Using the method type specified in the ``type`` field, the AM finds out what field
548needs to access within the ``param`` union.
549
550Storing Authentication parameters
551~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
552
553A parameter described by ``auth_param_type_desc_t`` to verify an image could be
554obtained from either the image itself or its parent image. The memory allocated
555for loading the parent image will be reused for loading the child image. Hence
556parameters which are obtained from the parent for verifying a child image need
557to have memory allocated for them separately where they can be stored. This
558memory must be statically allocated by the platform port.
559
560The AM defines the following structure to store the data corresponding to an
561authentication parameter.
562
563.. code:: c
564
565 typedef struct auth_param_data_desc_s {
566 void *auth_param_ptr;
567 unsigned int auth_param_len;
568 } auth_param_data_desc_t;
569
570The ``auth_param_ptr`` field is initialized by the platform. The ``auth_param_len``
571field is used to specify the length of the data in the memory.
572
573For parameters that can be obtained from the child image itself, the IPM is
574responsible for populating the ``auth_param_ptr`` and ``auth_param_len`` fields
575while executing the ``img_get_auth_param()`` function.
576
577The AM defines the following structure to enable an image to describe the
578parameters that should be extracted from it and used to verify the next image
579(child) in a CoT.
580
581.. code:: c
582
583 typedef struct auth_param_desc_s {
584 auth_param_type_desc_t type_desc;
585 auth_param_data_desc_t data;
586 } auth_param_desc_t;
587
588Describing an image in a CoT
589~~~~~~~~~~~~~~~~~~~~~~~~~~~~
590
591An image in a CoT is a consolidation of the following aspects of a CoT described
592above.
593
594#. A unique identifier specified by the platform which allows the IO framework
595 to locate the image in a FIP and load it in the memory reserved for the data
596 image in the CoT.
597
598#. A parsing method which is used by the AM to find the appropriate IPM.
599
600#. Authentication methods and their parameters as described in the previous
601 section. These are used to verify the current image.
602
603#. Parameters which are used to verify the next image in the current CoT. These
604 parameters are specified only by authentication images and can be extracted
605 from the current image once it has been verified.
606
607The following data structure describes an image in a CoT.
608
609.. code:: c
610
611 typedef struct auth_img_desc_s {
612 unsigned int img_id;
613 const struct auth_img_desc_s *parent;
614 img_type_t img_type;
Joel Hutton1fdcc902019-02-22 16:40:16 +0000615 const auth_method_desc_t *const img_auth_methods;
616 const auth_param_desc_t *const authenticated_data;
Douglas Raillardd7c21b72017-06-28 15:23:03 +0100617 } auth_img_desc_t;
618
Joel Hutton1fdcc902019-02-22 16:40:16 +0000619A CoT is defined as an array of pointers to ``auth_image_desc_t`` structures
620linked together by the ``parent`` field. Those nodes with no parent must be
621authenticated using the ROTPK stored in the platform.
Douglas Raillardd7c21b72017-06-28 15:23:03 +0100622
623Implementation example
624----------------------
625
626This section is a detailed guide explaining a trusted boot implementation using
627the authentication framework. This example corresponds to the Applicative
628Functional Mode (AFM) as specified in the TBBR-Client document. It is
629recommended to read this guide along with the source code.
630
631The TBBR CoT
632~~~~~~~~~~~~
633
Manish V Badarkhe043fd622020-05-16 16:36:39 +0100634CoT specific to BL1 and BL2 can be found in ``drivers/auth/tbbr/tbbr_cot_bl1.c``
635and ``drivers/auth/tbbr/tbbr_cot_bl2.c`` respectively. The common CoT used across
636BL1 and BL2 can be found in ``drivers/auth/tbbr/tbbr_cot_common.c``.
637This CoT consists of an array of pointers to image descriptors and it is
638registered in the framework using the macro ``REGISTER_COT(cot_desc)``, where
639``cot_desc`` must be the name of the array (passing a pointer or any other
640type of indirection will cause the registration process to fail).
Douglas Raillardd7c21b72017-06-28 15:23:03 +0100641
Joel Hutton1fdcc902019-02-22 16:40:16 +0000642The number of images participating in the boot process depends on the CoT.
643There is, however, a minimum set of images that are mandatory in TF-A and thus
644all CoTs must present:
Douglas Raillardd7c21b72017-06-28 15:23:03 +0100645
646- ``BL2``
647- ``SCP_BL2`` (platform specific)
648- ``BL31``
649- ``BL32`` (optional)
650- ``BL33``
651
652The TBBR specifies the additional certificates that must accompany these images
653for a proper authentication. Details about the TBBR CoT may be found in the
Paul Beesleyf8640672019-04-12 14:19:42 +0100654:ref:`Trusted Board Boot` document.
Douglas Raillardd7c21b72017-06-28 15:23:03 +0100655
Paul Beesleyf8640672019-04-12 14:19:42 +0100656Following the :ref:`Porting Guide`, a platform must provide unique
Douglas Raillardd7c21b72017-06-28 15:23:03 +0100657identifiers for all the images and certificates that will be loaded during the
658boot process. If a platform is using the TBBR as a reference for trusted boot,
659these identifiers can be obtained from ``include/common/tbbr/tbbr_img_def.h``.
Dan Handley610e7e12018-03-01 18:44:00 +0000660Arm platforms include this file in ``include/plat/arm/common/arm_def.h``. Other
Douglas Raillardd7c21b72017-06-28 15:23:03 +0100661platforms may also include this file or provide their own identifiers.
662
663**Important**: the authentication module uses these identifiers to index the
664CoT array, so the descriptors location in the array must match the identifiers.
665
666Each image descriptor must specify:
667
668- ``img_id``: the corresponding image unique identifier defined by the platform.
669- ``img_type``: the image parser module uses the image type to call the proper
670 parsing library to check the image integrity and extract the required
671 authentication parameters. Three types of images are currently supported:
672
673 - ``IMG_RAW``: image is a raw binary. No parsing functions are available,
674 other than reading the whole image.
675 - ``IMG_PLAT``: image format is platform specific. The platform may use this
676 type for custom images not directly supported by the authentication
677 framework.
678 - ``IMG_CERT``: image is an x509v3 certificate.
679
680- ``parent``: pointer to the parent image descriptor. The parent will contain
681 the information required to authenticate the current image. If the parent
682 is NULL, the authentication parameters will be obtained from the platform
683 (i.e. the BL2 and Trusted Key certificates are signed with the ROT private
684 key, whose public part is stored in the platform).
Joel Hutton1fdcc902019-02-22 16:40:16 +0000685- ``img_auth_methods``: this points to an array which defines the
686 authentication methods that must be checked to consider an image
687 authenticated. Each method consists of a type and a list of parameter
688 descriptors. A parameter descriptor consists of a type and a cookie which
689 will point to specific information required to extract that parameter from
690 the image (i.e. if the parameter is stored in an x509v3 extension, the
691 cookie will point to the extension OID). Depending on the method type, a
692 different number of parameters must be specified. This pointer should not be
693 NULL.
Douglas Raillardd7c21b72017-06-28 15:23:03 +0100694 Supported methods are:
695
696 - ``AUTH_METHOD_HASH``: the hash of the image must match the hash extracted
697 from the parent image. The following parameter descriptors must be
698 specified:
699
700 - ``data``: data to be hashed (obtained from current image)
701 - ``hash``: reference hash (obtained from parent image)
702
703 - ``AUTH_METHOD_SIG``: the image (usually a certificate) must be signed with
704 the private key whose public part is extracted from the parent image (or
705 the platform if the parent is NULL). The following parameter descriptors
706 must be specified:
707
708 - ``pk``: the public key (obtained from parent image)
709 - ``sig``: the digital signature (obtained from current image)
710 - ``alg``: the signature algorithm used (obtained from current image)
711 - ``data``: the data to be signed (obtained from current image)
712
Joel Hutton1fdcc902019-02-22 16:40:16 +0000713- ``authenticated_data``: this array pointer indicates what authentication
714 parameters must be extracted from an image once it has been authenticated.
715 Each parameter consists of a parameter descriptor and the buffer
716 address/size to store the parameter. The CoT is responsible for allocating
717 the required memory to store the parameters. This pointer may be NULL.
Douglas Raillardd7c21b72017-06-28 15:23:03 +0100718
Manish V Badarkhe043fd622020-05-16 16:36:39 +0100719In the ``tbbr_cot*.c`` file, a set of buffers are allocated to store the parameters
Douglas Raillardd7c21b72017-06-28 15:23:03 +0100720extracted from the certificates. In the case of the TBBR CoT, these parameters
Justin Chadwell82b06b32019-07-29 17:18:21 +0100721are hashes and public keys. In DER format, an RSA-4096 public key requires 550
Douglas Raillardd7c21b72017-06-28 15:23:03 +0100722bytes, and a hash requires 51 bytes. Depending on the CoT and the authentication
723process, some of the buffers may be reused at different stages during the boot.
724
725Next in that file, the parameter descriptors are defined. These descriptors will
726be used to extract the parameter data from the corresponding image.
727
728Example: the BL31 Chain of Trust
729^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
730
731Four image descriptors form the BL31 Chain of Trust:
732
Sandrine Bailleuxf5a91002019-02-08 10:50:28 +0100733.. code:: c
Douglas Raillardd7c21b72017-06-28 15:23:03 +0100734
Joel Hutton1fdcc902019-02-22 16:40:16 +0000735 static const auth_img_desc_t trusted_key_cert = {
736 .img_id = TRUSTED_KEY_CERT_ID,
737 .img_type = IMG_CERT,
738 .parent = NULL,
739 .img_auth_methods = (const auth_method_desc_t[AUTH_METHOD_NUM]) {
740 [0] = {
741 .type = AUTH_METHOD_SIG,
742 .param.sig = {
743 .pk = &subject_pk,
744 .sig = &sig,
745 .alg = &sig_alg,
746 .data = &raw_data
747 }
748 },
749 [1] = {
750 .type = AUTH_METHOD_NV_CTR,
751 .param.nv_ctr = {
752 .cert_nv_ctr = &trusted_nv_ctr,
753 .plat_nv_ctr = &trusted_nv_ctr
754 }
755 }
Douglas Raillardd7c21b72017-06-28 15:23:03 +0100756 },
Joel Hutton1fdcc902019-02-22 16:40:16 +0000757 .authenticated_data = (const auth_param_desc_t[COT_MAX_VERIFIED_PARAMS]) {
758 [0] = {
759 .type_desc = &trusted_world_pk,
760 .data = {
761 .ptr = (void *)trusted_world_pk_buf,
762 .len = (unsigned int)PK_DER_LEN
763 }
764 },
765 [1] = {
766 .type_desc = &non_trusted_world_pk,
767 .data = {
768 .ptr = (void *)non_trusted_world_pk_buf,
769 .len = (unsigned int)PK_DER_LEN
770 }
771 }
Douglas Raillardd7c21b72017-06-28 15:23:03 +0100772 }
Joel Hutton1fdcc902019-02-22 16:40:16 +0000773 };
774 static const auth_img_desc_t soc_fw_key_cert = {
775 .img_id = SOC_FW_KEY_CERT_ID,
776 .img_type = IMG_CERT,
777 .parent = &trusted_key_cert,
778 .img_auth_methods = (const auth_method_desc_t[AUTH_METHOD_NUM]) {
779 [0] = {
780 .type = AUTH_METHOD_SIG,
781 .param.sig = {
782 .pk = &trusted_world_pk,
783 .sig = &sig,
784 .alg = &sig_alg,
785 .data = &raw_data
786 }
787 },
788 [1] = {
789 .type = AUTH_METHOD_NV_CTR,
790 .param.nv_ctr = {
791 .cert_nv_ctr = &trusted_nv_ctr,
792 .plat_nv_ctr = &trusted_nv_ctr
793 }
794 }
795 },
796 .authenticated_data = (const auth_param_desc_t[COT_MAX_VERIFIED_PARAMS]) {
797 [0] = {
798 .type_desc = &soc_fw_content_pk,
799 .data = {
800 .ptr = (void *)content_pk_buf,
801 .len = (unsigned int)PK_DER_LEN
802 }
803 }
Douglas Raillardd7c21b72017-06-28 15:23:03 +0100804 }
Joel Hutton1fdcc902019-02-22 16:40:16 +0000805 };
806 static const auth_img_desc_t soc_fw_content_cert = {
807 .img_id = SOC_FW_CONTENT_CERT_ID,
808 .img_type = IMG_CERT,
809 .parent = &soc_fw_key_cert,
810 .img_auth_methods = (const auth_method_desc_t[AUTH_METHOD_NUM]) {
811 [0] = {
812 .type = AUTH_METHOD_SIG,
813 .param.sig = {
814 .pk = &soc_fw_content_pk,
815 .sig = &sig,
816 .alg = &sig_alg,
817 .data = &raw_data
818 }
819 },
820 [1] = {
821 .type = AUTH_METHOD_NV_CTR,
822 .param.nv_ctr = {
823 .cert_nv_ctr = &trusted_nv_ctr,
824 .plat_nv_ctr = &trusted_nv_ctr
825 }
826 }
827 },
828 .authenticated_data = (const auth_param_desc_t[COT_MAX_VERIFIED_PARAMS]) {
829 [0] = {
830 .type_desc = &soc_fw_hash,
831 .data = {
832 .ptr = (void *)soc_fw_hash_buf,
833 .len = (unsigned int)HASH_DER_LEN
834 }
835 },
836 [1] = {
837 .type_desc = &soc_fw_config_hash,
838 .data = {
839 .ptr = (void *)soc_fw_config_hash_buf,
840 .len = (unsigned int)HASH_DER_LEN
841 }
842 }
Douglas Raillardd7c21b72017-06-28 15:23:03 +0100843 }
Joel Hutton1fdcc902019-02-22 16:40:16 +0000844 };
845 static const auth_img_desc_t bl31_image = {
846 .img_id = BL31_IMAGE_ID,
847 .img_type = IMG_RAW,
848 .parent = &soc_fw_content_cert,
849 .img_auth_methods = (const auth_method_desc_t[AUTH_METHOD_NUM]) {
850 [0] = {
851 .type = AUTH_METHOD_HASH,
852 .param.hash = {
853 .data = &raw_data,
854 .hash = &soc_fw_hash
855 }
856 }
Douglas Raillardd7c21b72017-06-28 15:23:03 +0100857 }
Joel Hutton1fdcc902019-02-22 16:40:16 +0000858 };
Douglas Raillardd7c21b72017-06-28 15:23:03 +0100859
860The **Trusted Key certificate** is signed with the ROT private key and contains
861the Trusted World public key and the Non-Trusted World public key as x509v3
862extensions. This must be specified in the image descriptor using the
863``img_auth_methods`` and ``authenticated_data`` arrays, respectively.
864
865The Trusted Key certificate is authenticated by checking its digital signature
866using the ROTPK. Four parameters are required to check a signature: the public
867key, the algorithm, the signature and the data that has been signed. Therefore,
868four parameter descriptors must be specified with the authentication method:
869
870- ``subject_pk``: parameter descriptor of type ``AUTH_PARAM_PUB_KEY``. This type
871 is used to extract a public key from the parent image. If the cookie is an
872 OID, the key is extracted from the corresponding x509v3 extension. If the
873 cookie is NULL, the subject public key is retrieved. In this case, because
874 the parent image is NULL, the public key is obtained from the platform
875 (this key will be the ROTPK).
876- ``sig``: parameter descriptor of type ``AUTH_PARAM_SIG``. It is used to extract
877 the signature from the certificate.
878- ``sig_alg``: parameter descriptor of type ``AUTH_PARAM_SIG``. It is used to
879 extract the signature algorithm from the certificate.
880- ``raw_data``: parameter descriptor of type ``AUTH_PARAM_RAW_DATA``. It is used
881 to extract the data to be signed from the certificate.
882
883Once the signature has been checked and the certificate authenticated, the
884Trusted World public key needs to be extracted from the certificate. A new entry
885is created in the ``authenticated_data`` array for that purpose. In that entry,
886the corresponding parameter descriptor must be specified along with the buffer
Sandrine Bailleuxaf0f9602020-03-02 13:09:22 +0100887address to store the parameter value. In this case, the ``trusted_world_pk``
888descriptor is used to extract the public key from an x509v3 extension with OID
Douglas Raillardd7c21b72017-06-28 15:23:03 +0100889``TRUSTED_WORLD_PK_OID``. The BL31 key certificate will use this descriptor as
890parameter in the signature authentication method. The key is stored in the
Sandrine Bailleuxaf0f9602020-03-02 13:09:22 +0100891``trusted_world_pk_buf`` buffer.
Douglas Raillardd7c21b72017-06-28 15:23:03 +0100892
893The **BL31 Key certificate** is authenticated by checking its digital signature
894using the Trusted World public key obtained previously from the Trusted Key
895certificate. In the image descriptor, we specify a single authentication method
Sandrine Bailleuxaf0f9602020-03-02 13:09:22 +0100896by signature whose public key is the ``trusted_world_pk``. Once this certificate
897has been authenticated, we have to extract the BL31 public key, stored in the
898extension specified by ``soc_fw_content_pk``. This key will be copied to the
899``content_pk_buf`` buffer.
Douglas Raillardd7c21b72017-06-28 15:23:03 +0100900
901The **BL31 certificate** is authenticated by checking its digital signature
902using the BL31 public key obtained previously from the BL31 Key certificate.
Sandrine Bailleuxaf0f9602020-03-02 13:09:22 +0100903We specify the authentication method using ``soc_fw_content_pk`` as public key.
Douglas Raillardd7c21b72017-06-28 15:23:03 +0100904After authentication, we need to extract the BL31 hash, stored in the extension
Sandrine Bailleuxaf0f9602020-03-02 13:09:22 +0100905specified by ``soc_fw_hash``. This hash will be copied to the
906``soc_fw_hash_buf`` buffer.
Douglas Raillardd7c21b72017-06-28 15:23:03 +0100907
908The **BL31 image** is authenticated by calculating its hash and matching it
909with the hash obtained from the BL31 certificate. The image descriptor contains
910a single authentication method by hash. The parameters to the hash method are
Sandrine Bailleuxaf0f9602020-03-02 13:09:22 +0100911the reference hash, ``soc_fw_hash``, and the data to be hashed. In this case,
912it is the whole image, so we specify ``raw_data``.
Douglas Raillardd7c21b72017-06-28 15:23:03 +0100913
914The image parser library
915~~~~~~~~~~~~~~~~~~~~~~~~
916
917The image parser module relies on libraries to check the image integrity and
918extract the authentication parameters. The number and type of parser libraries
919depend on the images used in the CoT. Raw images do not need a library, so
920only an x509v3 library is required for the TBBR CoT.
921
Dan Handley610e7e12018-03-01 18:44:00 +0000922Arm platforms will use an x509v3 library based on mbed TLS. This library may be
Douglas Raillardd7c21b72017-06-28 15:23:03 +0100923found in ``drivers/auth/mbedtls/mbedtls_x509_parser.c``. It exports three
924functions:
925
926.. code:: c
927
928 void init(void);
929 int check_integrity(void *img, unsigned int img_len);
930 int get_auth_param(const auth_param_type_desc_t *type_desc,
931 void *img, unsigned int img_len,
932 void **param, unsigned int *param_len);
933
934The library is registered in the framework using the macro
935``REGISTER_IMG_PARSER_LIB()``. Each time the image parser module needs to access
936an image of type ``IMG_CERT``, it will call the corresponding function exported
937in this file.
938
939The build system must be updated to include the corresponding library and
Dan Handley610e7e12018-03-01 18:44:00 +0000940mbed TLS sources. Arm platforms use the ``arm_common.mk`` file to pull the
Douglas Raillardd7c21b72017-06-28 15:23:03 +0100941sources.
942
943The cryptographic library
944~~~~~~~~~~~~~~~~~~~~~~~~~
945
946The cryptographic module relies on a library to perform the required operations,
Dan Handley610e7e12018-03-01 18:44:00 +0000947i.e. verify a hash or a digital signature. Arm platforms will use a library
Douglas Raillardd7c21b72017-06-28 15:23:03 +0100948based on mbed TLS, which can be found in
949``drivers/auth/mbedtls/mbedtls_crypto.c``. This library is registered in the
950authentication framework using the macro ``REGISTER_CRYPTO_LIB()`` and exports
Manish V Badarkhe149e8e02023-03-09 22:23:49 +0000951below functions:
Douglas Raillardd7c21b72017-06-28 15:23:03 +0100952
953.. code:: c
954
955 void init(void);
956 int verify_signature(void *data_ptr, unsigned int data_len,
957 void *sig_ptr, unsigned int sig_len,
958 void *sig_alg, unsigned int sig_alg_len,
959 void *pk_ptr, unsigned int pk_len);
Manish V Badarkhe149e8e02023-03-09 22:23:49 +0000960 int crypto_mod_calc_hash(enum crypto_md_algo alg, void *data_ptr,
961 unsigned int data_len,
962 unsigned char output[CRYPTO_MD_MAX_SIZE])
Douglas Raillardd7c21b72017-06-28 15:23:03 +0100963 int verify_hash(void *data_ptr, unsigned int data_len,
964 void *digest_info_ptr, unsigned int digest_info_len);
Sumit Gargc0c369c2019-11-15 18:47:53 +0530965 int auth_decrypt(enum crypto_dec_algo dec_algo, void *data_ptr,
966 size_t len, const void *key, unsigned int key_len,
967 unsigned int key_flags, const void *iv,
968 unsigned int iv_len, const void *tag,
969 unsigned int tag_len)
Douglas Raillardd7c21b72017-06-28 15:23:03 +0100970
Justin Chadwell82b06b32019-07-29 17:18:21 +0100971The mbedTLS library algorithm support is configured by both the
972``TF_MBEDTLS_KEY_ALG`` and ``TF_MBEDTLS_KEY_SIZE`` variables.
973
974- ``TF_MBEDTLS_KEY_ALG`` can take in 3 values: `rsa`, `ecdsa` or `rsa+ecdsa`.
975 This variable allows the Makefile to include the corresponding sources in
976 the build for the various algorithms. Setting the variable to `rsa+ecdsa`
977 enables support for both rsa and ecdsa algorithms in the mbedTLS library.
978
979- ``TF_MBEDTLS_KEY_SIZE`` sets the supported RSA key size for TFA. Valid values
980 include 1024, 2048, 3072 and 4096.
Douglas Raillardd7c21b72017-06-28 15:23:03 +0100981
Sumit Gargc0c369c2019-11-15 18:47:53 +0530982- ``TF_MBEDTLS_USE_AES_GCM`` enables the authenticated decryption support based
983 on AES-GCM algorithm. Valid values are 0 and 1.
984
Paul Beesleyba3ed402019-03-13 16:20:44 +0000985.. note::
986 If code size is a concern, the build option ``MBEDTLS_SHA256_SMALLER`` can
987 be defined in the platform Makefile. It will make mbed TLS use an
988 implementation of SHA-256 with smaller memory footprint (~1.5 KB less) but
989 slower (~30%).
Douglas Raillardd7c21b72017-06-28 15:23:03 +0100990
991--------------
992
Manish V Badarkhe149e8e02023-03-09 22:23:49 +0000993*Copyright (c) 2017-2023, Arm Limited and Contributors. All rights reserved.*
Douglas Raillardd7c21b72017-06-28 15:23:03 +0100994
Sandrine Bailleux30918422019-04-24 10:41:24 +0200995.. _TBBR-Client specification: https://developer.arm.com/docs/den0006/latest/trusted-board-boot-requirements-client-tbbr-client-armv8-a