| < draft-ietf-suit-manifest-01.txt | draft-ietf-suit-manifest-02.txt > | |||
|---|---|---|---|---|
| SUIT B. Moran | SUIT B. Moran | |||
| Internet-Draft H. Tschofenig | Internet-Draft H. Tschofenig | |||
| Intended status: Informational Arm Limited | Intended status: Standards Track Arm Limited | |||
| Expires: April 30, 2020 H. Birkholz | Expires: May 7, 2020 H. Birkholz | |||
| Fraunhofer SIT | Fraunhofer SIT | |||
| October 28, 2019 | November 04, 2019 | |||
| SUIT CBOR manifest serialisation format | A Concise Binary Object Representation (CBOR)-based Serialization Format | |||
| draft-ietf-suit-manifest-01 | for the Software Updates for Internet of Things (SUIT) Manifest | |||
| draft-ietf-suit-manifest-02 | ||||
| Abstract | Abstract | |||
| This specification describes the format of a manifest. A manifest is | This specification describes the format of a manifest. A manifest is | |||
| a bundle of metadata about the firmware for an IoT device, where to | a bundle of metadata about the firmware for an IoT device, where to | |||
| find the firmware, the devices to which it applies, and cryptographic | find the firmware, the devices to which it applies, and cryptographic | |||
| information protecting the manifest. | information protecting the manifest. | |||
| Status of This Memo | Status of This Memo | |||
| skipping to change at page 1, line 35 ¶ | skipping to change at page 1, line 36 ¶ | |||
| Internet-Drafts are working documents of the Internet Engineering | Internet-Drafts are working documents of the Internet Engineering | |||
| Task Force (IETF). Note that other groups may also distribute | Task Force (IETF). Note that other groups may also distribute | |||
| working documents as Internet-Drafts. The list of current Internet- | working documents as Internet-Drafts. The list of current Internet- | |||
| Drafts is at https://datatracker.ietf.org/drafts/current/. | Drafts is at https://datatracker.ietf.org/drafts/current/. | |||
| Internet-Drafts are draft documents valid for a maximum of six months | Internet-Drafts are draft documents valid for a maximum of six months | |||
| and may be updated, replaced, or obsoleted by other documents at any | and may be updated, replaced, or obsoleted by other documents at any | |||
| time. It is inappropriate to use Internet-Drafts as reference | time. It is inappropriate to use Internet-Drafts as reference | |||
| material or to cite them other than as "work in progress." | material or to cite them other than as "work in progress." | |||
| This Internet-Draft will expire on April 30, 2020. | This Internet-Draft will expire on May 7, 2020. | |||
| Copyright Notice | Copyright Notice | |||
| Copyright (c) 2019 IETF Trust and the persons identified as the | Copyright (c) 2019 IETF Trust and the persons identified as the | |||
| document authors. All rights reserved. | document authors. All rights reserved. | |||
| This document is subject to BCP 78 and the IETF Trust's Legal | This document is subject to BCP 78 and the IETF Trust's Legal | |||
| Provisions Relating to IETF Documents | Provisions Relating to IETF Documents | |||
| (https://trustee.ietf.org/license-info) in effect on the date of | (https://trustee.ietf.org/license-info) in effect on the date of | |||
| publication of this document. Please review these documents | publication of this document. Please review these documents | |||
| skipping to change at page 2, line 21 ¶ | skipping to change at page 2, line 21 ¶ | |||
| modifications of such material outside the IETF Standards Process. | modifications of such material outside the IETF Standards Process. | |||
| Without obtaining an adequate license from the person(s) controlling | Without obtaining an adequate license from the person(s) controlling | |||
| the copyright in such materials, this document may not be modified | the copyright in such materials, this document may not be modified | |||
| outside the IETF Standards Process, and derivative works of it may | outside the IETF Standards Process, and derivative works of it may | |||
| not be created outside the IETF Standards Process, except to format | not be created outside the IETF Standards Process, except to format | |||
| it for publication as an RFC or to translate it into languages other | it for publication as an RFC or to translate it into languages other | |||
| than English. | than English. | |||
| Table of Contents | Table of Contents | |||
| 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 3 | 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 4 | |||
| 2. Conventions and Terminology . . . . . . . . . . . . . . . . . 4 | 2. Conventions and Terminology . . . . . . . . . . . . . . . . . 5 | |||
| 3. Distributing firmware . . . . . . . . . . . . . . . . . . . . 5 | 3. How to use this document . . . . . . . . . . . . . . . . . . 6 | |||
| 4. Workflow of a device applying a firmware update . . . . . . . 5 | 4. Background . . . . . . . . . . . . . . . . . . . . . . . . . 6 | |||
| 5. SUIT manifest goals . . . . . . . . . . . . . . . . . . . . . 6 | 4.1. Landscape . . . . . . . . . . . . . . . . . . . . . . . . 6 | |||
| 6. SUIT manifest design overview . . . . . . . . . . . . . . . . 7 | 4.2. Update Workflow Model . . . . . . . . . . . . . . . . . . 7 | |||
| 6.1. Manifest Design Evaluation . . . . . . . . . . . . . . . 8 | 4.3. SUIT Manifest goals . . . . . . . . . . . . . . . . . . . 8 | |||
| 6.2. Severable Elements . . . . . . . . . . . . . . . . . . . 9 | 4.4. SUIT manifest design summary . . . . . . . . . . . . . . 9 | |||
| 6.3. Conventions . . . . . . . . . . . . . . . . . . . . . . . 9 | 5. Interpreter Behaviour . . . . . . . . . . . . . . . . . . . . 10 | |||
| 6.4. Payloads . . . . . . . . . . . . . . . . . . . . . . . . 9 | 5.1. Interpreter Setup . . . . . . . . . . . . . . . . . . . . 10 | |||
| 7. Manifest Structure . . . . . . . . . . . . . . . . . . . . . 10 | 5.2. Required Checks . . . . . . . . . . . . . . . . . . . . . 11 | |||
| 7.1. Outer wrapper . . . . . . . . . . . . . . . . . . . . . . 11 | 5.3. Interpreter fundamental properties . . . . . . . . . . . 12 | |||
| 7.2. Manifest . . . . . . . . . . . . . . . . . . . . . . . . 13 | 5.4. Abstract Machine Description . . . . . . . . . . . . . . 12 | |||
| 7.3. SUIT_Dependency . . . . . . . . . . . . . . . . . . . . . 16 | 5.4.1. Parameters . . . . . . . . . . . . . . . . . . . . . 13 | |||
| 7.4. SUIT_Component_Reference . . . . . . . . . . . . . . . . 17 | 5.4.2. Commands . . . . . . . . . . . . . . . . . . . . . . 13 | |||
| 7.5. Manifest Parameters . . . . . . . . . . . . . . . . . . . 17 | 5.4.3. Command Behaviour . . . . . . . . . . . . . . . . . . 15 | |||
| 7.5.1. SUIT_Parameter_Strict_Order . . . . . . . . . . . . . 19 | 5.5. Serialized Processing Interpreter . . . . . . . . . . . . 16 | |||
| 7.5.2. SUIT_Parameter_Coerce_Condition_Failure . . . . . . . 20 | 5.6. Parallel Processing Interpreter . . . . . . . . . . . . . 16 | |||
| 7.6. SUIT_Parameter_Encryption_Info . . . . . . . . . . . . . 20 | 5.7. Processing Dependencies . . . . . . . . . . . . . . . . . 17 | |||
| 7.7. SUIT_Parameter_Compression_Info . . . . . . . . . . . . . 20 | 6. Creating Manifests . . . . . . . . . . . . . . . . . . . . . 17 | |||
| 7.8. SUIT_Parameter_Unpack_Info . . . . . . . . . . . . . . . 20 | 6.1. Manifest Source Material . . . . . . . . . . . . . . . . 18 | |||
| 7.9. SUIT_Parameters CDDL . . . . . . . . . . . . . . . . . . 21 | 6.2. Required Template: Compatibility Check . . . . . . . . . 18 | |||
| 7.10. SUIT_Command_Sequence . . . . . . . . . . . . . . . . . . 22 | 6.3. Use Case Template: XIP Secure Boot . . . . . . . . . . . 19 | |||
| 7.11. SUIT_Condition . . . . . . . . . . . . . . . . . . . . . 24 | 6.4. Use Case Template: Firmware Download . . . . . . . . . . 19 | |||
| 7.11.1. Identifier Conditions . . . . . . . . . . . . . . . 25 | 6.5. Use Case Template: Load from External Storage . . . . . . 20 | |||
| 7.11.2. suit-condition-image-match . . . . . . . . . . . . . 25 | 6.6. Use Case Template Load & Decompress from External Storage 20 | |||
| 7.11.3. suit-condition-image-not-match . . . . . . . . . . . 25 | 6.7. Use Case Template: Dependency . . . . . . . . . . . . . . 20 | |||
| 7.11.4. suit-condition-use-before . . . . . . . . . . . . . 25 | 7. Manifest Structure . . . . . . . . . . . . . . . . . . . . . 21 | |||
| 7.11.5. suit-condition-minimum-battery . . . . . . . . . . . 25 | 7.1. Severable Elements . . . . . . . . . . . . . . . . . . . 22 | |||
| 7.11.6. suit-condition-update-authorised . . . . . . . . . . 26 | 7.2. Outer wrapper . . . . . . . . . . . . . . . . . . . . . . 23 | |||
| 7.11.7. suit-condition-version . . . . . . . . . . . . . . . 26 | 7.3. Manifest . . . . . . . . . . . . . . . . . . . . . . . . 24 | |||
| 7.11.8. SUIT_Condition_Custom . . . . . . . . . . . . . . . 27 | 7.4. SUIT_Dependency . . . . . . . . . . . . . . . . . . . . . 27 | |||
| 7.11.9. Identifiers . . . . . . . . . . . . . . . . . . . . 27 | 7.5. SUIT_Component_Reference . . . . . . . . . . . . . . . . 28 | |||
| 7.11.10. SUIT_Condition CDDL . . . . . . . . . . . . . . . . 29 | 7.6. Manifest Parameters . . . . . . . . . . . . . . . . . . . 28 | |||
| 7.12. SUIT_Directive . . . . . . . . . . . . . . . . . . . . . 29 | 7.6.1. SUIT_Parameter_Strict_Order . . . . . . . . . . . . . 30 | |||
| 7.12.1. suit-directive-set-component-index . . . . . . . . . 30 | 7.6.2. SUIT_Parameter_Soft_Failure . . . . . . . . . . . . . 31 | |||
| 7.12.2. suit-directive-set-dependency-index . . . . . . . . 31 | 7.7. SUIT_Parameter_Encryption_Info . . . . . . . . . . . . . 31 | |||
| 7.12.3. suit-directive-abort . . . . . . . . . . . . . . . . 31 | 7.8. SUIT_Parameter_Compression_Info . . . . . . . . . . . . . 31 | |||
| 7.12.4. suit-directive-run-sequence . . . . . . . . . . . . 31 | 7.9. SUIT_Parameter_Unpack_Info . . . . . . . . . . . . . . . 31 | |||
| 7.12.5. suit-directive-try-each . . . . . . . . . . . . . . 32 | 7.10. SUIT_Parameters CDDL . . . . . . . . . . . . . . . . . . 32 | |||
| 7.12.6. suit-directive-process-dependency . . . . . . . . . 32 | 7.11. SUIT_Command_Sequence . . . . . . . . . . . . . . . . . . 33 | |||
| 7.12.7. suit-directive-set-parameters . . . . . . . . . . . 33 | 7.12. SUIT_Condition . . . . . . . . . . . . . . . . . . . . . 35 | |||
| 7.12.8. suit-directive-override-parameters . . . . . . . . . 33 | 7.12.1. Identifier Conditions . . . . . . . . . . . . . . . 36 | |||
| 7.12.9. suit-directive-fetch . . . . . . . . . . . . . . . . 34 | 7.12.2. suit-condition-image-match . . . . . . . . . . . . . 36 | |||
| 7.12.10. suit-directive-copy . . . . . . . . . . . . . . . . 34 | 7.12.3. suit-condition-image-not-match . . . . . . . . . . . 36 | |||
| 7.12.11. suit-directive-swap . . . . . . . . . . . . . . . . 35 | 7.12.4. suit-condition-use-before . . . . . . . . . . . . . 36 | |||
| 7.12.12. suit-directive-run . . . . . . . . . . . . . . . . . 35 | 7.12.5. suit-condition-minimum-battery . . . . . . . . . . . 36 | |||
| 7.12.13. suit-directive-wait . . . . . . . . . . . . . . . . 36 | 7.12.6. suit-condition-update-authorised . . . . . . . . . . 37 | |||
| 7.12.14. SUIT_Directive CDDL . . . . . . . . . . . . . . . . 37 | 7.12.7. suit-condition-version . . . . . . . . . . . . . . . 37 | |||
| 8. Dependency processing . . . . . . . . . . . . . . . . . . . . 39 | 7.12.8. SUIT_Condition_Custom . . . . . . . . . . . . . . . 38 | |||
| 9. Access Control Lists . . . . . . . . . . . . . . . . . . . . 40 | 7.12.9. Identifiers . . . . . . . . . . . . . . . . . . . . 38 | |||
| 10. SUIT digest container . . . . . . . . . . . . . . . . . . . . 40 | 7.12.10. SUIT_Condition CDDL . . . . . . . . . . . . . . . . 40 | |||
| 11. Creating conditional sequences . . . . . . . . . . . . . . . 41 | 7.13. SUIT_Directive . . . . . . . . . . . . . . . . . . . . . 40 | |||
| 12. Full CDDL . . . . . . . . . . . . . . . . . . . . . . . . . . 43 | 7.13.1. suit-directive-set-component-index . . . . . . . . . 41 | |||
| 13. Examples . . . . . . . . . . . . . . . . . . . . . . . . . . 49 | 7.13.2. suit-directive-set-dependency-index . . . . . . . . 42 | |||
| 13.1. Example 0: . . . . . . . . . . . . . . . . . . . . . . . 50 | 7.13.3. suit-directive-abort . . . . . . . . . . . . . . . . 42 | |||
| 13.2. Example 1: . . . . . . . . . . . . . . . . . . . . . . . 52 | 7.13.4. suit-directive-run-sequence . . . . . . . . . . . . 42 | |||
| 13.3. Example 2: . . . . . . . . . . . . . . . . . . . . . . . 54 | 7.13.5. suit-directive-try-each . . . . . . . . . . . . . . 43 | |||
| 13.4. Example 3: . . . . . . . . . . . . . . . . . . . . . . . 57 | 7.13.6. suit-directive-process-dependency . . . . . . . . . 43 | |||
| 13.5. Example 4: . . . . . . . . . . . . . . . . . . . . . . . 61 | 7.13.7. suit-directive-set-parameters . . . . . . . . . . . 44 | |||
| 13.6. Example 5: . . . . . . . . . . . . . . . . . . . . . . . 65 | 7.13.8. suit-directive-override-parameters . . . . . . . . . 44 | |||
| 13.7. Example 6: . . . . . . . . . . . . . . . . . . . . . . . 69 | 7.13.9. suit-directive-fetch . . . . . . . . . . . . . . . . 45 | |||
| 14. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 73 | 7.13.10. suit-directive-copy . . . . . . . . . . . . . . . . 45 | |||
| 15. Security Considerations . . . . . . . . . . . . . . . . . . . 73 | 7.13.11. suit-directive-swap . . . . . . . . . . . . . . . . 46 | |||
| 16. Mailing List Information . . . . . . . . . . . . . . . . . . 74 | 7.13.12. suit-directive-run . . . . . . . . . . . . . . . . . 46 | |||
| 17. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . 74 | 7.13.13. suit-directive-wait . . . . . . . . . . . . . . . . 47 | |||
| 18. References . . . . . . . . . . . . . . . . . . . . . . . . . 74 | 7.13.14. SUIT_Directive CDDL . . . . . . . . . . . . . . . . 48 | |||
| 18.1. Normative References . . . . . . . . . . . . . . . . . . 74 | 7.14. SUIT_Text_Map . . . . . . . . . . . . . . . . . . . . . . 50 | |||
| 18.2. Informative References . . . . . . . . . . . . . . . . . 75 | 8. Access Control Lists . . . . . . . . . . . . . . . . . . . . 50 | |||
| 18.3. URIs . . . . . . . . . . . . . . . . . . . . . . . . . . 75 | 9. SUIT digest container . . . . . . . . . . . . . . . . . . . . 51 | |||
| Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 76 | 10. Creating conditional sequences . . . . . . . . . . . . . . . 52 | |||
| 11. Full CDDL . . . . . . . . . . . . . . . . . . . . . . . . . . 54 | ||||
| 12. Examples . . . . . . . . . . . . . . . . . . . . . . . . . . 61 | ||||
| 12.1. Example 0: . . . . . . . . . . . . . . . . . . . . . . . 61 | ||||
| 12.2. Example 1: . . . . . . . . . . . . . . . . . . . . . . . 64 | ||||
| 12.3. Example 2: . . . . . . . . . . . . . . . . . . . . . . . 66 | ||||
| 12.4. Example 3: . . . . . . . . . . . . . . . . . . . . . . . 69 | ||||
| 12.5. Example 4: . . . . . . . . . . . . . . . . . . . . . . . 73 | ||||
| 12.6. Example 5: . . . . . . . . . . . . . . . . . . . . . . . 77 | ||||
| 12.7. Example 6: . . . . . . . . . . . . . . . . . . . . . . . 81 | ||||
| 13. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 86 | ||||
| 14. Security Considerations . . . . . . . . . . . . . . . . . . . 86 | ||||
| 15. Mailing List Information . . . . . . . . . . . . . . . . . . 86 | ||||
| 16. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . 86 | ||||
| 17. References . . . . . . . . . . . . . . . . . . . . . . . . . 87 | ||||
| 17.1. Normative References . . . . . . . . . . . . . . . . . . 87 | ||||
| 17.2. Informative References . . . . . . . . . . . . . . . . . 87 | ||||
| 17.3. URIs . . . . . . . . . . . . . . . . . . . . . . . . . . 88 | ||||
| Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 88 | ||||
| 1. Introduction | 1. Introduction | |||
| A firmware update mechanism is an essential security feature for IoT | A firmware update mechanism is an essential security feature for IoT | |||
| devices to deal with vulnerabilities. While the transport of | devices to deal with vulnerabilities. While the transport of | |||
| firmware images to the devices themselves is important there are | firmware images to the devices themselves is important there are | |||
| already various techniques available, such as the Lightweight | already various techniques available, such as the Lightweight | |||
| Machine-to-Machine (LwM2M) protocol offering device management of IoT | Machine-to-Machine (LwM2M) protocol offering device management of IoT | |||
| devices. Equally important is the inclusion of meta-data about the | devices. Equally important is the inclusion of meta-data about the | |||
| conveyed firmware image (in the form of a manifest) and the use of | conveyed firmware image (in the form of a manifest) and the use of | |||
| skipping to change at page 4, line 23 ¶ | skipping to change at page 4, line 41 ¶ | |||
| integrity protection is required it is sufficient to install a trust | integrity protection is required it is sufficient to install a trust | |||
| anchor on the IoT device. For confidentiality protected firmware | anchor on the IoT device. For confidentiality protected firmware | |||
| images it is additionally required to install either one or multiple | images it is additionally required to install either one or multiple | |||
| symmetric or asymmetric keys on the IoT device. Starting security | symmetric or asymmetric keys on the IoT device. Starting security | |||
| protection at the author is a risk mitigation technique so firmware | protection at the author is a risk mitigation technique so firmware | |||
| images and manifests can be stored on untrusted respositories; it | images and manifests can be stored on untrusted respositories; it | |||
| also reduces the scope of a compromise of any repository or | also reduces the scope of a compromise of any repository or | |||
| intermediate system to be no worse than a denial of service. | intermediate system to be no worse than a denial of service. | |||
| It is assumed that the reader is familiar with the high-level | It is assumed that the reader is familiar with the high-level | |||
| firmware update architecture [Architecture]. | firmware update architecture [I-D.ietf-suit-architecture]. | |||
| The SUIT manifest is heavily optimised for consumption by constrained | The SUIT manifest is heavily optimised for consumption by constrained | |||
| devices. This means that it is not constructed as a conventional | devices. This means that it is not constructed as a conventional | |||
| descriptive document. Instead, of describing what an update IS, it | descriptive document. Instead, of describing what an update IS, it | |||
| describes what a recipient should DO. | describes what a recipient should DO. | |||
| While the SUIT manifest is informed by and optimised for firmware | While the SUIT manifest is informed by and optimised for firmware | |||
| update use cases, there is nothing in the [Information] that | update use cases, there is nothing in the | |||
| restricts its use to only firmware use cases. Software update and | [I-D.ietf-suit-information-model] that restricts its use to only | |||
| delivery of arbitrary data can equally be managed by SUIT-based | firmware use cases. Software update and delivery of arbitrary data | |||
| metadata. | can equally be managed by SUIT-based metadata. | |||
| 2. Conventions and Terminology | 2. Conventions and Terminology | |||
| The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | |||
| "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | |||
| "OPTIONAL" in this document are to be interpreted as described in | "OPTIONAL" in this document are to be interpreted as described in | |||
| BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all | BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all | |||
| capitals, as shown here. | capitals, as shown here. | |||
| - SUIT: Sofware Update for the Internet of Things, the IETF working | - SUIT: Sofware Update for the Internet of Things, the IETF working | |||
| skipping to change at page 5, line 27 ¶ | skipping to change at page 5, line 46 ¶ | |||
| - Condition: A test for a property of the Recipient or its | - Condition: A test for a property of the Recipient or its | |||
| components. | components. | |||
| - Directive: An action for the Recipient to perform. | - Directive: An action for the Recipient to perform. | |||
| - Command: A Condition or a Directive. | - Command: A Condition or a Directive. | |||
| - Trusted Execution: A process by which a system ensures that only | - Trusted Execution: A process by which a system ensures that only | |||
| trusted code is executed, for example secure boot. | trusted code is executed, for example secure boot. | |||
| 3. Distributing firmware | - A/B images: Dividing a device's storage into two or more bootable | |||
| images, at different offsets, such that the active image can write | ||||
| to the inactive image(s). | ||||
| Distributing firmware in a multi-party environment is a difficult | The map indices in this encoding are reset to 1 for each map within | |||
| operation. Each party requires a different subset of data. Some | the structure. This is to keep the indices as small as possible. | |||
| data may not be accessible to all parties. Multiple signatures may | ||||
| be required from parties with different authorities. This topic is | ||||
| covered in more depth in [Architecture]. | ||||
| 4. Workflow of a device applying a firmware update | The goal is to keep the index objects to single bytes (CBOR positive | |||
| integers 1-23). | ||||
| The manifest is designed to work with a pull parser, where each | Wherever enumerations are used, they are started at 1. This allows | |||
| section of the manifest is used in sequence. The expected workflow | detection of several common software errors that are caused by | |||
| for a device installing an update can be broken down into 5 steps: | uninitialised variables. Positive numbers in enumerations are | |||
| reserved for IANA registration. Negative numbers are used to | ||||
| identify application-specific implementations. | ||||
| CDDL names are hyphenated and CDDL structures follow the convention | ||||
| adopted in COSE [RFC8152]: SUIT_Structure_Name. | ||||
| 3. How to use this document | ||||
| For information about firmware update in general and the background | ||||
| of the suit manifest, see Section 4. To implement an updatable | ||||
| device, see Section 5 and Section 7. To implement a tool that | ||||
| generates updates, see Section 6 and Section 7. | ||||
| 4. Background | ||||
| Distributing firmware updates to diverse devices with diverse trust | ||||
| anchors in a coordinated system presents unique challenges. Devices | ||||
| have a broad set of constraints, requiring different metadata to make | ||||
| appropriate decisions. There may be many actors in production IoT | ||||
| systems, each of whom has some authority. Distributing firmware in | ||||
| such a multi-party environment presents additional challenges. Each | ||||
| party requires a different subset of data. Some data may not be | ||||
| accessible to all parties. Multiple signatures may be required from | ||||
| parties with different authorities. This topic is covered in more | ||||
| depth in [I-D.ietf-suit-architecture]. | ||||
| 4.1. Landscape | ||||
| The various constraints on IoT devices creates a broad set of use- | ||||
| case requirements. For example, devices with: | ||||
| - limited processing power and storage may require a simple | ||||
| representation of metadata. | ||||
| - bandwidth constraints may require firmware compression or partial | ||||
| update support. | ||||
| - bootloader complexity constraints may require simple selection | ||||
| between two bootable images. | ||||
| - small internal storage may require external storage support. | ||||
| - multiple processors may require coordinated update of all | ||||
| applications. | ||||
| - large storage and complex functionality may require parallel | ||||
| update of many software components. | ||||
| - mesh networks may require multicast distribution. | ||||
| Supporting the requirements introduced by the constraints on IoT | ||||
| devices requires the flexibility to represent a diverse set of | ||||
| possible metadata, but also requires that the encoding is kept | ||||
| simple. | ||||
| 4.2. Update Workflow Model | ||||
| There are several fundamental assumptions that inform the model of | ||||
| the firmware update workflow: | ||||
| - Compatibility must be checked before any other operation is | ||||
| performed | ||||
| - All dependency manifests should be present before any payload is | ||||
| fetched | ||||
| - In some applications, payloads must be fetched and validated prior | ||||
| to installation | ||||
| There are several fundamental assumptions that inform the model of | ||||
| the secure boot workflow: | ||||
| - Compatibility must be checked before any other operation is | ||||
| performed | ||||
| - All dependencies and payloads must be validated prior to loading | ||||
| - All loaded images must be validated prior to execution | ||||
| Based on these assumptions, the manifest is structured to work with a | ||||
| pull parser, where each section of the manifest is used in sequence. | ||||
| The expected workflow for a device installing an update can be broken | ||||
| down into 5 steps: | ||||
| 1. Verify the signature of the manifest | 1. Verify the signature of the manifest | |||
| 2. Verify the applicability of the manifest | 2. Verify the applicability of the manifest | |||
| 3. Resolve dependencies | 3. Resolve dependencies | |||
| 4. Fetch payload(s) | 4. Fetch payload(s) | |||
| 5. Install payload(s) | 5. Install payload(s) | |||
| When installation is complete, similar information can be used for | When installation is complete, similar information can be used for | |||
| validating and running images in a further three steps: | validating and running images in a further 3 steps: | |||
| 1. Verify image(s) | 1. Verify image(s) | |||
| 2. Load image(s) | 2. Load image(s) | |||
| 3. Run image(s) | 3. Run image(s) | |||
| If verification and running is implemented in bootloader, then the | ||||
| When multiple manifests are used for an update, each manifest's steps | When multiple manifests are used for an update, each manifest's steps | |||
| occur in a lockstep fashion; all manifests have dependency resolution | occur in a lockstep fashion; all manifests have dependency resolution | |||
| performed before any manifest performs a payload fetch, etc. | performed before any manifest performs a payload fetch, etc. | |||
| 5. SUIT manifest goals | 4.3. SUIT Manifest goals | |||
| The manifest described in this document is intended to meet several | The manifest described in this document is intended to meet several | |||
| goals, as described below. | goals, as described below. | |||
| 1. Meet the requirements defined in [Information]. | 1. Meet the requirements defined in | |||
| [I-D.ietf-suit-information-model]. | ||||
| 2. Simple to parse on a constrained node | 2. Simple to parse on a constrained node | |||
| 3. Simple to process on a constrained node | 3. Simple to process on a constrained node | |||
| 4. Compact encoding | 4. Compact encoding | |||
| 5. Comprehensible by an intermediate system | 5. Comprehensible by an intermediate system | |||
| 6. Expressive enough to enable advanced use cases on advanced nodes | 6. Expressive enough to enable advanced use cases on advanced nodes | |||
| skipping to change at page 7, line 13 ¶ | skipping to change at page 9, line 24 ¶ | |||
| 7. the device to reason about the applicability of a firmware. | 7. the device to reason about the applicability of a firmware. | |||
| 8. the device to reason about the installation of a firmware. | 8. the device to reason about the installation of a firmware. | |||
| 9. the device to reason about the authenticity & encoding of a | 9. the device to reason about the authenticity & encoding of a | |||
| firmware at boot. | firmware at boot. | |||
| Each of these uses happens at a different stage of the manifest | Each of these uses happens at a different stage of the manifest | |||
| lifecycle, so each has different requirements. | lifecycle, so each has different requirements. | |||
| 6. SUIT manifest design overview | 4.4. SUIT manifest design summary | |||
| In order to provide flexible behaviour to constrained devices, while | In order to provide flexible behaviour to constrained devices, while | |||
| still allowing more powerful devices to use their full capabilities, | still allowing more powerful devices to use their full capabilities, | |||
| the SUIT manifest encodes the required behaviour of a Recipient | the SUIT manifest encodes the required behaviour of a Recipient | |||
| device. Behaviour is encoded as a specialised byte code, contained | device. Behaviour is encoded as a specialised byte code, contained | |||
| in a CBOR list. This promotes a flat encoding, which simplifies the | in a CBOR list. This promotes a flat encoding, which simplifies the | |||
| parser. The information encoded by this byte code closely matches | parser. The information encoded by this byte code closely matches | |||
| the operations that a device will perform, which promotes ease of | the operations that a device will perform, which promotes ease of | |||
| processing. The core operations used by most update and trusted | processing. The core operations used by most update and trusted | |||
| execution operations are represented in the byte code. The byte code | execution operations are represented in the byte code. The byte code | |||
| skipping to change at page 8, line 20 ¶ | skipping to change at page 10, line 33 ¶ | |||
| Capability reporting is similarly simplified. A Recipient can report | Capability reporting is similarly simplified. A Recipient can report | |||
| the Commands, Parameters, Algorithms, and Component Identifiers that | the Commands, Parameters, Algorithms, and Component Identifiers that | |||
| it supports. This is sufficiently precise for a manifest author to | it supports. This is sufficiently precise for a manifest author to | |||
| create a manifest that the Recipient can accept. | create a manifest that the Recipient can accept. | |||
| The simplicity of design in the Recipient due to all of these | The simplicity of design in the Recipient due to all of these | |||
| benefits allows even a highly constrained platform to use advanced | benefits allows even a highly constrained platform to use advanced | |||
| update capabilities. | update capabilities. | |||
| 6.1. Manifest Design Evaluation | 5. Interpreter Behaviour | |||
| To evaluate this design, it is compared to the goals stated above. | This section describes the behaviour of the manifest interpreter. | |||
| This section focuses primarily on interpreting commands in the | ||||
| manifest. However, there are several other important behaviours of | ||||
| the interpreter: encoding version detection, rollback protection, and | ||||
| authenticity verification are chief among these. | ||||
| Goal evaluation: | 5.1. Interpreter Setup | |||
| 1. Each command and condition is anchored to a manifest information | Prior to executing any command sequence, the interpreter or its host | |||
| element in [Information] | application MUST inspect the manifest version field and fail when it | |||
| encounters an unsupported encoding version. Next, the interpreter or | ||||
| its host application MUST extract the manifest sequence number and | ||||
| perform a rollback check using this sequence number. The exact logic | ||||
| of rollback protection may vary by application, but it has the | ||||
| following properties: | ||||
| 2. The use of a byte code encourages flat encoding and reduces | - Whenever the interpreter can choose between several manifests, it | |||
| nesting depth. This promotes a simple encoding. | MUST select the latest valid manifest, authentic manifest. | |||
| 3. The encoded information closely matches the operations that a | - If the latest valid, authentic manifest fails, it MAY select the | |||
| device will perform, making the format easy to process. | next latest valid, authentic manifest. | |||
| 4. Encoding efficiency exceeds 50% when compared to raw data. | Here, valid means that a manifest has a supported encoding version | |||
| AND it has not been excluded for other reasons. Reasons for | ||||
| excluding typically involve first executing the manifest and MAY | ||||
| include: | ||||
| 5. Tooling will be required to reason about the manifest. | - Test failed (e.g. Vendor ID/Class ID) | |||
| 6. The core operations used by most update and trusted execution | - Unsupported command encountered | |||
| operations are represented in the byte code. The use cases | ||||
| listed in [Information] are enabled. | ||||
| 7. Registration of new standard byte code identifiers enables | - Unsupported parameter encountered | |||
| extension in a comprehensible way. | ||||
| The manifest described by this document meets the stated goals. | - Unsupported component ID encountered | |||
| Meeting goal 5-comprehensible by intermediate systems-will require | ||||
| additional tooling or a division of metadata. | ||||
| 6.2. Severable Elements | - Payload not available (update interpreter) | |||
| Because the manifest can be used by different actors at different | - Dependency not available (update interpreter) | |||
| times, some parts of the manifest can be removed without affecting | ||||
| later stages of the lifecycle. This is called "Severing." Severing | ||||
| of information is achieved by separating that information from the | ||||
| signed container so that removing it does not affect the signature. | ||||
| This means that ensuring authenticity of severable parts of the | ||||
| manifest is a requirement for the signed portion of the manifest. | ||||
| Severing some parts makes it possible to discard parts of the | ||||
| manifest that are no longer necessary. This is important because it | ||||
| allows the storage used by the manifest to be greatly reduced. For | ||||
| example, no text size limits are needed if text is removed from the | ||||
| manifest prior to delivery to a constrained device. | ||||
| Elements are made severable by removing them from the manifest, | - Application crashed when executed (bootloader interpreter) | |||
| encoding them in a bstr, and placing a SUIT_Digest of the bstr in the | ||||
| manifest so that they can still be authenticated. The SUIT_Digest | ||||
| typically consumes 4 bytes more than the size of the raw digest, | ||||
| therefore elements smaller than (Digest Bits)/8 + 4 SHOULD never be | ||||
| severable. Elements larger than (Digest Bits)/8 + 4 MAY be | ||||
| severable, while elements that are much larger than (Digest Bits)/8 + | ||||
| 4 SHOULD be severable. | ||||
| 6.3. Conventions | - Watchdog timeout occurred (bootloader interpreter) | |||
| The map indices in this encoding are reset to 1 for each map within | - Dependency or Payload verification failed (bootloader interpreter) | |||
| the structure. This is to keep the indices as small as possible. | ||||
| The goal is to keep the index objects to single bytes (CBOR positive | ||||
| integers 1-23). | ||||
| Wherever enumerations are used, they are started at 1. This allows | These failure reasons MAY be combined with retry mechanisms prior to | |||
| detection of several common software errors that are caused by | marking a manifest as invalid. | |||
| uninitialised variables. Positive numbers in enumerations are | ||||
| reserved for IANA registration. Negative numbers are used to | ||||
| identify application-specific implementations. | ||||
| CDDL names are hyphenated and CDDL structures follow the convention | Following these initial tests, the interpreter clears all parameter | |||
| adopted in COSE [RFC8152]: SUIT_Structure_Name. | storage. This ensures that the interpreter begins without any leaked | |||
| data. | ||||
| 6.4. Payloads | 5.2. Required Checks | |||
| Payloads can take many forms, for example, binary, hex, s-record, | Once a valid, authentic manifest has been selected, the interpreter | |||
| elf, binary diff, PEM certificate, CBOR Web Token, serialised | MUST examine the component list and verify that its maximum number of | |||
| configuration. These payloads fall into two broad categories: those | components is not exceeded and that each listed component ID is | |||
| that require installation-time unpacking and those that do not. | supported. | |||
| Binary, PEM certificate, and CBOR Web Token do not require | ||||
| installation-time unpacking. Hex, s-record, and serialised | ||||
| configuration require installation-time unpacking. Elf may or may | ||||
| not require unpacking depending on the target. | ||||
| Some payloads cannot be directly converted to a writable binary | For each listed component, the interpreter MUST provide storage for | |||
| stream. Hex, s-record, and elf may contain gaps and they have no | the supported parameters (Section 5.4.1). If the interpreter does | |||
| guarantee of monotonic increase of address, which makes pre- | not have sufficient temporary storage to process the parameters for | |||
| processing them into a binary stream difficult on constrained | all components, it MAY process components serially for each command | |||
| platforms. Serialised configuration may be unpacked into a | sequence. See Section 5.5 for more details. | |||
| configuration database, which makes it impossible to preprocess into | ||||
| a binary stream, suitable for direct writing. | ||||
| Where a specialised unpacking algorithm is needed, a digest is not | The interpreter SHOULD check that the common section contains at | |||
| always calculable over an installed payload. For example, an elf, | least one vendor ID check and at least one class ID check. | |||
| s-record or hex file may contain gaps that can contain any data, | ||||
| while not changing whether or not an installed payload is valid. | ||||
| Serialised configuration may update only some device data rather than | ||||
| all of it. This means that the digest cannot always be calculated | ||||
| over an installed payload when a specialised installer is used. | ||||
| This presents two problems for the manifest: first, it must indicate | If the manifest contains more than one component, each command | |||
| that a specialised installer is needed and, second, it cannot provide | sequence MUST begin with a Set Current Component command. | |||
| a hash of the payload that is checkable after installation. These | ||||
| two problems are resolved in two ways: | ||||
| 1. Payloads that need a specialised installer must indicate this in | If a dependency is specified, then the interpreter MUST perform the | |||
| suit-payload-info-unpack. | following checks: | |||
| 2. Payloads that need specialised verification must indicate this in | 1. At the beginning of each section in the dependent: all previous | |||
| the SUIT_Parameter_Image_Digest by indicating a SUIT_Digest | sections of each dependency have been executed. | |||
| algorithm that correctly validates their information. | ||||
| 2. At the end of each section in the dependent: The corresponding | ||||
| section in each dependency has been executed. | ||||
| If the interpreter does not support dependencies and a manifest | ||||
| specifies a dependency, then the interpreter MUST reject the | ||||
| manifest. | ||||
| 5.3. Interpreter fundamental properties | ||||
| The interpreter has a small set of design goals: | ||||
| 1. Executing an update MUST either result in an error, or a | ||||
| verifiably correct system state. | ||||
| 2. Executing a secure boot MUST either result in an error, or a | ||||
| booted system. | ||||
| 3. Executing the same manifest on multiple devices MUST result in | ||||
| the same system state. | ||||
| NOTE: when using A/B images, the manifest functions as two (or more) | ||||
| logical manifests, each of which applies to a system in a particular | ||||
| starting state. With that provision, design goal 3 holds. | ||||
| 5.4. Abstract Machine Description | ||||
| The byte code that forms the bulk of the manifest is processed by an | ||||
| interpreter. This interpreter can be modelled as a simple abstract | ||||
| machine. This machine consists of several data storage locations | ||||
| that are modified by commands. Certain commands also affect the | ||||
| machine's behaviour. | ||||
| Every command that modifies system state targets a specific | ||||
| component. Components are units of code or data that can be targeted | ||||
| by an update. They are identified by Component identifiers, arrays | ||||
| of binary-strings-effectively a binary path. Each component has a | ||||
| corresponding set of configuration, Parameters. Parameters are used | ||||
| as the inputs to commands. | ||||
| 5.4.1. Parameters | ||||
| Some parameters are REQUIRED to implement. These parameters allow a | ||||
| device to perform core functions. | ||||
| - Vendor ID | ||||
| - Class ID | ||||
| - Image Digest | ||||
| Some parameters are RECOMMENDED to implement. These parameters are | ||||
| needed for most use-cases. | ||||
| - Image Size | ||||
| - URI | ||||
| Other parameters are OPTIONAL to implement. These parameters allow a | ||||
| device to implement specific use-cases. | ||||
| - Strict Order | ||||
| - Soft Failure | ||||
| - Device ID | ||||
| - Encryption Info | ||||
| - Unpack Info | ||||
| - Source Component | ||||
| - URI List | ||||
| - Custom Parameters | ||||
| 5.4.2. Commands | ||||
| Commands define the behaviour of a device. The commands are divided | ||||
| into two groups: those that modify state (directives) and those that | ||||
| perform tests (conditions). There are also several Control Flow | ||||
| operations. | ||||
| Some commands are REQUIRED to implement. These commands allow a | ||||
| device to perform core functions | ||||
| - Check Vendor Identifier (cvid) | ||||
| - Check Class Identifier (ccid) | ||||
| - Verify Image (cimg) | ||||
| - Set Current Component (setc) | ||||
| - Override Parameters (ovrp) | ||||
| NOTE: on systems that support only a single component, Set Current | ||||
| Component has no effect. | ||||
| Some commands are RECOMMENDED to implement. These commands are | ||||
| needed for most use-cases | ||||
| - Set Current Dependency (setd) | ||||
| - Set Parameters (setp) | ||||
| - Process Dependency (pdep) | ||||
| - Run (run) | ||||
| - Fetch (getc) | ||||
| Other commands are OPTIONAL to implement. These commands allow a | ||||
| device to implement specific use-cases. | ||||
| - Use Before (ubf) | ||||
| - Check Component Offset (cco) | ||||
| - Check Device Identifier (cdid) | ||||
| - Check Image Not Match (nimg) | ||||
| - Check Minimum Battery (minb) | ||||
| - Check Update Authorised (auth) | ||||
| - Check Version (cver) | ||||
| - Abort (abrt) | ||||
| - Try Each (try) | ||||
| - Copy (copy) | ||||
| - Swap (swap) | ||||
| - Wait For Event (wfe) | ||||
| - Run Sequence (srun) mandatory component set | ||||
| - Run with Arguments (arun) | ||||
| 5.4.3. Command Behaviour | ||||
| The following table describes the behaviour of each command. "params" | ||||
| represents the parameters for the current component or dependency. | ||||
| +------+------------------------------------------------------------+ | ||||
| | Code | Operation | | ||||
| +------+------------------------------------------------------------+ | ||||
| | cvid | binary-match(component, params[vendor-id]) | | ||||
| | | | | ||||
| | ccid | binary-match(component, params[class-id]) | | ||||
| | | | | ||||
| | cimg | binary-match(digest(component), params[digest]) | | ||||
| | | | | ||||
| | setc | component := components[arg] | | ||||
| | | | | ||||
| | ovrp | params[k] := v for k,v in arg | | ||||
| | | | | ||||
| | setd | dependency := dependencies[arg] | | ||||
| | | | | ||||
| | setp | params[k] := v if not k in params for k,v in arg | | ||||
| | | | | ||||
| | pdep | exec(dependency[common]); exec(dependency[current- | | ||||
| | | segment]) | | ||||
| | | | | ||||
| | run | run(component) | | ||||
| | | | | ||||
| | getc | store(component, fetch(params[uri])) | | ||||
| | | | | ||||
| | ubf | assert(now() < arg) | | ||||
| | | | | ||||
| | cco | assert(offsetof(component) == arg) | | ||||
| | | | | ||||
| | cdid | binary-match(component, params[device-id]) | | ||||
| | | | | ||||
| | nimg | not binary-match(digest(component), params[digest]) | | ||||
| | | | | ||||
| | minb | assert(battery >= arg) | | ||||
| | | | | ||||
| | auth | assert(isAuthorised()) | | ||||
| | | | | ||||
| | cver | assert(version_check(component, arg)) | | ||||
| | | | | ||||
| | abrt | assert(0) | | ||||
| | | | | ||||
| | try | break if exec(seq) is not error for seq in arg | | ||||
| | | | | ||||
| | copy | store(component, params[src-component]) | | ||||
| | | | | ||||
| | swap | swap(component, params[src-component]) | | ||||
| | | | | ||||
| | wfe | until event(arg), wait | | ||||
| | | | | ||||
| | srun | exec(arg) | | ||||
| | | | | ||||
| | arun | run(component, arg) | | ||||
| +------+------------------------------------------------------------+ | ||||
| 5.5. Serialized Processing Interpreter | ||||
| Because each manifest has a list of components and a list of | ||||
| components defined by its dependencies, it is possible for the | ||||
| manifest processor to handle one component at a time, traversing the | ||||
| manifest tree once for each listed component. In this mode, the | ||||
| interpreter ignores any commands executed while the component index | ||||
| is not the current component. This reduces the overall volatile | ||||
| storage required to process the update so that the only limit on | ||||
| number of components is the size of the manifest. However, this | ||||
| approach requires additional processing power. | ||||
| 5.6. Parallel Processing Interpreter | ||||
| Advanced devices may make use of the Strict Order parameter and | ||||
| enable parallel processing of some segments, or it may reorder some | ||||
| segments. To perform parallel processing, once the Strict Order | ||||
| parameter is set to False, the device may fork a process for each | ||||
| command until the Strict Order parameter is returned to True or the | ||||
| command sequence ends. Then, it joins all forked processes before | ||||
| continuing processing of commands. To perform out-of-order | ||||
| processing, a similar approach is used, except the device consumes | ||||
| all commands after the Strict Order parameter is set to False, then | ||||
| it sorts these commands into its preferred order, invokes them all, | ||||
| then continues processing. | ||||
| Under each of these scenarios the parallel processing must halt: | ||||
| - Set Parameters | ||||
| - Override Parameters | ||||
| - Set Strict Order = True | ||||
| - Set Dependency Index | ||||
| - Set Component Index | ||||
| To perform more useful parallel operations, sequences of commands may | ||||
| be collected in a suit-directive-run-sequence. Then, each of these | ||||
| sequences may be run in parallel. Each sequence defaults to Strict | ||||
| Order = True. To isolate each sequence from each other sequence, | ||||
| each sequence must declare a single target component. Set Component | ||||
| Index is not permitted inside this sequence. | ||||
| 5.7. Processing Dependencies | ||||
| As described in Section 5.2, each manifest must invoke each of its | ||||
| dependencies sections from the corresponding section of the | ||||
| dependent. Any changes made to parameters by the dependency persist | ||||
| in the dependent. | ||||
| When a Process Depdendency command is encountered, the interpreter | ||||
| loads the dependency identified by the Current Dependency Index. The | ||||
| interpreter first executes the common-sequence section of the | ||||
| identified dependency, then it executes the section of the dependency | ||||
| that corresponds to the currently executing section of the dependent. | ||||
| The interpreter also performs the checks described in Section 5.2 to | ||||
| ensure that the dependent is processing the dependency correctly. | ||||
| 6. Creating Manifests | ||||
| Manifests are created using tools for constructing COSE structures, | ||||
| calculating cryptographic values and compiling desired system state | ||||
| into a sequence of operations required to achieve that state. The | ||||
| process of constructing COSE structures is covered in [RFC8152] and | ||||
| the calculation of cryptographic values is beyond the scope of this | ||||
| document. | ||||
| Compiling desired system state into a sequence of operations can be | ||||
| accomplished in many ways, however several templates are provided | ||||
| here to cover common use-cases. Many of these templates can be | ||||
| aggregated to produce more complex behaviour. | ||||
| NOTE: On systems that support only a single component, Set Current | ||||
| Component has no effect and can be omitted. | ||||
| NOTE: Digest should always be set using Override Parameters, since | ||||
| this prevents a less-privileged dependent from replacing the digest. | ||||
| 6.1. Manifest Source Material | ||||
| When a manifest is constructed from a descriptive document, the | ||||
| descriptive document SHOULD be included in the severable text | ||||
| section. This section MAY be pruned from the manifest prior to | ||||
| distribution to a device. The inclusion of text source material | ||||
| enables several use-cases on unconstrained intermediate systems, | ||||
| where small manifest size, low parser complexity, and pull parsing | ||||
| are not required. | ||||
| An unconstrained system that makes decisions based on the manifest | ||||
| can use the source material instead so that it does not need to | ||||
| execute the manifest. | ||||
| An unconstrained system that presents data to a user can do so | ||||
| according to typical usage patterns without first executing the | ||||
| manifest, and can trust that information with the same level of | ||||
| confidence as the manifest itself. | ||||
| A verifier can be constructed to emulate execution the manifest and | ||||
| compare the results of that execution to the source material, | ||||
| providing a check that the manifest performs its stated objectives | ||||
| and that the manifest does not exceed the capabilities of the target | ||||
| device. | ||||
| 6.2. Required Template: Compatibility Check | ||||
| The compatibility check ensures that devices only install compatible | ||||
| images. | ||||
| Common: Set Current Component Check Vendor Identifier Check Class | ||||
| Identifier | ||||
| All manifests MUST contain the compatibility check template, except | ||||
| as outlined below. | ||||
| If a device class has a unique trust anchor, and every element in its | ||||
| trust chain is unique-different from every element in any other | ||||
| device class, then it MAY include the compatibility check. | ||||
| If a manifest includes a dependency that performs a compatibility | ||||
| check, then the dependent manifest MAY include the compatibility | ||||
| check. | ||||
| The compatibility check template contains a data dependency: Vendor | ||||
| Identifier and Class Identifier MUST be set prior to executing the | ||||
| template. One examples of the full template is included below, | ||||
| however Parameters may be set within a Try-Each block as well. They | ||||
| may also be inherited from a dependent manifest. | ||||
| - Common: | ||||
| o Set Current Component | ||||
| o Set Parameters: | ||||
| * Vendor ID | ||||
| * Class ID | ||||
| o Check Vendor Identifier | ||||
| o Check Class Identifier | ||||
| 6.3. Use Case Template: XIP Secure Boot | ||||
| - Common: | ||||
| o Set Current Component | ||||
| o Override Parameters: | ||||
| * Digest | ||||
| * Size | ||||
| - Run: | ||||
| o Set Current Component | ||||
| o Check Image Match | ||||
| o Directive Run | ||||
| 6.4. Use Case Template: Firmware Download | ||||
| - Common: | ||||
| o Set Current Component | ||||
| o Override Parameters: | ||||
| * Digest | ||||
| * Size | ||||
| - Install: | ||||
| o Set Current Component | ||||
| o Set Parameters: | ||||
| * URI | ||||
| o Fetch | ||||
| 6.5. Use Case Template: Load from External Storage | ||||
| - Load: | ||||
| o Set Current Component | ||||
| o Set Parameters: | ||||
| * Source Index | ||||
| o Copy | ||||
| 6.6. Use Case Template Load & Decompress from External Storage | ||||
| - Load: | ||||
| o Set Current Component | ||||
| o Set Parameters: | ||||
| * Source Index | ||||
| * Compression Info | ||||
| o Copy | ||||
| 6.7. Use Case Template: Dependency | ||||
| - Dependency Resolution: | ||||
| o Set Current Dependency | ||||
| o Set Parameters: | ||||
| * URI | ||||
| o Fetch | ||||
| o Check Image Match | ||||
| o Process Dependency | ||||
| - Validate: | ||||
| o Set Current Dependency | ||||
| o Check Image Match | ||||
| o Process Dependency | ||||
| For any other section that the dependency has, the dependent MUST | ||||
| invoke Process Dependency. | ||||
| NOTE: Any changes made to parameters in a dependency persist in the | ||||
| dependent. | ||||
| 7. Manifest Structure | 7. Manifest Structure | |||
| The manifest is divided into several sections in a hierarchy as | The manifest is divided into several sections in a hierarchy as | |||
| follows: | follows: | |||
| 1. The outer wrapper | 1. The outer wrapper | |||
| 1. The authentication wrapper | 1. The authentication wrapper | |||
| skipping to change at page 11, line 42 ¶ | skipping to change at page 22, line 28 ¶ | |||
| 5. Installation conditions/directives | 5. Installation conditions/directives | |||
| 6. Text | 6. Text | |||
| 7. COSWID / Reference | 7. COSWID / Reference | |||
| 8. Intermediate Certificate(s) / CWTs | 8. Intermediate Certificate(s) / CWTs | |||
| 9. Inline Payload(s) | 9. Inline Payload(s) | |||
| 7.1. Outer wrapper | 7.1. Severable Elements | |||
| Because the manifest can be used by different actors at different | ||||
| times, some parts of the manifest can be removed without affecting | ||||
| later stages of the lifecycle. This is called "Severing." Severing | ||||
| of information is achieved by separating that information from the | ||||
| signed container so that removing it does not affect the signature. | ||||
| This means that ensuring authenticity of severable parts of the | ||||
| manifest is a requirement for the signed portion of the manifest. | ||||
| Severing some parts makes it possible to discard parts of the | ||||
| manifest that are no longer necessary. This is important because it | ||||
| allows the storage used by the manifest to be greatly reduced. For | ||||
| example, no text size limits are needed if text is removed from the | ||||
| manifest prior to delivery to a constrained device. | ||||
| Elements are made severable by removing them from the manifest, | ||||
| encoding them in a bstr, and placing a SUIT_Digest of the bstr in the | ||||
| manifest so that they can still be authenticated. The SUIT_Digest | ||||
| typically consumes 4 bytes more than the size of the raw digest, | ||||
| therefore elements smaller than (Digest Bits)/8 + 4 SHOULD never be | ||||
| severable. Elements larger than (Digest Bits)/8 + 4 MAY be | ||||
| severable, while elements that are much larger than (Digest Bits)/8 + | ||||
| 4 SHOULD be severable. | ||||
| Because of this, all command sequences in the manifest are encoded in | ||||
| a bstr so that there is a single code path needed for all command | ||||
| sequences | ||||
| 7.2. Outer wrapper | ||||
| This object is a container for the other pieces of the manifest to | This object is a container for the other pieces of the manifest to | |||
| provide a common mechanism to find each of the parts. All elements | provide a common mechanism to find each of the parts. All elements | |||
| of the outer wrapper are contained in bstr objects. Wherever the | of the outer wrapper are contained in bstr objects. Wherever the | |||
| manifest references an object in the outer wrapper, the bstr is | manifest references an object in the outer wrapper, the bstr is | |||
| included in the digest calculation. | included in the digest calculation. | |||
| The CDDL that describes the wrapper is below | The CDDL that describes the wrapper is below | |||
| SUIT_Outer_Wrapper = { | SUIT_Outer_Wrapper = { | |||
| suit-authentication-wrapper => bstr .cbor | suit-authentication-wrapper => bstr .cbor | |||
| SUIT_Authentication_Wrapper / nil, | SUIT_Authentication_Wrapper / nil, | |||
| $SUIT_Manifest_Wrapped, | $SUIT_Manifest_Wrapped, | |||
| ? suit-dependency-resolution => bstr .cbor SUIT_Command_Sequence, | ? suit-dependency-resolution => bstr .cbor SUIT_Command_Sequence, | |||
| ? suit-payload-fetch => bstr .cbor SUIT_Command_Sequence, | ? suit-payload-fetch => bstr .cbor SUIT_Command_Sequence, | |||
| ? suit-install => bstr .cbor SUIT_Command_Sequence, | ? suit-install => bstr .cbor SUIT_Command_Sequence, | |||
| ? suit-text-external => bstr .cbor SUIT_Text_Info, | ? suit-text => bstr .cbor SUIT_Text_Map, | |||
| ? suit-coswid-external => bstr .cbor COSWID | ? suit-coswid => bstr .cbor COSWID | |||
| } | } | |||
| SUIT_Authentication_Wrapper = [ + (COSE_Mac_Tagged / COSE_Sign_Tagged / | SUIT_Authentication_Wrapper = [ + (COSE_Mac_Tagged / COSE_Sign_Tagged / | |||
| COSE_Mac0_Tagged / COSE_Sign1_Tagged)] | COSE_Mac0_Tagged / COSE_Sign1_Tagged)] | |||
| SUIT_Encryption_Wrapper = COSE_Encrypt_Tagged / COSE_Encrypt0_Tagged | SUIT_Encryption_Wrapper = COSE_Encrypt_Tagged / COSE_Encrypt0_Tagged | |||
| SUIT_Manifest_Wrapped //= (suit-manifest => bstr .cbor SUIT_Manifest) | SUIT_Manifest_Wrapped //= (suit-manifest => bstr .cbor SUIT_Manifest) | |||
| SUIT_Manifest_Wrapped //= ( | SUIT_Manifest_Wrapped //= ( | |||
| suit-manifest-encryption-info => bstr .cbor SUIT_Encryption_Wrapper, | suit-manifest-encryption-info => bstr .cbor SUIT_Encryption_Wrapper, | |||
| suit-manifest-encrypted => bstr | suit-manifest-encrypted => bstr | |||
| skipping to change at page 13, line 20 ¶ | skipping to change at page 24, line 34 ¶ | |||
| payload(s) to be installed and any dependencies on other manifests. | payload(s) to be installed and any dependencies on other manifests. | |||
| suit-manifest-encryption-info contains a SUIT_Encryption_Wrapper, a | suit-manifest-encryption-info contains a SUIT_Encryption_Wrapper, a | |||
| COSE object that describes the information required to decrypt a | COSE object that describes the information required to decrypt a | |||
| ciphertext manifest. | ciphertext manifest. | |||
| suit-manifest-encrypted contains a ciphertext manifest. | suit-manifest-encrypted contains a ciphertext manifest. | |||
| Each of suit-dependency-resolution, suit-payload-fetch, and suit- | Each of suit-dependency-resolution, suit-payload-fetch, and suit- | |||
| payload-installation contain the severable contents of the | payload-installation contain the severable contents of the | |||
| identically named portions of the manifest, described in Section 7.2. | identically named portions of the manifest, described in Section 7.3. | |||
| suit-text contains all the human-readable information that describes | suit-text contains all the human-readable information that describes | |||
| any and all parts of the manifest, its payload(s) and its | any and all parts of the manifest, its payload(s) and its | |||
| resource(s). | resource(s). | |||
| suit-coswid contains a Concise Software Identifier. This may be | suit-coswid contains a Concise Software Identifier. This may be | |||
| discarded by the recipient if not needed. | discarded by the recipient if not needed. | |||
| 7.2. Manifest | 7.3. Manifest | |||
| The manifest describes the critical metadata for the referenced | The manifest describes the critical metadata for the referenced | |||
| payload(s). In addition, it contains: | payload(s). In addition, it contains: | |||
| 1. a version number for the manifest structure itself | 1. a version number for the manifest structure itself | |||
| 2. a sequence number | 2. a sequence number | |||
| 3. a list of dependencies | 3. a list of dependencies | |||
| 4. a list of components affected | 4. a list of components affected | |||
| 5. a list of components affected by dependencies | 5. a list of components affected by dependencies | |||
| 6. a reference for each of the severable blocks. | 6. a reference for each of the severable blocks. | |||
| 7. a list of actions that the recipient should perform. | 7. a list of actions that the recipient should perform. | |||
| The following CDDL fragment defines the manifest. | The following CDDL fragment defines the manifest. | |||
| SUIT_Manifest = { | SUIT_Manifest = { | |||
| suit-manifest-version => 1, | suit-manifest-version => 1, | |||
| suit-manifest-sequence-number => uint, | suit-manifest-sequence-number => uint, | |||
| suit-common => bstr .cbor SUIT_Common, | suit-common => bstr .cbor SUIT_Common, | |||
| ? suit-dependency-resolution => Digest / bstr .cbor SUIT_Command_Sequence, | ? suit-dependency-resolution => Digest / bstr .cbor SUIT_Command_Sequence, | |||
| ? suit-payload-fetch => Digest / bstr .cbor SUIT_Command_Sequence, | ? suit-payload-fetch => Digest / bstr .cbor SUIT_Command_Sequence, | |||
| ? suit-install => Digest / bstr .cbor SUIT_Command_Sequence | ? suit-install => Digest / bstr .cbor SUIT_Command_Sequence, | |||
| ? suit-validate => bstr .cbor SUIT_Command_Sequence | ? suit-validate => bstr .cbor SUIT_Command_Sequence, | |||
| ? suit-load => bstr .cbor SUIT_Command_Sequence | ? suit-load => bstr .cbor SUIT_Command_Sequence, | |||
| ? suit-run => bstr .cbor SUIT_Command_Sequence | ? suit-run => bstr .cbor SUIT_Command_Sequence, | |||
| ? suit-text-info => Digest / bstr .cbor SUIT_Text_Map | ? suit-text => Digest, | |||
| ? suit-coswid => Digest / bstr .cbor COSWID | ? suit-coswid => Digest / bstr .cbor concise-software-identity, | |||
| } | } | |||
| SUIT_Common = { | SUIT_Common = { | |||
| ? suit-dependencies => bstr .cbor [ + SUIT_Dependency ], | ? suit-dependencies => bstr .cbor [ + SUIT_Dependency ], | |||
| ? suit-components => bstr .cbor [ + SUIT_Component_Identifier ], | ? suit-components => bstr .cbor [ + SUIT_Component_Identifier ], | |||
| ? suit-dependency-components => bstr .cbor [ + SUIT_Component_Reference ], | ? suit-dependency-components => bstr .cbor [ + SUIT_Component_Reference ], | |||
| ? suit-common-sequence => bstr .cbor SUIT_Command_Sequence, | ? suit-common-sequence => bstr .cbor SUIT_Command_Sequence, | |||
| } | } | |||
| Several fields in the Manifest can be either a CBOR structure or a | Several fields in the Manifest can be either a CBOR structure or a | |||
| skipping to change at page 15, line 31 ¶ | skipping to change at page 26, line 43 ¶ | |||
| manifest MUST contain a suit-components block. | manifest MUST contain a suit-components block. | |||
| suit-dependency-components is a list of SUIT_Component_Reference | suit-dependency-components is a list of SUIT_Component_Reference | |||
| blocks that specify component identifiers that will be affected by | blocks that specify component identifiers that will be affected by | |||
| the content of a dependency of the current manifest. suit-dependency- | the content of a dependency of the current manifest. suit-dependency- | |||
| components is OPTIONAL. | components is OPTIONAL. | |||
| suit-common-sequence is a SUIT_Command_Sequence to execute prior to | suit-common-sequence is a SUIT_Command_Sequence to execute prior to | |||
| executing any other command sequence. Typical actions in suit- | executing any other command sequence. Typical actions in suit- | |||
| common-sequence include setting expected device identity and image | common-sequence include setting expected device identity and image | |||
| digests when they are conditional (see Section 11 for more | digests when they are conditional (see Section 10 for more | |||
| information on conditional sequences). suit-common-sequence is | information on conditional sequences). suit-common-sequence is | |||
| RECOMMENDED. | RECOMMENDED. | |||
| suit-dependency-resolution is a SUIT_Command_Sequence to execute in | suit-dependency-resolution is a SUIT_Command_Sequence to execute in | |||
| order to perform dependency resolution. Typical actions include | order to perform dependency resolution. Typical actions include | |||
| configuring URIs of dependency manifests, fetching dependency | configuring URIs of dependency manifests, fetching dependency | |||
| manifests, and validating dependency manifests' contents. suit- | manifests, and validating dependency manifests' contents. suit- | |||
| dependency-resolution is REQUIRED when suit-dependencies is present. | dependency-resolution is REQUIRED when suit-dependencies is present. | |||
| suit-payload-fetch is a SUIT_Command_Sequence to execute in order to | suit-payload-fetch is a SUIT_Command_Sequence to execute in order to | |||
| skipping to change at page 16, line 25 ¶ | skipping to change at page 27, line 37 ¶ | |||
| permanent storage into RAM, optionally including actions such as | permanent storage into RAM, optionally including actions such as | |||
| decryption or decompression. suit-load is OPTIONAL. | decryption or decompression. suit-load is OPTIONAL. | |||
| suit-run is a SUIT_Command_Sequence to execute in order to run an | suit-run is a SUIT_Command_Sequence to execute in order to run an | |||
| image. suit-run typically contains a single instruction: either the | image. suit-run typically contains a single instruction: either the | |||
| "run" directive for the bootable manifest or the "process | "run" directive for the bootable manifest or the "process | |||
| dependencies" directive for any dependents of the bootable manifest. | dependencies" directive for any dependents of the bootable manifest. | |||
| suit-run is OPTIONAL. Only one manifest in an update may contain the | suit-run is OPTIONAL. Only one manifest in an update may contain the | |||
| "run" directive. | "run" directive. | |||
| suit-text-info is a digest that uniquely identifies the content of | suit-text is a digest that uniquely identifies the content of the | |||
| the Text that is packaged in the OuterWrapper. text is OPTIONAL. | Text that is packaged in the OuterWrapper. text is OPTIONAL. | |||
| suit-coswid is a digest that uniquely identifies the content of the | suit-coswid is a digest that uniquely identifies the content of the | |||
| concise-software-identifier that is packaged in the OuterWrapper. | concise-software-identifier that is packaged in the OuterWrapper. | |||
| coswid is OPTIONAL. | coswid is OPTIONAL. | |||
| 7.3. SUIT_Dependency | 7.4. SUIT_Dependency | |||
| SUIT_Dependency specifies a manifest that describes a dependency of | SUIT_Dependency specifies a manifest that describes a dependency of | |||
| the current manifest. | the current manifest. | |||
| The following CDDL describes the SUIT_Dependency structure. | The following CDDL describes the SUIT_Dependency structure. | |||
| SUIT_Dependency = { | SUIT_Dependency = { | |||
| suit-dependency-digest => SUIT_Digest, | suit-dependency-digest => SUIT_Digest, | |||
| ? suit-dependency-prefix => SUIT_Component_Identifier, | ? suit-dependency-prefix => SUIT_Component_Identifier, | |||
| } | } | |||
| skipping to change at page 17, line 15 ¶ | skipping to change at page 28, line 29 ¶ | |||
| different algorithm, or trading COSE_Sign for COSE_Mac. | different algorithm, or trading COSE_Sign for COSE_Mac. | |||
| The suit-dependency-prefix element contains a | The suit-dependency-prefix element contains a | |||
| SUIT_Component_Identifier. This specifies the scope at which the | SUIT_Component_Identifier. This specifies the scope at which the | |||
| dependency operates. This allows the dependency to be forwarded on | dependency operates. This allows the dependency to be forwarded on | |||
| to a component that is capable of parsing its own manifests. It also | to a component that is capable of parsing its own manifests. It also | |||
| allows one manifest to be deployed to multiple dependent devices | allows one manifest to be deployed to multiple dependent devices | |||
| without those devices needing consistent component hierarchy. This | without those devices needing consistent component hierarchy. This | |||
| element is OPTIONAL. | element is OPTIONAL. | |||
| 7.4. SUIT_Component_Reference | 7.5. SUIT_Component_Reference | |||
| The SUIT_Component_Reference describes an image that is defined by | The SUIT_Component_Reference describes an image that is defined by | |||
| another manifest. This is useful for overriding the behaviour of | another manifest. This is useful for overriding the behaviour of | |||
| another manifest, for example by directing the recipient to look at a | another manifest, for example by directing the recipient to look at a | |||
| different URI for the image or by changing the expected format, such | different URI for the image or by changing the expected format, such | |||
| as when a gateway performs decryption on behalf of a constrained | as when a gateway performs decryption on behalf of a constrained | |||
| device. The following CDDL describes the SUIT_Component_Reference. | device. The following CDDL describes the SUIT_Component_Reference. | |||
| SUIT_Component_Reference = { | SUIT_Component_Reference = { | |||
| suit-component-identifier => SUIT_Component_Identifier, | suit-component-identifier => SUIT_Component_Identifier, | |||
| suit-component-dependency-index => uint | suit-component-dependency-index => uint | |||
| } | } | |||
| 7.5. Manifest Parameters | 7.6. Manifest Parameters | |||
| Many conditions and directives require additional information. That | Many conditions and directives require additional information. That | |||
| information is contained within parameters that can be set in a | information is contained within parameters that can be set in a | |||
| consistent way. Parameters MUST only be: | consistent way. This allows reduction of manifest size and | |||
| replacement of parameters from one manifest to the next. | ||||
| 1. Integers | ||||
| 2. Byte strings | ||||
| 3. Booleans | ||||
| This allows reduction of manifest size and replacement of parameters | ||||
| from one manifest to the next. Byte strings MAY contain CBOR-encoded | ||||
| objects. | ||||
| The defined manifest parameters are described below. | The defined manifest parameters are described below. | |||
| +--------+-------+------+---------------+----------+----------------+ | +-----+--------+-------------------+------------+-------------------+ | |||
| | Parame | CBOR | Defa | Scope | Name | Description | | | ID | CBOR | Scope | Name | Description | | |||
| | ter | Type | ult | | | | | | | Type | | | | | |||
| | Code | | | | | | | +-----+--------+-------------------+------------+-------------------+ | |||
| +--------+-------+------+---------------+----------+----------------+ | | 1 | boolea | Global | Strict | Requires that the | | |||
| | 1 | boole | True | Global | Strict | Requires that | | | | n | | Order | manifest is | | |||
| | | an | | | Order | the manifest | | | | | | | processed in a | | |||
| | | | | | | is processed | | | | | | | strictly linear | | |||
| | | | | | | in a strictly | | | | | | | fashion. Set to 0 | | |||
| | | | | | | linear | | | | | | | to enable | | |||
| | | | | | | fashion. Set | | | | | | | parallel handling | | |||
| | | | | | | to 0 to enable | | | | | | | of manifest | | |||
| | | | | | | parallel | | | | | | | directives. | | |||
| | | | | | | handling of | | | | | | | | | |||
| | | | | | | manifest | | | 2 | boolea | Command Segment | Soft | Condition | | |||
| | | | | | | directives. | | | | n | | Failure | failures only | | |||
| | | | | | | | | | | | | | terminate the | | |||
| | 2 | boole | Fals | Command | Coerce C | Coerces the | | | | | | | current command | | |||
| | | an | e | Segment | ondition | success code | | | | | | | segment. | | |||
| | | | | | Failure | of a command | | | | | | | | | |||
| | | | | | | segment to | | | 3 | bstr | Component/Global | Vendor ID | A RFC4122 UUID | | |||
| | | | | | | success even | | | | | | | representing the | | |||
| | | | | | | when aborted | | | | | | | vendor of the | | |||
| | | | | | | due to a | | | | | | | device or | | |||
| | | | | | | condition | | | | | | | component | | |||
| | | | | | | failure. | | | | | | | | | |||
| | | | | | | | | | 4 | bstr | Component/Global | Class ID | A RFC4122 UUID | | |||
| | 3 | bstr | nil | Component/Glo | Vendor | A RFC4122 UUID | | | | | | | representing the | | |||
| | | | | bal | ID | representing | | | | | | | class of the | | |||
| | | | | | | the vendor of | | | | | | | device or | | |||
| | | | | | | the device or | | | | | | | component | | |||
| | | | | | | component | | | | | | | | | |||
| | | | | | | | | | 5 | bstr | Component/Global | Device ID | A RFC4122 UUID | | |||
| | 4 | bstr | nil | Component/Glo | Class ID | A RFC4122 UUID | | | | | | | representing the | | |||
| | | | | bal | | representing | | | | | | | device or | | |||
| | | | | | | the class of | | | | | | | component | | |||
| | | | | | | the device or | | | | | | | | | |||
| | | | | | | component | | | 6 | tstr | Component/Depende | URI | A URI from which | | |||
| | | | | | | | | | | | ncy | | to fetch a | | |||
| | 5 | bstr | nil | Component/Glo | Device | A RFC4122 UUID | | | | | | | resource | | |||
| | | | | bal | ID | representing | | | | | | | | | |||
| | | | | | | the device or | | | 7 | bstr | Component/Depende | Encryption | A COSE object | | |||
| | | | | | | component | | | | | ncy | Info | defining the | | |||
| | | | | | | | | | | | | | encryption mode | | |||
| | 6 | bstr | nil | Component/Dep | URI | A URI from | | | | | | | of a resource | | |||
| | | | | endency | | which to fetch | | | | | | | | | |||
| | | | | | | a resource | | | 8 | bstr | Component | Compressio | The information | | |||
| | | | | | | | | | | | | n Info | required to | | |||
| | 7 | bstr | nil | Component/Dep | Encrypti | A COSE object | | | | | | | decompress the | | |||
| | | | | endency | on Info | defining the | | | | | | | image | | |||
| | | | | | | encryption | | | | | | | | | |||
| | | | | | | mode of a | | | 9 | bstr | Component | Unpack | The information | | |||
| | | | | | | resource | | | | | | Info | required to | | |||
| | | | | | | | | | | | | | unpack the image | | |||
| | 8 | bstr | nil | Component | Compress | A SUIT_Compres | | | | | | | | | |||
| | | | | | ion Info | sion_Info | | | 10 | uint | Component | Source | A Component Index | | |||
| | | | | | | object | | | | | | Component | | | |||
| | | | | | | | | | | | | | | | |||
| | 9 | bstr | nil | Component | Unpack | A SUIT_Unpack_ | | | 11 | bstr | Component/Depende | Image | A SUIT_Digest | | |||
| | | | | | Info | Info object | | | | | ncy | Digest | | | |||
| | | | | | | | | | | | | | | | |||
| | 10 | uint | nil | Component | Source C | A Component | | | 12 | uint | Component/Depende | Image Size | Integer size | | |||
| | | | | | omponent | Index | | | | | ncy | | | | |||
| | | | | | | | | | | | | | | | |||
| | 11 | bstr | nil | Component/Dep | Image | A SUIT_Digest | | | 24 | bstr | Component/Depende | URI List | A CBOR encoded | | |||
| | | | | endency | Digest | | | | | | ncy | | list of ranked | | |||
| | | | | | | | | | | | | | URIs | | |||
| | 12 | bstr | nil | Component/Dep | Image | Integer size | | | | | | | | | |||
| | | | | endency | Size | | | | 25 | boolea | Component/Depende | URI List | A CBOR encoded | | |||
| | | | | | | | | | | n | ncy | Append | list of ranked | | |||
| | 24 | bstr | nil | Component/Dep | URI List | A CBOR encoded | | | | | | | URIs | | |||
| | | | | endency | | list of ranked | | | | | | | | | |||
| | | | | | | URIs | | | nin | int/bs | Custom | Custom | Application- | | |||
| | | | | | | | | | t | tr | | Parameter | defined parameter | | |||
| | 25 | boole | Fals | Component/Dep | URI List | A CBOR encoded | | +-----+--------+-------------------+------------+-------------------+ | |||
| | | an | e | endency | Append | list of ranked | | ||||
| | | | | | | URIs | | ||||
| | | | | | | | | ||||
| | nint | int/b | nil | Custom | Custom P | Application- | | ||||
| | | str | | | arameter | defined | | ||||
| | | | | | | parameter | | ||||
| +--------+-------+------+---------------+----------+----------------+ | ||||
| CBOR-encoded object parameters are still wrapped in a bstr. This is | CBOR-encoded object parameters are still wrapped in a bstr. This is | |||
| because it allows a parser that is aggregating parameters to | because it allows a parser that is aggregating parameters to | |||
| reference the object with a single pointer and traverse it without | reference the object with a single pointer and traverse it without | |||
| understanding the contents. This is important for modularisation and | understanding the contents. This is important for modularisation and | |||
| division of responsibility within a pull parser. The same | division of responsibility within a pull parser. The same | |||
| consideration does not apply to Conditions and Directives because | consideration does not apply to Conditions and Directives because | |||
| those elements are invoked with their arguments immediately | those elements are invoked with their arguments immediately | |||
| 7.5.1. SUIT_Parameter_Strict_Order | 7.6.1. SUIT_Parameter_Strict_Order | |||
| The Strict Order Parameter allows a manifest to govern when | The Strict Order Parameter allows a manifest to govern when | |||
| directives can be executed out-of-order. This allows for systems | directives can be executed out-of-order. This allows for systems | |||
| that have a sensitivity to order of updates to choose the order in | that have a sensitivity to order of updates to choose the order in | |||
| which they are executed. It also allows for more advanced systems to | which they are executed. It also allows for more advanced systems to | |||
| parallelise their handling of updates. Strict Order defaults to | parallelise their handling of updates. Strict Order defaults to | |||
| True. It MAY be set to False when the order of operations does not | True. It MAY be set to False when the order of operations does not | |||
| matter. When arriving at the end of a command sequence, ALL commands | matter. When arriving at the end of a command sequence, ALL commands | |||
| MUST have completed, regardless of the state of | MUST have completed, regardless of the state of | |||
| SUIT_Parameter_Strict_Order. If SUIT_Parameter_Strict_Order is | SUIT_Parameter_Strict_Order. If SUIT_Parameter_Strict_Order is | |||
| returned to True, ALL preceding commands MUST complete before the | returned to True, ALL preceding commands MUST complete before the | |||
| next command is executed. | next command is executed. | |||
| 7.5.2. SUIT_Parameter_Coerce_Condition_Failure | 7.6.2. SUIT_Parameter_Soft_Failure | |||
| When executing a command sequence inside SUIT_Run_Sequence and a | When executing a command sequence inside SUIT_Directive_Try_Each and | |||
| condition failure occurs, the manifest processor aborts the sequence. | a condition failure occurs, the manifest processor aborts the | |||
| If Coerce Condition Failure is True, it returns Success. Otherwise, | sequence. If Soft Failure is True, it returns Success. Otherwise, | |||
| it returns the original condition failure. | it returns the original condition failure. | |||
| SUIT_Parameter_Coerce_Condition_Failure is scoped to the enclosing | SUIT_Parameter_Soft_Failure is scoped to the enclosing | |||
| SUIT_Directive_Run_Sequence. Its value is discarded when | SUIT_Command_Sequence. Its value is discarded when | |||
| SUIT_Directive_Run_Sequence terminates. | SUIT_Command_Sequence terminates. | |||
| 7.6. SUIT_Parameter_Encryption_Info | 7.7. SUIT_Parameter_Encryption_Info | |||
| Encryption Info defines the mechanism that Fetch or Copy should use | Encryption Info defines the mechanism that Fetch or Copy should use | |||
| to decrypt the data they transfer. SUIT_Parameter_Encryption_Info is | to decrypt the data they transfer. SUIT_Parameter_Encryption_Info is | |||
| encoded as a COSE_Encrypt_Tagged or a COSE_Encrypt0_Tagged, wrapped | encoded as a COSE_Encrypt_Tagged or a COSE_Encrypt0_Tagged, wrapped | |||
| in a bstr | in a bstr | |||
| 7.7. SUIT_Parameter_Compression_Info | 7.8. SUIT_Parameter_Compression_Info | |||
| Compression Info defines any information that is required for a | Compression Info defines any information that is required for a | |||
| device to perform decompression operations. Typically, this includes | device to perform decompression operations. Typically, this includes | |||
| the algorithm identifier. | the algorithm identifier. | |||
| SUIT_Parameter_Compression_Info is defined by the following CDDL: | SUIT_Parameter_Compression_Info is defined by the following CDDL: | |||
| SUIT_Compression_Info = { | SUIT_Compression_Info = { | |||
| suit-compression-algorithm => SUIT_Compression_Algorithms | suit-compression-algorithm => SUIT_Compression_Algorithms | |||
| ? suit-compression-parameters => bstr | ? suit-compression-parameters => bstr | |||
| } | } | |||
| SUIT_Compression_Algorithms /= SUIT_Compression_Algorithm_gzip | SUIT_Compression_Algorithms /= SUIT_Compression_Algorithm_gzip | |||
| SUIT_Compression_Algorithms /= SUIT_Compression_Algorithm_bzip2 | SUIT_Compression_Algorithms /= SUIT_Compression_Algorithm_bzip2 | |||
| SUIT_Compression_Algorithms /= SUIT_Compression_Algorithm_deflate | SUIT_Compression_Algorithms /= SUIT_Compression_Algorithm_deflate | |||
| SUIT_Compression_Algorithms /= SUIT_Compression_Algorithm_LZ4 | SUIT_Compression_Algorithms /= SUIT_Compression_Algorithm_LZ4 | |||
| SUIT_Compression_Algorithms /= SUIT_Compression_Algorithm_lzma | SUIT_Compression_Algorithms /= SUIT_Compression_Algorithm_lzma | |||
| 7.8. SUIT_Parameter_Unpack_Info | 7.9. SUIT_Parameter_Unpack_Info | |||
| SUIT_Unpack_Info defines the information required for a device to | SUIT_Unpack_Info defines the information required for a device to | |||
| interpret a packed format, such as elf, hex, or binary diff. | interpret a packed format, such as elf, hex, or binary diff. | |||
| SUIT_Unpack_Info is defined by the following CDDL: | SUIT_Unpack_Info is defined by the following CDDL: | |||
| SUIT_Unpack_Info = { | SUIT_Unpack_Info = { | |||
| suit-unpack-algorithm => SUIT_Unpack_Algorithms | suit-unpack-algorithm => SUIT_Unpack_Algorithms | |||
| ? suit-unpack-parameters => bstr | ? suit-unpack-parameters => bstr | |||
| } | } | |||
| SUIT_Unpack_Algorithms //= SUIT_Unpack_Algorithm_Delta | SUIT_Unpack_Algorithms //= SUIT_Unpack_Algorithm_Delta | |||
| SUIT_Unpack_Algorithms //= SUIT_Unpack_Algorithm_Hex | SUIT_Unpack_Algorithms //= SUIT_Unpack_Algorithm_Hex | |||
| SUIT_Unpack_Algorithms //= SUIT_Unpack_Algorithm_Elf | SUIT_Unpack_Algorithms //= SUIT_Unpack_Algorithm_Elf | |||
| 7.9. SUIT_Parameters CDDL | 7.10. SUIT_Parameters CDDL | |||
| The following CDDL describes all SUIT_Parameters. | The following CDDL describes all SUIT_Parameters. | |||
| SUIT_Parameters //= (suit-parameter-strict-order => bool) | SUIT_Parameters //= (suit-parameter-strict-order => bool) | |||
| SUIT_Parameters //= (suit-parameter-coerce-condition-failure => bool) | SUIT_Parameters //= (suit-parameter-soft-failure => bool) | |||
| SUIT_Parameters //= (suit-parameter-vendor-id => bstr) | SUIT_Parameters //= (suit-parameter-vendor-id => bstr) | |||
| SUIT_Parameters //= (suit-parameter-class-id => bstr) | SUIT_Parameters //= (suit-parameter-class-id => bstr) | |||
| SUIT_Parameters //= (suit-parameter-device-id => bstr) | SUIT_Parameters //= (suit-parameter-device-id => bstr) | |||
| SUIT_Parameters //= (suit-parameter-uri => bstr) | SUIT_Parameters //= (suit-parameter-uri => tstr) | |||
| SUIT_Parameters //= (suit-parameter-encryption-info => bstr .cbor SUIT_Encryption_Info) | SUIT_Parameters //= (suit-parameter-encryption-info => bstr .cbor SUIT_Encryption_Info) | |||
| SUIT_Parameters //= (suit-parameter-compression-info => bstr .cbor SUIT_Compression_Info) | SUIT_Parameters //= (suit-parameter-compression-info => bstr .cbor SUIT_Compression_Info) | |||
| SUIT_Parameters //= (suit-parameter-unpack-info => bstr .cbor SUIT_Unpack_Info) | SUIT_Parameters //= (suit-parameter-unpack-info => bstr .cbor SUIT_Unpack_Info) | |||
| SUIT_Parameters //= (suit-parameter-source-component => bstr .cbor SUIT_Component_Identifier) | SUIT_Parameters //= (suit-parameter-source-component => uint) | |||
| SUIT_Parameters //= (suit-parameter-image-digest => bstr .cbor SUIT_Digest) | SUIT_Parameters //= (suit-parameter-image-digest => bstr .cbor SUIT_Digest) | |||
| SUIT_Parameters //= (suit-parameter-image-size => uint) | SUIT_Parameters //= (suit-parameter-image-size => uint) | |||
| SUIT_Parameters //= (suit-parameter-uri-list => bstr .cbor SUIT_URI_List) | SUIT_Parameters //= (suit-parameter-uri-list => bstr .cbor SUIT_Component_URI_List) | |||
| SUIT_Parameters //= (suit-parameter_custom => int/bool/bstr) | SUIT_Parameters //= (suit-parameter-custom => int/bool/tstr/bstr) | |||
| SUIT_URI_List = [ + [priority: int, uri: tstr] ] | SUIT_Component_URI_List = [ + [priority: int, uri: tstr] ] | |||
| SUIT_Encryption_Info= COSE_Encrypt_Tagged/COSE_Encrypt0_Tagged | SUIT_Encryption_Info= COSE_Encrypt_Tagged/COSE_Encrypt0_Tagged | |||
| SUIT_Compression_Info = { | SUIT_Compression_Info = { | |||
| suit-compression-algorithm => SUIT_Compression_Algorithms | suit-compression-algorithm => SUIT_Compression_Algorithms | |||
| ? suit-compression-parameters => bstr | ? suit-compression-parameters => bstr | |||
| } | } | |||
| SUIT_Compression_Algorithms /= SUIT_Compression_Algorithm_gzip | SUIT_Compression_Algorithms /= SUIT_Compression_Algorithm_gzip | |||
| SUIT_Compression_Algorithms /= SUIT_Compression_Algorithm_bzip2 | SUIT_Compression_Algorithms /= SUIT_Compression_Algorithm_bzip2 | |||
| SUIT_Compression_Algorithms /= SUIT_Compression_Algorithm_deflate | SUIT_Compression_Algorithms /= SUIT_Compression_Algorithm_deflate | |||
| skipping to change at page 22, line 43 ¶ | skipping to change at page 33, line 43 ¶ | |||
| SUIT_Unpack_Info = { | SUIT_Unpack_Info = { | |||
| suit-unpack-algorithm => SUIT_Unpack_Algorithms | suit-unpack-algorithm => SUIT_Unpack_Algorithms | |||
| ? suit-unpack-parameters => bstr | ? suit-unpack-parameters => bstr | |||
| } | } | |||
| SUIT_Unpack_Algorithms //= SUIT_Unpack_Algorithm_Delta | SUIT_Unpack_Algorithms //= SUIT_Unpack_Algorithm_Delta | |||
| SUIT_Unpack_Algorithms //= SUIT_Unpack_Algorithm_Hex | SUIT_Unpack_Algorithms //= SUIT_Unpack_Algorithm_Hex | |||
| SUIT_Unpack_Algorithms //= SUIT_Unpack_Algorithm_Elf | SUIT_Unpack_Algorithms //= SUIT_Unpack_Algorithm_Elf | |||
| 7.10. SUIT_Command_Sequence | 7.11. SUIT_Command_Sequence | |||
| A SUIT_Command_Sequence defines a series of actions that the | A SUIT_Command_Sequence defines a series of actions that the | |||
| recipient MUST take to accomplish a particular goal. These goals are | recipient MUST take to accomplish a particular goal. These goals are | |||
| defined in the manifest and include: | defined in the manifest and include: | |||
| 1. Dependency Resolution | 1. Dependency Resolution | |||
| 2. Payload Fetch | 2. Payload Fetch | |||
| 3. Payload Installation | 3. Payload Installation | |||
| skipping to change at page 24, line 12 ¶ | skipping to change at page 35, line 12 ¶ | |||
| the purpose of setting the index, the two component ID tables are | the purpose of setting the index, the two component ID tables are | |||
| considered to be concatenated together. | considered to be concatenated together. | |||
| To facilitate optional conditions, a special directive is provided. | To facilitate optional conditions, a special directive is provided. | |||
| It runs several new lists of conditions/directives, one after | It runs several new lists of conditions/directives, one after | |||
| another, that are contained as an argument to the directive. By | another, that are contained as an argument to the directive. By | |||
| default, it assumes that a failure of a condition should not indicate | default, it assumes that a failure of a condition should not indicate | |||
| a failure of the update/boot, but a parameter is provided to override | a failure of the update/boot, but a parameter is provided to override | |||
| this behaviour. | this behaviour. | |||
| 7.11. SUIT_Condition | 7.12. SUIT_Condition | |||
| Conditions are used to define mandatory properties of a system in | Conditions are used to define mandatory properties of a system in | |||
| order for an update to be applied. They can be pre-conditions or | order for an update to be applied. They can be pre-conditions or | |||
| post-conditons of any directive or series of directives, depending on | post-conditons of any directive or series of directives, depending on | |||
| where they are placed in the list. Conditions include: | where they are placed in the list. Conditions include: | |||
| +----------------+-------------------+----------------------------+ | +----------------+-------------------+----------------------------+ | |||
| | Condition Code | Condition Name | Argument Type | | | Condition Code | Condition Name | Argument Type | | |||
| +----------------+-------------------+----------------------------+ | +----------------+-------------------+----------------------------+ | |||
| | 1 | Vendor Identifier | nil | | | 1 | Vendor Identifier | nil | | |||
| skipping to change at page 25, line 5 ¶ | skipping to change at page 36, line 5 ¶ | |||
| Each condition MUST report a success code on completion. If a | Each condition MUST report a success code on completion. If a | |||
| condition reports failure, then the current sequence of commands MUST | condition reports failure, then the current sequence of commands MUST | |||
| terminate. If a recipient encounters an unknown Condition Code, it | terminate. If a recipient encounters an unknown Condition Code, it | |||
| MUST report a failure. | MUST report a failure. | |||
| Positive Condition numbers are reserved for IANA registration. | Positive Condition numbers are reserved for IANA registration. | |||
| Negative numbers are reserved for proprietary, application-specific | Negative numbers are reserved for proprietary, application-specific | |||
| directives. | directives. | |||
| 7.11.1. Identifier Conditions | 7.12.1. Identifier Conditions | |||
| There are three identifier-based conditions: suit-condition-vendor- | There are three identifier-based conditions: suit-condition-vendor- | |||
| identifier, suit-condition-class-identifier, and suit-condition- | identifier, suit-condition-class-identifier, and suit-condition- | |||
| device-identifier. Each of these conditions match a RFC 4122 | device-identifier. Each of these conditions match a RFC 4122 | |||
| [RFC4122] UUID that MUST have already been set as a parameter. The | [RFC4122] UUID that MUST have already been set as a parameter. The | |||
| installing device MUST match the specified UUID in order to consider | installing device MUST match the specified UUID in order to consider | |||
| the manifest valid. These identifiers MAY be scoped by component. | the manifest valid. These identifiers MAY be scoped by component. | |||
| The recipient uses the ID parameter that has already been set using | The recipient uses the ID parameter that has already been set using | |||
| the Set Parameters directive. If no ID has been set, this condition | the Set Parameters directive. If no ID has been set, this condition | |||
| fails. suit-condition-class-identifier and suit-condition-vendor- | fails. suit-condition-class-identifier and suit-condition-vendor- | |||
| identifier are REQUIRED to implement. suit-condition-device- | identifier are REQUIRED to implement. suit-condition-device- | |||
| identifier is OPTIONAL to implement. | identifier is OPTIONAL to implement. | |||
| 7.11.2. suit-condition-image-match | 7.12.2. suit-condition-image-match | |||
| Verify that the current component matches the digest parameter for | Verify that the current component matches the digest parameter for | |||
| the current component. The digest is verified against the digest | the current component. The digest is verified against the digest | |||
| specified in the Component's parameters list. If no digest is | specified in the Component's parameters list. If no digest is | |||
| specified, the condition fails. suit-condition-image-match is | specified, the condition fails. suit-condition-image-match is | |||
| REQUIRED to implement. | REQUIRED to implement. | |||
| 7.11.3. suit-condition-image-not-match | 7.12.3. suit-condition-image-not-match | |||
| Verify that the current component does not match the supplied digest. | Verify that the current component does not match the supplied digest. | |||
| If no digest is specified, then the digest is compared against the | If no digest is specified, then the digest is compared against the | |||
| digest specified in the Components list. If no digest is specified | digest specified in the Components list. If no digest is specified | |||
| and the component is not present in the Components list, the | and the component is not present in the Components list, the | |||
| condition fails. suit-condition-image-not-match is OPTIONAL to | condition fails. suit-condition-image-not-match is OPTIONAL to | |||
| implement. | implement. | |||
| 7.11.4. suit-condition-use-before | 7.12.4. suit-condition-use-before | |||
| Verify that the current time is BEFORE the specified time. suit- | Verify that the current time is BEFORE the specified time. suit- | |||
| condition-use-before is used to specify the last time at which an | condition-use-before is used to specify the last time at which an | |||
| update should be installed. One argument is required, encoded as a | update should be installed. One argument is required, encoded as a | |||
| POSIX timestamp, that is seconds after 1970-01-01 00:00:00. | POSIX timestamp, that is seconds after 1970-01-01 00:00:00. | |||
| Timestamp conditions MUST be evaluated in 64 bits, regardless of | Timestamp conditions MUST be evaluated in 64 bits, regardless of | |||
| encoded CBOR size. suit-condition-use-before is OPTIONAL to | encoded CBOR size. suit-condition-use-before is OPTIONAL to | |||
| implement. | implement. | |||
| 7.11.5. suit-condition-minimum-battery | 7.12.5. suit-condition-minimum-battery | |||
| suit-condition-minimum-battery provides a mechanism to test a | suit-condition-minimum-battery provides a mechanism to test a | |||
| device's battery level before installing an update. This condition | device's battery level before installing an update. This condition | |||
| is for use in primary-cell applications, where the battery is only | is for use in primary-cell applications, where the battery is only | |||
| ever discharged. For batteries that are charged, suit-directive-wait | ever discharged. For batteries that are charged, suit-directive-wait | |||
| is more appropriate, since it defines a "wait" until the battery | is more appropriate, since it defines a "wait" until the battery | |||
| level is sufficient to install the update. suit-condition-minimum- | level is sufficient to install the update. suit-condition-minimum- | |||
| battery is specified in mWh. suit-condition-minimum-battery is | battery is specified in mWh. suit-condition-minimum-battery is | |||
| OPTIONAL to implement. | OPTIONAL to implement. | |||
| 7.11.6. suit-condition-update-authorised | 7.12.6. suit-condition-update-authorised | |||
| Request Authorisation from the application and fail if not | Request Authorisation from the application and fail if not | |||
| authorised. This can allow a user to decline an update. Argument is | authorised. This can allow a user to decline an update. Argument is | |||
| an integer priority level. Priorities are application defined. suit- | an integer priority level. Priorities are application defined. suit- | |||
| condition-update-authorised is OPTIONAL to implement. | condition-update-authorised is OPTIONAL to implement. | |||
| 7.11.7. suit-condition-version | 7.12.7. suit-condition-version | |||
| suit-condition-version allows comparing versions of firmware. | suit-condition-version allows comparing versions of firmware. | |||
| Verifying image digests is preferred to version checks because | Verifying image digests is preferred to version checks because | |||
| digests are more precise. The image can be compared as: | digests are more precise. The image can be compared as: | |||
| - Greater | - Greater | |||
| - Greater or Equal | - Greater or Equal | |||
| - Equal | - Equal | |||
| skipping to change at page 27, line 37 ¶ | skipping to change at page 38, line 37 ¶ | |||
| - 1.2-rc3 = [1,2,-1,3] | - 1.2-rc3 = [1,2,-1,3] | |||
| - 1.2-beta = [1,2,-2] | - 1.2-beta = [1,2,-2] | |||
| - 1.2-alpha = [1,2,-3] | - 1.2-alpha = [1,2,-3] | |||
| - 1.2-alpha4 = [1,2,-3,4] | - 1.2-alpha4 = [1,2,-3,4] | |||
| suit-condition-version is OPTIONAL to implement. | suit-condition-version is OPTIONAL to implement. | |||
| 7.11.8. SUIT_Condition_Custom | 7.12.8. SUIT_Condition_Custom | |||
| SUIT_Condition_Custom describes any proprietary, application specific | SUIT_Condition_Custom describes any proprietary, application specific | |||
| condition. This is encoded as a negative integer, chosen by the | condition. This is encoded as a negative integer, chosen by the | |||
| firmware developer, and a bstr that encodes the parameters passed to | firmware developer, and a bstr that encodes the parameters passed to | |||
| the system that evaluates the condition matching that integer. | the system that evaluates the condition matching that integer. | |||
| SUIT_Condition_Custom is OPTIONAL to implement. | SUIT_Condition_Custom is OPTIONAL to implement. | |||
| 7.11.9. Identifiers | 7.12.9. Identifiers | |||
| Many conditions use identifiers to determine whether a manifest | Many conditions use identifiers to determine whether a manifest | |||
| matches a given recipient or not. These identifiers are defined to | matches a given recipient or not. These identifiers are defined to | |||
| be RFC 4122 [RFC4122] UUIDs. These UUIDs are explicitly NOT human- | be RFC 4122 [RFC4122] UUIDs. These UUIDs are explicitly NOT human- | |||
| readable. They are for machine-based matching only. | readable. They are for machine-based matching only. | |||
| A device may match any number of UUIDs for vendor or class | A device may match any number of UUIDs for vendor or class | |||
| identifier. This may be relevant to physical or software modules. | identifier. This may be relevant to physical or software modules. | |||
| For example, a device that has an OS and one or more applications | For example, a device that has an OS and one or more applications | |||
| might list one Vendor ID for the OS and one or more additional Vendor | might list one Vendor ID for the OS and one or more additional Vendor | |||
| skipping to change at page 28, line 39 ¶ | skipping to change at page 39, line 39 ¶ | |||
| 4. Application | 4. Application | |||
| This allows the OS, WiFi module, and application to be updated | This allows the OS, WiFi module, and application to be updated | |||
| independently. To combat possible incompatibilities, the OS class ID | independently. To combat possible incompatibilities, the OS class ID | |||
| can be changed each time the OS has a change to its API. | can be changed each time the OS has a change to its API. | |||
| This approach allows a vendor to target, for example, all devices | This approach allows a vendor to target, for example, all devices | |||
| with a particular WiFi module with an update, which is a very | with a particular WiFi module with an update, which is a very | |||
| powerful mechanism, particularly when used for security updates. | powerful mechanism, particularly when used for security updates. | |||
| 7.11.9.1. Creating UUIDs: | 7.12.9.1. Creating UUIDs: | |||
| UUIDs MUST be created according to RFC 4122 [RFC4122]. UUIDs SHOULD | UUIDs MUST be created according to RFC 4122 [RFC4122]. UUIDs SHOULD | |||
| use versions 3, 4, or 5, as described in RFC4122. Versions 1 and 2 | use versions 3, 4, or 5, as described in RFC4122. Versions 1 and 2 | |||
| do not provide a tangible benefit over version 4 for this | do not provide a tangible benefit over version 4 for this | |||
| application. | application. | |||
| The RECOMMENDED method to create a vendor ID is: Vendor ID = | The RECOMMENDED method to create a vendor ID is: Vendor ID = | |||
| UUID5(DNS_PREFIX, vendor domain name) | UUID5(DNS_PREFIX, vendor domain name) | |||
| The RECOMMENDED method to create a class ID is: Class ID = | The RECOMMENDED method to create a class ID is: Class ID = | |||
| UUID5(Vendor ID, Class-Specific-Information) | UUID5(Vendor ID, Class-Specific-Information) | |||
| Class-specific information is composed of a variety of data, for | Class-specific information is composed of a variety of data, for | |||
| example: | example: | |||
| - Model number | - Model number | |||
| - Hardware revision | - Hardware revision | |||
| - Bootloader version (for immutable bootloaders) | - Bootloader version (for immutable bootloaders) | |||
| 7.11.10. SUIT_Condition CDDL | 7.12.10. SUIT_Condition CDDL | |||
| The following CDDL describes SUIT_Condition: | The following CDDL describes SUIT_Condition: | |||
| SUIT_Condition //= (suit-condition-vendor-identifier, nil) | SUIT_Condition //= (suit-condition-vendor-identifier, nil) | |||
| SUIT_Condition //= (suit-condition-class-identifier, nil) | SUIT_Condition //= (suit-condition-class-identifier, nil) | |||
| SUIT_Condition //= (suit-condition-device-identifier, nil) | SUIT_Condition //= (suit-condition-device-identifier, nil) | |||
| SUIT_Condition //= (suit-condition-image-match, nil) | SUIT_Condition //= (suit-condition-image-match, nil) | |||
| SUIT_Condition //= (suit-condition-image-not-match, nil) | SUIT_Condition //= (suit-condition-image-not-match, nil) | |||
| SUIT_Condition //= (suit-condition-use-before, uint) | SUIT_Condition //= (suit-condition-use-before, uint) | |||
| SUIT_Condition //= (suit-condition-minimum-battery, uint) | SUIT_Condition //= (suit-condition-minimum-battery, uint) | |||
| skipping to change at page 29, line 41 ¶ | skipping to change at page 40, line 41 ¶ | |||
| suit-condition-version-comparison: SUIT_Condition_Version_Comparison_Value | suit-condition-version-comparison: SUIT_Condition_Version_Comparison_Value | |||
| ] | ] | |||
| SUIT_Condition_Version_Comparison_Types /= suit-condition-version-comparison-greater | SUIT_Condition_Version_Comparison_Types /= suit-condition-version-comparison-greater | |||
| SUIT_Condition_Version_Comparison_Types /= suit-condition-version-comparison-greater-equal | SUIT_Condition_Version_Comparison_Types /= suit-condition-version-comparison-greater-equal | |||
| SUIT_Condition_Version_Comparison_Types /= suit-condition-version-comparison-equal | SUIT_Condition_Version_Comparison_Types /= suit-condition-version-comparison-equal | |||
| SUIT_Condition_Version_Comparison_Types /= suit-condition-version-comparison-lesser-equal | SUIT_Condition_Version_Comparison_Types /= suit-condition-version-comparison-lesser-equal | |||
| SUIT_Condition_Version_Comparison_Types /= suit-condition-version-comparison-lesser | SUIT_Condition_Version_Comparison_Types /= suit-condition-version-comparison-lesser | |||
| SUIT_Condition_Version_Comparison_Value = [+int] | SUIT_Condition_Version_Comparison_Value = [+int] | |||
| 7.12. SUIT_Directive | 7.13. SUIT_Directive | |||
| Directives are used to define the behaviour of the recipient. | Directives are used to define the behaviour of the recipient. | |||
| Directives include: | Directives include: | |||
| +----------------+----------------------+ | +----------------+----------------------+ | |||
| | Directive Code | Directive Name | | | Directive Code | Directive Name | | |||
| +----------------+----------------------+ | +----------------+----------------------+ | |||
| | 12 | Set Component Index | | | 12 | Set Component Index | | |||
| | | | | | | | | |||
| | 13 | Set Dependency Index | | | 13 | Set Dependency Index | | |||
| skipping to change at page 30, line 45 ¶ | skipping to change at page 41, line 45 ¶ | |||
| | | | | | | | | |||
| | 31 | Run with Arguments | | | 31 | Run with Arguments | | |||
| | | | | | | | | |||
| | 32 | Swap | | | 32 | Swap | | |||
| +----------------+----------------------+ | +----------------+----------------------+ | |||
| When a Recipient executes a Directive, it MUST report a success code. | When a Recipient executes a Directive, it MUST report a success code. | |||
| If the Directive reports failure, then the current Command Sequence | If the Directive reports failure, then the current Command Sequence | |||
| MUST terminate. | MUST terminate. | |||
| 7.12.1. suit-directive-set-component-index | 7.13.1. suit-directive-set-component-index | |||
| Set Component Index defines the component to which successive | Set Component Index defines the component to which successive | |||
| directives and conditions will apply. The supplied argument MUST be | directives and conditions will apply. The supplied argument MUST be | |||
| either a boolean or an unsigned integer index into the concatenation | either a boolean or an unsigned integer index into the concatenation | |||
| of suit-components and suit-dependency-components. If the following | of suit-components and suit-dependency-components. If the following | |||
| directives apply to ALL components, then the boolean value "True" is | directives apply to ALL components, then the boolean value "True" is | |||
| used instead of an index. True does not apply to dependency | used instead of an index. True does not apply to dependency | |||
| components. If the following directives apply to NO components, then | components. If the following directives apply to NO components, then | |||
| the boolean value "False" is used. When suit-directive-set- | the boolean value "False" is used. When suit-directive-set- | |||
| dependency-index is used, suit-directive-set-component-index = False | dependency-index is used, suit-directive-set-component-index = False | |||
| is implied. When suit-directive-set-component-index is used, suit- | is implied. When suit-directive-set-component-index is used, suit- | |||
| directive-set-dependency-index = False is implied. | directive-set-dependency-index = False is implied. | |||
| The following CDDL describes the argument to suit-directive-set- | The following CDDL describes the argument to suit-directive-set- | |||
| component-index. | component-index. | |||
| SUIT_Directive_Set_Component_Index_Argument = uint/bool | SUIT_Directive_Set_Component_Index_Argument = uint/bool | |||
| 7.12.2. suit-directive-set-dependency-index | 7.13.2. suit-directive-set-dependency-index | |||
| Set Dependency Index defines the manifest to which successive | Set Dependency Index defines the manifest to which successive | |||
| directives and conditions will apply. The supplied argument MUST be | directives and conditions will apply. The supplied argument MUST be | |||
| either a boolean or an unsigned integer index into the dependencies. | either a boolean or an unsigned integer index into the dependencies. | |||
| If the following directives apply to ALL dependencies, then the | If the following directives apply to ALL dependencies, then the | |||
| boolean value "True" is used instead of an index. If the following | boolean value "True" is used instead of an index. If the following | |||
| directives apply to NO dependencies, then the boolean value "False" | directives apply to NO dependencies, then the boolean value "False" | |||
| is used. When suit-directive-set-component-index is used, suit- | is used. When suit-directive-set-component-index is used, suit- | |||
| directive-set-dependency-index = False is implied. When suit- | directive-set-dependency-index = False is implied. When suit- | |||
| directive-set-dependency-index is used, suit-directive-set-component- | directive-set-dependency-index is used, suit-directive-set-component- | |||
| skipping to change at page 31, line 37 ¶ | skipping to change at page 42, line 37 ¶ | |||
| Typical operations that require suit-directive-set-dependency-index | Typical operations that require suit-directive-set-dependency-index | |||
| include setting a source URI, invoking "Fetch," or invoking "Process | include setting a source URI, invoking "Fetch," or invoking "Process | |||
| Dependency" for an individual dependency. | Dependency" for an individual dependency. | |||
| The following CDDL describes the argument to suit-directive-set- | The following CDDL describes the argument to suit-directive-set- | |||
| dependency-index. | dependency-index. | |||
| SUIT_Directive_Set_Manifest_Index_Argument = uint/bool | SUIT_Directive_Set_Manifest_Index_Argument = uint/bool | |||
| 7.12.3. suit-directive-abort | 7.13.3. suit-directive-abort | |||
| Unconditionally fail. This operation is typically used in | Unconditionally fail. This operation is typically used in | |||
| conjunction with suit-directive-try-each. | conjunction with suit-directive-try-each. | |||
| 7.12.4. suit-directive-run-sequence | 7.13.4. suit-directive-run-sequence | |||
| To enable conditional commands, and to allow several strictly ordered | To enable conditional commands, and to allow several strictly ordered | |||
| sequences to be executed out-of-order, suit-directive-run-sequence | sequences to be executed out-of-order, suit-directive-run-sequence | |||
| allows the manifest processor to execute its argument as a | allows the manifest processor to execute its argument as a | |||
| SUIT_Command_Sequence. The argument must be wrapped in a bstr. | SUIT_Command_Sequence. The argument must be wrapped in a bstr. | |||
| When a sequence is executed, any failure of a condition causes | When a sequence is executed, any failure of a condition causes | |||
| immediate termination of the sequence. | immediate termination of the sequence. | |||
| The following CDDL describes the SUIT_Run_Sequence argument. | The following CDDL describes the SUIT_Run_Sequence argument. | |||
| SUIT_Directive_Run_Sequence_Argument = bstr .cbor SUIT_Command_Sequence | SUIT_Directive_Run_Sequence_Argument = bstr .cbor SUIT_Command_Sequence | |||
| When suit-directive-run-sequence completes, it forwards the last | When suit-directive-run-sequence completes, it forwards the last | |||
| status code that occurred in the sequence. If the Coerce on | status code that occurred in the sequence. If the Soft Failure | |||
| Condition Failure parameter is true, then suit-directive-run-sequence | parameter is true, then suit-directive-run-sequence only fails when a | |||
| only fails when a directive in the argument sequence fails. | directive in the argument sequence fails. | |||
| SUIT_Parameter_Coerce_Condition_Failure defaults to False when suit- | SUIT_Parameter_Soft_Failure defaults to False when suit-directive- | |||
| directive-run-sequence begins. Its value is discarded when suit- | run-sequence begins. Its value is discarded when suit-directive-run- | |||
| directive-run-sequence terminates. | sequence terminates. | |||
| 7.12.5. suit-directive-try-each | 7.13.5. suit-directive-try-each | |||
| This command runs several suit-directive-run-sequence one after | This command runs several SUIT_Command_Sequence, one after another, | |||
| another, in a strict order. Use this command to implement a "try/ | in a strict order. Use this command to implement a "try/catch-try/ | |||
| catch-try/catch" sequence. Manifest processors MAY implement this | catch" sequence. Manifest processors MAY implement this command. | |||
| command. | ||||
| SUIT_Parameter_Coerce_Condition_Failure is initialised to True at the | SUIT_Parameter_Soft_Failure is initialised to True at the beginning | |||
| beginning of each sequence. If one sequence aborts due to a | of each sequence. If one sequence aborts due to a condition failure, | |||
| condition failure, the next is started. If no sequence completes | the next is started. If no sequence completes without condition | |||
| without condition failure, then suit-directive-try-each returns an | failure, then suit-directive-try-each returns an error. If a | |||
| error. If a particular application calls for all sequences to fail | particular application calls for all sequences to fail and still | |||
| and still continue, then an empty sequence (nil) can be added to the | continue, then an empty sequence (nil) can be added to the Try Each | |||
| Try Each Argument. | Argument. | |||
| The following CDDL describes the SUIT_Try_Each argument. | The following CDDL describes the SUIT_Try_Each argument. | |||
| SUIT_Directive_Try_Each_Argument = [ | SUIT_Directive_Try_Each_Argument = [ | |||
| + bstr .cbor SUIT_Command_Sequence, | + bstr .cbor SUIT_Command_Sequence, | |||
| nil / bstr .cbor SUIT_Command_Sequence | nil / bstr .cbor SUIT_Command_Sequence | |||
| ] | ] | |||
| 7.12.6. suit-directive-process-dependency | 7.13.6. suit-directive-process-dependency | |||
| Execute the commands in the common section of the current dependency, | Execute the commands in the common section of the current dependency, | |||
| followed by the commands in the equivalent section of the current | followed by the commands in the equivalent section of the current | |||
| dependency. For example, if the current section is "fetch payload," | dependency. For example, if the current section is "fetch payload," | |||
| this will execute "common" in the current dependency, then "fetch | this will execute "common" in the current dependency, then "fetch | |||
| payload" in the current dependency. Once this is complete, the | payload" in the current dependency. Once this is complete, the | |||
| command following suit-directive-process-dependency will be | command following suit-directive-process-dependency will be | |||
| processed. | processed. | |||
| If the current dependency is False, this directive has no effect. If | If the current dependency is False, this directive has no effect. If | |||
| skipping to change at page 33, line 15 ¶ | skipping to change at page 44, line 13 ¶ | |||
| MUST have no effect. | MUST have no effect. | |||
| When SUIT_Process_Dependency completes, it forwards the last status | When SUIT_Process_Dependency completes, it forwards the last status | |||
| code that occurred in the dependency. | code that occurred in the dependency. | |||
| The argument to suit-directive-process-dependency is defined in the | The argument to suit-directive-process-dependency is defined in the | |||
| following CDDL. | following CDDL. | |||
| SUIT_Directive_Process_Dependency_Argument = nil | SUIT_Directive_Process_Dependency_Argument = nil | |||
| 7.12.7. suit-directive-set-parameters | 7.13.7. suit-directive-set-parameters | |||
| suit-directive-set-parameters allows the manifest to configure | suit-directive-set-parameters allows the manifest to configure | |||
| behaviour of future directives by changing parameters that are read | behaviour of future directives by changing parameters that are read | |||
| by those directives. When dependencies are used, suit-directive-set- | by those directives. When dependencies are used, suit-directive-set- | |||
| parameters also allows a manifest to modify the behaviour of its | parameters also allows a manifest to modify the behaviour of its | |||
| dependencies. | dependencies. | |||
| Available parameters are defined in Section 7.5. | Available parameters are defined in Section 7.6. | |||
| If a parameter is already set, suit-directive-set-parameters will | If a parameter is already set, suit-directive-set-parameters will | |||
| skip setting the parameter to its argument. This provides the core | skip setting the parameter to its argument. This provides the core | |||
| of the override mechanism, allowing dependent manifests to change the | of the override mechanism, allowing dependent manifests to change the | |||
| behaviour of a manifest. | behaviour of a manifest. | |||
| The argument to suit-directive-set-parameters is defined in the | The argument to suit-directive-set-parameters is defined in the | |||
| following CDDL. | following CDDL. | |||
| SUIT_Directive_Set_Parameters_Argument = {+ SUIT_Parameters} | SUIT_Directive_Set_Parameters_Argument = {+ SUIT_Parameters} | |||
| N.B.: A directive code is reserved for an optimisation: a way to set | N.B.: A directive code is reserved for an optimisation: a way to set | |||
| a parameter to the contents of another parameter, optionally with | a parameter to the contents of another parameter, optionally with | |||
| another component ID. | another component ID. | |||
| 7.12.8. suit-directive-override-parameters | 7.13.8. suit-directive-override-parameters | |||
| suit-directive-override-parameters replaces any listed parameters | suit-directive-override-parameters replaces any listed parameters | |||
| that are already set with the values that are provided in its | that are already set with the values that are provided in its | |||
| argument. This allows a manifest to prevent replacement of critical | argument. This allows a manifest to prevent replacement of critical | |||
| parameters. | parameters. | |||
| Available parameters are defined in Section 7.5. | Available parameters are defined in Section 7.6. | |||
| The argument to suit-directive-override-parameters is defined in the | The argument to suit-directive-override-parameters is defined in the | |||
| following CDDL. | following CDDL. | |||
| SUIT_Directive_Override_Parameters_Argument = {+ SUIT_Parameters} | SUIT_Directive_Override_Parameters_Argument = {+ SUIT_Parameters} | |||
| 7.12.9. suit-directive-fetch | 7.13.9. suit-directive-fetch | |||
| suit-directive-fetch instructs the manifest processor to obtain one | suit-directive-fetch instructs the manifest processor to obtain one | |||
| or more manifests or payloads, as specified by the manifest index and | or more manifests or payloads, as specified by the manifest index and | |||
| component index, respectively. | component index, respectively. | |||
| suit-directive-fetch can target one or more manifests and one or more | suit-directive-fetch can target one or more manifests and one or more | |||
| payloads. suit-directive-fetch retrieves each component and each | payloads. suit-directive-fetch retrieves each component and each | |||
| manifest listed in component-index and manifest-index, respectively. | manifest listed in component-index and manifest-index, respectively. | |||
| If component-index or manifest-index is True, instead of an integer, | If component-index or manifest-index is True, instead of an integer, | |||
| then all current manifest components/manifests are fetched. The | then all current manifest components/manifests are fetched. The | |||
| skipping to change at page 34, line 39 ¶ | skipping to change at page 45, line 39 ¶ | |||
| SUIT_Parameter_Compression_Info, SUIT_Parameter_Unpack_Info. These | SUIT_Parameter_Compression_Info, SUIT_Parameter_Unpack_Info. These | |||
| three parameters each activate and configure a processing step that | three parameters each activate and configure a processing step that | |||
| can be applied to the data that is transferred during suit-directive- | can be applied to the data that is transferred during suit-directive- | |||
| fetch. | fetch. | |||
| The argument to suit-directive-fetch is defined in the following | The argument to suit-directive-fetch is defined in the following | |||
| CDDL. | CDDL. | |||
| SUIT_Directive_Fetch_Argument = nil/bstr | SUIT_Directive_Fetch_Argument = nil/bstr | |||
| 7.12.10. suit-directive-copy | 7.13.10. suit-directive-copy | |||
| suit-directive-copy instructs the manifest processor to obtain one or | suit-directive-copy instructs the manifest processor to obtain one or | |||
| more payloads, as specified by the component index. suit-directive- | more payloads, as specified by the component index. suit-directive- | |||
| copy retrieves each component listed in component-index, | copy retrieves each component listed in component-index, | |||
| respectively. If component-index is True, instead of an integer, | respectively. If component-index is True, instead of an integer, | |||
| then all current manifest components are copied. The current | then all current manifest components are copied. The current | |||
| manifest's dependent-components are not automatically copied. In | manifest's dependent-components are not automatically copied. In | |||
| order to copy these, they MUST be specified in a component-index | order to copy these, they MUST be specified in a component-index | |||
| integer. | integer. | |||
| skipping to change at page 35, line 18 ¶ | skipping to change at page 46, line 18 ¶ | |||
| *N.B.* Fetch and Copy are very similar. Merging them into one | *N.B.* Fetch and Copy are very similar. Merging them into one | |||
| command may be appropriate. | command may be appropriate. | |||
| suit-directive-copy reads its source from | suit-directive-copy reads its source from | |||
| SUIT_Parameter_Source_Component. | SUIT_Parameter_Source_Component. | |||
| The argument to suit-directive-copy is defined in the following CDDL. | The argument to suit-directive-copy is defined in the following CDDL. | |||
| SUIT_Directive_Copy_Argument = nil | SUIT_Directive_Copy_Argument = nil | |||
| 7.12.11. suit-directive-swap | 7.13.11. suit-directive-swap | |||
| suit-directive-swap instructs the manifest processor to move the | suit-directive-swap instructs the manifest processor to move the | |||
| source to the destination and the destination to the source | source to the destination and the destination to the source | |||
| simultaneously. Swap has nearly identical semantics to suit- | simultaneously. Swap has nearly identical semantics to suit- | |||
| directive-copy except that suit-directive-swap replaces the source | directive-copy except that suit-directive-swap replaces the source | |||
| with the current contents of the destination in an application- | with the current contents of the destination in an application- | |||
| defined way. If SUIT_Parameter_Compression_Info or | defined way. If SUIT_Parameter_Compression_Info or | |||
| SUIT_Parameter_Encryption_Info are present, they must be handled in a | SUIT_Parameter_Encryption_Info are present, they must be handled in a | |||
| symmetric way, so that the source is decompressed into the | symmetric way, so that the source is decompressed into the | |||
| destination and the destination is compressed into the source. The | destination and the destination is compressed into the source. The | |||
| source is decrypted into the destination and the destination is | source is decrypted into the destination and the destination is | |||
| encrypted into the source. suit-directive-swap is OPTIONAL to | encrypted into the source. suit-directive-swap is OPTIONAL to | |||
| implement. | implement. | |||
| 7.12.12. suit-directive-run | 7.13.12. suit-directive-run | |||
| suit-directive-run directs the manifest processor to transfer | suit-directive-run directs the manifest processor to transfer | |||
| execution to the current Component Index. When this is invoked, the | execution to the current Component Index. When this is invoked, the | |||
| manifest processor MAY be unloaded and execution continues in the | manifest processor MAY be unloaded and execution continues in the | |||
| Component Index. Arguments provided to Run are forwarded to the | Component Index. Arguments provided to Run are forwarded to the | |||
| executable code located in Component Index, in an application- | executable code located in Component Index, in an application- | |||
| specific way. For example, this could form the Linux Kernel Command | specific way. For example, this could form the Linux Kernel Command | |||
| Line if booting a linux device. | Line if booting a linux device. | |||
| If the executable code at Component Index is constructed in such a | If the executable code at Component Index is constructed in such a | |||
| way that it does not unload the manifest processor, then the manifest | way that it does not unload the manifest processor, then the manifest | |||
| processor may resume execution after the executable completes. This | processor may resume execution after the executable completes. This | |||
| allows the manifest processor to invoke suitable helpers and to | allows the manifest processor to invoke suitable helpers and to | |||
| verify them with image conditions. | verify them with image conditions. | |||
| The argument to suit-directive-run is defined in the following CDDL. | The argument to suit-directive-run is defined in the following CDDL. | |||
| SUIT_Directive_Run_Argument = nil/bstr | SUIT_Directive_Run_Argument = nil/bstr | |||
| 7.12.13. suit-directive-wait | 7.13.13. suit-directive-wait | |||
| suit-directive-wait directs the manifest processor to pause until a | suit-directive-wait directs the manifest processor to pause until a | |||
| specified event occurs. Some possible events include: | specified event occurs. Some possible events include: | |||
| 1. Authorisation | 1. Authorisation | |||
| 2. External Power | 2. External Power | |||
| 3. Network availability | 3. Network availability | |||
| skipping to change at page 37, line 4 ¶ | skipping to change at page 48, line 4 ¶ | |||
| SUIT_Wait_Event_Argument_Authorisation = int ; priority | SUIT_Wait_Event_Argument_Authorisation = int ; priority | |||
| SUIT_Wait_Event_Argument_Power = int ; Power Level | SUIT_Wait_Event_Argument_Power = int ; Power Level | |||
| SUIT_Wait_Event_Argument_Network = int ; Network State | SUIT_Wait_Event_Argument_Network = int ; Network State | |||
| SUIT_Wait_Event_Argument_Other_Device_Version = [ | SUIT_Wait_Event_Argument_Other_Device_Version = [ | |||
| other-device: bstr, | other-device: bstr, | |||
| other-device-version: [+int] | other-device-version: [+int] | |||
| ] | ] | |||
| SUIT_Wait_Event_Argument_Time = uint ; Timestamp | SUIT_Wait_Event_Argument_Time = uint ; Timestamp | |||
| SUIT_Wait_Event_Argument_Time_Of_Day = uint ; Time of Day (seconds since 00:00:00) | SUIT_Wait_Event_Argument_Time_Of_Day = uint ; Time of Day (seconds since 00:00:00) | |||
| SUIT_Wait_Event_Argument_Day_Of_Week = uint ; Days since Sunday | SUIT_Wait_Event_Argument_Day_Of_Week = uint ; Days since Sunday | |||
| 7.12.14. SUIT_Directive CDDL | 7.13.14. SUIT_Directive CDDL | |||
| The following CDDL describes SUIT_Directive: | The following CDDL describes SUIT_Directive: | |||
| SUIT_Directive //= (suit-directive-set-component-index, uint/bool) | SUIT_Directive //= (suit-directive-set-component-index, uint/bool) | |||
| SUIT_Directive //= (suit-directive-set-dependency-index, uint/bool) | SUIT_Directive //= (suit-directive-set-dependency-index, uint/bool) | |||
| SUIT_Directive //= (suit-directive-run-sequence, | SUIT_Directive //= (suit-directive-run-sequence, | |||
| bstr .cbor SUIT_Command_Sequence) | bstr .cbor SUIT_Command_Sequence) | |||
| SUIT_Directive //= (suit-directive-try-each, | SUIT_Directive //= (suit-directive-try-each, | |||
| SUIT_Directive_Try_Each_Argument) | SUIT_Directive_Try_Each_Argument) | |||
| SUIT_Directive //= (suit-directive-process-dependency, nil) | SUIT_Directive //= (suit-directive-process-dependency, nil) | |||
| skipping to change at page 39, line 4 ¶ | skipping to change at page 50, line 4 ¶ | |||
| SUIT_Wait_Event_Argument_Authorisation = int ; priority | SUIT_Wait_Event_Argument_Authorisation = int ; priority | |||
| SUIT_Wait_Event_Argument_Power = int ; Power Level | SUIT_Wait_Event_Argument_Power = int ; Power Level | |||
| SUIT_Wait_Event_Argument_Network = int ; Network State | SUIT_Wait_Event_Argument_Network = int ; Network State | |||
| SUIT_Wait_Event_Argument_Other_Device_Version = [ | SUIT_Wait_Event_Argument_Other_Device_Version = [ | |||
| other-device: bstr, | other-device: bstr, | |||
| other-device-version: [+int] | other-device-version: [+int] | |||
| ] | ] | |||
| SUIT_Wait_Event_Argument_Time = uint ; Timestamp | SUIT_Wait_Event_Argument_Time = uint ; Timestamp | |||
| SUIT_Wait_Event_Argument_Time_Of_Day = uint ; Time of Day (seconds since 00:00:00) | SUIT_Wait_Event_Argument_Time_Of_Day = uint ; Time of Day (seconds since 00:00:00) | |||
| SUIT_Wait_Event_Argument_Day_Of_Week = uint ; Days since Sunday | SUIT_Wait_Event_Argument_Day_Of_Week = uint ; Days since Sunday | |||
| 8. Dependency processing | 7.14. SUIT_Text_Map | |||
| Dependencies need careful handling on constrained systems. A | ||||
| dependency tree that is too deep can cause recursive handling to | ||||
| overflow stack space. Systems that parse all dependencies into an | ||||
| object tree can easily fill up available memory. Too many | ||||
| dependencies can overrun available storage space. | ||||
| The dependency handling system in this document is designed to | ||||
| address as many of these problems as possible. | ||||
| Dependencies MAY be addressed in one of three ways: | ||||
| 1. Iterate by component | ||||
| 2. Iterate by manifest | ||||
| 3. Out-of-order | ||||
| Because each manifest has a list of components and a list of | ||||
| components defined by its dependencies, it is possible for the | ||||
| manifest processor to handle one component at a time, traversing the | ||||
| manifest tree once for each listed component. This, however consumes | ||||
| significant processing power. | ||||
| Alternatively, it is possible for a device with sufficient memory to | The SUIT_Text_Map contains all text descriptions needed for this | |||
| accumulate all parameters for all listed component IDs. This will | manifest. The text section is typically severable, allowing | |||
| naturally consume more memory, but it allows the device to process | manifests to be distributed without the text, since end-nodes do not | |||
| the manifests in a single pass. | require text. The meaning of each field is described below. | |||
| It is expected that the simplest and most power sensitive devices | Each section MAY be present. If present, each section MUST be as | |||
| will use option 2, with a fixed maximum number of components. | described. Negative integer IDs are reserved for application- | |||
| specific text values. | ||||
| Advanced devices may make use of the Strict Order parameter and | +----+-----------------------+--------------------------------------+ | |||
| enable parallel processing of some segments, or it may reorder some | | ID | Name | Summary | | |||
| segments. To perform parallel processing, once the Strict Order | +----+-----------------------+--------------------------------------+ | |||
| parameter is set to False, the device may fork a process for each | | 1 | manifest-description | Free text description of the | | |||
| command until the Strict Order parameter is returned to True or the | | | | manifest | | |||
| command sequence ends. Then, it joins all forked processes before | | | | | | |||
| continuing processing of commands. To perform out-of-order | | 2 | update-description | Free text description of the update | | |||
| processing, a similar approach is used, except the device consumes | | | | | | |||
| all commands after the Strict Order parameter is set to False, then | | 3 | vendor-name | Free text vendor name | | |||
| it sorts these commands into its preferred order, invokes them all, | | | | | | |||
| then continues processing. | | 4 | model-name | Free text model name | | |||
| | | | | | ||||
| | 5 | vendor-domain | The domain used to create the | | ||||
| | | | vendor-id (Section 7.12.9.1) | | ||||
| | | | | | ||||
| | 6 | model-info | The information used to create the | | ||||
| | | | class-id (Section 7.12.9.1) | | ||||
| | | | | | ||||
| | 7 | component-description | Free text description of each | | ||||
| | | | component in the manifest | | ||||
| | | | | | ||||
| | 8 | json-source | The JSON-formated document that was | | ||||
| | | | used to create the manifest | | ||||
| | | | | | ||||
| | 9 | yaml-source | The yaml-formated document that was | | ||||
| | | | used to create the manifest | | ||||
| | | | | | ||||
| | 10 | version-dependencies | List of component versions required | | ||||
| | | | by the manifest | | ||||
| +----+-----------------------+--------------------------------------+ | ||||
| 9. Access Control Lists | 8. Access Control Lists | |||
| To manage permissions in the manifest, there are three models that | To manage permissions in the manifest, there are three models that | |||
| can be used. | can be used. | |||
| First, the simplest model requires that all manifests are | First, the simplest model requires that all manifests are | |||
| authenticated by a single trusted key. This mode has the advantage | authenticated by a single trusted key. This mode has the advantage | |||
| that only a root manifest needs to be authenticated, since all of its | that only a root manifest needs to be authenticated, since all of its | |||
| dependencies have digests included in the root manifest. | dependencies have digests included in the root manifest. | |||
| This simplest model can be extended by adding key delegation without | This simplest model can be extended by adding key delegation without | |||
| skipping to change at page 40, line 30 ¶ | skipping to change at page 51, line 25 ¶ | |||
| grants access rights for specific component IDs or component ID | grants access rights for specific component IDs or component ID | |||
| prefixes to the listed identities or identity groups. Any identity | prefixes to the listed identities or identity groups. Any identity | |||
| may verify an image digest, but fetching into or fetching from a | may verify an image digest, but fetching into or fetching from a | |||
| component ID requires approval from the ACL. | component ID requires approval from the ACL. | |||
| A third model allows a device to provide even more fine-grained | A third model allows a device to provide even more fine-grained | |||
| controls: The ACL lists the component ID or component ID prefix that | controls: The ACL lists the component ID or component ID prefix that | |||
| an identity may use, and also lists the commands that the identity | an identity may use, and also lists the commands that the identity | |||
| may use in combination with that component ID. | may use in combination with that component ID. | |||
| 10. SUIT digest container | 9. SUIT digest container | |||
| RFC 8152 [RFC8152] provides containers for signature, MAC, and | RFC 8152 [RFC8152] provides containers for signature, MAC, and | |||
| encryption, but no basic digest container. The container needed for | encryption, but no basic digest container. The container needed for | |||
| a digest requires a type identifier and a container for the raw | a digest requires a type identifier and a container for the raw | |||
| digest data. Some forms of digest may require additional parameters. | digest data. Some forms of digest may require additional parameters. | |||
| These can be added following the digest. This structure is described | These can be added following the digest. This structure is described | |||
| by the following CDDL. | by the following CDDL. | |||
| The algorithms listed are sufficient for verifying integrity of | The algorithms listed are sufficient for verifying integrity of | |||
| Firmware Updates as of this writing, however this may change over | Firmware Updates as of this writing, however this may change over | |||
| skipping to change at page 41, line 29 ¶ | skipping to change at page 52, line 29 ¶ | |||
| algorithm-id-sha224 = 1 | algorithm-id-sha224 = 1 | |||
| algorithm-id-sha256 = 2 | algorithm-id-sha256 = 2 | |||
| algorithm-id-sha384 = 3 | algorithm-id-sha384 = 3 | |||
| algorithm-id-sha512 = 4 | algorithm-id-sha512 = 4 | |||
| algorithm-id-sha3-224 = 5 | algorithm-id-sha3-224 = 5 | |||
| algorithm-id-sha3-256 = 6 | algorithm-id-sha3-256 = 6 | |||
| algorithm-id-sha3-384 = 7 | algorithm-id-sha3-384 = 7 | |||
| algorithm-id-sha3-512 = 8 | algorithm-id-sha3-512 = 8 | |||
| 11. Creating conditional sequences | 10. Creating conditional sequences | |||
| For some use cases, it is important to provide a sequence that can | For some use cases, it is important to provide a sequence that can | |||
| fail without terminating an update. For example, a dual-image XIP | fail without terminating an update. For example, a dual-image XIP | |||
| MCU may require an update that can be placed at one of two offsets. | MCU may require an update that can be placed at one of two offsets. | |||
| This has two implications, first, the digest of each offset will be | This has two implications, first, the digest of each offset will be | |||
| different. Second, the image fetched for each offset will have a | different. Second, the image fetched for each offset will have a | |||
| different URI. Conditional sequences allow this to be resolved in a | different URI. Conditional sequences allow this to be resolved in a | |||
| simple way. | simple way. | |||
| The following JSON representation of a manifest demonstrates how this | The following JSON representation of a manifest demonstrates how this | |||
| skipping to change at page 43, line 10 ¶ | skipping to change at page 54, line 10 ¶ | |||
| } | } | |||
| ], | ], | |||
| [{ "directive-abort" : null }] | [{ "directive-abort" : null }] | |||
| ] | ] | |||
| }, | }, | |||
| "fetch" : null | "fetch" : null | |||
| ] | ] | |||
| } | } | |||
| 12. Full CDDL | 11. Full CDDL | |||
| In order to create a valid SUIT Manifest document the structure of | In order to create a valid SUIT Manifest document the structure of | |||
| the corresponding CBOR message MUST adhere to the following CDDL data | the corresponding CBOR message MUST adhere to the following CDDL data | |||
| definition. | definition. | |||
| SUIT_Outer_Wrapper = { | SUIT_Outer_Wrapper = { | |||
| suit-authentication-wrapper => bstr .cbor SUIT_Authentication_Wrapper / nil, | suit-authentication-wrapper => bstr .cbor SUIT_Authentication_Wrapper / nil, | |||
| $$SUIT_Manifest_Wrapped, | $$SUIT_Manifest_Wrapped, | |||
| suit-dependency-resolution => bstr .cbor SUIT_Command_Sequence, | suit-dependency-resolution => bstr .cbor SUIT_Command_Sequence, | |||
| suit-payload-fetch => bstr .cbor SUIT_Command_Sequence, | suit-payload-fetch => bstr .cbor SUIT_Command_Sequence, | |||
| skipping to change at page 43, line 50 ¶ | skipping to change at page 54, line 50 ¶ | |||
| COSE_Mac_Tagged = any | COSE_Mac_Tagged = any | |||
| COSE_Sign_Tagged = any | COSE_Sign_Tagged = any | |||
| COSE_Mac0_Tagged = any | COSE_Mac0_Tagged = any | |||
| COSE_Sign1_Tagged = any | COSE_Sign1_Tagged = any | |||
| COSE_Encrypt_Tagged = any | COSE_Encrypt_Tagged = any | |||
| COSE_Encrypt0_Tagged = any | COSE_Encrypt0_Tagged = any | |||
| SUIT_Digest = [ | SUIT_Digest = [ | |||
| suit-digest-algorithm-id : $suit-digest-algorithm-ids, | suit-digest-algorithm-id : $suit-digest-algorithm-ids, | |||
| suit-digest-bytes : bytes, | suit-digest-bytes : bstr, | |||
| ? suit-digest-parameters : any | ? suit-digest-parameters : any | |||
| ] | ] | |||
| ; Named Information Hash Algorithm Identifiers | ; Named Information Hash Algorithm Identifiers | |||
| suit-digest-algorithm-ids /= algorithm-id-sha224 | suit-digest-algorithm-ids /= algorithm-id-sha224 | |||
| suit-digest-algorithm-ids /= algorithm-id-sha256 | suit-digest-algorithm-ids /= algorithm-id-sha256 | |||
| suit-digest-algorithm-ids /= algorithm-id-sha384 | suit-digest-algorithm-ids /= algorithm-id-sha384 | |||
| suit-digest-algorithm-ids /= algorithm-id-sha512 | suit-digest-algorithm-ids /= algorithm-id-sha512 | |||
| suit-digest-algorithm-ids /= algorithm-id-sha3-224 | suit-digest-algorithm-ids /= algorithm-id-sha3-224 | |||
| suit-digest-algorithm-ids /= algorithm-id-sha3-256 | suit-digest-algorithm-ids /= algorithm-id-sha3-256 | |||
| suit-digest-algorithm-ids /= algorithm-id-sha3-384 | suit-digest-algorithm-ids /= algorithm-id-sha3-384 | |||
| suit-digest-algorithm-ids /= algorithm-id-sha3-512 | suit-digest-algorithm-ids /= algorithm-id-sha3-512 | |||
| algorithm-id-sha224 = 1 | ||||
| algorithm-id-sha256 = 2 | ||||
| algorithm-id-sha384 = 3 | ||||
| algorithm-id-sha512 = 4 | ||||
| algorithm-id-sha3-224 = 5 | ||||
| algorithm-id-sha3-256 = 6 | ||||
| algorithm-id-sha3-384 = 7 | ||||
| algorithm-id-sha3-512 = 8 | ||||
| SUIT_Manifest = { | SUIT_Manifest = { | |||
| suit-manifest-version => 1, | suit-manifest-version => 1, | |||
| suit-manifest-sequence-number => uint, | suit-manifest-sequence-number => uint, | |||
| ? suit-common => bstr .cbor SUIT_Common, | ? suit-common => bstr .cbor SUIT_Common, | |||
| ? suit-dependency-resolution => SUIT_Digest / bstr .cbor SUIT_Command_Sequence, | ? suit-dependency-resolution => SUIT_Digest / bstr .cbor SUIT_Command_Sequence, | |||
| ? suit-payload-fetch => SUIT_Digest / bstr .cbor SUIT_Command_Sequence, | ? suit-payload-fetch => SUIT_Digest / bstr .cbor SUIT_Command_Sequence, | |||
| ? suit-install => SUIT_Digest / bstr .cbor SUIT_Command_Sequence | ? suit-install => SUIT_Digest / bstr .cbor SUIT_Command_Sequence, | |||
| ? suit-validate => bstr .cbor SUIT_Command_Sequence | ? suit-validate => bstr .cbor SUIT_Command_Sequence, | |||
| ? suit-load => bstr .cbor SUIT_Command_Sequence | ? suit-load => bstr .cbor SUIT_Command_Sequence, | |||
| ? suit-run => bstr .cbor SUIT_Command_Sequence | ? suit-run => bstr .cbor SUIT_Command_Sequence, | |||
| ? suit-text => SUIT_Digest / bstr .cbor SUIT_Text_Map | ? suit-text => SUIT_Digest, | |||
| ? suit-coswid => SUIT_Digest / bstr .cbor concise-software-identity | ? suit-coswid => SUIT_Digest / bstr .cbor concise-software-identity, | |||
| } | } | |||
| SUIT_Common = { | SUIT_Common = { | |||
| ? suit-dependencies => bstr .cbor SUIT_Dependencies, | ? suit-dependencies => bstr .cbor SUIT_Dependencies, | |||
| ? suit-components => bstr .cbor SUIT_Components, | ? suit-components => bstr .cbor SUIT_Components, | |||
| ? suit-dependency-components => bstr .cbor SUIT_Component_References, | ? suit-dependency-components => bstr .cbor SUIT_Component_References, | |||
| ? suit-common-sequence => bstr .cbor SUIT_Command_Sequence, | ? suit-common-sequence => bstr .cbor SUIT_Command_Sequence, | |||
| } | } | |||
| SUIT_Dependencies = [ + SUIT_Dependency ] | SUIT_Dependencies = [ + SUIT_Dependency ] | |||
| skipping to change at page 45, line 4 ¶ | skipping to change at page 56, line 12 ¶ | |||
| SUIT_Dependency = { | SUIT_Dependency = { | |||
| suit-dependency-digest => SUIT_Digest, | suit-dependency-digest => SUIT_Digest, | |||
| suit-dependency-prefix => SUIT_Component_Identifier, | suit-dependency-prefix => SUIT_Component_Identifier, | |||
| } | } | |||
| SUIT_Component_Identifier = [* bstr] | SUIT_Component_Identifier = [* bstr] | |||
| SUIT_Component_Reference = { | SUIT_Component_Reference = { | |||
| suit-component-identifier => SUIT_Component_Identifier, | suit-component-identifier => SUIT_Component_Identifier, | |||
| suit-component-dependency-index => uint | suit-component-dependency-index => uint | |||
| } | } | |||
| SUIT_Command_Sequence = [ + (SUIT_Condition // SUIT_Directive // SUIT_Command_Custom) ] | SUIT_Command_Sequence = [ + (SUIT_Condition // SUIT_Directive // SUIT_Command_Custom) ] | |||
| SUIT_Command_Custom = (nint, bstr) | SUIT_Command_Custom = (nint, bstr) | |||
| SUIT_Condition //= (suit-condition-vendor-identifier, nil) | SUIT_Condition //= (suit-condition-vendor-identifier, nil) | |||
| SUIT_Condition //= (suit-condition-class-identifier, nil) | SUIT_Condition //= (suit-condition-class-identifier, nil) | |||
| SUIT_Condition //= (suit-condition-device-identifier, nil) | SUIT_Condition //= (suit-condition-device-identifier, nil) | |||
| SUIT_Condition //= (suit-condition-image-match, nil) | SUIT_Condition //= (suit-condition-image-match, nil) | |||
| SUIT_Condition //= (suit-condition-image-not-match, nil) | SUIT_Condition //= (suit-condition-image-not-match, nil) | |||
| SUIT_Condition //= (suit-condition-use-before, uint) | SUIT_Condition //= (suit-condition-use-before, uint) | |||
| SUIT_Condition //= (suit-condition-minimum-battery, uint) | SUIT_Condition //= (suit-condition-minimum-battery, uint) | |||
| SUIT_Condition //= (suit-condition-update-authorised, int) | SUIT_Condition //= (suit-condition-update-authorised, int) | |||
| SUIT_Condition //= (suit-condition-version, SUIT_Condition_Version_Argument) | SUIT_Condition //= (suit-condition-version, SUIT_Condition_Version_Argument) | |||
| SUIT_Condition //= (suit-condition-component-offset, uint) | SUIT_Condition //= (suit-condition-component-offset, uint) | |||
| SUIT_Condition //= (suit-condition-custom, bstr) | SUIT_Condition //= (suit-condition-custom, bstr) | |||
| RFC4122_UUID = bstr .size 16 | RFC4122_UUID = bstr .size 16 | |||
| SUIT_Condition_Version_Argument = [ | SUIT_Condition_Version_Argument = [ | |||
| suit-condition-version-comparison: SUIT_Condition_Version_Comparison_Types, | suit-condition-version-comparison-type: SUIT_Condition_Version_Comparison_Types, | |||
| suit-condition-version-comparison: SUIT_Condition_Version_Comparison_Value | suit-condition-version-comparison-value: SUIT_Condition_Version_Comparison_Value | |||
| ] | ] | |||
| SUIT_Condition_Version_Comparison_Types /= suit-condition-version-comparison-greater | SUIT_Condition_Version_Comparison_Types /= suit-condition-version-comparison-greater | |||
| SUIT_Condition_Version_Comparison_Types /= suit-condition-version-comparison-greater-equal | SUIT_Condition_Version_Comparison_Types /= suit-condition-version-comparison-greater-equal | |||
| SUIT_Condition_Version_Comparison_Types /= suit-condition-version-comparison-equal | SUIT_Condition_Version_Comparison_Types /= suit-condition-version-comparison-equal | |||
| SUIT_Condition_Version_Comparison_Types /= suit-condition-version-comparison-lesser-equal | SUIT_Condition_Version_Comparison_Types /= suit-condition-version-comparison-lesser-equal | |||
| SUIT_Condition_Version_Comparison_Types /= suit-condition-version-comparison-lesser | SUIT_Condition_Version_Comparison_Types /= suit-condition-version-comparison-lesser | |||
| suit-condition-version-comparison-greater = 1 | suit-condition-version-comparison-greater = 1 | |||
| suit-condition-version-comparison-greater-equal = 2 | suit-condition-version-comparison-greater-equal = 2 | |||
| suit-condition-version-comparison-equal = 3 | suit-condition-version-comparison-equal = 3 | |||
| skipping to change at page 46, line 36 ¶ | skipping to change at page 57, line 45 ¶ | |||
| SUIT_Wait_Event_Argument_Network = int ; Network State | SUIT_Wait_Event_Argument_Network = int ; Network State | |||
| SUIT_Wait_Event_Argument_Other_Device_Version = [ | SUIT_Wait_Event_Argument_Other_Device_Version = [ | |||
| other-device: bstr, | other-device: bstr, | |||
| other-device-version: [+int] | other-device-version: [+int] | |||
| ] | ] | |||
| SUIT_Wait_Event_Argument_Time = uint ; Timestamp | SUIT_Wait_Event_Argument_Time = uint ; Timestamp | |||
| SUIT_Wait_Event_Argument_Time_Of_Day = uint ; Time of Day (seconds since 00:00:00) | SUIT_Wait_Event_Argument_Time_Of_Day = uint ; Time of Day (seconds since 00:00:00) | |||
| SUIT_Wait_Event_Argument_Day_Of_Week = uint ; Days since Sunday | SUIT_Wait_Event_Argument_Day_Of_Week = uint ; Days since Sunday | |||
| SUIT_Parameters //= (suit-parameter-strict-order => bool) | SUIT_Parameters //= (suit-parameter-strict-order => bool) | |||
| SUIT_Parameters //= (suit-parameter-coerce-condition-failure => bool) | SUIT_Parameters //= (suit-parameter-soft-failure => bool) | |||
| SUIT_Parameters //= (suit-parameter-vendor-id => bstr) | SUIT_Parameters //= (suit-parameter-vendor-id => bstr) | |||
| SUIT_Parameters //= (suit-parameter-class-id => bstr) | SUIT_Parameters //= (suit-parameter-class-id => bstr) | |||
| SUIT_Parameters //= (suit-parameter-device-id => bstr) | SUIT_Parameters //= (suit-parameter-device-id => bstr) | |||
| SUIT_Parameters //= (suit-parameter-uri => bstr) | SUIT_Parameters //= (suit-parameter-uri => tstr) | |||
| SUIT_Parameters //= (suit-parameter-encryption-info => bstr .cbor SUIT_Encryption_Info) | SUIT_Parameters //= (suit-parameter-encryption-info => bstr .cbor SUIT_Encryption_Info) | |||
| SUIT_Parameters //= (suit-parameter-compression-info => bstr .cbor SUIT_Compression_Info) | SUIT_Parameters //= (suit-parameter-compression-info => bstr .cbor SUIT_Compression_Info) | |||
| SUIT_Parameters //= (suit-parameter-unpack-info => bstr .cbor SUIT_Unpack_Info) | SUIT_Parameters //= (suit-parameter-unpack-info => bstr .cbor SUIT_Unpack_Info) | |||
| SUIT_Parameters //= (suit-parameter-source-component => bstr .cbor SUIT_Component_Identifier) | SUIT_Parameters //= (suit-parameter-source-component => uint) | |||
| SUIT_Parameters //= (suit-parameter-image-digest => bstr .cbor SUIT_Digest) | SUIT_Parameters //= (suit-parameter-image-digest => bstr .cbor SUIT_Digest) | |||
| SUIT_Parameters //= (suit-parameter-image-size => uint) | SUIT_Parameters //= (suit-parameter-image-size => uint) | |||
| SUIT_Parameters //= (suit-parameter-uri-list => bstr .cbor SUIT_Component_URI_List) | SUIT_Parameters //= (suit-parameter-uri-list => bstr .cbor SUIT_Component_URI_List) | |||
| SUIT_Parameters //= (suit-parameter-custom => int/bool/bstr) | SUIT_Parameters //= (suit-parameter-custom => int/bool/tstr/bstr) | |||
| SUIT_Component_URI_List = [ + [priority: int, uri: tstr] ] | SUIT_Component_URI_List = [ + [priority: int, uri: tstr] ] | |||
| SUIT_Priority_Parameter_List = [ + [priority: int, parameters: { + SUIT_Parameters }] ] | SUIT_Priority_Parameter_List = [ + [priority: int, parameters: { + SUIT_Parameters }] ] | |||
| SUIT_Encryption_Info = COSE_Encrypt_Tagged/COSE_Encrypt0_Tagged | SUIT_Encryption_Info = COSE_Encrypt_Tagged/COSE_Encrypt0_Tagged | |||
| SUIT_Compression_Info = { | SUIT_Compression_Info = { | |||
| suit-compression-algorithm => SUIT_Compression_Algorithms | suit-compression-algorithm => SUIT_Compression_Algorithms, | |||
| ? suit-compression-parameters => bstr | ? suit-compression-parameters => bstr | |||
| } | } | |||
| SUIT_Compression_Algorithms /= SUIT_Compression_Algorithm_gzip | SUIT_Compression_Algorithms /= SUIT_Compression_Algorithm_gzip | |||
| SUIT_Compression_Algorithms /= SUIT_Compression_Algorithm_bzip2 | SUIT_Compression_Algorithms /= SUIT_Compression_Algorithm_bzip2 | |||
| SUIT_Compression_Algorithms /= SUIT_Compression_Algorithm_lz4 | SUIT_Compression_Algorithms /= SUIT_Compression_Algorithm_lz4 | |||
| SUIT_Compression_Algorithms /= SUIT_Compression_Algorithm_lzma | SUIT_Compression_Algorithms /= SUIT_Compression_Algorithm_lzma | |||
| SUIT_Compression_Algorithm_gzip = 1 | SUIT_Compression_Algorithm_gzip = 1 | |||
| SUIT_Compression_Algorithm_bzip2 = 2 | SUIT_Compression_Algorithm_bzip2 = 2 | |||
| SUIT_Compression_Algorithm_deflate = 3 | SUIT_Compression_Algorithm_deflate = 3 | |||
| SUIT_Compression_Algorithm_lz4 = 4 | SUIT_Compression_Algorithm_lz4 = 4 | |||
| SUIT_Compression_Algorithm_lzma = 7 | SUIT_Compression_Algorithm_lzma = 7 | |||
| SUIT_Unpack_Info = { | SUIT_Unpack_Info = { | |||
| suit-unpack-algorithm => SUIT_Unpack_Algorithms | suit-unpack-algorithm => SUIT_Unpack_Algorithms, | |||
| ? suit-unpack-parameters => bstr | ? suit-unpack-parameters => bstr | |||
| } | } | |||
| SUIT_Unpack_Algorithms /= SUIT_Unpack_Algorithm_Delta | SUIT_Unpack_Algorithms /= SUIT_Unpack_Algorithm_Delta | |||
| SUIT_Unpack_Algorithms /= SUIT_Unpack_Algorithm_Hex | SUIT_Unpack_Algorithms /= SUIT_Unpack_Algorithm_Hex | |||
| SUIT_Unpack_Algorithms /= SUIT_Unpack_Algorithm_Elf | SUIT_Unpack_Algorithms /= SUIT_Unpack_Algorithm_Elf | |||
| SUIT_Unpack_Algorithm_Delta = 1 | SUIT_Unpack_Algorithm_Delta = 1 | |||
| SUIT_Unpack_Algorithm_Hex = 2 | SUIT_Unpack_Algorithm_Hex = 2 | |||
| SUIT_Unpack_Algorithm_Elf = 3 | SUIT_Unpack_Algorithm_Elf = 3 | |||
| skipping to change at page 49, line 4 ¶ | skipping to change at page 60, line 11 ¶ | |||
| suit-directive-set-parameters = 19 | suit-directive-set-parameters = 19 | |||
| suit-directive-override-parameters = 20 | suit-directive-override-parameters = 20 | |||
| suit-directive-fetch = 21 | suit-directive-fetch = 21 | |||
| suit-directive-copy = 22 | suit-directive-copy = 22 | |||
| suit-directive-run = 23 | suit-directive-run = 23 | |||
| suit-directive-wait = 29 | suit-directive-wait = 29 | |||
| suit-directive-run-sequence = 30 | suit-directive-run-sequence = 30 | |||
| suit-directive-run-with-arguments = 31 | suit-directive-run-with-arguments = 31 | |||
| suit-directive-swap = 32 | suit-directive-swap = 32 | |||
| suit-wait-event-argument-authorisation = 1 | suit-wait-event-argument-authorisation = 1 | |||
| suit-wait-event-power = 2 | suit-wait-event-power = 2 | |||
| suit-wait-event-network = 3 | suit-wait-event-network = 3 | |||
| suit-wait-event-other-device-version = 4 | suit-wait-event-other-device-version = 4 | |||
| suit-wait-event-time = 5 | suit-wait-event-time = 5 | |||
| suit-wait-event-time-of-day = 6 | suit-wait-event-time-of-day = 6 | |||
| suit-wait-event-day-of-week = 7 | suit-wait-event-day-of-week = 7 | |||
| suit-wait-event-authorisation = 8 | suit-wait-event-authorisation = 8 | |||
| suit-parameter-strict-order = 1 | suit-parameter-strict-order = 1 | |||
| suit-parameter-coerce-condition-failure = 2 | suit-parameter-soft-failure = 2 | |||
| suit-parameter-vendor-id = 3 | suit-parameter-vendor-id = 3 | |||
| suit-parameter-class-id = 4 | suit-parameter-class-id = 4 | |||
| suit-parameter-device-id = 5 | suit-parameter-device-id = 5 | |||
| suit-parameter-uri = 6 | suit-parameter-uri = 6 | |||
| suit-parameter-encryption-info = 7 | suit-parameter-encryption-info = 7 | |||
| suit-parameter-compression-info = 8 | suit-parameter-compression-info = 8 | |||
| suit-parameter-unpack-info = 9 | suit-parameter-unpack-info = 9 | |||
| suit-parameter-source-component = 10 | suit-parameter-source-component = 10 | |||
| suit-parameter-image-digest = 11 | suit-parameter-image-digest = 11 | |||
| suit-parameter-image-size = 12 | suit-parameter-image-size = 12 | |||
| skipping to change at page 49, line 38 ¶ | skipping to change at page 60, line 46 ¶ | |||
| suit-parameter-prioritised-parameters = 26 | suit-parameter-prioritised-parameters = 26 | |||
| suit-parameter-custom = nint | suit-parameter-custom = nint | |||
| suit-compression-algorithm = 1 | suit-compression-algorithm = 1 | |||
| suit-compression-parameters = 2 | suit-compression-parameters = 2 | |||
| suit-unpack-algorithm = 1 | suit-unpack-algorithm = 1 | |||
| suit-unpack-parameters = 2 | suit-unpack-parameters = 2 | |||
| 13. Examples | suit-text-manifest-description = 1 | |||
| suit-text-update-description = 2 | ||||
| suit-text-vendor-name = 3 | ||||
| suit-text-model-name = 4 | ||||
| suit-text-vendor-domain = 5 | ||||
| suit-text-model-info = 6 | ||||
| suit-text-component-description = 7 | ||||
| suit-text-manifest-json-source = 8 | ||||
| suit-text-manifest-yaml-source = 9 | ||||
| suit-text-version-dependencies = 10 | ||||
| 12. Examples | ||||
| The following examples demonstrate a small subset of the | The following examples demonstrate a small subset of the | |||
| functionality of the manifest. However, despite this, even a simple | functionality of the manifest. However, despite this, even a simple | |||
| manifest processor can execute most of these manifests. | manifest processor can execute most of these manifests. | |||
| None of these examples include authentication. This is provided via | The examples are signed using the following ECDSA secp256r1 key: | |||
| RFC 8152 [RFC8152], and is omitted for clarity. | ||||
| 13.1. Example 0: | -----BEGIN PRIVATE KEY----- | |||
| MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgApZYjZCUGLM50VBC | ||||
| CjYStX+09jGmnyJPrpDLTz/hiXOhRANCAASEloEarguqq9JhVxie7NomvqqL8Rtv | ||||
| P+bitWWchdvArTsfKktsCYExwKNtrNHXi9OB3N+wnAUtszmR23M4tKiW | ||||
| -----END PRIVATE KEY----- | ||||
| The corresponding public key can be used to verify these examples: | ||||
| -----BEGIN PUBLIC KEY----- | ||||
| MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEhJaBGq4LqqvSYVcYnuzaJr6qi/Eb | ||||
| bz/m4rVlnIXbwK07HypLbAmBMcCjbazR14vTgdzfsJwFLbM5kdtzOLSolg== | ||||
| -----END PUBLIC KEY----- | ||||
| 12.1. Example 0: | ||||
| Secure boot only. | Secure boot only. | |||
| The following JSON shows the intended behaviour of the manifest. | The following JSON shows the intended behaviour of the manifest. | |||
| { | { | |||
| "structure-version": 1, | "structure-version": 1, | |||
| "sequence-number": 1, | "sequence-number": 1, | |||
| "run-image": [ | "run-image": [ | |||
| { "directive-set-component": 0 }, | { "directive-set-component": 0 }, | |||
| skipping to change at page 51, line 6 ¶ | skipping to change at page 63, line 6 ¶ | |||
| "Flash", | "Flash", | |||
| 78848 | 78848 | |||
| ] | ] | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| Converted into the SUIT manifest, this produces: | Converted into the SUIT manifest, this produces: | |||
| { | { | |||
| / auth object / 1 : h'd28443a10126a1044874657374206b6579f658405e5f' | / auth object / 1 : h'd28443a10126a1044874657374206b6579f65840ebec' | |||
| h'b84f9e9729a4d74096ad485921e842b4e320cc3fa177' | h'b66cbecb19dcedacf8459c1a22a1453781ba98d8ffb9' | |||
| h'8c2807377e1969e42449b3261109d273df4b3ceb9a61' | h'd4e2912f29d23bac5ae3d51f1ff0c1b1df05e207ca17' | |||
| h'06a46f0a7938de9a8441ab515b82463b39ee', | h'483a57ede914cf826b73599137881c8364c8', | |||
| / manifest / 2 : h'a40101020103583ea2024c818245466c6173684300340104' | / manifest / 2 : h'a401010201035840a2024c818245466c6173684300340104' | |||
| h'582c8213a20b8202582000112233445566778899aabbccdd' | h'582e8213a20b58248202582000112233445566778899aabb' | |||
| h'eeff0123456789abcdeffedcba98765432100c1987d00c47' | h'ccddeeff0123456789abcdeffedcba98765432100c1987d0' | |||
| h'860c0003f617f6' \ | h'0c47860c0003f617f6' \ | |||
| { | { | |||
| / structure-version / 1 : 1, | / structure-version / 1 : 1, | |||
| / sequence-number / 2 : 1, | / sequence-number / 2 : 1, | |||
| / common / 3 : h'a2024c818245466c6173684300340104582c8213a20b82' | / common / 3 : h'a2024c818245466c6173684300340104582e8213a20b58' | |||
| h'02582000112233445566778899aabbccddeeff01234567' | h'248202582000112233445566778899aabbccddeeff0123' | |||
| h'89abcdeffedcba98765432100c1987d0' \ { | h'456789abcdeffedcba98765432100c1987d0' \ { | |||
| / components / 2 : h'818245466c61736843003401' \ | / components / 2 : h'818245466c61736843003401' \ | |||
| [ | [ | |||
| [h'466c617368', h'003401'], | [h'466c617368', h'003401'], | |||
| ], | ], | |||
| / common-sequence / 4 : h'8213a20b820258200011223344556677' | / common-sequence / 4 : h'8213a20b582482025820001122334455' | |||
| h'8899aabbccddeeff0123456789abcdef' | h'66778899aabbccddeeff0123456789ab' | |||
| h'fedcba98765432100c1987d0' \ [ | h'cdeffedcba98765432100c1987d0' \ [ | |||
| / set-vars / 19, { | / set-vars / 19, { | |||
| / digest / 11 : [ 2, | / digest / 11 : h'8202582000112233445566778899aabb' | |||
| h'00112233445566778899aabbccddeeff0123456789ab' | h'ccddeeff0123456789abcdeffedcba98' | |||
| h'cdeffedcba9876543210' ], | h'76543210' \ | |||
| [ 2, h'00112233445566778899aabbccddeeff01234567' | ||||
| h'89abcdeffedcba9876543210' ], | ||||
| / size / 12 : 34768, | / size / 12 : 34768, | |||
| }, | }, | |||
| ], | ], | |||
| }, | }, | |||
| / run-image / 12 : h'860c0003f617f6' \ [ | / run-image / 12 : h'860c0003f617f6' \ [ | |||
| / set-component-index / 12, 0, | / set-component-index / 12, 0, | |||
| / condition-image / 3, None, | / condition-image / 3, None, | |||
| / run / 23, None, | / run / 23, None, | |||
| ], | ], | |||
| } | } | |||
| } | } | |||
| Total size of outer wrapper without COSE authentication object: 85 | Total size of outer wrapper without COSE authentication object: 87 | |||
| Outer: | Outer: | |||
| a201f602584fa40101020103583ea2024c818245466c6173684300340104582c8213a20b | a201f6025851a401010201035840a2024c818245466c6173684300340104582e8213a20b | |||
| 8202582000112233445566778899aabbccddeeff0123456789abcdeffedcba9876543210 | 58248202582000112233445566778899aabbccddeeff0123456789abcdeffedcba987654 | |||
| 0c1987d00c47860c0003f617f6 | 32100c1987d00c47860c0003f617f6 | |||
| Total size of outer wrapper with COSE authentication object: 172 | ||||
| Total size of outer wrapper with COSE authentication object: 170 | ||||
| Signed Outer: | Signed Outer: | |||
| a2015854d28443a10126a1044874657374206b6579f658405e5fb84f9e9729a4d74096ad | a2015854d28443a10126a1044874657374206b6579f65840ebecb66cbecb19dcedacf845 | |||
| 485921e842b4e320cc3fa1778c2807377e1969e42449b3261109d273df4b3ceb9a6106a4 | 9c1a22a1453781ba98d8ffb9d4e2912f29d23bac5ae3d51f1ff0c1b1df05e207ca17483a | |||
| 6f0a7938de9a8441ab515b82463b39ee02584fa40101020103583ea2024c818245466c61 | 57ede914cf826b73599137881c8364c8025851a401010201035840a2024c818245466c61 | |||
| 73684300340104582c8213a20b8202582000112233445566778899aabbccddeeff012345 | 73684300340104582e8213a20b58248202582000112233445566778899aabbccddeeff01 | |||
| 6789abcdeffedcba98765432100c1987d00c47860c0003f617f6 | 23456789abcdeffedcba98765432100c1987d00c47860c0003f617f6 | |||
| 13.2. Example 1: | 12.2. Example 1: | |||
| Simultaneous download and installation of payload. | Simultaneous download and installation of payload. | |||
| The following JSON shows the intended behaviour of the manifest. | The following JSON shows the intended behaviour of the manifest. | |||
| { | { | |||
| "structure-version": 1, | "structure-version": 1, | |||
| "sequence-number": 2, | "sequence-number": 2, | |||
| "apply-image": [ | "apply-image": [ | |||
| { "directive-set-component": 0 }, | { "directive-set-component": 0 }, | |||
| skipping to change at page 53, line 6 ¶ | skipping to change at page 65, line 6 ¶ | |||
| "Flash", | "Flash", | |||
| 78848 | 78848 | |||
| ] | ] | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| Converted into the SUIT manifest, this produces: | Converted into the SUIT manifest, this produces: | |||
| { | { | |||
| / auth object / 1 : h'd28443a10126a1044874657374206b6579f658403d4e' | / auth object / 1 : h'd28443a10126a1044874657374206b6579f65840b531' | |||
| h'9ff1ca8803a81ae1e2b13df28c527a4d6975e860035e' | h'42132ebddbf0c523378d16fc904badc56553e41c6713' | |||
| h'e9a88576b5e6f2bf12f33017e88157bcff58d712e7f8' | h'b758dbd39f47effec5e7a583c418129f456d0aaaa3c4' | |||
| h'010821ae0f82f78eb681b61697345e655cf4', | h'3fe06dd30d664b709edf0ad05b70dad38bc2', | |||
| / manifest / 2 : h'a40101020203583ea2024c818245466c6173684300340104' | / manifest / 2 : h'a401010202035840a2024c818245466c6173684300340104' | |||
| h'582c8213a20b8202582000112233445566778899aabbccdd' | h'582e8213a20b58248202582000112233445566778899aabb' | |||
| h'eeff0123456789abcdeffedcba98765432100c1987d00958' | h'ccddeeff0123456789abcdeffedcba98765432100c1987d0' | |||
| h'25860c0013a106781b687474703a2f2f6578616d706c652e' | h'095825860c0013a106781b687474703a2f2f6578616d706c' | |||
| h'636f6d2f66696c652e62696e15f6' \ | h'652e636f6d2f66696c652e62696e15f6' \ | |||
| { | { | |||
| / structure-version / 1 : 1, | / structure-version / 1 : 1, | |||
| / sequence-number / 2 : 2, | / sequence-number / 2 : 2, | |||
| / common / 3 : h'a2024c818245466c6173684300340104582c8213a20b82' | / common / 3 : h'a2024c818245466c6173684300340104582e8213a20b58' | |||
| h'02582000112233445566778899aabbccddeeff01234567' | h'248202582000112233445566778899aabbccddeeff0123' | |||
| h'89abcdeffedcba98765432100c1987d0' \ { | h'456789abcdeffedcba98765432100c1987d0' \ { | |||
| / components / 2 : h'818245466c61736843003401' \ | / components / 2 : h'818245466c61736843003401' \ | |||
| [ | [ | |||
| [h'466c617368', h'003401'], | [h'466c617368', h'003401'], | |||
| ], | ], | |||
| / common-sequence / 4 : h'8213a20b820258200011223344556677' | / common-sequence / 4 : h'8213a20b582482025820001122334455' | |||
| h'8899aabbccddeeff0123456789abcdef' | h'66778899aabbccddeeff0123456789ab' | |||
| h'fedcba98765432100c1987d0' \ [ | h'cdeffedcba98765432100c1987d0' \ [ | |||
| / set-vars / 19, { | / set-vars / 19, { | |||
| / digest / 11 : [ 2, | / digest / 11 : h'8202582000112233445566778899aabb' | |||
| h'00112233445566778899aabbccddeeff0123456789ab' | h'ccddeeff0123456789abcdeffedcba98' | |||
| h'cdeffedcba9876543210' ], | h'76543210' \ | |||
| [ 2, h'00112233445566778899aabbccddeeff01234567' | ||||
| h'89abcdeffedcba9876543210' ], | ||||
| / size / 12 : 34768, | / size / 12 : 34768, | |||
| }, | }, | |||
| ], | ], | |||
| }, | }, | |||
| / apply-image / 9 : h'860c0013a106781b687474703a2f2f6578616d70' | / apply-image / 9 : h'860c0013a106781b687474703a2f2f6578616d70' | |||
| h'6c652e636f6d2f66696c652e62696e15f6' \ [ | h'6c652e636f6d2f66696c652e62696e15f6' \ [ | |||
| / set-component-index / 12, 0, | / set-component-index / 12, 0, | |||
| / set-vars / 19, { | / set-vars / 19, { | |||
| / uri / 6 : http://example.com/file.bin, | / uri / 6 : http://example.com/file.bin, | |||
| }, | }, | |||
| / fetch / 21, None, | / fetch / 21, None, | |||
| ], | ], | |||
| } | } | |||
| } | } | |||
| Total size of outer wrapper without COSE authentication object: 116 | Total size of outer wrapper without COSE authentication object: 118 | |||
| Outer: | Outer: | |||
| a201f602586ea40101020203583ea2024c818245466c6173684300340104582c8213a20b | a201f6025870a401010202035840a2024c818245466c6173684300340104582e8213a20b | |||
| 8202582000112233445566778899aabbccddeeff0123456789abcdeffedcba9876543210 | 58248202582000112233445566778899aabbccddeeff0123456789abcdeffedcba987654 | |||
| 0c1987d0095825860c0013a106781b687474703a2f2f6578616d706c652e636f6d2f6669 | 32100c1987d0095825860c0013a106781b687474703a2f2f6578616d706c652e636f6d2f | |||
| 6c652e62696e15f6 | 66696c652e62696e15f6 | |||
| Total size of outer wrapper with COSE authentication object: 201 | Total size of outer wrapper with COSE authentication object: 203 | |||
| Signed Outer: | Signed Outer: | |||
| a2015854d28443a10126a1044874657374206b6579f658403d4e9ff1ca8803a81ae1e2b1 | a2015854d28443a10126a1044874657374206b6579f65840b53142132ebddbf0c523378d | |||
| 3df28c527a4d6975e860035ee9a88576b5e6f2bf12f33017e88157bcff58d712e7f80108 | 16fc904badc56553e41c6713b758dbd39f47effec5e7a583c418129f456d0aaaa3c43fe0 | |||
| 21ae0f82f78eb681b61697345e655cf402586ea40101020203583ea2024c818245466c61 | 6dd30d664b709edf0ad05b70dad38bc2025870a401010202035840a2024c818245466c61 | |||
| 73684300340104582c8213a20b8202582000112233445566778899aabbccddeeff012345 | 73684300340104582e8213a20b58248202582000112233445566778899aabbccddeeff01 | |||
| 6789abcdeffedcba98765432100c1987d0095825860c0013a106781b687474703a2f2f65 | 23456789abcdeffedcba98765432100c1987d0095825860c0013a106781b687474703a2f | |||
| 78616d706c652e636f6d2f66696c652e62696e15f6 | 2f6578616d706c652e636f6d2f66696c652e62696e15f6 | |||
| 13.3. Example 2: | 12.3. Example 2: | |||
| Compatibility test, simultaneous download and installation, and | Compatibility test, simultaneous download and installation, and | |||
| secure boot. | secure boot. | |||
| The following JSON shows the intended behaviour of the manifest. | The following JSON shows the intended behaviour of the manifest. | |||
| { | { | |||
| "structure-version": 1, | "structure-version": 1, | |||
| "sequence-number": 3, | "sequence-number": 3, | |||
| "common": { | "common": { | |||
| skipping to change at page 55, line 48 ¶ | skipping to change at page 67, line 48 ¶ | |||
| "run-image": [ | "run-image": [ | |||
| { "directive-set-component": 0 }, | { "directive-set-component": 0 }, | |||
| { "condition-image": null }, | { "condition-image": null }, | |||
| { "directive-run": null } | { "directive-run": null } | |||
| ] | ] | |||
| } | } | |||
| Converted into the SUIT manifest, this produces: | Converted into the SUIT manifest, this produces: | |||
| { | { | |||
| / auth object / 1 : h'd28443a10126a1044874657374206b6579f65840e637' | / auth object / 1 : h'd28443a10126a1044874657374206b6579f658400014' | |||
| h'5a57596cb4a35a90a30b4099bccf7e2352a9829bf7bb' | h'750c013f7e1cdbec6f14b99b49195e081d1030508a6b' | |||
| h'1b56cfc0e713955be4fd360e366c94e32dfc344695b1' | h'8d271bd99dfb382a7767dc45f20c9943ed22a1eaac9d' | |||
| h'20b2c59732b2e3f079fc2693c5a459d9ce44', | h'07a041ec1acfc10ad7e45e6424629ff3e3e5', | |||
| / manifest / 2 : h'a501010203035866a2024c818245466c6173684300340104' | / manifest / 2 : h'a501010203035868a2024c818245466c6173684300340104' | |||
| h'58548613a40350fa6b4a53d5ad5fdfbe9de663e4d41ffe04' | h'58568613a40350fa6b4a53d5ad5fdfbe9de663e4d41ffe04' | |||
| h'501492af1425695e48bf429b2d51f2ab450b820258200011' | h'501492af1425695e48bf429b2d51f2ab450b582482025820' | |||
| h'2233445566778899aabbccddeeff0123456789abcdeffedc' | h'00112233445566778899aabbccddeeff0123456789abcdef' | |||
| h'ba98765432100c1987d001f602f6095825860c0013a10678' | h'fedcba98765432100c1987d001f602f6095825860c0013a1' | |||
| h'1b687474703a2f2f6578616d706c652e636f6d2f66696c65' | h'06781b687474703a2f2f6578616d706c652e636f6d2f6669' | |||
| h'2e62696e15f60c47860c0003f617f6' \ | h'6c652e62696e15f60c47860c0003f617f6' \ | |||
| { | { | |||
| / structure-version / 1 : 1, | / structure-version / 1 : 1, | |||
| / sequence-number / 2 : 3, | / sequence-number / 2 : 3, | |||
| / common / 3 : h'a2024c818245466c617368430034010458548613a40350' | / common / 3 : h'a2024c818245466c617368430034010458568613a40350' | |||
| h'fa6b4a53d5ad5fdfbe9de663e4d41ffe04501492af1425' | h'fa6b4a53d5ad5fdfbe9de663e4d41ffe04501492af1425' | |||
| h'695e48bf429b2d51f2ab450b8202582000112233445566' | h'695e48bf429b2d51f2ab450b5824820258200011223344' | |||
| h'778899aabbccddeeff0123456789abcdeffedcba987654' | h'5566778899aabbccddeeff0123456789abcdeffedcba98' | |||
| h'32100c1987d001f602f6' \ { | h'765432100c1987d001f602f6' \ { | |||
| / components / 2 : h'818245466c61736843003401' \ | / components / 2 : h'818245466c61736843003401' \ | |||
| [ | [ | |||
| [h'466c617368', h'003401'], | [h'466c617368', h'003401'], | |||
| ], | ], | |||
| / common-sequence / 4 : h'8613a40350fa6b4a53d5ad5fdfbe9de6' | / common-sequence / 4 : h'8613a40350fa6b4a53d5ad5fdfbe9de6' | |||
| h'63e4d41ffe04501492af1425695e48bf' | h'63e4d41ffe04501492af1425695e48bf' | |||
| h'429b2d51f2ab450b8202582000112233' | h'429b2d51f2ab450b5824820258200011' | |||
| h'445566778899aabbccddeeff01234567' | h'2233445566778899aabbccddeeff0123' | |||
| h'89abcdeffedcba98765432100c1987d0' | h'456789abcdeffedcba98765432100c19' | |||
| h'01f602f6' \ [ | h'87d001f602f6' \ [ | |||
| / set-vars / 19, { | / set-vars / 19, { | |||
| / vendor-id / 3 : h'fa6b4a53d5ad5fdfbe9de663e4d41f' | / vendor-id / 3 : h'fa6b4a53d5ad5fdfbe9de663e4d41f' | |||
| h'fe', | h'fe', | |||
| / class-id / 4 : h'1492af1425695e48bf429b2d51f2ab45', | / class-id / 4 : h'1492af1425695e48bf429b2d51f2ab45', | |||
| / digest / 11 : [ 2, | / digest / 11 : h'8202582000112233445566778899aabb' | |||
| h'00112233445566778899aabbccddeeff0123456789ab' | h'ccddeeff0123456789abcdeffedcba98' | |||
| h'cdeffedcba9876543210' ], | h'76543210' \ | |||
| [ 2, h'00112233445566778899aabbccddeeff01234567' | ||||
| h'89abcdeffedcba9876543210' ], | ||||
| / size / 12 : 34768, | / size / 12 : 34768, | |||
| }, | }, | |||
| / condition-vendor-id / 1, None, | / condition-vendor-id / 1, None, | |||
| / condition-class-id / 2, None, | / condition-class-id / 2, None, | |||
| ], | ], | |||
| }, | }, | |||
| / apply-image / 9 : h'860c0013a106781b687474703a2f2f6578616d70' | / apply-image / 9 : h'860c0013a106781b687474703a2f2f6578616d70' | |||
| h'6c652e636f6d2f66696c652e62696e15f6' \ [ | h'6c652e636f6d2f66696c652e62696e15f6' \ [ | |||
| / set-component-index / 12, 0, | / set-component-index / 12, 0, | |||
| / set-vars / 19, { | / set-vars / 19, { | |||
| skipping to change at page 57, line 9 ¶ | skipping to change at page 69, line 11 ¶ | |||
| / fetch / 21, None, | / fetch / 21, None, | |||
| ], | ], | |||
| / run-image / 12 : h'860c0003f617f6' \ [ | / run-image / 12 : h'860c0003f617f6' \ [ | |||
| / set-component-index / 12, 0, | / set-component-index / 12, 0, | |||
| / condition-image / 3, None, | / condition-image / 3, None, | |||
| / run / 23, None, | / run / 23, None, | |||
| ], | ], | |||
| } | } | |||
| } | } | |||
| Total size of outer wrapper without COSE authentication object: 165 | Total size of outer wrapper without COSE authentication object: 167 | |||
| Outer: | Outer: | |||
| a201f602589fa501010203035866a2024c818245466c617368430034010458548613a403 | a201f60258a1a501010203035868a2024c818245466c617368430034010458568613a403 | |||
| 50fa6b4a53d5ad5fdfbe9de663e4d41ffe04501492af1425695e48bf429b2d51f2ab450b | 50fa6b4a53d5ad5fdfbe9de663e4d41ffe04501492af1425695e48bf429b2d51f2ab450b | |||
| 8202582000112233445566778899aabbccddeeff0123456789abcdeffedcba9876543210 | 58248202582000112233445566778899aabbccddeeff0123456789abcdeffedcba987654 | |||
| 0c1987d001f602f6095825860c0013a106781b687474703a2f2f6578616d706c652e636f | 32100c1987d001f602f6095825860c0013a106781b687474703a2f2f6578616d706c652e | |||
| 6d2f66696c652e62696e15f60c47860c0003f617f6 | 636f6d2f66696c652e62696e15f60c47860c0003f617f6 | |||
| Total size of outer wrapper with COSE authentication object: 250 | Total size of outer wrapper with COSE authentication object: 252 | |||
| Signed Outer: | Signed Outer: | |||
| a2015854d28443a10126a1044874657374206b6579f65840e6375a57596cb4a35a90a30b | a2015854d28443a10126a1044874657374206b6579f658400014750c013f7e1cdbec6f14 | |||
| 4099bccf7e2352a9829bf7bb1b56cfc0e713955be4fd360e366c94e32dfc344695b120b2 | b99b49195e081d1030508a6b8d271bd99dfb382a7767dc45f20c9943ed22a1eaac9d07a0 | |||
| c59732b2e3f079fc2693c5a459d9ce4402589fa501010203035866a2024c818245466c61 | 41ec1acfc10ad7e45e6424629ff3e3e50258a1a501010203035868a2024c818245466c61 | |||
| 7368430034010458548613a40350fa6b4a53d5ad5fdfbe9de663e4d41ffe04501492af14 | 7368430034010458568613a40350fa6b4a53d5ad5fdfbe9de663e4d41ffe04501492af14 | |||
| 25695e48bf429b2d51f2ab450b8202582000112233445566778899aabbccddeeff012345 | 25695e48bf429b2d51f2ab450b58248202582000112233445566778899aabbccddeeff01 | |||
| 6789abcdeffedcba98765432100c1987d001f602f6095825860c0013a106781b68747470 | 23456789abcdeffedcba98765432100c1987d001f602f6095825860c0013a106781b6874 | |||
| 3a2f2f6578616d706c652e636f6d2f66696c652e62696e15f60c47860c0003f617f6 | 74703a2f2f6578616d706c652e636f6d2f66696c652e62696e15f60c47860c0003f617f6 | |||
| 13.4. Example 3: | 12.4. Example 3: | |||
| Compatibility test, simultaneous download and installation, load from | Compatibility test, simultaneous download and installation, load from | |||
| external storage, and secure boot. | external storage, and secure boot. | |||
| The following JSON shows the intended behaviour of the manifest. | The following JSON shows the intended behaviour of the manifest. | |||
| { | { | |||
| "structure-version": 1, | "structure-version": 1, | |||
| "sequence-number": 4, | "sequence-number": 4, | |||
| "common": { | "common": { | |||
| skipping to change at page 59, line 4 ¶ | skipping to change at page 71, line 6 ¶ | |||
| { "condition-image": null }, | { "condition-image": null }, | |||
| { "directive-set-component": 1 }, | { "directive-set-component": 1 }, | |||
| { | { | |||
| "directive-set-var": { | "directive-set-var": { | |||
| "source-index": 0 | "source-index": 0 | |||
| } | } | |||
| }, | }, | |||
| { "directive-fetch": null }, | { "directive-fetch": null }, | |||
| { "condition-image": null }, | { "condition-image": null }, | |||
| { "directive-run": null } | { "directive-run": null } | |||
| ] | ] | |||
| } | } | |||
| Converted into the SUIT manifest, this produces: | Converted into the SUIT manifest, this produces: | |||
| { | { | |||
| / auth object / 1 : h'd28443a10126a1044874657374206b6579f65840ef4b' | / auth object / 1 : h'd28443a10126a1044874657374206b6579f6584070eb' | |||
| h'399c55131a51bebafb46da6e6b79c59417fdefea7b87' | h'70f2552533fc954e934f50f42bdd9b6f7d4fd7e11463' | |||
| h'e4234bf8f978094e3092c8506d8a912fbacaec5ba365' | h'6b9cdbef2a065f9640243a7857f66c4389aea906c4f3' | |||
| h'24ae0e4bb1aa14197e4d0afe10ba47e29e5a', | h'b45150c8e55461e9bfda945904033fc70a84', | |||
| / manifest / 2 : h'a50101020403589fa20254828245466c6173684300340182' | / manifest / 2 : h'a5010102040358a3a20254828245466c6173684300340182' | |||
| h'4352414d4200040458858e13a20350fa6b4a53d5ad5fdfbe' | h'4352414d4200040458898e13a20350fa6b4a53d5ad5fdfbe' | |||
| h'9de663e4d41ffe04501492af1425695e48bf429b2d51f2ab' | h'9de663e4d41ffe04501492af1425695e48bf429b2d51f2ab' | |||
| h'450c0013a20b8202582000112233445566778899aabbccdd' | h'450c0013a20b58248202582000112233445566778899aabb' | |||
| h'eeff0123456789abcdeffedcba98765432100c1987d00c01' | h'ccddeeff0123456789abcdeffedcba98765432100c1987d0' | |||
| h'13a20b8202582000112233445566778899aabbccddeeff01' | h'0c0113a20b58248202582000112233445566778899aabbcc' | |||
| h'23456789abcdeffedcba98765432100c1987d001f602f609' | h'ddeeff0123456789abcdeffedcba98765432100c1987d001' | |||
| h'5825860c0013a106781b687474703a2f2f6578616d706c65' | h'f602f6095825860c0013a106781b687474703a2f2f657861' | |||
| h'2e636f6d2f66696c652e62696e15f60c518e0c0003f60c01' | h'6d706c652e636f6d2f66696c652e62696e15f60c518e0c00' | |||
| h'13a10a0015f603f617f6' \ | h'03f60c0113a10a0015f603f617f6' \ | |||
| { | { | |||
| / structure-version / 1 : 1, | / structure-version / 1 : 1, | |||
| / sequence-number / 2 : 4, | / sequence-number / 2 : 4, | |||
| / common / 3 : h'a20254828245466c61736843003401824352414d420004' | / common / 3 : h'a20254828245466c61736843003401824352414d420004' | |||
| h'0458858e13a20350fa6b4a53d5ad5fdfbe9de663e4d41f' | h'0458898e13a20350fa6b4a53d5ad5fdfbe9de663e4d41f' | |||
| h'fe04501492af1425695e48bf429b2d51f2ab450c0013a2' | h'fe04501492af1425695e48bf429b2d51f2ab450c0013a2' | |||
| h'0b8202582000112233445566778899aabbccddeeff0123' | h'0b58248202582000112233445566778899aabbccddeeff' | |||
| h'456789abcdeffedcba98765432100c1987d00c0113a20b' | h'0123456789abcdeffedcba98765432100c1987d00c0113' | |||
| h'8202582000112233445566778899aabbccddeeff012345' | h'a20b58248202582000112233445566778899aabbccddee' | |||
| h'6789abcdeffedcba98765432100c1987d001f602f6' \ { | h'ff0123456789abcdeffedcba98765432100c1987d001f6' | |||
| h'02f6' \ { | ||||
| / components / 2 : h'828245466c61736843003401824352414d4200' | / components / 2 : h'828245466c61736843003401824352414d4200' | |||
| h'04' \ | h'04' \ | |||
| [ | [ | |||
| [h'466c617368', h'003401'], | [h'466c617368', h'003401'], | |||
| [h'52414d', h'0004'], | [h'52414d', h'0004'], | |||
| ], | ], | |||
| / common-sequence / 4 : h'8e13a20350fa6b4a53d5ad5fdfbe9de6' | / common-sequence / 4 : h'8e13a20350fa6b4a53d5ad5fdfbe9de6' | |||
| h'63e4d41ffe04501492af1425695e48bf' | h'63e4d41ffe04501492af1425695e48bf' | |||
| h'429b2d51f2ab450c0013a20b82025820' | h'429b2d51f2ab450c0013a20b58248202' | |||
| h'00112233445566778899aabbccddeeff' | h'582000112233445566778899aabbccdd' | |||
| h'0123456789abcdeffedcba9876543210' | h'eeff0123456789abcdeffedcba987654' | |||
| h'0c1987d00c0113a20b82025820001122' | h'32100c1987d00c0113a20b5824820258' | |||
| h'33445566778899aabbccddeeff012345' | h'2000112233445566778899aabbccddee' | |||
| h'6789abcdeffedcba98765432100c1987' | h'ff0123456789abcdeffedcba98765432' | |||
| h'd001f602f6' \ [ | h'100c1987d001f602f6' \ [ | |||
| / set-vars / 19, { | / set-vars / 19, { | |||
| / vendor-id / 3 : h'fa6b4a53d5ad5fdfbe9de663e4d41f' | / vendor-id / 3 : h'fa6b4a53d5ad5fdfbe9de663e4d41f' | |||
| h'fe', | h'fe', | |||
| / class-id / 4 : h'1492af1425695e48bf429b2d51f2ab45', | / class-id / 4 : h'1492af1425695e48bf429b2d51f2ab45', | |||
| }, | }, | |||
| / set-component-index / 12, 0, | / set-component-index / 12, 0, | |||
| / set-vars / 19, { | / set-vars / 19, { | |||
| / digest / 11 : [ 2, | / digest / 11 : h'8202582000112233445566778899aabb' | |||
| h'00112233445566778899aabbccddeeff0123456789ab' | h'ccddeeff0123456789abcdeffedcba98' | |||
| h'cdeffedcba9876543210' ], | h'76543210' \ | |||
| [ 2, h'00112233445566778899aabbccddeeff01234567' | ||||
| h'89abcdeffedcba9876543210' ], | ||||
| / size / 12 : 34768, | / size / 12 : 34768, | |||
| }, | }, | |||
| / set-component-index / 12, 1, | / set-component-index / 12, 1, | |||
| / set-vars / 19, { | / set-vars / 19, { | |||
| / digest / 11 : [ 2, | / digest / 11 : h'8202582000112233445566778899aabb' | |||
| h'00112233445566778899aabbccddeeff0123456789ab' | h'ccddeeff0123456789abcdeffedcba98' | |||
| h'cdeffedcba9876543210' ], | h'76543210' \ | |||
| [ 2, h'00112233445566778899aabbccddeeff01234567' | ||||
| h'89abcdeffedcba9876543210' ], | ||||
| / size / 12 : 34768, | / size / 12 : 34768, | |||
| }, | }, | |||
| / condition-vendor-id / 1, None, | / condition-vendor-id / 1, None, | |||
| / condition-class-id / 2, None, | / condition-class-id / 2, None, | |||
| ], | ], | |||
| }, | }, | |||
| / apply-image / 9 : h'860c0013a106781b687474703a2f2f6578616d70' | / apply-image / 9 : h'860c0013a106781b687474703a2f2f6578616d70' | |||
| h'6c652e636f6d2f66696c652e62696e15f6' \ [ | h'6c652e636f6d2f66696c652e62696e15f6' \ [ | |||
| / set-component-index / 12, 0, | / set-component-index / 12, 0, | |||
| / set-vars / 19, { | / set-vars / 19, { | |||
| skipping to change at page 60, line 46 ¶ | skipping to change at page 73, line 4 ¶ | |||
| / set-component-index / 12, 1, | / set-component-index / 12, 1, | |||
| / set-vars / 19, { | / set-vars / 19, { | |||
| / source-component / 10 : 0, | / source-component / 10 : 0, | |||
| }, | }, | |||
| / fetch / 21, None, | / fetch / 21, None, | |||
| / condition-image / 3, None, | / condition-image / 3, None, | |||
| / run / 23, None, | / run / 23, None, | |||
| ], | ], | |||
| } | } | |||
| } | } | |||
| Total size of outer wrapper without COSE authentication object: 236 | ||||
| Total size of outer wrapper without COSE authentication object: 232 | ||||
| Outer: | Outer: | |||
| a201f60258e2a50101020403589fa20254828245466c61736843003401824352414d4200 | a201f60258e6a5010102040358a3a20254828245466c61736843003401824352414d4200 | |||
| 040458858e13a20350fa6b4a53d5ad5fdfbe9de663e4d41ffe04501492af1425695e48bf | 040458898e13a20350fa6b4a53d5ad5fdfbe9de663e4d41ffe04501492af1425695e48bf | |||
| 429b2d51f2ab450c0013a20b8202582000112233445566778899aabbccddeeff01234567 | 429b2d51f2ab450c0013a20b58248202582000112233445566778899aabbccddeeff0123 | |||
| 89abcdeffedcba98765432100c1987d00c0113a20b8202582000112233445566778899aa | 456789abcdeffedcba98765432100c1987d00c0113a20b58248202582000112233445566 | |||
| bbccddeeff0123456789abcdeffedcba98765432100c1987d001f602f6095825860c0013 | 778899aabbccddeeff0123456789abcdeffedcba98765432100c1987d001f602f6095825 | |||
| a106781b687474703a2f2f6578616d706c652e636f6d2f66696c652e62696e15f60c518e | 860c0013a106781b687474703a2f2f6578616d706c652e636f6d2f66696c652e62696e15 | |||
| 0c0003f60c0113a10a0015f603f617f6 | f60c518e0c0003f60c0113a10a0015f603f617f6 | |||
| Total size of outer wrapper with COSE authentication object: 317 | Total size of outer wrapper with COSE authentication object: 321 | |||
| Signed Outer: | Signed Outer: | |||
| a2015854d28443a10126a1044874657374206b6579f65840ef4b399c55131a51bebafb46 | a2015854d28443a10126a1044874657374206b6579f6584070eb70f2552533fc954e934f | |||
| da6e6b79c59417fdefea7b87e4234bf8f978094e3092c8506d8a912fbacaec5ba36524ae | 50f42bdd9b6f7d4fd7e114636b9cdbef2a065f9640243a7857f66c4389aea906c4f3b451 | |||
| 0e4bb1aa14197e4d0afe10ba47e29e5a0258e2a50101020403589fa20254828245466c61 | 50c8e55461e9bfda945904033fc70a840258e6a5010102040358a3a20254828245466c61 | |||
| 736843003401824352414d4200040458858e13a20350fa6b4a53d5ad5fdfbe9de663e4d4 | 736843003401824352414d4200040458898e13a20350fa6b4a53d5ad5fdfbe9de663e4d4 | |||
| 1ffe04501492af1425695e48bf429b2d51f2ab450c0013a20b8202582000112233445566 | 1ffe04501492af1425695e48bf429b2d51f2ab450c0013a20b5824820258200011223344 | |||
| 778899aabbccddeeff0123456789abcdeffedcba98765432100c1987d00c0113a20b8202 | 5566778899aabbccddeeff0123456789abcdeffedcba98765432100c1987d00c0113a20b | |||
| 582000112233445566778899aabbccddeeff0123456789abcdeffedcba98765432100c19 | 58248202582000112233445566778899aabbccddeeff0123456789abcdeffedcba987654 | |||
| 87d001f602f6095825860c0013a106781b687474703a2f2f6578616d706c652e636f6d2f | 32100c1987d001f602f6095825860c0013a106781b687474703a2f2f6578616d706c652e | |||
| 66696c652e62696e15f60c518e0c0003f60c0113a10a0015f603f617f6 | 636f6d2f66696c652e62696e15f60c518e0c0003f60c0113a10a0015f603f617f6 | |||
| 13.5. Example 4: | 12.5. Example 4: | |||
| Compatibility test, simultaneous download and installation, load and | Compatibility test, simultaneous download and installation, load and | |||
| decompress from external storage, and secure boot. | decompress from external storage, and secure boot. | |||
| The following JSON shows the intended behaviour of the manifest. | The following JSON shows the intended behaviour of the manifest. | |||
| { | { | |||
| "structure-version": 1, | "structure-version": 1, | |||
| "sequence-number": 5, | "sequence-number": 5, | |||
| "common": { | "common": { | |||
| skipping to change at page 62, line 48 ¶ | skipping to change at page 75, line 4 ¶ | |||
| { "directive-set-component": 1 }, | { "directive-set-component": 1 }, | |||
| { | { | |||
| "directive-set-var": { | "directive-set-var": { | |||
| "source-index": 0, | "source-index": 0, | |||
| "compression-info": { | "compression-info": { | |||
| "algorithm": "gzip" | "algorithm": "gzip" | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| { "directive-copy": null } | { "directive-copy": null } | |||
| ], | ], | |||
| "run-image": [ | "run-image": [ | |||
| { "condition-image": null }, | { "condition-image": null }, | |||
| { "directive-run": null } | { "directive-run": null } | |||
| ] | ] | |||
| } | } | |||
| Converted into the SUIT manifest, this produces: | Converted into the SUIT manifest, this produces: | |||
| { | { | |||
| / auth object / 1 : h'd28443a10126a1044874657374206b6579f65840e90d' | / auth object / 1 : h'd28443a10126a1044874657374206b6579f658403491' | |||
| h'ab6e502bad8132adf86b4d78defaebac64fa6c6b2882' | h'5619c1ef02b4a7ffbbb69083e8b3fb82febd9ecd6feb' | |||
| h'd12b36f492b14ce75819ed3524de4d66ddfd5e1d80a5' | h'f666d700fb981b208ec6d3df8735f36fd4a0a84e0189' | |||
| h'984004c1ac9b003b2da32589583a93c541dd', | h'43ef80e25f57fc130a43e57c6634f337b7fa', | |||
| / manifest / 2 : h'a60101020503589fa20254828245466c6173684300340182' | / manifest / 2 : h'a6010102050358a3a20254828245466c6173684300340182' | |||
| h'4352414d4200040458858e13a20350fa6b4a53d5ad5fdfbe' | h'4352414d4200040458898e13a20350fa6b4a53d5ad5fdfbe' | |||
| h'9de663e4d41ffe04501492af1425695e48bf429b2d51f2ab' | h'9de663e4d41ffe04501492af1425695e48bf429b2d51f2ab' | |||
| h'450c0013a20b8202582000112233445566778899aabbccdd' | h'450c0013a20b58248202582000112233445566778899aabb' | |||
| h'eeff0123456789abcdeffedcba98765432100c1987d00c01' | h'ccddeeff0123456789abcdeffedcba98765432100c1987d0' | |||
| h'13a20b820258200123456789abcdeffedcba987654321000' | h'0c0113a20b5824820258200123456789abcdeffedcba9876' | |||
| h'112233445566778899aabbccddeeff0c1987d001f602f609' | h'54321000112233445566778899aabbccddeeff0c1987d001' | |||
| h'5825860c0013a106781b687474703a2f2f6578616d706c65' | h'f602f6095825860c0013a106781b687474703a2f2f657861' | |||
| h'2e636f6d2f66696c652e62696e15f60b528a0c0003f60c01' | h'6d706c652e636f6d2f66696c652e62696e15f60b528a0c00' | |||
| h'13a20843a101010a0016f60c458403f617f6' \ | h'03f60c0113a20843a101010a0016f60c458403f617f6' \ | |||
| { | { | |||
| / structure-version / 1 : 1, | / structure-version / 1 : 1, | |||
| / sequence-number / 2 : 5, | / sequence-number / 2 : 5, | |||
| / common / 3 : h'a20254828245466c61736843003401824352414d420004' | / common / 3 : h'a20254828245466c61736843003401824352414d420004' | |||
| h'0458858e13a20350fa6b4a53d5ad5fdfbe9de663e4d41f' | h'0458898e13a20350fa6b4a53d5ad5fdfbe9de663e4d41f' | |||
| h'fe04501492af1425695e48bf429b2d51f2ab450c0013a2' | h'fe04501492af1425695e48bf429b2d51f2ab450c0013a2' | |||
| h'0b8202582000112233445566778899aabbccddeeff0123' | h'0b58248202582000112233445566778899aabbccddeeff' | |||
| h'456789abcdeffedcba98765432100c1987d00c0113a20b' | h'0123456789abcdeffedcba98765432100c1987d00c0113' | |||
| h'820258200123456789abcdeffedcba9876543210001122' | h'a20b5824820258200123456789abcdeffedcba98765432' | |||
| h'33445566778899aabbccddeeff0c1987d001f602f6' \ { | h'1000112233445566778899aabbccddeeff0c1987d001f6' | |||
| h'02f6' \ { | ||||
| / components / 2 : h'828245466c61736843003401824352414d4200' | / components / 2 : h'828245466c61736843003401824352414d4200' | |||
| h'04' \ | h'04' \ | |||
| [ | [ | |||
| [h'466c617368', h'003401'], | [h'466c617368', h'003401'], | |||
| [h'52414d', h'0004'], | [h'52414d', h'0004'], | |||
| ], | ], | |||
| / common-sequence / 4 : h'8e13a20350fa6b4a53d5ad5fdfbe9de6' | / common-sequence / 4 : h'8e13a20350fa6b4a53d5ad5fdfbe9de6' | |||
| h'63e4d41ffe04501492af1425695e48bf' | h'63e4d41ffe04501492af1425695e48bf' | |||
| h'429b2d51f2ab450c0013a20b82025820' | h'429b2d51f2ab450c0013a20b58248202' | |||
| h'00112233445566778899aabbccddeeff' | h'582000112233445566778899aabbccdd' | |||
| h'0123456789abcdeffedcba9876543210' | h'eeff0123456789abcdeffedcba987654' | |||
| h'0c1987d00c0113a20b82025820012345' | h'32100c1987d00c0113a20b5824820258' | |||
| h'6789abcdeffedcba9876543210001122' | h'200123456789abcdeffedcba98765432' | |||
| h'33445566778899aabbccddeeff0c1987' | h'1000112233445566778899aabbccddee' | |||
| h'd001f602f6' \ [ | h'ff0c1987d001f602f6' \ [ | |||
| / set-vars / 19, { | / set-vars / 19, { | |||
| / vendor-id / 3 : h'fa6b4a53d5ad5fdfbe9de663e4d41f' | / vendor-id / 3 : h'fa6b4a53d5ad5fdfbe9de663e4d41f' | |||
| h'fe', | h'fe', | |||
| / class-id / 4 : h'1492af1425695e48bf429b2d51f2ab45', | / class-id / 4 : h'1492af1425695e48bf429b2d51f2ab45', | |||
| }, | }, | |||
| / set-component-index / 12, 0, | / set-component-index / 12, 0, | |||
| / set-vars / 19, { | / set-vars / 19, { | |||
| / digest / 11 : [ 2, | / digest / 11 : h'8202582000112233445566778899aabb' | |||
| h'00112233445566778899aabbccddeeff0123456789ab' | h'ccddeeff0123456789abcdeffedcba98' | |||
| h'cdeffedcba9876543210' ] | h'76543210' \ | |||
| / size / 12 : 34768 | [ 2, h'00112233445566778899aabbccddeeff01234567' | |||
| h'89abcdeffedcba9876543210' ], | ||||
| / size / 12 : 34768, | ||||
| }, | }, | |||
| / set-component-index / 12, 1, | / set-component-index / 12, 1, | |||
| / set-vars / 19, { | / set-vars / 19, { | |||
| / digest / 11 : [ 2, | / digest / 11 : h'820258200123456789abcdeffedcba98' | |||
| h'0123456789abcdeffedcba9876543210001122334455' | h'7654321000112233445566778899aabb' | |||
| h'66778899aabbccddeeff' ], | h'ccddeeff' \ | |||
| [ 2, h'0123456789abcdeffedcba987654321000112233' | ||||
| h'445566778899aabbccddeeff' ], | ||||
| / size / 12 : 34768, | / size / 12 : 34768, | |||
| }, | }, | |||
| / condition-vendor-id / 1, None, | / condition-vendor-id / 1, None, | |||
| / condition-class-id / 2, None, | / condition-class-id / 2, None, | |||
| ], | ], | |||
| }, | }, | |||
| / apply-image / 9 : h'860c0013a106781b687474703a2f2f6578616d70' | / apply-image / 9 : h'860c0013a106781b687474703a2f2f6578616d70' | |||
| h'6c652e636f6d2f66696c652e62696e15f6' \ [ | h'6c652e636f6d2f66696c652e62696e15f6' \ [ | |||
| / set-component-index / 12, 0, | / set-component-index / 12, 0, | |||
| / set-vars / 19, { | / set-vars / 19, { | |||
| skipping to change at page 64, line 50 ¶ | skipping to change at page 77, line 10 ¶ | |||
| }, | }, | |||
| / copy / 22, None, | / copy / 22, None, | |||
| ], | ], | |||
| / run-image / 12 : h'8403f617f6' \ [ | / run-image / 12 : h'8403f617f6' \ [ | |||
| / condition-image / 3, None, | / condition-image / 3, None, | |||
| / run / 23, None, | / run / 23, None, | |||
| ], | ], | |||
| } | } | |||
| } | } | |||
| Total size of outer wrapper without COSE authentication object: 240 | Total size of outer wrapper without COSE authentication object: 244 | |||
| Outer: | Outer: | |||
| a201f60258eaa60101020503589fa20254828245466c61736843003401824352414d4200 | a201f60258eea6010102050358a3a20254828245466c61736843003401824352414d4200 | |||
| 040458858e13a20350fa6b4a53d5ad5fdfbe9de663e4d41ffe04501492af1425695e48bf | 040458898e13a20350fa6b4a53d5ad5fdfbe9de663e4d41ffe04501492af1425695e48bf | |||
| 429b2d51f2ab450c0013a20b8202582000112233445566778899aabbccddeeff01234567 | 429b2d51f2ab450c0013a20b58248202582000112233445566778899aabbccddeeff0123 | |||
| 89abcdeffedcba98765432100c1987d00c0113a20b820258200123456789abcdeffedcba | 456789abcdeffedcba98765432100c1987d00c0113a20b5824820258200123456789abcd | |||
| 987654321000112233445566778899aabbccddeeff0c1987d001f602f6095825860c0013 | effedcba987654321000112233445566778899aabbccddeeff0c1987d001f602f6095825 | |||
| a106781b687474703a2f2f6578616d706c652e636f6d2f66696c652e62696e15f60b528a | 860c0013a106781b687474703a2f2f6578616d706c652e636f6d2f66696c652e62696e15 | |||
| 0c0003f60c0113a20843a101010a0016f60c458403f617f6 | f60b528a0c0003f60c0113a20843a101010a0016f60c458403f617f6 | |||
| Total size of outer wrapper with COSE authentication object: 325 | Total size of outer wrapper with COSE authentication object: 329 | |||
| Signed Outer: | Signed Outer: | |||
| a2015854d28443a10126a1044874657374206b6579f65840e90dab6e502bad8132adf86b | a2015854d28443a10126a1044874657374206b6579f6584034915619c1ef02b4a7ffbbb6 | |||
| 4d78defaebac64fa6c6b2882d12b36f492b14ce75819ed3524de4d66ddfd5e1d80a59840 | 9083e8b3fb82febd9ecd6febf666d700fb981b208ec6d3df8735f36fd4a0a84e018943ef | |||
| 04c1ac9b003b2da32589583a93c541dd0258eaa60101020503589fa20254828245466c61 | 80e25f57fc130a43e57c6634f337b7fa0258eea6010102050358a3a20254828245466c61 | |||
| 736843003401824352414d4200040458858e13a20350fa6b4a53d5ad5fdfbe9de663e4d4 | 736843003401824352414d4200040458898e13a20350fa6b4a53d5ad5fdfbe9de663e4d4 | |||
| 1ffe04501492af1425695e48bf429b2d51f2ab450c0013a20b8202582000112233445566 | 1ffe04501492af1425695e48bf429b2d51f2ab450c0013a20b5824820258200011223344 | |||
| 778899aabbccddeeff0123456789abcdeffedcba98765432100c1987d00c0113a20b8202 | 5566778899aabbccddeeff0123456789abcdeffedcba98765432100c1987d00c0113a20b | |||
| 58200123456789abcdeffedcba987654321000112233445566778899aabbccddeeff0c19 | 5824820258200123456789abcdeffedcba987654321000112233445566778899aabbccdd | |||
| 87d001f602f6095825860c0013a106781b687474703a2f2f6578616d706c652e636f6d2f | eeff0c1987d001f602f6095825860c0013a106781b687474703a2f2f6578616d706c652e | |||
| 66696c652e62696e15f60b528a0c0003f60c0113a20843a101010a0016f60c458403f617 | 636f6d2f66696c652e62696e15f60b528a0c0003f60c0113a20843a101010a0016f60c45 | |||
| f6 | 8403f617f6 | |||
| 13.6. Example 5: | 12.6. Example 5: | |||
| Compatibility test, download, installation, and secure boot. | Compatibility test, download, installation, and secure boot. | |||
| The following JSON shows the intended behaviour of the manifest. | The following JSON shows the intended behaviour of the manifest. | |||
| { | { | |||
| "structure-version": 1, | "structure-version": 1, | |||
| "sequence-number": 6, | "sequence-number": 6, | |||
| "common": { | "common": { | |||
| "common-sequence": [ | "common-sequence": [ | |||
| skipping to change at page 67, line 4 ¶ | skipping to change at page 79, line 14 ¶ | |||
| "directive-set-var": { | "directive-set-var": { | |||
| "source-index": 0 | "source-index": 0 | |||
| } | } | |||
| }, | }, | |||
| { "directive-fetch": null } | { "directive-fetch": null } | |||
| ], | ], | |||
| "run-image": [ | "run-image": [ | |||
| { "directive-set-component": 1 }, | { "directive-set-component": 1 }, | |||
| { "condition-image": null }, | { "condition-image": null }, | |||
| { "directive-run": null } | { "directive-run": null } | |||
| ] | ] | |||
| } | } | |||
| Converted into the SUIT manifest, this produces: | Converted into the SUIT manifest, this produces: | |||
| { | { | |||
| / auth object / 1 : h'd28443a10126a1044874657374206b6579f658402282' | / auth object / 1 : h'd28443a10126a1044874657374206b6579f65840a516' | |||
| h'c1e7770b1806afb0cf78e74003af39166b9db14b0a7c' | h'466c62602aa017422f23d1469339e40c5cf06f9090da' | |||
| h'172d18598c8be16e3cec48770fb8471675a5b3bab05a' | h'09bd9939ecfc4c1ffe3e6ce50e0620fe9948f76552da' | |||
| h'22e370a03320a7346f252f9629c3417ed153', | h'703a4c0bf2532d073be2d1f215ec83483f46', | |||
| / manifest / 2 : h'a6010102060358a2a202578282467b1b4595ab2143003401' | / manifest / 2 : h'a6010102060358a6a202578282467b1b4595ab2143003401' | |||
| h'8245466c6173684200040458858e13a20350fa6b4a53d5ad' | h'8245466c6173684200040458898e13a20350fa6b4a53d5ad' | |||
| h'5fdfbe9de663e4d41ffe04501492af1425695e48bf429b2d' | h'5fdfbe9de663e4d41ffe04501492af1425695e48bf429b2d' | |||
| h'51f2ab450c0013a20b8202582000112233445566778899aa' | h'51f2ab450c0013a20b582482025820001122334455667788' | |||
| h'bbccddeeff0123456789abcdeffedcba98765432100c1987' | h'99aabbccddeeff0123456789abcdeffedcba98765432100c' | |||
| h'd00c0113a20b820258200123456789abcdeffedcba987654' | h'1987d00c0113a20b5824820258200123456789abcdeffedc' | |||
| h'321000112233445566778899aabbccddeeff0c1987d001f6' | h'ba987654321000112233445566778899aabbccddeeff0c19' | |||
| h'02f6095825860c0013a106781b687474703a2f2f6578616d' | h'87d001f602f6095825860c0013a106781b687474703a2f2f' | |||
| h'706c652e636f6d2f66696c652e62696e15f60b528e0c0118' | h'6578616d706c652e636f6d2f66696c652e62696e15f60b52' | |||
| h'19f60c0003f60c0113a10a0015f60c47860c0103f617f6' \ | h'8e0c011819f60c0003f60c0113a10a0015f60c47860c0103' | |||
| h'f617f6' \ | ||||
| { | { | |||
| / structure-version / 1 : 1, | / structure-version / 1 : 1, | |||
| / sequence-number / 2 : 6, | / sequence-number / 2 : 6, | |||
| / common / 3 : h'a202578282467b1b4595ab21430034018245466c617368' | / common / 3 : h'a202578282467b1b4595ab21430034018245466c617368' | |||
| h'4200040458858e13a20350fa6b4a53d5ad5fdfbe9de663' | h'4200040458898e13a20350fa6b4a53d5ad5fdfbe9de663' | |||
| h'e4d41ffe04501492af1425695e48bf429b2d51f2ab450c' | h'e4d41ffe04501492af1425695e48bf429b2d51f2ab450c' | |||
| h'0013a20b8202582000112233445566778899aabbccddee' | h'0013a20b58248202582000112233445566778899aabbcc' | |||
| h'ff0123456789abcdeffedcba98765432100c1987d00c01' | h'ddeeff0123456789abcdeffedcba98765432100c1987d0' | |||
| h'13a20b820258200123456789abcdeffedcba9876543210' | h'0c0113a20b5824820258200123456789abcdeffedcba98' | |||
| h'00112233445566778899aabbccddeeff0c1987d001f602' | h'7654321000112233445566778899aabbccddeeff0c1987' | |||
| h'f6' \ { | h'd001f602f6' \ { | |||
| / components / 2 : h'8282467b1b4595ab21430034018245466c6173' | / components / 2 : h'8282467b1b4595ab21430034018245466c6173' | |||
| h'68420004' \ | h'68420004' \ | |||
| [ | [ | |||
| [h'7b1b4595ab21', h'003401'], | [h'7b1b4595ab21', h'003401'], | |||
| [h'466c617368', h'0004'], | [h'466c617368', h'0004'], | |||
| ], | ], | |||
| / common-sequence / 4 : h'8e13a20350fa6b4a53d5ad5fdfbe9de6' | / common-sequence / 4 : h'8e13a20350fa6b4a53d5ad5fdfbe9de6' | |||
| h'63e4d41ffe04501492af1425695e48bf' | h'63e4d41ffe04501492af1425695e48bf' | |||
| h'429b2d51f2ab450c0013a20b82025820' | h'429b2d51f2ab450c0013a20b58248202' | |||
| h'00112233445566778899aabbccddeeff' | h'582000112233445566778899aabbccdd' | |||
| h'0123456789abcdeffedcba9876543210' | h'eeff0123456789abcdeffedcba987654' | |||
| h'0c1987d00c0113a20b82025820012345' | h'32100c1987d00c0113a20b5824820258' | |||
| h'6789abcdeffedcba9876543210001122' | h'200123456789abcdeffedcba98765432' | |||
| h'33445566778899aabbccddeeff0c1987' | h'1000112233445566778899aabbccddee' | |||
| h'd001f602f6' \ [ | h'ff0c1987d001f602f6' \ [ | |||
| / set-vars / 19, { | / set-vars / 19, { | |||
| / vendor-id / 3 : h'fa6b4a53d5ad5fdfbe9de663e4d41f' | / vendor-id / 3 : h'fa6b4a53d5ad5fdfbe9de663e4d41f' | |||
| h'fe', | h'fe', | |||
| / class-id / 4 : h'1492af1425695e48bf429b2d51f2ab45', | / class-id / 4 : h'1492af1425695e48bf429b2d51f2ab45', | |||
| }, | }, | |||
| / set-component-index / 12, 0, | / set-component-index / 12, 0, | |||
| / set-vars / 19, { | / set-vars / 19, { | |||
| / digest / 11 : [ 2, | / digest / 11 : h'8202582000112233445566778899aabb' | |||
| h'00112233445566778899aabbccddeeff0123456789ab' | h'ccddeeff0123456789abcdeffedcba98' | |||
| h'cdeffedcba9876543210' ], | h'76543210' \ | |||
| [ 2, h'00112233445566778899aabbccddeeff01234567' | ||||
| h'89abcdeffedcba9876543210' ], | ||||
| / size / 12 : 34768, | / size / 12 : 34768, | |||
| }, | }, | |||
| / set-component-index / 12, 1, | / set-component-index / 12, 1, | |||
| / set-vars / 19, { | / set-vars / 19, { | |||
| / digest / 11 : [ 2, | / digest / 11 : h'820258200123456789abcdeffedcba98' | |||
| h'0123456789abcdeffedcba9876543210001122334455' | h'7654321000112233445566778899aabb' | |||
| h'66778899aabbccddeeff' ], | h'ccddeeff' \ | |||
| [ 2, h'0123456789abcdeffedcba987654321000112233' | ||||
| h'445566778899aabbccddeeff' ], | ||||
| / size / 12 : 34768, | / size / 12 : 34768, | |||
| }, | }, | |||
| / condition-vendor-id / 1, None, | / condition-vendor-id / 1, None, | |||
| / condition-class-id / 2, None, | / condition-class-id / 2, None, | |||
| ], | ], | |||
| }, | }, | |||
| / apply-image / 9 : h'860c0013a106781b687474703a2f2f6578616d70' | / apply-image / 9 : h'860c0013a106781b687474703a2f2f6578616d70' | |||
| h'6c652e636f6d2f66696c652e62696e15f6' \ [ | h'6c652e636f6d2f66696c652e62696e15f6' \ [ | |||
| / set-component-index / 12, 0, | / set-component-index / 12, 0, | |||
| / set-vars / 19, { | / set-vars / 19, { | |||
| skipping to change at page 69, line 4 ¶ | skipping to change at page 81, line 18 ¶ | |||
| }, | }, | |||
| / fetch / 21, None, | / fetch / 21, None, | |||
| ], | ], | |||
| / run-image / 12 : h'860c0103f617f6' \ [ | / run-image / 12 : h'860c0103f617f6' \ [ | |||
| / set-component-index / 12, 1, | / set-component-index / 12, 1, | |||
| / condition-image / 3, None, | / condition-image / 3, None, | |||
| / run / 23, None, | / run / 23, None, | |||
| ], | ], | |||
| } | } | |||
| } | } | |||
| Total size of outer wrapper without COSE authentication object: 245 | ||||
| Total size of outer wrapper without COSE authentication object: 249 | ||||
| Outer: | Outer: | |||
| a201f60258efa6010102060358a2a202578282467b1b4595ab21430034018245466c6173 | a201f60258f3a6010102060358a6a202578282467b1b4595ab21430034018245466c6173 | |||
| 684200040458858e13a20350fa6b4a53d5ad5fdfbe9de663e4d41ffe04501492af142569 | 684200040458898e13a20350fa6b4a53d5ad5fdfbe9de663e4d41ffe04501492af142569 | |||
| 5e48bf429b2d51f2ab450c0013a20b8202582000112233445566778899aabbccddeeff01 | 5e48bf429b2d51f2ab450c0013a20b58248202582000112233445566778899aabbccddee | |||
| 23456789abcdeffedcba98765432100c1987d00c0113a20b820258200123456789abcdef | ff0123456789abcdeffedcba98765432100c1987d00c0113a20b58248202582001234567 | |||
| fedcba987654321000112233445566778899aabbccddeeff0c1987d001f602f609582586 | 89abcdeffedcba987654321000112233445566778899aabbccddeeff0c1987d001f602f6 | |||
| 0c0013a106781b687474703a2f2f6578616d706c652e636f6d2f66696c652e62696e15f6 | 095825860c0013a106781b687474703a2f2f6578616d706c652e636f6d2f66696c652e62 | |||
| 0b528e0c011819f60c0003f60c0113a10a0015f60c47860c0103f617f6 | 696e15f60b528e0c011819f60c0003f60c0113a10a0015f60c47860c0103f617f6 | |||
| Total size of outer wrapper with COSE authentication object: 330 | Total size of outer wrapper with COSE authentication object: 334 | |||
| Signed Outer: | Signed Outer: | |||
| a2015854d28443a10126a1044874657374206b6579f658402282c1e7770b1806afb0cf78 | a2015854d28443a10126a1044874657374206b6579f65840a516466c62602aa017422f23 | |||
| e74003af39166b9db14b0a7c172d18598c8be16e3cec48770fb8471675a5b3bab05a22e3 | d1469339e40c5cf06f9090da09bd9939ecfc4c1ffe3e6ce50e0620fe9948f76552da703a | |||
| 70a03320a7346f252f9629c3417ed1530258efa6010102060358a2a202578282467b1b45 | 4c0bf2532d073be2d1f215ec83483f460258f3a6010102060358a6a202578282467b1b45 | |||
| 95ab21430034018245466c6173684200040458858e13a20350fa6b4a53d5ad5fdfbe9de6 | 95ab21430034018245466c6173684200040458898e13a20350fa6b4a53d5ad5fdfbe9de6 | |||
| 63e4d41ffe04501492af1425695e48bf429b2d51f2ab450c0013a20b8202582000112233 | 63e4d41ffe04501492af1425695e48bf429b2d51f2ab450c0013a20b5824820258200011 | |||
| 445566778899aabbccddeeff0123456789abcdeffedcba98765432100c1987d00c0113a2 | 2233445566778899aabbccddeeff0123456789abcdeffedcba98765432100c1987d00c01 | |||
| 0b820258200123456789abcdeffedcba987654321000112233445566778899aabbccddee | 13a20b5824820258200123456789abcdeffedcba987654321000112233445566778899aa | |||
| ff0c1987d001f602f6095825860c0013a106781b687474703a2f2f6578616d706c652e63 | bbccddeeff0c1987d001f602f6095825860c0013a106781b687474703a2f2f6578616d70 | |||
| 6f6d2f66696c652e62696e15f60b528e0c011819f60c0003f60c0113a10a0015f60c4786 | 6c652e636f6d2f66696c652e62696e15f60b528e0c011819f60c0003f60c0113a10a0015 | |||
| 0c0103f617f6 | f60c47860c0103f617f6 | |||
| 13.7. Example 6: | 12.7. Example 6: | |||
| Compatibility test, 2 images, simultaneous download and installation, | Compatibility test, 2 images, simultaneous download and installation, | |||
| and secure boot. | and secure boot. | |||
| The following JSON shows the intended behaviour of the manifest. | The following JSON shows the intended behaviour of the manifest. | |||
| { | { | |||
| "structure-version": 1, | "structure-version": 1, | |||
| "sequence-number": 7, | "sequence-number": 7, | |||
| "common": { | "common": { | |||
| skipping to change at page 71, line 4 ¶ | skipping to change at page 83, line 18 ¶ | |||
| } | } | |||
| }, | }, | |||
| { "directive-set-component": true }, | { "directive-set-component": true }, | |||
| { "directive-fetch": null } | { "directive-fetch": null } | |||
| ], | ], | |||
| "run-image": [ | "run-image": [ | |||
| { "directive-set-component": true }, | { "directive-set-component": true }, | |||
| { "condition-image": null }, | { "condition-image": null }, | |||
| { "directive-set-component": 0 }, | { "directive-set-component": 0 }, | |||
| { "directive-run": null } | { "directive-run": null } | |||
| ] | ] | |||
| } | } | |||
| Converted into the SUIT manifest, this produces: | Converted into the SUIT manifest, this produces: | |||
| { | { | |||
| / auth object / 1 : h'd28443a10126a1044874657374206b6579f65840d00c' | / auth object / 1 : h'd28443a10126a1044874657374206b6579f658400d44' | |||
| h'd62be643247904621f2956b11b97fcbcd22f87701dd9' | h'c766566a88c5bbe61b544edd14effa7d53c9a6d43221' | |||
| h'008e949f8c801f55d7095b545d6db0060bd47c5f78ee' | h'99c6285490460b910c8e96c6a1065cc1be9cfa438f7b' | |||
| h'5cb1fea17c875a36a599aec4e8b876cfdae7', | h'eeaffa9922e2ae440d6c8d0b9cb26bed2ffe', | |||
| / manifest / 2 : h'a5010102070358a4a20257828245466c6173684300340182' | / manifest / 2 : h'a5010102070358a8a20257828245466c6173684300340182' | |||
| h'45466c617368430004020458878e13a20350fa6b4a53d5ad' | h'45466c6173684300040204588b8e13a20350fa6b4a53d5ad' | |||
| h'5fdfbe9de663e4d41ffe04501492af1425695e48bf429b2d' | h'5fdfbe9de663e4d41ffe04501492af1425695e48bf429b2d' | |||
| h'51f2ab450c0013a20b8202582000112233445566778899aa' | h'51f2ab450c0013a20b582482025820001122334455667788' | |||
| h'bbccddeeff0123456789abcdeffedcba98765432100c1987' | h'99aabbccddeeff0123456789abcdeffedcba98765432100c' | |||
| h'd00c0113a20b820258200123456789abcdeffedcba987654' | h'1987d00c0113a20b5824820258200123456789abcdeffedc' | |||
| h'321000112233445566778899aabbccddeeff0c1a00012c22' | h'ba987654321000112233445566778899aabbccddeeff0c1a' | |||
| h'01f602f609584b8c0c0013a106781c687474703a2f2f6578' | h'00012c2201f602f609584b8c0c0013a106781c687474703a' | |||
| h'616d706c652e636f6d2f66696c65312e62696e0c0113a106' | h'2f2f6578616d706c652e636f6d2f66696c65312e62696e0c' | |||
| h'781c687474703a2f2f6578616d706c652e636f6d2f66696c' | h'0113a106781c687474703a2f2f6578616d706c652e636f6d' | |||
| h'65322e62696e0cf515f60c49880cf503f60c0017f6' \ | h'2f66696c65322e62696e0cf515f60c49880cf503f60c0017' | |||
| h'f6' \ | ||||
| { | { | |||
| / structure-version / 1 : 1, | / structure-version / 1 : 1, | |||
| / sequence-number / 2 : 7, | / sequence-number / 2 : 7, | |||
| / common / 3 : h'a20257828245466c617368430034018245466c61736843' | / common / 3 : h'a20257828245466c617368430034018245466c61736843' | |||
| h'0004020458878e13a20350fa6b4a53d5ad5fdfbe9de663' | h'00040204588b8e13a20350fa6b4a53d5ad5fdfbe9de663' | |||
| h'e4d41ffe04501492af1425695e48bf429b2d51f2ab450c' | h'e4d41ffe04501492af1425695e48bf429b2d51f2ab450c' | |||
| h'0013a20b8202582000112233445566778899aabbccddee' | h'0013a20b58248202582000112233445566778899aabbcc' | |||
| h'ff0123456789abcdeffedcba98765432100c1987d00c01' | h'ddeeff0123456789abcdeffedcba98765432100c1987d0' | |||
| h'13a20b820258200123456789abcdeffedcba9876543210' | h'0c0113a20b5824820258200123456789abcdeffedcba98' | |||
| h'00112233445566778899aabbccddeeff0c1a00012c2201' | h'7654321000112233445566778899aabbccddeeff0c1a00' | |||
| h'f602f6' \ { | h'012c2201f602f6' \ { | |||
| / components / 2 : h'828245466c617368430034018245466c617368' | / components / 2 : h'828245466c617368430034018245466c617368' | |||
| h'43000402' \ | h'43000402' \ | |||
| [ | [ | |||
| [h'466c617368', h'003401'], | [h'466c617368', h'003401'], | |||
| [h'466c617368', h'000402'], | [h'466c617368', h'000402'], | |||
| ], | ], | |||
| / common-sequence / 4 : h'8e13a20350fa6b4a53d5ad5fdfbe9de6' | / common-sequence / 4 : h'8e13a20350fa6b4a53d5ad5fdfbe9de6' | |||
| h'63e4d41ffe04501492af1425695e48bf' | h'63e4d41ffe04501492af1425695e48bf' | |||
| h'429b2d51f2ab450c0013a20b82025820' | h'429b2d51f2ab450c0013a20b58248202' | |||
| h'00112233445566778899aabbccddeeff' | h'582000112233445566778899aabbccdd' | |||
| h'0123456789abcdeffedcba9876543210' | h'eeff0123456789abcdeffedcba987654' | |||
| h'0c1987d00c0113a20b82025820012345' | h'32100c1987d00c0113a20b5824820258' | |||
| h'6789abcdeffedcba9876543210001122' | h'200123456789abcdeffedcba98765432' | |||
| h'33445566778899aabbccddeeff0c1a00' | h'1000112233445566778899aabbccddee' | |||
| h'012c2201f602f6' \ [ | h'ff0c1a00012c2201f602f6' \ [ | |||
| / set-vars / 19, { | / set-vars / 19, { | |||
| / vendor-id / 3 : h'fa6b4a53d5ad5fdfbe9de663e4d41f' | / vendor-id / 3 : h'fa6b4a53d5ad5fdfbe9de663e4d41f' | |||
| h'fe', | h'fe', | |||
| / class-id / 4 : h'1492af1425695e48bf429b2d51f2ab45', | / class-id / 4 : h'1492af1425695e48bf429b2d51f2ab45', | |||
| }, | }, | |||
| / set-component-index / 12, 0, | / set-component-index / 12, 0, | |||
| / set-vars / 19, { | / set-vars / 19, { | |||
| / digest / 11 : [ 2, | / digest / 11 : h'8202582000112233445566778899aabb' | |||
| h'00112233445566778899aabbccddeeff0123456789ab' | h'ccddeeff0123456789abcdeffedcba98' | |||
| h'cdeffedcba9876543210' ], | h'76543210' \ | |||
| [ 2, h'00112233445566778899aabbccddeeff01234567' | ||||
| h'89abcdeffedcba9876543210' ], | ||||
| / size / 12 : 34768, | / size / 12 : 34768, | |||
| }, | }, | |||
| / set-component-index / 12, 1, | / set-component-index / 12, 1, | |||
| / set-vars / 19, { | / set-vars / 19, { | |||
| / digest / 11 : [ 2, | / digest / 11 : h'820258200123456789abcdeffedcba98' | |||
| h'0123456789abcdeffedcba9876543210001122334455' | h'7654321000112233445566778899aabb' | |||
| h'66778899aabbccddeeff' ], | h'ccddeeff' \ | |||
| [ 2, h'0123456789abcdeffedcba987654321000112233' | ||||
| h'445566778899aabbccddeeff' ], | ||||
| / size / 12 : 76834, | / size / 12 : 76834, | |||
| }, | }, | |||
| / condition-vendor-id / 1, None, | / condition-vendor-id / 1, None, | |||
| / condition-class-id / 2, None, | / condition-class-id / 2, None, | |||
| ], | ], | |||
| }, | }, | |||
| / apply-image / 9 : h'8c0c0013a106781c687474703a2f2f6578616d70' | / apply-image / 9 : h'8c0c0013a106781c687474703a2f2f6578616d70' | |||
| h'6c652e636f6d2f66696c65312e62696e0c0113a1' | h'6c652e636f6d2f66696c65312e62696e0c0113a1' | |||
| h'06781c687474703a2f2f6578616d706c652e636f' | h'06781c687474703a2f2f6578616d706c652e636f' | |||
| h'6d2f66696c65322e62696e0cf515f6' \ [ | h'6d2f66696c65322e62696e0cf515f6' \ [ | |||
| / set-component-index / 12, 0, | / set-component-index / 12, 0, | |||
| / set-vars / 19, { | / set-vars / 19, { | |||
| / uri / 6 : http://example.com/file1.bin | / uri / 6 : http://example.com/file1.bin, | |||
| }, | }, | |||
| / set-component-index / 12, 1, | / set-component-index / 12, 1, | |||
| / set-vars / 19, { | / set-vars / 19, { | |||
| / uri / 6 : http://example.com/file2.bin | / uri / 6 : http://example.com/file2.bin, | |||
| }, | }, | |||
| / set-component-index / 12, True, | / set-component-index / 12, True, | |||
| / fetch / 21, None, | / fetch / 21, None, | |||
| ], | ], | |||
| / run-image / 12 : h'880cf503f60c0017f6' \ [ | / run-image / 12 : h'880cf503f60c0017f6' \ [ | |||
| / set-component-index / 12, True, | / set-component-index / 12, True, | |||
| / condition-image / 3, None, | / condition-image / 3, None, | |||
| / set-component-index / 12, 0, | / set-component-index / 12, 0, | |||
| / run / 23, None, | / run / 23, None, | |||
| ], | ], | |||
| } | } | |||
| } | } | |||
| Total size of outer wrapper without COSE authentication object: 268 | Total size of outer wrapper without COSE authentication object: 272 | |||
| Outer: | Outer: | |||
| a201f602590105a5010102070358a4a20257828245466c617368430034018245466c6173 | a201f602590109a5010102070358a8a20257828245466c617368430034018245466c6173 | |||
| 68430004020458878e13a20350fa6b4a53d5ad5fdfbe9de663e4d41ffe04501492af1425 | 684300040204588b8e13a20350fa6b4a53d5ad5fdfbe9de663e4d41ffe04501492af1425 | |||
| 695e48bf429b2d51f2ab450c0013a20b8202582000112233445566778899aabbccddeeff | 695e48bf429b2d51f2ab450c0013a20b58248202582000112233445566778899aabbccdd | |||
| 0123456789abcdeffedcba98765432100c1987d00c0113a20b820258200123456789abcd | eeff0123456789abcdeffedcba98765432100c1987d00c0113a20b582482025820012345 | |||
| effedcba987654321000112233445566778899aabbccddeeff0c1a00012c2201f602f609 | 6789abcdeffedcba987654321000112233445566778899aabbccddeeff0c1a00012c2201 | |||
| 584b8c0c0013a106781c687474703a2f2f6578616d706c652e636f6d2f66696c65312e62 | f602f609584b8c0c0013a106781c687474703a2f2f6578616d706c652e636f6d2f66696c | |||
| 696e0c0113a106781c687474703a2f2f6578616d706c652e636f6d2f66696c65322e6269 | 65312e62696e0c0113a106781c687474703a2f2f6578616d706c652e636f6d2f66696c65 | |||
| 6e0cf515f60c49880cf503f60c0017f6 | 322e62696e0cf515f60c49880cf503f60c0017f6 | |||
| Total size of outer wrapper with COSE authentication object: 353 | Total size of outer wrapper with COSE authentication object: 357 | |||
| Signed Outer: | Signed Outer: | |||
| a2015854d28443a10126a1044874657374206b6579f65840d00cd62be643247904621f29 | a2015854d28443a10126a1044874657374206b6579f658400d44c766566a88c5bbe61b54 | |||
| 56b11b97fcbcd22f87701dd9008e949f8c801f55d7095b545d6db0060bd47c5f78ee5cb1 | 4edd14effa7d53c9a6d4322199c6285490460b910c8e96c6a1065cc1be9cfa438f7beeaf | |||
| fea17c875a36a599aec4e8b876cfdae702590105a5010102070358a4a20257828245466c | fa9922e2ae440d6c8d0b9cb26bed2ffe02590109a5010102070358a8a20257828245466c | |||
| 617368430034018245466c617368430004020458878e13a20350fa6b4a53d5ad5fdfbe9d | 617368430034018245466c6173684300040204588b8e13a20350fa6b4a53d5ad5fdfbe9d | |||
| e663e4d41ffe04501492af1425695e48bf429b2d51f2ab450c0013a20b82025820001122 | e663e4d41ffe04501492af1425695e48bf429b2d51f2ab450c0013a20b58248202582000 | |||
| 33445566778899aabbccddeeff0123456789abcdeffedcba98765432100c1987d00c0113 | 112233445566778899aabbccddeeff0123456789abcdeffedcba98765432100c1987d00c | |||
| a20b820258200123456789abcdeffedcba987654321000112233445566778899aabbccdd | 0113a20b5824820258200123456789abcdeffedcba987654321000112233445566778899 | |||
| eeff0c1a00012c2201f602f609584b8c0c0013a106781c687474703a2f2f6578616d706c | aabbccddeeff0c1a00012c2201f602f609584b8c0c0013a106781c687474703a2f2f6578 | |||
| 652e636f6d2f66696c65312e62696e0c0113a106781c687474703a2f2f6578616d706c65 | 616d706c652e636f6d2f66696c65312e62696e0c0113a106781c687474703a2f2f657861 | |||
| 2e636f6d2f66696c65322e62696e0cf515f60c49880cf503f60c0017f6 | 6d706c652e636f6d2f66696c65322e62696e0cf515f60c49880cf503f60c0017f6 | |||
| 13. IANA Considerations | ||||
| 14. IANA Considerations | ||||
| Several registries will be required for: | Several registries will be required for: | |||
| - standard Commands | - standard Commands | |||
| - standard Parameters | - standard Parameters | |||
| - standard Algorithm identifiers | - standard Algorithm identifiers | |||
| - standard text values | - standard text values | |||
| 15. Security Considerations | 14. Security Considerations | |||
| This document is about a manifest format describing and protecting | This document is about a manifest format describing and protecting | |||
| firmware images and as such it is part of a larger solution for | firmware images and as such it is part of a larger solution for | |||
| offering a standardized way of delivering firmware updates to IoT | offering a standardized way of delivering firmware updates to IoT | |||
| devices. A more detailed discussion about security can be found in | devices. A more detailed discussion about security can be found in | |||
| the architecture document [Architecture] and in [Information]. | the architecture document [I-D.ietf-suit-architecture] and in | |||
| [I-D.ietf-suit-information-model]. | ||||
| 16. Mailing List Information | 15. Mailing List Information | |||
| The discussion list for this document is located at the e-mail | The discussion list for this document is located at the e-mail | |||
| address suit@ietf.org [1]. Information on the group and information | address suit@ietf.org [1]. Information on the group and information | |||
| on how to subscribe to the list is at | on how to subscribe to the list is at | |||
| https://www1.ietf.org/mailman/listinfo/suit [2] | https://www1.ietf.org/mailman/listinfo/suit [2] | |||
| Archives of the list can be found at: https://www.ietf.org/mail- | Archives of the list can be found at: https://www.ietf.org/mail- | |||
| archive/web/suit/current/index.html [3] | archive/web/suit/current/index.html [3] | |||
| 17. Acknowledgements | 16. Acknowledgements | |||
| We would like to thank the following persons for their support in | We would like to thank the following persons for their support in | |||
| designing this mechanism: | designing this mechanism: | |||
| - Milosch Meriac | - Milosch Meriac | |||
| - Geraint Luff | - Geraint Luff | |||
| - Dan Ros | - Dan Ros | |||
| skipping to change at page 74, line 31 ¶ | skipping to change at page 87, line 4 ¶ | |||
| - Geraint Luff | - Geraint Luff | |||
| - Dan Ros | - Dan Ros | |||
| - John-Paul Stanford | - John-Paul Stanford | |||
| - Hugo Vincent | - Hugo Vincent | |||
| - Carsten Bormann | - Carsten Bormann | |||
| - Oeyvind Roenningstad | - Oeyvind Roenningstad | |||
| - Frank Audun Kvamtroe | - Frank Audun Kvamtroe | |||
| - Krzysztof Chruściński | - Krzysztof Chruściński | |||
| - Andrzej Puzdrowski | - Andrzej Puzdrowski | |||
| - Michael Richardson | - Michael Richardson | |||
| - David Brown | - David Brown | |||
| - Emmanuel Baccelli | - Emmanuel Baccelli | |||
| 18. References | 17. References | |||
| 18.1. Normative References | 17.1. Normative References | |||
| [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | |||
| Requirement Levels", BCP 14, RFC 2119, | Requirement Levels", BCP 14, RFC 2119, | |||
| DOI 10.17487/RFC2119, March 1997, | DOI 10.17487/RFC2119, March 1997, | |||
| <https://www.rfc-editor.org/info/rfc2119>. | <https://www.rfc-editor.org/info/rfc2119>. | |||
| [RFC4122] Leach, P., Mealling, M., and R. Salz, "A Universally | [RFC4122] Leach, P., Mealling, M., and R. Salz, "A Universally | |||
| Unique IDentifier (UUID) URN Namespace", RFC 4122, | Unique IDentifier (UUID) URN Namespace", RFC 4122, | |||
| DOI 10.17487/RFC4122, July 2005, | DOI 10.17487/RFC4122, July 2005, | |||
| <https://www.rfc-editor.org/info/rfc4122>. | <https://www.rfc-editor.org/info/rfc4122>. | |||
| [RFC8152] Schaad, J., "CBOR Object Signing and Encryption (COSE)", | [RFC8152] Schaad, J., "CBOR Object Signing and Encryption (COSE)", | |||
| RFC 8152, DOI 10.17487/RFC8152, July 2017, | RFC 8152, DOI 10.17487/RFC8152, July 2017, | |||
| <https://www.rfc-editor.org/info/rfc8152>. | <https://www.rfc-editor.org/info/rfc8152>. | |||
| [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC | [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC | |||
| 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, | 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, | |||
| May 2017, <https://www.rfc-editor.org/info/rfc8174>. | May 2017, <https://www.rfc-editor.org/info/rfc8174>. | |||
| 18.2. Informative References | 17.2. Informative References | |||
| [Architecture] | ||||
| Moran, B., "A Firmware Update Architecture for Internet of | ||||
| Things Devices", January 2019, | ||||
| <https://tools.ietf.org/html/draft-ietf-suit-architecture- | ||||
| 02>. | ||||
| [Information] | [I-D.ietf-suit-architecture] | |||
| Moran, B., "Firmware Updates for Internet of Things | Moran, B., Meriac, M., Tschofenig, H., and D. Brown, "A | |||
| Devices - An Information Model for Manifests", January | Firmware Update Architecture for Internet of Things | |||
| 2019, <https://tools.ietf.org/html/draft-ietf-suit- | Devices", draft-ietf-suit-architecture-07 (work in | |||
| information-model-02>. | progress), October 2019. | |||
| [RFC6920] Farrell, S., Kutscher, D., Dannewitz, C., Ohlman, B., | [I-D.ietf-suit-information-model] | |||
| Keranen, A., and P. Hallam-Baker, "Naming Things with | Moran, B., Tschofenig, H., and H. Birkholz, "An | |||
| Hashes", RFC 6920, DOI 10.17487/RFC6920, April 2013, | Information Model for Firmware Updates in IoT Devices", | |||
| <https://www.rfc-editor.org/info/rfc6920>. | draft-ietf-suit-information-model-04 (work in progress), | |||
| October 2019. | ||||
| 18.3. URIs | 17.3. URIs | |||
| [1] mailto:suit@ietf.org | [1] mailto:suit@ietf.org | |||
| [2] https://www1.ietf.org/mailman/listinfo/suit | [2] https://www1.ietf.org/mailman/listinfo/suit | |||
| [3] https://www.ietf.org/mail-archive/web/suit/current/index.html | [3] https://www.ietf.org/mail-archive/web/suit/current/index.html | |||
| Authors' Addresses | Authors' Addresses | |||
| Brendan Moran | Brendan Moran | |||
| End of changes. 222 change blocks. | ||||
| 758 lines changed or deleted | 1331 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ | ||||