| < draft-ietf-suit-manifest-09.txt | draft-ietf-suit-manifest-10.txt > | |||
|---|---|---|---|---|
| SUIT B. Moran | SUIT B. Moran | |||
| Internet-Draft H. Tschofenig | Internet-Draft H. Tschofenig | |||
| Intended status: Standards Track Arm Limited | Intended status: Standards Track Arm Limited | |||
| Expires: January 14, 2021 H. Birkholz | Expires: May 6, 2021 H. Birkholz | |||
| Fraunhofer SIT | Fraunhofer SIT | |||
| K. Zandberg | K. Zandberg | |||
| Inria | Inria | |||
| July 13, 2020 | November 02, 2020 | |||
| A Concise Binary Object Representation (CBOR)-based Serialization Format | A Concise Binary Object Representation (CBOR)-based Serialization Format | |||
| for the Software Updates for Internet of Things (SUIT) Manifest | for the Software Updates for Internet of Things (SUIT) Manifest | |||
| draft-ietf-suit-manifest-09 | draft-ietf-suit-manifest-10 | |||
| 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 code/data obtained by a recipient (chiefly | |||
| find the firmware, the devices to which it applies, and cryptographic | the firmware for an IoT device), where to find the that code/data, | |||
| information protecting the manifest. Firmware updates and secure | the devices to which it applies, and cryptographic information | |||
| boot both tend to use sequences of common operations, so the manifest | protecting the manifest. Software updates and Trusted Invocation | |||
| both tend to use sequences of common operations, so the manifest | ||||
| encodes those sequences of operations, rather than declaring the | encodes those sequences of operations, rather than declaring the | |||
| metadata. The manifest also serves as a building block for secure | metadata. | |||
| boot. | ||||
| Status of This Memo | Status of This Memo | |||
| This Internet-Draft is submitted in full conformance with the | This Internet-Draft is submitted in full conformance with the | |||
| provisions of BCP 78 and BCP 79. | provisions of BCP 78 and BCP 79. | |||
| 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 January 14, 2021. | This Internet-Draft will expire on May 6, 2021. | |||
| Copyright Notice | Copyright Notice | |||
| Copyright (c) 2020 IETF Trust and the persons identified as the | Copyright (c) 2020 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 25 ¶ | skipping to change at page 2, line 25 ¶ | |||
| Table of Contents | Table of Contents | |||
| 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 4 | 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 4 | |||
| 2. Conventions and Terminology . . . . . . . . . . . . . . . . . 6 | 2. Conventions and Terminology . . . . . . . . . . . . . . . . . 6 | |||
| 3. How to use this Document . . . . . . . . . . . . . . . . . . 8 | 3. How to use this Document . . . . . . . . . . . . . . . . . . 8 | |||
| 4. Background . . . . . . . . . . . . . . . . . . . . . . . . . 9 | 4. Background . . . . . . . . . . . . . . . . . . . . . . . . . 9 | |||
| 4.1. IoT Firmware Update Constraints . . . . . . . . . . . . . 9 | 4.1. IoT Firmware Update Constraints . . . . . . . . . . . . . 9 | |||
| 4.2. SUIT Workflow Model . . . . . . . . . . . . . . . . . . . 10 | 4.2. SUIT Workflow Model . . . . . . . . . . . . . . . . . . . 10 | |||
| 5. Metadata Structure Overview . . . . . . . . . . . . . . . . . 11 | 5. Metadata Structure Overview . . . . . . . . . . . . . . . . . 11 | |||
| 5.1. Envelope . . . . . . . . . . . . . . . . . . . . . . . . 12 | 5.1. Envelope . . . . . . . . . . . . . . . . . . . . . . . . 12 | |||
| 5.2. Delegation Chains . . . . . . . . . . . . . . . . . . . . 12 | 5.2. Delegation Chains . . . . . . . . . . . . . . . . . . . . 13 | |||
| 5.3. Authentication Block . . . . . . . . . . . . . . . . . . 13 | 5.3. Authentication Block . . . . . . . . . . . . . . . . . . 13 | |||
| 5.4. Manifest . . . . . . . . . . . . . . . . . . . . . . . . 13 | 5.4. Manifest . . . . . . . . . . . . . . . . . . . . . . . . 13 | |||
| 5.4.1. Critical Metadata . . . . . . . . . . . . . . . . . . 13 | 5.4.1. Critical Metadata . . . . . . . . . . . . . . . . . . 14 | |||
| 5.4.2. Common . . . . . . . . . . . . . . . . . . . . . . . 13 | 5.4.2. Common . . . . . . . . . . . . . . . . . . . . . . . 14 | |||
| 5.4.3. Command Sequences . . . . . . . . . . . . . . . . . . 14 | 5.4.3. Command Sequences . . . . . . . . . . . . . . . . . . 14 | |||
| 5.4.4. Integrity Check Values . . . . . . . . . . . . . . . 14 | 5.4.4. Integrity Check Values . . . . . . . . . . . . . . . 15 | |||
| 5.4.5. Human-Readable Text . . . . . . . . . . . . . . . . . 14 | 5.4.5. Human-Readable Text . . . . . . . . . . . . . . . . . 15 | |||
| 5.5. Severable Elements . . . . . . . . . . . . . . . . . . . 15 | 5.5. Severable Elements . . . . . . . . . . . . . . . . . . . 15 | |||
| 5.6. Integrated Dependencies and Payloads . . . . . . . . . . 15 | 5.6. Integrated Dependencies and Payloads . . . . . . . . . . 16 | |||
| 6. Interpreter Behavior . . . . . . . . . . . . . . . . . . . . 15 | 6. Manifest Processor Behavior . . . . . . . . . . . . . . . . . 16 | |||
| 6.1. Interpreter Setup . . . . . . . . . . . . . . . . . . . . 16 | 6.1. Manifest Processor Setup . . . . . . . . . . . . . . . . 16 | |||
| 6.2. Required Checks . . . . . . . . . . . . . . . . . . . . . 17 | 6.2. Required Checks . . . . . . . . . . . . . . . . . . . . . 17 | |||
| 6.2.1. Minimizing Signature Verifications . . . . . . . . . 18 | 6.2.1. Minimizing Signature Verifications . . . . . . . . . 19 | |||
| 6.3. Interpreter Fundamental Properties . . . . . . . . . . . 19 | 6.3. Interpreter Fundamental Properties . . . . . . . . . . . 19 | |||
| 6.4. Abstract Machine Description . . . . . . . . . . . . . . 19 | 6.4. Abstract Machine Description . . . . . . . . . . . . . . 20 | |||
| 6.5. Special Cases of Component Index and Dependency Index . . 21 | 6.5. Special Cases of Component Index and Dependency Index . . 22 | |||
| 6.6. Serialized Processing Interpreter . . . . . . . . . . . . 22 | 6.6. Serialized Processing Interpreter . . . . . . . . . . . . 24 | |||
| 6.7. Parallel Processing Interpreter . . . . . . . . . . . . . 22 | 6.7. Parallel Processing Interpreter . . . . . . . . . . . . . 24 | |||
| 6.8. Processing Dependencies . . . . . . . . . . . . . . . . . 23 | 6.8. Processing Dependencies . . . . . . . . . . . . . . . . . 25 | |||
| 6.9. Multiple Manifest Processors . . . . . . . . . . . . . . 23 | 6.9. Multiple Manifest Processors . . . . . . . . . . . . . . 25 | |||
| 7. Creating Manifests . . . . . . . . . . . . . . . . . . . . . 24 | 7. Creating Manifests . . . . . . . . . . . . . . . . . . . . . 27 | |||
| 7.1. Compatibility Check Template . . . . . . . . . . . . . . 25 | 7.1. Compatibility Check Template . . . . . . . . . . . . . . 27 | |||
| 7.2. Secure Boot Template . . . . . . . . . . . . . . . . . . 25 | 7.2. Trusted Invocation Template . . . . . . . . . . . . . . . 28 | |||
| 7.3. Firmware Download Template . . . . . . . . . . . . . . . 26 | 7.3. Component Download Template . . . . . . . . . . . . . . . 28 | |||
| 7.4. Install Template . . . . . . . . . . . . . . . . . . . . 26 | 7.4. Install Template . . . . . . . . . . . . . . . . . . . . 29 | |||
| 7.5. Integrated Payload Template . . . . . . . . . . . . . . . 27 | 7.5. Install and Transform Template . . . . . . . . . . . . . 29 | |||
| 7.6. Load from Nonvolatile Storage Template . . . . . . . . . 27 | 7.6. Integrated Payload Template . . . . . . . . . . . . . . . 30 | |||
| 7.7. Load & Decompress from Nonvolatile Storage Template . . . 27 | 7.7. Load from Nonvolatile Storage Template . . . . . . . . . 31 | |||
| 7.8. Dependency Template . . . . . . . . . . . . . . . . . . . 28 | 7.8. Load & Decompress from Nonvolatile Storage Template . . . 31 | |||
| 7.8.1. Composite Manifests . . . . . . . . . . . . . . . . . 28 | 7.9. Dependency Template . . . . . . . . . . . . . . . . . . . 31 | |||
| 7.9. Encrypted Manifest Template . . . . . . . . . . . . . . . 29 | 7.9.1. Composite Manifests . . . . . . . . . . . . . . . . . 32 | |||
| 7.10. A/B Image Template . . . . . . . . . . . . . . . . . . . 29 | 7.10. Encrypted Manifest Template . . . . . . . . . . . . . . . 32 | |||
| 8. Metadata Structure . . . . . . . . . . . . . . . . . . . . . 30 | 7.11. A/B Image Template . . . . . . . . . . . . . . . . . . . 33 | |||
| 8.1. Encoding Considerations . . . . . . . . . . . . . . . . . 31 | 8. Metadata Structure . . . . . . . . . . . . . . . . . . . . . 35 | |||
| 8.2. Envelope . . . . . . . . . . . . . . . . . . . . . . . . 31 | 8.1. Encoding Considerations . . . . . . . . . . . . . . . . . 35 | |||
| 8.3. Delegation Chains . . . . . . . . . . . . . . . . . . . . 31 | 8.2. Envelope . . . . . . . . . . . . . . . . . . . . . . . . 35 | |||
| 8.4. Authenticated Manifests . . . . . . . . . . . . . . . . . 32 | 8.3. Delegation Chains . . . . . . . . . . . . . . . . . . . . 35 | |||
| 8.5. Encrypted Manifests . . . . . . . . . . . . . . . . . . . 32 | 8.4. Authenticated Manifests . . . . . . . . . . . . . . . . . 36 | |||
| 8.6. Manifest . . . . . . . . . . . . . . . . . . . . . . . . 32 | 8.5. Encrypted Manifests . . . . . . . . . . . . . . . . . . . 36 | |||
| 8.6.1. suit-manifest-version . . . . . . . . . . . . . . . . 33 | 8.6. Manifest . . . . . . . . . . . . . . . . . . . . . . . . 36 | |||
| 8.6.2. suit-manifest-sequence-number . . . . . . . . . . . . 33 | 8.6.1. suit-manifest-version . . . . . . . . . . . . . . . . 37 | |||
| 8.6.3. suit-reference-uri . . . . . . . . . . . . . . . . . 33 | 8.6.2. suit-manifest-sequence-number . . . . . . . . . . . . 37 | |||
| 8.6.4. suit-text . . . . . . . . . . . . . . . . . . . . . . 34 | 8.6.3. suit-reference-uri . . . . . . . . . . . . . . . . . 38 | |||
| 8.7. text-version-required . . . . . . . . . . . . . . . . . . 35 | 8.6.4. suit-text . . . . . . . . . . . . . . . . . . . . . . 38 | |||
| 8.7.1. suit-coswid . . . . . . . . . . . . . . . . . . . . . 35 | 8.7. text-version-required . . . . . . . . . . . . . . . . . . 40 | |||
| 8.7.2. suit-common . . . . . . . . . . . . . . . . . . . . . 36 | 8.7.1. suit-coswid . . . . . . . . . . . . . . . . . . . . . 40 | |||
| 8.7.3. SUIT_Command_Sequence . . . . . . . . . . . . . . . . 37 | 8.7.2. suit-common . . . . . . . . . . . . . . . . . . . . . 40 | |||
| 8.7.4. Reporting Policy . . . . . . . . . . . . . . . . . . 40 | 8.7.3. SUIT_Command_Sequence . . . . . . . . . . . . . . . . 42 | |||
| 8.7.5. SUIT_Parameters . . . . . . . . . . . . . . . . . . . 41 | 8.7.4. Reporting Policy . . . . . . . . . . . . . . . . . . 44 | |||
| 8.7.6. SUIT_Condition . . . . . . . . . . . . . . . . . . . 51 | 8.7.5. SUIT_Parameters . . . . . . . . . . . . . . . . . . . 46 | |||
| 8.7.7. SUIT_Directive . . . . . . . . . . . . . . . . . . . 55 | 8.7.6. SUIT_Condition . . . . . . . . . . . . . . . . . . . 56 | |||
| 8.7.8. Integrity Check Values . . . . . . . . . . . . . . . 62 | 8.7.7. SUIT_Directive . . . . . . . . . . . . . . . . . . . 60 | |||
| 8.8. Severable Elements . . . . . . . . . . . . . . . . . . . 62 | 8.7.8. Integrity Check Values . . . . . . . . . . . . . . . 67 | |||
| 9. Access Control Lists . . . . . . . . . . . . . . . . . . . . 63 | 8.8. Severable Elements . . . . . . . . . . . . . . . . . . . 67 | |||
| 10. SUIT Digest Container . . . . . . . . . . . . . . . . . . . . 63 | 9. Access Control Lists . . . . . . . . . . . . . . . . . . . . 68 | |||
| 11. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 63 | 10. SUIT Digest Container . . . . . . . . . . . . . . . . . . . . 68 | |||
| 11.1. SUIT Commands . . . . . . . . . . . . . . . . . . . . . 64 | 11. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 69 | |||
| 11.2. SUIT Parameters . . . . . . . . . . . . . . . . . . . . 65 | 11.1. SUIT Commands . . . . . . . . . . . . . . . . . . . . . 69 | |||
| 11.3. SUIT Text Values . . . . . . . . . . . . . . . . . . . . 67 | 11.2. SUIT Parameters . . . . . . . . . . . . . . . . . . . . 71 | |||
| 11.4. SUIT Component Text Values . . . . . . . . . . . . . . . 67 | 11.3. SUIT Text Values . . . . . . . . . . . . . . . . . . . . 73 | |||
| 11.5. SUIT Algorithm Identifiers . . . . . . . . . . . . . . . 67 | 11.4. SUIT Component Text Values . . . . . . . . . . . . . . . 73 | |||
| 11.5.1. SUIT Digest Algorithm Identifiers . . . . . . . . . 67 | 11.5. SUIT Algorithm Identifiers . . . . . . . . . . . . . . . 73 | |||
| 11.5.2. SUIT Compression Algorithm Identifiers . . . . . . . 68 | 11.5.1. SUIT Digest Algorithm Identifiers . . . . . . . . . 73 | |||
| 11.5.3. Unpack Algorithms . . . . . . . . . . . . . . . . . 68 | 11.5.2. SUIT Compression Algorithm Identifiers . . . . . . . 74 | |||
| 12. Security Considerations . . . . . . . . . . . . . . . . . . . 69 | 11.5.3. Unpack Algorithms . . . . . . . . . . . . . . . . . 74 | |||
| 13. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . 69 | 12. Security Considerations . . . . . . . . . . . . . . . . . . . 75 | |||
| 14. References . . . . . . . . . . . . . . . . . . . . . . . . . 69 | 13. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . 75 | |||
| 14.1. Normative References . . . . . . . . . . . . . . . . . . 69 | 14. References . . . . . . . . . . . . . . . . . . . . . . . . . 75 | |||
| 14.2. Informative References . . . . . . . . . . . . . . . . . 70 | 14.1. Normative References . . . . . . . . . . . . . . . . . . 75 | |||
| 14.3. URIs . . . . . . . . . . . . . . . . . . . . . . . . . . 71 | 14.2. Informative References . . . . . . . . . . . . . . . . . 76 | |||
| A. Full CDDL . . . . . . . . . . . . . . . . . . . . . . . . . . 72 | Appendix A. A. Full CDDL . . . . . . . . . . . . . . . . . . . . 78 | |||
| B. Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . 82 | Appendix B. B. Examples . . . . . . . . . . . . . . . . . . . . 87 | |||
| B.1. Example 0: Secure Boot . . . . . . . . . . . . . . . . . 83 | B.1. Example 0: Secure Boot . . . . . . . . . . . . . . . . . 88 | |||
| B.2. Example 1: Simultaneous Download and Installation of | B.2. Example 1: Simultaneous Download and Installation of | |||
| Payload . . . . . . . . . . . . . . . . . . . . . . . . . 85 | Payload . . . . . . . . . . . . . . . . . . . . . . . . . 90 | |||
| B.3. Example 2: Simultaneous Download, Installation, Secure | B.3. Example 2: Simultaneous Download, Installation, Secure | |||
| Boot, Severed Fields . . . . . . . . . . . . . . . . . . 88 | Boot, Severed Fields . . . . . . . . . . . . . . . . . . 92 | |||
| B.4. Example 3: A/B images . . . . . . . . . . . . . . . . . . 92 | B.4. Example 3: A/B images . . . . . . . . . . . . . . . . . . 96 | |||
| B.5. Example 4: Load and Decompress from External Storage . . 96 | B.5. Example 4: Load and Decompress from External Storage . . 99 | |||
| B.6. Example 5: Two Images . . . . . . . . . . . . . . . . . . 100 | B.6. Example 5: Two Images . . . . . . . . . . . . . . . . . . 102 | |||
| C. Design Rational . . . . . . . . . . . . . . . . . . . . . . . 103 | Appendix C. C. Design Rational . . . . . . . . . . . . . . . . . 105 | |||
| C.1. C.1 Design Rationale: Envelope . . . . . . . . . . . . . 104 | C.1. C.1 Design Rationale: Envelope . . . . . . . . . . . . . 106 | |||
| C.2. C.2 Byte String Wrappers . . . . . . . . . . . . . . . . 105 | C.2. C.2 Byte String Wrappers . . . . . . . . . . . . . . . . 107 | |||
| D. Implementation Conformance Matrix . . . . . . . . . . . . . . 106 | Appendix D. D. Implementation Conformance Matrix . . . . . . . . 108 | |||
| Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 109 | Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 111 | |||
| 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. Equally important is the | already various techniques available. Equally important is the | |||
| inclusion of metadata about the conveyed firmware image (in the form | inclusion of metadata about the conveyed firmware image (in the form | |||
| of a manifest) and the use of a security wrapper to provide end-to- | of a manifest) and the use of a security wrapper to provide end-to- | |||
| end security protection to detect modifications and (optionally) to | end security protection to detect modifications and (optionally) to | |||
| skipping to change at page 4, line 36 ¶ | skipping to change at page 4, line 36 ¶ | |||
| the author, who builds the firmware image, to be sure that no other | the author, who builds the firmware image, to be sure that no other | |||
| party (including potential adversaries) can install firmware updates | party (including potential adversaries) can install firmware updates | |||
| on IoT devices without adequate privileges. For confidentiality | on IoT devices without adequate privileges. For confidentiality | |||
| protected firmware images it is additionally required to encrypt the | protected firmware images it is additionally required to encrypt the | |||
| firmware image. Starting security protection at the author is a risk | firmware image. Starting security protection at the author is a risk | |||
| mitigation technique so firmware images and manifests can be stored | mitigation technique so firmware images and manifests can be stored | |||
| on untrusted repositories; it also reduces the scope of a compromise | on untrusted repositories; it also reduces the scope of a compromise | |||
| of any repository or intermediate system to be no worse than a denial | of any repository or intermediate system to be no worse than a denial | |||
| of service. | of service. | |||
| A manifest is a bundle of metadata about the firmware for an IoT | A manifest is a bundle of metadata describing one or more code or | |||
| device, where to find the firmware, the devices to which it applies, | data payloads and how to: | |||
| and cryptographic information protecting the manifest. | ||||
| - Obtain any dependencies | ||||
| - Obtain the payload(s) | ||||
| - Install them | ||||
| - Verify them | ||||
| - Load them into memory | ||||
| - Invoke them | ||||
| This specification defines the SUIT manifest format and it is | This specification defines the SUIT manifest format and it is | |||
| intended to meet several goals: | intended to meet several goals: | |||
| - Meet the requirements defined in | - Meet the requirements defined in | |||
| [I-D.ietf-suit-information-model]. | [I-D.ietf-suit-information-model]. | |||
| - Simple to parse on a constrained node | - Simple to parse on a constrained node | |||
| - Simple to process on a constrained node | - Simple to process on a constrained node | |||
| skipping to change at page 5, line 4 ¶ | skipping to change at page 5, line 15 ¶ | |||
| - Meet the requirements defined in | - Meet the requirements defined in | |||
| [I-D.ietf-suit-information-model]. | [I-D.ietf-suit-information-model]. | |||
| - Simple to parse on a constrained node | - Simple to parse on a constrained node | |||
| - Simple to process on a constrained node | - Simple to process on a constrained node | |||
| - Compact encoding | - Compact encoding | |||
| - Comprehensible by an intermediate system | - Comprehensible by an intermediate system | |||
| - Expressive enough to enable advanced use cases on advanced nodes | - Expressive enough to enable advanced use cases on advanced nodes | |||
| - Extensible | - Extensible | |||
| The SUIT manifest can be used for a variety of purposes throughout | The SUIT manifest can be used for a variety of purposes throughout | |||
| its lifecycle, such as: | its lifecycle, such as: | |||
| - the Firmware Author to reason about releasing a firmware. | - a Firmware Author to reason about releasing a firmware. | |||
| - the Network Operator to reason about compatibility of a firmware. | - a Network Operator to reason about compatibility of a firmware. | |||
| - the Device Operator to reason about the impact of a firmware. | - a Device Operator to reason about the impact of a firmware. | |||
| - the Device Operator to manage distribution of firmware to devices. | - the Device Operator to manage distribution of firmware to devices. | |||
| - the Plant Manager to reason about timing and acceptance of | - a Plant Manager to reason about timing and acceptance of firmware | |||
| firmware updates. | updates. | |||
| - the device to reason about the authority & authenticity of a | - a device to reason about the authority & authenticity of a | |||
| firmware prior to installation. | firmware prior to installation. | |||
| - the device to reason about the applicability of a firmware. | - a device to reason about the applicability of a firmware. | |||
| - the device to reason about the installation of a firmware. | - a device to reason about the installation of a firmware. | |||
| - the device to reason about the authenticity & encoding of a | - a device to reason about the authenticity & encoding of a firmware | |||
| firmware at boot. | 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. | |||
| 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 [I-D.ietf-suit-architecture] and the | firmware update architecture [I-D.ietf-suit-architecture] and the | |||
| threats, requirements, and user stories in | threats, requirements, and user stories in | |||
| [I-D.ietf-suit-information-model]. | [I-D.ietf-suit-information-model]. | |||
| The design of this specification is based on an observation that the | The design of this specification is based on an observation that the | |||
| vast majority of operations that a device can perform during an | vast majority of operations that a device can perform during an | |||
| update or secure boot are composed of a small group of operations: | update or Trusted Invocation are composed of a small group of | |||
| operations: | ||||
| - Copy some data from one place to another | - Copy some data from one place to another | |||
| - Transform some data | - Transform some data | |||
| - Digest some data and compare to an expected value | - Digest some data and compare to an expected value | |||
| - Compare some system parameters to an expected value | - Compare some system parameters to an expected value | |||
| - Run some code | - Run some code | |||
| In the SUIT manifest specification, these operations are called | In this document, these operations are called commands. Commands are | |||
| commands. Commands are classed as either conditions or directives. | classed as either conditions or directives. Conditions have no side- | |||
| Conditions have no side-effects, while directives do have side- | effects, while directives do have side-effects. Conceptually, a | |||
| effects. Conceptually, a sequence of commands is like a script but | sequence of commands is like a script but the used language is | |||
| the used language is tailored to software updates and secure boot. | tailored to software updates and Trusted Invocation. | |||
| The available commands support simple steps, such as copying a | The available commands support simple steps, such as copying a | |||
| firmware image from one place to another, checking that a firmware | firmware image from one place to another, checking that a firmware | |||
| image is correct, verifying that the specified firmware is the | image is correct, verifying that the specified firmware is the | |||
| correct firmware for the device, or unpacking a firmware. By using | correct firmware for the device, or unpacking a firmware. By using | |||
| these steps in different orders and changing the parameters they use, | these steps in different orders and changing the parameters they use, | |||
| a broad range of use cases can be supported. The SUIT manifest uses | a broad range of use cases can be supported. The SUIT manifest uses | |||
| this observation to optimize metadata for consumption by constrained | this observation to optimize metadata for consumption by constrained | |||
| devices. | devices. | |||
| While the SUIT manifest is informed by and optimized for firmware | While the SUIT manifest is informed by and optimized for firmware | |||
| update and secure boot use cases, there is nothing in the | update and Trusted Invocation use cases, there is nothing in the | |||
| [I-D.ietf-suit-information-model] that restricts its use to only | [I-D.ietf-suit-information-model] that restricts its use to only | |||
| those use cases. Other use cases include the management of trusted | those use cases. Other use cases include the management of trusted | |||
| applications in a Trusted Execution Environment (TEE), see | applications (TAs) in a Trusted Execution Environment (TEE), as | |||
| [I-D.ietf-teep-architecture]. | discussed in [I-D.ietf-teep-architecture]. | |||
| 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. | |||
| The following terminology is used throughout this document: | Additionally, the following terminology is used throughout this | |||
| document: | ||||
| - SUIT: Software Update for the Internet of Things, also the IETF | - SUIT: Software Update for the Internet of Things, also the IETF | |||
| working group for this standard. | working group for this standard. | |||
| - Payload: A piece of information to be delivered. Typically | - Payload: A piece of information to be delivered. Typically | |||
| Firmware for the purposes of SUIT. | Firmware for the purposes of SUIT. | |||
| - Resource: A piece of information that is used to construct a | - Resource: A piece of information that is used to construct a | |||
| payload. | payload. | |||
| - Manifest: A manifest is a bundle of metadata about the firmware | - Manifest: A manifest is a bundle of metadata about the firmware | |||
| for an IoT device, where to find the firmware, and the devices to | for an IoT device, where to find the firmware, and the devices to | |||
| which it applies. | which it applies. | |||
| - Envelope: A container with the manifest, an authentication wrapper | - Envelope: A container with the manifest, an authentication wrapper | |||
| with cryptographic information protecting the manifest, | with cryptographic information protecting the manifest, | |||
| authorization information, and severed fields. | authorization information, and severable elements (see: TBD). | |||
| - Update: One or more manifests that describe one or more payloads. | - Update: One or more manifests that describe one or more payloads. | |||
| - Update Authority: The owner of a cryptographic key used to sign | - Update Authority: The owner of a cryptographic key used to sign | |||
| updates, trusted by Recipients. | updates, trusted by Recipients. | |||
| - Recipient: The system, typically an IoT device, that receives and | - Recipient: The system, typically an IoT device, that receives and | |||
| processes a manifest. | processes a manifest. | |||
| - Manifest Processor: A component of the Recipient that consumes | - Manifest Processor: A component of the Recipient that consumes | |||
| skipping to change at page 7, line 33 ¶ | skipping to change at page 7, line 46 ¶ | |||
| - Component Set: A group of interdependent Components that must be | - Component Set: A group of interdependent Components that must be | |||
| updated simultaneously. | updated simultaneously. | |||
| - Command: A Condition or a Directive. | - Command: A Condition or a Directive. | |||
| - 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. | |||
| - Trusted Execution: A process by which a system ensures that only | - Trusted Invocation: 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 or launching a | |||
| Trusted Application. | ||||
| - A/B images: Dividing a Recipient's storage into two or more | - A/B images: Dividing a Recipient's storage into two or more | |||
| bootable images, at different offsets, such that the active image | bootable images, at different offsets, such that the active image | |||
| can write to the inactive image(s). | can write to the inactive image(s). | |||
| - Record: The result of a Command and any metadata about it. | - Record: The result of a Command and any metadata about it. | |||
| - Report: A list of Records. | - Report: A list of Records. | |||
| - Procedure: The process of invoking one or more sequences of | - Procedure: The process of invoking one or more sequences of | |||
| commands. | commands. | |||
| - Update Procedure: A procedure that updates a Recipient by fetching | - Update Procedure: A procedure that updates a Recipient by fetching | |||
| dependencies, software images, and installing them. | dependencies and images, and installing them. | |||
| - Boot Procedure: A procedure that boots a Recipient by verifying | - Invocation Procedure: A procedure in which a Recipient verifies | |||
| dependencies and images, loading images, and invoking one or more | dependencies and images, loading images, and invokes one or more | |||
| image. | image. | |||
| - Software: Instructions and data that allow a Recipient to perform | - Software: Instructions and data that allow a Recipient to perform | |||
| a useful function. | a useful function. | |||
| - Firmware: Instructions and data that allow a Recipient to perform | - Firmware: Software that is typically changed infrequently, stored | |||
| a useful function. Typically, changed infrequently, stored in | in nonvolatile memory, and small enough to apply to [RFC7228] | |||
| nonvolatile memory, and small enough to apply to [RFC7228] Class | Class 0-2 devices. | |||
| 0-2 devices. | ||||
| - Image: Information that a Recipient uses to perform its function, | - Image: Information that a Recipient uses to perform its function, | |||
| typically firmware/software, configuration, or resource data such | typically firmware/software, configuration, or resource data such | |||
| as text or images. Also, a Payload, once installed is an Image. | as text or images. Also, a Payload, once installed is an Image. | |||
| - Slot: One of several possible storage locations for a given | - Slot: One of several possible storage locations for a given | |||
| Component, typically used in A/B image systems | Component, typically used in A/B image systems | |||
| - Abort: The Manifest Processor immediately halts execution of the | - Abort: An event in which the Manifest Processor immediately halts | |||
| current Procedure. It creates a Record of an error condition. | execution of the current Procedure. It creates a Record of an | |||
| error condition. | ||||
| 3. How to use this Document | 3. How to use this Document | |||
| This specification covers five aspects of firmware update: | This specification covers five aspects of firmware update: | |||
| - Section 4 describes the device constraints, use cases, and design | - Section 4 describes the device constraints, use cases, and design | |||
| principles that informed the structure of the manifest. | principles that informed the structure of the manifest. | |||
| - Section 5 gives a general overview of the metadata structure to | - Section 5 gives a general overview of the metadata structure to | |||
| inform the following sections | inform the following sections | |||
| skipping to change at page 8, line 46 ¶ | skipping to change at page 9, line 12 ¶ | |||
| - Section 8 specifies the content of the Envelope and the Manifest. | - Section 8 specifies the content of the Envelope and the Manifest. | |||
| To implement an updatable device, see Section 6 and Section 8. To | To implement an updatable device, see Section 6 and Section 8. To | |||
| implement a tool that generates updates, see Section 7 and Section 8. | implement a tool that generates updates, see Section 7 and Section 8. | |||
| The IANA consideration section, see Section 11, provides instructions | The IANA consideration section, see Section 11, provides instructions | |||
| to IANA to create several registries. This section also provides the | to IANA to create several registries. This section also provides the | |||
| CBOR labels for the structures defined in this document. | CBOR labels for the structures defined in this document. | |||
| The complete CDDL description is provided in [full-cddl], examples | The complete CDDL description is provided in Appendix A, examples are | |||
| are given in [examples] and a design rational is offered in | given in Appendix B and a design rational is offered in Appendix C. | |||
| [design-rationale]. Finally, [implementation-matrix] gives a | Finally, Appendix D gives a summarize of the mandatory-to-implement | |||
| summarize of the mandatory-to-implement features of this | features of this specification. | |||
| specification. | ||||
| 4. Background | 4. Background | |||
| Distributing firmware updates to diverse devices with diverse trust | Distributing software updates to diverse devices with diverse trust | |||
| anchors in a coordinated system presents unique challenges. Devices | anchors in a coordinated system presents unique challenges. Devices | |||
| have a broad set of constraints, requiring different metadata to make | have a broad set of constraints, requiring different metadata to make | |||
| appropriate decisions. There may be many actors in production IoT | appropriate decisions. There may be many actors in production IoT | |||
| systems, each of whom has some authority. Distributing firmware in | systems, each of whom has some authority. Distributing firmware in | |||
| such a multi-party environment presents additional challenges. Each | such a multi-party environment presents additional challenges. Each | |||
| party requires a different subset of data. Some data may not be | party requires a different subset of data. Some data may not be | |||
| accessible to all parties. Multiple signatures may be required from | accessible to all parties. Multiple signatures may be required from | |||
| parties with different authorities. This topic is covered in more | parties with different authorities. This topic is covered in more | |||
| depth in [I-D.ietf-suit-architecture]. The security aspects are | depth in [I-D.ietf-suit-architecture]. The security aspects are | |||
| described in [I-D.ietf-suit-information-model]. | described in [I-D.ietf-suit-information-model]. | |||
| 4.1. IoT Firmware Update Constraints | 4.1. IoT Firmware Update Constraints | |||
| The various constraints of IoT devices and the range of use cases | The various constraints of IoT devices and the range of use cases | |||
| that need to be supported create a broad set of urequirements. For | that need to be supported create a broad set of requirements. For | |||
| example, devices with: | example, devices with: | |||
| - limited processing power and storage may require a simple | - limited processing power and storage may require a simple | |||
| representation of metadata. | representation of metadata. | |||
| - bandwidth constraints may require firmware compression or partial | - bandwidth constraints may require firmware compression or partial | |||
| update support. | update support. | |||
| - bootloader complexity constraints may require simple selection | - bootloader complexity constraints may require simple selection | |||
| between two bootable images. | between two bootable images. | |||
| skipping to change at page 9, line 44 ¶ | skipping to change at page 10, line 7 ¶ | |||
| - small internal storage may require external storage support. | - small internal storage may require external storage support. | |||
| - multiple microcontrollers may require coordinated update of all | - multiple microcontrollers may require coordinated update of all | |||
| applications. | applications. | |||
| - large storage and complex functionality may require parallel | - large storage and complex functionality may require parallel | |||
| update of many software components. | update of many software components. | |||
| - extra information may need to be conveyed in the manifest in the | - extra information may need to be conveyed in the manifest in the | |||
| earlier stages of the device lifecycle before those data items are | earlier stages of the device lifecycle before those data items are | |||
| stripped when the manifest is delivery to a constrained device. | stripped when the manifest is delivered to a constrained device. | |||
| Supporting the requirements introduced by the constraints on IoT | Supporting the requirements introduced by the constraints on IoT | |||
| devices requires the flexibility to represent a diverse set of | devices requires the flexibility to represent a diverse set of | |||
| possible metadata, but also requires that the encoding is kept | possible metadata, but also requires that the encoding is kept | |||
| simple. | simple. | |||
| 4.2. SUIT Workflow Model | 4.2. SUIT Workflow Model | |||
| There are several fundamental assumptions that inform the model of | There are several fundamental assumptions that inform the model of | |||
| Update Procedure workflow: | Update Procedure workflow: | |||
| skipping to change at page 10, line 20 ¶ | skipping to change at page 10, line 29 ¶ | |||
| - Compatibility must be checked before any other operation is | - Compatibility must be checked before any other operation is | |||
| performed. | performed. | |||
| - All dependency manifests should be present before any payload is | - All dependency manifests should be present before any payload is | |||
| fetched. | fetched. | |||
| - In some applications, payloads must be fetched and validated prior | - In some applications, payloads must be fetched and validated prior | |||
| to installation. | to installation. | |||
| There are several fundamental assumptions that inform the model of | There are several fundamental assumptions that inform the model of | |||
| the Boot Procedure workflow: | the Invocation Procedure workflow: | |||
| - Compatibility must be checked before any other operation is | - Compatibility must be checked before any other operation is | |||
| performed. | performed. | |||
| - All dependencies and payloads must be validated prior to loading. | - All dependencies and payloads must be validated prior to loading. | |||
| - All loaded images must be validated prior to execution. | - All loaded images must be validated prior to execution. | |||
| Based on these assumptions, the manifest is structured to work with a | Based on these assumptions, the manifest is structured to work with a | |||
| pull parser, where each section of the manifest is used in sequence. | pull parser, where each section of the manifest is used in sequence. | |||
| skipping to change at page 11, line 9 ¶ | skipping to change at page 11, line 18 ¶ | |||
| 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 a bootloader, then the | If verification and running is implemented in a bootloader, then the | |||
| bootloader MUST also verify the signature of the manifest and the | bootloader MUST also verify the signature of the manifest and the | |||
| applicability of the manifest in order to implement secure boot | applicability of the manifest in order to implement secure boot | |||
| workflows. The bootloader may add its own authentication, e.g. a | workflows. The bootloader may add its own authentication, e.g. a | |||
| MAC, to the manifest in order to prevent further verifications. | Message Authentication Code (MAC), to the manifest in order to | |||
| prevent further verifications. | ||||
| 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. Metadata Structure Overview | 5. Metadata Structure Overview | |||
| This section provides a high level overview of the manifest | This section provides a high level overview of the manifest | |||
| structure. The full description of the manifest structure is in | structure. The full description of the manifest structure is in | |||
| Section 8.6 | Section 8.6 | |||
| skipping to change at page 11, line 46 ¶ | skipping to change at page 12, line 8 ¶ | |||
| broken down into: | broken down into: | |||
| 1. Critical metadata, such as sequence number. | 1. Critical metadata, such as sequence number. | |||
| 2. Common metadata, including lists of dependencies and affected | 2. Common metadata, including lists of dependencies and affected | |||
| components. | components. | |||
| 3. Command sequences, directing the Recipient how to install and | 3. Command sequences, directing the Recipient how to install and | |||
| use the payload(s). | use the payload(s). | |||
| 4. Integrity check values for severable fields. | 4. Integrity check values for severable elements. | |||
| 5. Severable fields (see Section 5.5). | 5. Severable elements (see Section 5.5). | |||
| 6. Integrated dependencies (see Section 5.6). | 6. Integrated dependencies (see Section 5.6). | |||
| 7. Integrated payloads (see Section 5.6). | 7. Integrated payloads (see Section 5.6). | |||
| The diagram below illustrates the hierarchy of the Envelope. | The diagram below illustrates the hierarchy of the Envelope. | |||
| +-------------------------+ | +-------------------------+ | |||
| | Envelope | | | Envelope | | |||
| +-------------------------+ | +-------------------------+ | |||
| | Delegation Chains | | | Delegation Chains | | |||
| | Authentication Block | | | Authentication Block | | |||
| | Manifest ------------> +------------------------------+ | | Manifest --------------> +------------------------------+ | |||
| | Severable Elements | | Manifest | | | Severable Elements | | Manifest | | |||
| | Human-Readable Text | +------------------------------+ | | Human-Readable Text | +------------------------------+ | |||
| | COSWID | | Structure Version | | | COSWID | | Structure Version | | |||
| | Integrated Dependencies | | Sequence Number | | | Integrated Dependencies | | Sequence Number | | |||
| | Integrated Payloads | | Reference to Full Manifest | | | Integrated Payloads | | Reference to Full Manifest | | |||
| +-------------------------+ +------ Common Structure | | +-------------------------+ +------ Common Structure | | |||
| | +---- Commands | | | +---- Command Sequences | | |||
| +-----------------------+ | | | Digests of Envelope Elements | | +-------------------------+ | | | Digests of Envelope Elements | | |||
| | Common Structure | <--+ | +------------------------------+ | | Common Structure | <--+ | +------------------------------+ | |||
| +-----------------------+ | | +-------------------------+ | | |||
| | Dependencies | +-> +-----------------------+ | | Dependencies | +-> +-----------------------+ | |||
| | Components IDs | | Commands | | | Components IDs | | Command Sequence | | |||
| | Common Commands ---------------> +-----------------------+ | | Common Command Sequence ---------> +-----------------------+ | |||
| +-----------------------+ | List of ( pairs of ( | | +-------------------------+ | List of ( pairs of ( | | |||
| | * command code | | | * command code | | |||
| | * argument | | | * argument / | | |||
| | )) | | | reporting policy | | |||
| +-----------------------+ | | )) | | |||
| +-----------------------+ | ||||
| 5.1. Envelope | 5.1. Envelope | |||
| The SUIT Envelope is a container that encloses Delegation Chains, the | The SUIT Envelope is a container that encloses Delegation Chains, the | |||
| Authentication Block, the Manifest, any Severable Elements, and any | Authentication Block, the Manifest, any Severable Elements, and any | |||
| integrated payloads or dependencies. The Envelope is used instead of | integrated payloads or dependencies. The Envelope is used instead of | |||
| conventional cryptographic envelopes, such as COSE_Envelope because | conventional cryptographic envelopes, such as COSE_Envelope because | |||
| it allows modular processing, severing of elements, and integrated | it allows modular processing, severing of elements, and integrated | |||
| payloads in a way that would add substantial complexity with existing | payloads in a way that would add substantial complexity with existing | |||
| solutions. See Appendix C.1 for a description of the reasoning for | solutions. See Appendix C.1 for a description of the reasoning for | |||
| this. | this. | |||
| See Section 8.2 for more detail. | See Section 8.2 for more detail. | |||
| 5.2. Delegation Chains | 5.2. Delegation Chains | |||
| Delegation Chains allow a Recipient to validate intermediate Update | Delegation Chains allow a Recipient to establish a chain of trust | |||
| Authorities against long-term a Trust Anchor. These are lists of | from a Trust Anchor to the signer of a manifest by validating | |||
| CWTs, where the first in the list is signed by a Trust Anchor. | delegation claims. Each delegation claim is a [RFC8392] CBOR Web | |||
| Tokens (CWTs). The first claim in each list is signed by a Trust | ||||
| Anchor. Each subsequent claim in a list is signed by the public key | ||||
| claimed in the preceding list element. The last element in each list | ||||
| claims a public key that can be used to verify a signature in the | ||||
| Authentication Block (Section 5.3). | ||||
| See Section 8.3 for more detail. | See Section 8.3 for more detail. | |||
| 5.3. Authentication Block | 5.3. Authentication Block | |||
| The Authentication Block contains one or more COSE authentication | The Authentication Block contains a bstr-wrapped Section 10 and one | |||
| blocks. These blocks are one of: | or more [RFC8152] CBOR Object Signing and Encryption (COSE) | |||
| authentication blocks. These blocks are one of: | ||||
| - COSE_Sign_Tagged | - COSE_Sign_Tagged | |||
| - COSE_Sign1_Tagged | - COSE_Sign1_Tagged | |||
| - COSE_Mac_Tagged | - COSE_Mac_Tagged | |||
| - COSE_Mac0_Tagged | - COSE_Mac0_Tagged | |||
| The payload element in each of these COSE elements is a SUIT_Digest | Each of these objects is used in detached payload mode. The payload | |||
| Section 10. | is the bstr-wrapped SUIT_Digest. | |||
| See Section 8.4 for more detail. | See Section 8.4 for more detail. | |||
| 5.4. Manifest | 5.4. Manifest | |||
| The Manifest contains most metadata about one or more images. The | The Manifest contains most metadata about one or more images. The | |||
| Manifest is divided into Critical Metadata, Common Metadata, Command | Manifest is divided into Critical Metadata, Common Metadata, Command | |||
| Sequences, and Integrity Check Values. | Sequences, and Integrity Check Values. | |||
| See Section 8.6 for more detail. | See Section 8.6 for more detail. | |||
| 5.4.1. Critical Metadata | 5.4.1. Critical Metadata | |||
| Some metadata needs to be accessed before the manifest is processed. | Some metadata needs to be accessed before the manifest is processed. | |||
| This metadata can be used to determine which the newest manifest is | This metadata can be used to determine which manifest is newest and | |||
| and whether the structure version is supported. It also MAY provide | whether the structure version is supported. It also MAY provide a | |||
| a URI for obtaining a canonical copy of the manifest and Envelope. | URI for obtaining a canonical copy of the manifest and Envelope. | |||
| See Section 8.6.1, Section 8.6.2, Section 8.6.3 for more detail. | See Section 8.6.1, Section 8.6.2, and Section 8.6.3 for more detail. | |||
| 5.4.2. Common | 5.4.2. Common | |||
| Some metadata is used repeatedly and in more than one command | Some metadata is used repeatedly and in more than one command | |||
| sequence. In order to reduce the size of the manifest, this metadata | sequence. In order to reduce the size of the manifest, this metadata | |||
| is collected into the Common section. Common is composed of three | is collected into the Common section. Common is composed of three | |||
| parts: a list of dependencies, a list of components referenced by the | parts: a list of dependencies, a list of components referenced by the | |||
| manifest, and a command sequence to execute prior to each other | manifest, and a command sequence to execute prior to each other | |||
| command sequence. The common command sequence is typically used to | command sequence. The common command sequence is typically used to | |||
| set commonly used values and perform compatibility checks. The | set commonly used values and perform compatibility checks. The | |||
| common command sequence MUST NOT have any side-effects outside of | common command sequence MUST NOT have any side-effects outside of | |||
| setting parameter values. | setting parameter values. | |||
| See Section 8.7.2, Section 8.7.2.1 for more detail. | See Section 8.7.2, and Section 8.7.2.1 for more detail. | |||
| 5.4.3. Command Sequences | 5.4.3. Command Sequences | |||
| Command sequences provide the instructions that a Recipient requires | Command sequences provide the instructions that a Recipient requires | |||
| in order to install or use an image. These sequences tell a device | in order to install or use an image. These sequences tell a device | |||
| to set parameter values, test system parameters, copy data from one | to set parameter values, test system parameters, copy data from one | |||
| place to another, transform data, digest data, and run code. | place to another, transform data, digest data, and run code. | |||
| Command sequences are broken up into three groups: Common Command | Command sequences are broken up into three groups: Common Command | |||
| Sequence (see Section 5.4.2), update commands, and secure boot | Sequence (see Section 5.4.2), update commands, and secure boot | |||
| commands. | commands. | |||
| Update Command Sequences are: Dependency Resolution, Payload Fetch, | Update Command Sequences are: Dependency Resolution, Payload Fetch, | |||
| and Payload Installation. An Update Procedure is the complete set of | and Payload Installation. An Update Procedure is the complete set of | |||
| each Update Command Sequence, each preceded by the Common Command | each Update Command Sequence, each preceded by the Common Command | |||
| Sequence. | Sequence. | |||
| Boot Command Sequences are: System Validation, Image Loading, and | Invocation Command Sequences are: System Validation, Image Loading, | |||
| Image Invocation. A Boot Procedure is the complete set of each Boot | and Image Invocation. A Invocation Procedure is the complete set of | |||
| Command Sequence, each preceded by the Common Command Sequence. | each Invocation Command Sequence, each preceded by the Common Command | |||
| Sequence. | ||||
| Command Sequences are grouped into these sets to ensure that there is | Command Sequences are grouped into these sets to ensure that there is | |||
| common coordination between dependencies and dependents on when to | common coordination between dependencies and dependents on when to | |||
| execute each command. | execute each command. | |||
| See Section 8.7.3 for more detail. | See Section 8.7.3 for more detail. | |||
| 5.4.4. Integrity Check Values | 5.4.4. Integrity Check Values | |||
| To enable Section 5.5, there needs to be a mechanism to verify | To enable Section 5.5, there needs to be a mechanism to verify | |||
| integrity of any metadata outside the manifest. Integrity Check | integrity of any metadata outside the manifest. Integrity Check | |||
| Values are used to verify the integrity of metadata that is not | Values are used to verify the integrity of metadata that is not | |||
| contained in the manifest. This MAY include Severable Command | contained in the manifest. This MAY include Severable Command | |||
| Sequences, CoSWID, or Text data. Integrated Dependencies and | Sequences, Concise Software Identifiers (CoSWID | |||
| [I-D.ietf-sacm-coswid]), or Text data. Integrated Dependencies and | ||||
| Integrated Payloads are integrity-checked using Command Sequences, so | Integrated Payloads are integrity-checked using Command Sequences, so | |||
| they do not have Integrity Check Values present in the Manifest. | they do not have Integrity Check Values present in the Manifest. | |||
| See Section 8.7.8 for more detail. | See Section 8.7.8 for more detail. | |||
| 5.4.5. Human-Readable Text | 5.4.5. Human-Readable Text | |||
| Text is typically a Severable Element (Section 5.5). It contains all | Text is typically a Severable Element (Section 5.5). It contains all | |||
| the text that describes the update. Because text is explicitly for | the text that describes the update. Because text is explicitly for | |||
| human consumption, it is all grouped together so that it can be | human consumption, it is all grouped together so that it can be | |||
| skipping to change at page 15, line 16 ¶ | skipping to change at page 15, line 41 ¶ | |||
| Severable Elements are elements of the Envelope (Section 5.1) that | Severable Elements are elements of the Envelope (Section 5.1) that | |||
| have Integrity Check Values (Section 5.4.4) in the Manifest | have Integrity Check Values (Section 5.4.4) in the Manifest | |||
| (Section 5.4). | (Section 5.4). | |||
| Because of this organisation, these elements can be discarded or | Because of this organisation, these elements can be discarded or | |||
| "Severed" from the Envelope without changing the signature of the | "Severed" from the Envelope without changing the signature of the | |||
| Manifest. This allows savings based on the size of the Envelope in | Manifest. This allows savings based on the size of the Envelope in | |||
| several scenarios, for example: | several scenarios, for example: | |||
| - A management system Severs the Text and CoSWID sections before | - A management system severs the Text and CoSWID sections before | |||
| sending an Envelope to a constrained Recipient, which saves | sending an Envelope to a constrained Recipient, which saves | |||
| Recipient bandwidth. | Recipient bandwidth. | |||
| - A Recipient Severs the Installation section after installing the | - A Recipient severs the Installation section after installing the | |||
| Update, which saves storage space. | Update, which saves storage space. | |||
| See Section 8.8 for more detail. | See Section 8.8 for more detail. | |||
| 5.6. Integrated Dependencies and Payloads | 5.6. Integrated Dependencies and Payloads | |||
| In some cases, it is beneficial to include a dependency or a payload | In some cases, it is beneficial to include a dependency or a payload | |||
| in the Envelope of a manifest. For example: | in the Envelope of a manifest. For example: | |||
| - When an update is delivered via a comparatively unconstrained | - When an update is delivered via a comparatively unconstrained | |||
| skipping to change at page 15, line 42 ¶ | skipping to change at page 16, line 22 ¶ | |||
| beneficial to bundle updates into single files. | beneficial to bundle updates into single files. | |||
| - When a manifest requires encryption, it must be referenced as a | - When a manifest requires encryption, it must be referenced as a | |||
| dependency, so a trivial manifest may be used to enclose the | dependency, so a trivial manifest may be used to enclose the | |||
| encrypted manifest. The encrypted manifest may be contained in | encrypted manifest. The encrypted manifest may be contained in | |||
| the dependent manifest's envelope. | the dependent manifest's envelope. | |||
| - When a manifest transports a small payload, such as an encrypted | - When a manifest transports a small payload, such as an encrypted | |||
| key, that payload may be placed in the manifest's envelope. | key, that payload may be placed in the manifest's envelope. | |||
| See Section 7.8.1, Section 8.5 for more detail. | See Section 7.9.1, Section 8.5 for more detail. | |||
| 6. Interpreter Behavior | 6. Manifest Processor Behavior | |||
| This section describes the behavior of the manifest interpreter and | This section describes the behavior of the manifest processor and | |||
| focuses primarily on interpreting commands in the manifest. However, | focuses primarily on interpreting commands in the manifest. However, | |||
| there are several other important behaviors of the interpreter: | there are several other important behaviors of the manifest | |||
| encoding version detection, rollback protection, and authenticity | processor: encoding version detection, rollback protection, and | |||
| verification are chief among these. | authenticity verification are chief among these. | |||
| 6.1. Interpreter Setup | 6.1. Manifest Processor Setup | |||
| Prior to executing any command sequence, the interpreter or its host | Prior to executing any command sequence, the manifest processor or | |||
| application MUST inspect the manifest version field and fail when it | its host application MUST inspect the manifest version field and fail | |||
| encounters an unsupported encoding version. Next, the interpreter or | when it encounters an unsupported encoding version. Next, the | |||
| its host application MUST extract the manifest sequence number and | manifest processor or its host application MUST extract the manifest | |||
| perform a rollback check using this sequence number. The exact logic | sequence number and perform a rollback check using this sequence | |||
| of rollback protection may vary by application, but it has the | number. The exact logic of rollback protection may vary by | |||
| following properties: | application, but it has the following properties: | |||
| - Whenever the interpreter can choose between several manifests, it | - Whenever the manifest processor can choose between several | |||
| MUST select the latest valid, authentic manifest. | manifests, it MUST select the latest valid, authentic manifest. | |||
| - If the latest valid, authentic manifest fails, it MAY select the | - If the latest valid, authentic manifest fails, it MAY select the | |||
| next latest valid, authentic manifest. | next latest valid, authentic manifest, according to application- | |||
| specific policy. | ||||
| Here, valid means that a manifest has a supported encoding version | Here, valid means that a manifest has a supported encoding version | |||
| and it has not been excluded for other reasons. Reasons for | and it has not been excluded for other reasons. Reasons for | |||
| excluding typically involve first executing the manifest and may | excluding typically involve first executing the manifest and may | |||
| include: | include: | |||
| - Test failed (e.g. Vendor ID/Class ID). | - Test failed (e.g. Vendor ID/Class ID). | |||
| - Unsupported command encountered. | - Unsupported command encountered. | |||
| - Unsupported parameter encountered. | - Unsupported parameter encountered. | |||
| - Unsupported component ID encountered. | - Unsupported Component Identifier encountered. | |||
| - Payload not available. | - Payload not available. | |||
| - Dependency not available. | - Dependency not available. | |||
| - Application crashed when executed. | - Application crashed when executed. | |||
| - Watchdog timeout occurred. | - Watchdog timeout occurred. | |||
| - Dependency or Payload verification failed. | - Dependency or Payload verification failed. | |||
| - Missing component from a set. | - Missing component from a set. | |||
| - Required parameter not supplied. | - Required parameter not supplied. | |||
| These failure reasons MAY be combined with retry mechanisms prior to | These failure reasons MAY be combined with retry mechanisms prior to | |||
| marking a manifest as invalid. | marking a manifest as invalid. | |||
| Following these initial tests, the interpreter clears all parameter | Selecting an older manifest in the event of failure of the latest | |||
| storage. This ensures that the interpreter begins without any leaked | valid manifest is a robustness mechanism that is necessary for | |||
| data. | supporting the requirements in [I-D.ietf-suit-architecture], section | |||
| 3.5. It may not be appropriate for all applications. In particular | ||||
| Trusted Execution Environments MAY require a failure to invoke a new | ||||
| installation, rather than a rollback approach. See | ||||
| [I-D.ietf-suit-information-model], Section 4.2.1 for more discussion | ||||
| on the security considerations that apply to rollback. | ||||
| Following these initial tests, the manifest processor clears all | ||||
| parameter storage. This ensures that the manifest processor begins | ||||
| without any leaked data. | ||||
| 6.2. Required Checks | 6.2. Required Checks | |||
| The RECOMMENDED process is to verify the signature of the manifest | The RECOMMENDED process is to verify the signature of the manifest | |||
| prior to parsing/executing any section of the manifest. This guards | prior to parsing/executing any section of the manifest. This guards | |||
| the parser against arbitrary input by unauthenticated third parties, | the parser against arbitrary input by unauthenticated third parties, | |||
| but it costs extra energy when a Recipient receives an incompatible | but it costs extra energy when a Recipient receives an incompatible | |||
| manifest. | manifest. | |||
| When validating authenticity of manifests, the interpreter MAY use an | When validating authenticity of manifests, the manifest processor MAY | |||
| ACL (see Section 9) to determine the extent of the rights conferred | use an ACL (see Section 9) to determine the extent of the rights | |||
| by that authenticity. Where a device supports only one level of | conferred by that authenticity. Where a device supports only one | |||
| access, it MAY choose to skip signature verification of dependencies, | level of access, it MAY choose to skip signature verification of | |||
| since they are referenced by digest. Where a device supports more | dependencies, since they are referenced by digest. Where a device | |||
| than one trusted party, it MAY choose to defer the verification of | supports more than one trusted party, it MAY choose to defer the | |||
| signatures of dependencies until the list of affected components is | verification of signatures of dependencies until the list of affected | |||
| known so that it can skip redundant signature verifications. For | components is known so that it can skip redundant signature | |||
| example, a dependency signed by the same author as the dependent does | verifications. For example, a dependency signed by the same author | |||
| not require a signature verification. Similarly, if the signer of | as the dependent does not require a signature verification. | |||
| the dependent has full rights to the device, according to the ACL, | Similarly, if the signer of the dependent has full rights to the | |||
| then no signature verification is necessary on the dependency. | device, according to the ACL, then no signature verification is | |||
| necessary on the dependency. | ||||
| Once a valid, authentic manifest has been selected, the interpreter | Once a valid, authentic manifest has been selected, the manifest | |||
| MUST examine the component list and verify that its maximum number of | processor MUST examine the component list and verify that its maximum | |||
| components is not exceeded and that each listed component ID is | number of components is not exceeded and that each listed component | |||
| supported. | is supported. | |||
| For each listed component, the interpreter MUST provide storage for | For each listed component, the manifest processor MUST provide | |||
| the supported parameters. If the interpreter does not have | storage for the supported parameters. If the manifest processor does | |||
| sufficient temporary storage to process the parameters for all | not have sufficient temporary storage to process the parameters for | |||
| components, it MAY process components serially for each command | all components, it MAY process components serially for each command | |||
| sequence. See Section 6.6 for more details. | sequence. See Section 6.6 for more details. | |||
| The interpreter SHOULD check that the common section contains at | The manifest processor SHOULD check that the common sequence contains | |||
| least one vendor ID check and at least one class ID check. | at least Check Vendor Identifier command and at least one Check Class | |||
| Identifier command. | ||||
| If the manifest contains more than one component, each command | Because the common sequence contains Check Vendor Identifier and | |||
| sequence MUST begin with a Set Current Component command. | Check Class Identifier command(s), no custom commands are permitted | |||
| in the common sequence. This ensures that any custom commands are | ||||
| only executed by devices that understand them. | ||||
| If a dependency is specified, then the interpreter MUST perform the | If the manifest contains more than one component and/or dependency, | |||
| following checks: | each command sequence MUST begin with a Set Component Index or Set | |||
| Dependency Index command. | ||||
| If a dependency is specified, then the manifest processor MUST | ||||
| perform the following checks: | ||||
| 1. At the beginning of each section in the dependent: all previous | 1. At the beginning of each section in the dependent: all previous | |||
| sections of each dependency have been executed. | sections of each dependency have been executed. | |||
| 2. At the end of each section in the dependent: The corresponding | 2. At the end of each section in the dependent: The corresponding | |||
| section in each dependency has been executed. | section in each dependency has been executed. | |||
| If the interpreter does not support dependencies and a manifest | If the interpreter does not support dependencies and a manifest | |||
| specifies a dependency, then the interpreter MUST reject the | specifies a dependency, then the interpreter MUST reject the | |||
| manifest. | manifest. | |||
| If a Recipient supports groups of interdependent components (a | If a Recipient supports groups of interdependent components (a | |||
| Component Set), then it SHOULD require that all Components in the | Component Set), then it SHOULD verify that all Components in the | |||
| Component Set are specified by one manifest and its dependencies. | Component Set are specified by one update, where an update is | |||
| This manifest is called the Root Manifest. | composed of all the TODO: Wording | |||
| manifest and its dependencies. This manifest is called the Root | ||||
| Manifest. | ||||
| 6.2.1. Minimizing Signature Verifications | 6.2.1. Minimizing Signature Verifications | |||
| Signature verification can be energy and time expensive on a | Signature verification can be energy and time expensive on a | |||
| constrained device. MAC verification is typically unaffected by | constrained device. MAC verification is typically unaffected by | |||
| these concerns. A Recipient MAY choose to parse and execute only the | these concerns. A Recipient MAY choose to parse and execute only the | |||
| SUIT_Common section of the manifest prior to signature verification, | SUIT_Common section of the manifest prior to signature verification, | |||
| if all of the below apply: | if all of the below apply: | |||
| - The Authentication Block contains a COSE_Sign_Tagged or | - The Authentication Block contains a COSE_Sign_Tagged or | |||
| COSE_Sign1_Tagged | COSE_Sign1_Tagged | |||
| - The Recipient can receive many incompatible or inapplicable | - The Recipient receives manifests over an unauthenticated channel, | |||
| manifests, and | exposing it to more inauthentic or incompatible manifests, and | |||
| - The Recipient has a power budget that makes signature verification | - The Recipient has a power budget that makes signature verification | |||
| undesirable | undesirable | |||
| The guidelines in Creating Manifests (Section 7) require that the | The guidelines in Creating Manifests (Section 7) require that the | |||
| common section contains the applicability checks, so this section is | common section contains the applicability checks, so this section is | |||
| sufficient for applicability verification. The parser MUST restrict | sufficient for applicability verification. The parser MUST restrict | |||
| acceptable commands to: Conditions, Override Parameters, Set | acceptable commands to conditions and the following directives: | |||
| Parameters, Try-Each, and Run Sequence ONLY. The manifest parser | Override Parameters, Set Parameters, Try Each, and Run Sequence ONLY. | |||
| MUST NOT execute any command with side-effects outside the parser | The manifest parser MUST NOT execute any command with side-effects | |||
| (for example, Run, Copy, Swap, or Fetch commands) prior to | outside the parser (for example, Run, Copy, Swap, or Fetch commands) | |||
| authentication and any such command MUST Abort. The Common Sequence | prior to authentication and any such command MUST Abort. The Common | |||
| MUST be executed again in its entirety after authenticity validation. | Sequence MUST be executed again in its entirety after authenticity | |||
| validation. | ||||
| When executing Common prior to authenticity validation, the Manifest | When executing Common prior to authenticity validation, the Manifest | |||
| Processor MUST evaluate the integrity of the manifest using the | Processor MUST evaluate the integrity of the manifest using the | |||
| SUIT_Digest present in the authentication block. | SUIT_Digest present in the authentication block. | |||
| Alternatively, a Recipient MAY rely on network infrastructure to | Alternatively, a Recipient MAY rely on network infrastructure to | |||
| filter inapplicable manifests. | filter inapplicable manifests. | |||
| 6.3. Interpreter Fundamental Properties | 6.3. Interpreter Fundamental Properties | |||
| The interpreter has a small set of design goals: | The interpreter has a small set of design goals: | |||
| 1. Executing an update MUST either result in an error, or a | 1. Executing an update MUST either result in an error, or a | |||
| verifiably correct system state. | verifiably correct system state. | |||
| 2. Executing a secure boot MUST either result in an error, or a | 2. Executing a Trusted Invocation MUST either result in an error, or | |||
| booted system. | an invoked image. | |||
| 3. Executing the same manifest on multiple Recipients MUST result in | 3. Executing the same manifest on multiple Recipients MUST result in | |||
| the same system state. | the same system state. | |||
| NOTE: when using A/B images, the manifest functions as two (or more) | 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 | logical manifests, each of which applies to a system in a particular | |||
| starting state. With that provision, design goal 3 holds. | starting state. With that provision, design goal 3 holds. | |||
| 6.4. Abstract Machine Description | 6.4. Abstract Machine Description | |||
| The heart of the manifest is the list of commands, which are | The heart of the manifest is the list of commands, which are | |||
| processed by an interpreter. This interpreter can be modeled as a | processed by a Manifest Processor-a form of interpreter. This | |||
| simple abstract machine. This machine consists of several data | Manifest Processor can be modeled as a simple abstract machine. This | |||
| storage locations that are modified by commands. | machine consists of several data storage locations that are modified | |||
| by commands. | ||||
| There are two types of commands, namely those that modify state | There are two types of commands, namely those that modify state | |||
| (directives) and those that perform tests (conditions). Parameters | (directives) and those that perform tests (conditions). Parameters | |||
| are used as the inputs to commands. Some directives offer control | are used as the inputs to commands. Some directives offer control | |||
| flow operations. Directives target a specific component or | flow operations. Directives target a specific component or | |||
| dependency. A dependency is another SUIT_Envelope that describes | dependency. A dependency is another SUIT_Envelope that describes | |||
| additional components. Dependencies are identified by digest, but | additional components. Dependencies are identified by digest, but | |||
| referenced in commands by Dependency Index, the index into the array | referenced in commands by Dependency Index, the index into the array | |||
| of Dependencies. A component is a unit of code or data that can be | of Dependencies. A component is a unit of code or data that can be | |||
| targeted by an update. Components are identified by Component | targeted by an update. Components are identified by Component | |||
| Identifiers, i.e. arrays of binary strings, but referenced in | Identifiers, but referenced in commands by Component Index; Component | |||
| commands by Component Index, the index into the array of Component | Identifiers are arrays of binary strings and a Component Index is an | |||
| Identifiers. | index into the array of Component Identifiers. | |||
| Conditions MUST NOT have any side-effects other than informing the | Conditions MUST NOT have any side-effects other than informing the | |||
| interpreter of success or failure. The Interpreter does not Abort if | interpreter of success or failure. The Interpreter does not Abort if | |||
| the Soft Failure flag is set when a Condition reports failure. | the Soft Failure flag (Section 8.7.5.23) is set when a Condition | |||
| reports failure. | ||||
| Directives MAY have side-effects in the parameter table, the | Directives MAY have side-effects in the parameter table, the | |||
| interpreter state, or the current component. The Interpreter MUST | interpreter state, or the current component. The Interpreter MUST | |||
| Abort if a Directive reports failure regardless of the Soft Failure | Abort if a Directive reports failure regardless of the Soft Failure | |||
| flag. | flag. | |||
| To simplify the logic describing the command semantics, the object | ||||
| "current" is used. It represents the component identified by the | ||||
| Component Index or the dependency identified by the Dependency Index: | ||||
| current := components\[component-index\] | ||||
| if component-index is not false | ||||
| else dependencies\[dependency-index\] | ||||
| As a result, Set Component Index is described as current := | ||||
| components[arg]. The actual operation performed for Set Component | ||||
| Index is described by the following pseudocode, however, because of | ||||
| the definition of current (above), these are semantically equivalent. | ||||
| component-index := arg | ||||
| dependency-index := false | ||||
| Similarly, Set Dependency Index is semantically equivalent to current | ||||
| := dependencies[arg] | ||||
| The following table describes the behavior of each command. "params" | The following table describes the behavior of each command. "params" | |||
| represents the parameters for the current component or dependency. | represents the parameters for the current component or dependency. | |||
| Most commands operate on either a component or a dependency. Setting | Most commands operate on either a component or a dependency. Setting | |||
| the Component Index clears the Dependency Index. Setting the | the Component Index clears the Dependency Index. Setting the | |||
| Dependency Index clears the Component Index. | Dependency Index clears the Component Index. | |||
| +-------------------+-----------------------------------------------+ | +-------------------+-----------------------------------------------+ | |||
| | Command Name | Semantic of the Operation | | | Command Name | Semantic of the Operation | | |||
| +-------------------+-----------------------------------------------+ | +-------------------+-----------------------------------------------+ | |||
| | Check Vendor | assert(binary-match(current, | | | Check Vendor | assert(binary-match(current, | | |||
| | Identifier | current.params[vendor-id])) | | | Identifier | current.params[vendor-id])) | | |||
| | | | | | | | | |||
| | Check Class | assert(binary-match(current, | | | Check Class | assert(binary-match(current, | | |||
| | Identifier | current.params[class-id])) | | | Identifier | current.params[class-id])) | | |||
| | | | | | | | | |||
| | Verify Image | assert(binary-match(digest(current), | | | Verify Image | assert(binary-match(digest(current), | | |||
| | | current.params[digest])) | | | | current.params[digest])) | | |||
| | | | | | | | | |||
| | Set Component | current := components[arg] | | | Set Component | current := components[arg] | | |||
| | Index | | | | Index | | | |||
| | | | | | | | | |||
| | Override | current.params[k] := v for k,v in arg | | | Override | current.params[k] := v for-each k,v in arg | | |||
| | Parameters | | | | Parameters | | | |||
| | | | | | | | | |||
| | Set Dependency | current := dependencies[arg] | | | Set Dependency | current := dependencies[arg] | | |||
| | Index | | | | Index | | | |||
| | | | | | | | | |||
| | Set Parameters | current.params[k] := v if not k in params for | | | Set Parameters | current.params[k] := v if not k in params | | |||
| | | k,v in arg | | | | for-each k,v in arg | | |||
| | | | | | | | | |||
| | Process | exec(current[common]); exec(current[current- | | | Process | exec(current[common]); exec(current[current- | | |||
| | Dependency | segment]) | | | Dependency | segment]) | | |||
| | | | | | | | | |||
| | Run | run(current) | | | Run | run(current) | | |||
| | | | | | | | | |||
| | Fetch | store(current, fetch(current.params[uri])) | | | Fetch | store(current, fetch(current.params[uri])) | | |||
| | | | | | | | | |||
| | Use Before | assert(now() < arg) | | | Use Before | assert(now() < arg) | | |||
| | | | | | | | | |||
| skipping to change at page 21, line 12 ¶ | skipping to change at page 22, line 29 ¶ | |||
| | Check Minimum | assert(battery >= arg) | | | Check Minimum | assert(battery >= arg) | | |||
| | Battery | | | | Battery | | | |||
| | | | | | | | | |||
| | Check Update | assert(isAuthorized()) | | | Check Update | assert(isAuthorized()) | | |||
| | Authorized | | | | Authorized | | | |||
| | | | | | | | | |||
| | Check Version | assert(version_check(current, arg)) | | | Check Version | assert(version_check(current, arg)) | | |||
| | | | | | | | | |||
| | Abort | assert(0) | | | Abort | assert(0) | | |||
| | | | | | | | | |||
| | Try Each | break if exec(seq) is not error for-each seq | | | Try Each | try-each-done if exec(seq) is not error for- | | |||
| | | in arg | | | | each seq in arg | | |||
| | | | | | | | | |||
| | Copy | store(current, current.params[src-component]) | | | Copy | store(current, current.params[src-component]) | | |||
| | | | | | | | | |||
| | Swap | swap(current, current.params[src-component]) | | | Swap | swap(current, current.params[src-component]) | | |||
| | | | | | | | | |||
| | Wait For Event | until event(arg), wait | | | Wait For Event | until event(arg), wait | | |||
| | | | | | | | | |||
| | Run Sequence | exec(arg) | | | Run Sequence | exec(arg) | | |||
| | | | | | | | | |||
| | Run with | run(current, arg) | | | Run with | run(current, arg) | | |||
| | Arguments | | | | Arguments | | | |||
| +-------------------+-----------------------------------------------+ | +-------------------+-----------------------------------------------+ | |||
| 6.5. Special Cases of Component Index and Dependency Index | 6.5. Special Cases of Component Index and Dependency Index | |||
| The interpreter MUST support a special case of Component Index if | Component Index and Dependency Index can each take on one of three | |||
| more than two or more components are supported: setting Component | types: | |||
| Index to True is allowed. When a command is invoked and the | ||||
| Component Index is True, the command MUST be invoked once for each | ||||
| Component, in the order listed in the array of Component Identifiers. | ||||
| The interpreter MUST support a special case of Dependency Index when | ||||
| two or more dependencies are supported. When a command is invoked | ||||
| and the Dependency Index is True, the command MUST be invoked once | ||||
| for each Dependency, in the order listed in the array of | ||||
| Dependencies. | ||||
| This is represented by the following pseudocode. | 1. Integer | |||
| if iscomponent(current): | 2. Array of integers | |||
| if current is true: | 3. True | |||
| cmd(component) for-each component in components | ||||
| else: | Integers MUST always be supported by Set Component Index and Set | |||
| cmd(current) | Dependency Index. Arrays of integers MUST be supported by Set | |||
| Component Index and Set Dependency Index if the Recipient supports 3 | ||||
| or more components or 3 or more dependencies, respectively. True | ||||
| MUST be supported by Set Component Index and Set Dependency Index if | ||||
| the Recipient supports 2 or more components or 2 or more | ||||
| dependencies, respectively. Each of these operates on the list of | ||||
| components or list of dependencies declared in the manifest. | ||||
| Integer indices are the default case as described in the previous | ||||
| section. An array of integers represents a list of the components | ||||
| (Set Component Index) or a list of dependencies (Set Dependency | ||||
| Index) to which each subsequent command applies. The value True | ||||
| replaces the list of component indices or dependency indices with the | ||||
| full list of components or the full list of dependencies, | ||||
| respectively, as defined in the manifest. | ||||
| When a command is executed, it either 1. operates on the component or | ||||
| dependency identified by the component index or dependency index if | ||||
| that index is an integer, or 2. it operates on each component or | ||||
| dependency identified by an array of indicies, or 3. it operates on | ||||
| every component or every dependency if the index is the boolean True. | ||||
| This is described by the following pseudocode: | ||||
| if component-index is true: | ||||
| current-list = components | ||||
| else if component-index is array: | ||||
| current-list = [ components[idx] for idx in component-index ] | ||||
| else if component-index is integer: | ||||
| current-list = [ components[component-index] ] | ||||
| else if dependency-index is true: | ||||
| current-list = dependencies | ||||
| else if dependency-index is array: | ||||
| current-list = [ dependencies[idx] for idx in dependency-index ] | ||||
| else: | else: | |||
| if current is true: | current-list = [ dependencies[dependency-index] ] | |||
| cmd(dependency) for-each dependency in dependencies | for current in current-list: | |||
| else: | cmd(current) | |||
| cmd(current) | ||||
| Try Each and Run Sequence are affected in the same way as other | Try Each and Run Sequence are affected in the same way as other | |||
| commands: they are invoked once for each possible Component or | commands: they are invoked once for each possible Component or | |||
| Dependency. This means that the sequences that are arguments to Try | Dependency. This means that the sequences that are arguments to Try | |||
| Each and Run Sequence are NOT invoked with Component Index = True or | Each and Run Sequence are NOT invoked with Component Index = True or | |||
| Dependency Index = True. They are only invoked with integer indices. | Dependency Index = True, nor are they invoked with array indices. | |||
| The interpreter loops over the whole sequence, setting the Component | They are only invoked with integer indices. The interpreter loops | |||
| Index or Dependency Index to each possible index in turn. | over the whole sequence, setting the Component Index or Dependency | |||
| Index to each index in turn. | ||||
| 6.6. Serialized Processing Interpreter | 6.6. Serialized Processing Interpreter | |||
| In highly constrained devices, where storage for parameters is | In highly constrained devices, where storage for parameters is | |||
| limited, the manifest processor MAY handle one component at a time, | limited, the manifest processor MAY handle one component at a time, | |||
| traversing the manifest tree once for each listed component. In this | traversing the manifest tree once for each listed component. In this | |||
| mode, the interpreter ignores any commands executed while the | mode, the interpreter ignores any commands executed while the | |||
| component index is not the current component. This reduces the | component index is not the current component. This reduces the | |||
| overall volatile storage required to process the update so that the | overall volatile storage required to process the update so that the | |||
| only limit on number of components is the size of the manifest. | only limit on number of components is the size of the manifest. | |||
| skipping to change at page 22, line 38 ¶ | skipping to change at page 24, line 32 ¶ | |||
| When a serialized Manifest Processor encounters a component or | When a serialized Manifest Processor encounters a component or | |||
| dependency index of True, it does not ignore any commands. It | dependency index of True, it does not ignore any commands. It | |||
| applies them to the current component or dependency on each | applies them to the current component or dependency on each | |||
| iteration. | iteration. | |||
| 6.7. Parallel Processing Interpreter | 6.7. Parallel Processing Interpreter | |||
| Advanced Recipients MAY make use of the Strict Order parameter and | Advanced Recipients MAY make use of the Strict Order parameter and | |||
| enable parallel processing of some Command Sequences, or it may | enable parallel processing of some Command Sequences, or it may | |||
| reorder some Command Sequences. To perform parallel processing, once | reorder some Command Sequences. To perform parallel processing, once | |||
| the Strict Order parameter is set to False, the Recipient may fork a | the Strict Order parameter is set to False, the Recipient may issue | |||
| process for each command until the Strict Order parameter is returned | each or every command concurrently until the Strict Order parameter | |||
| to True or the Command Sequence ends. Then, it joins all forked | is returned to True or the Command Sequence ends. Then, it waits for | |||
| processes before continuing processing of commands. To perform out- | all issued commands to complete before continuing processing of | |||
| of-order processing, a similar approach is used, except the Recipient | commands. To perform out-of-order processing, a similar approach is | |||
| consumes all commands after the Strict Order parameter is set to | used, except the Recipient consumes all commands after the Strict | |||
| False, then it sorts these commands into its preferred order, invokes | Order parameter is set to False, then it sorts these commands into | |||
| them all, then continues processing. | its preferred order, invokes them all, then continues processing. | |||
| Under each of these scenarios the parallel processing must halt: | Under each of these scenarios the parallel processing MUST halt until | |||
| all issued commands have completed: | ||||
| - Set Parameters. | - Set Parameters. | |||
| - Override Parameters. | - Override Parameters. | |||
| - Set Strict Order = True. | - Set Strict Order = True. | |||
| - Set Dependency Index. | - Set Dependency Index. | |||
| - Set Component Index. | - Set Component Index. | |||
| To perform more useful parallel operations, sequences of commands may | To perform more useful parallel operations, a manifest author may | |||
| be collected in a suit-directive-run-sequence. Then, each of these | collect sequences of commands in a Run Sequence command. Then, each | |||
| sequences may be run in parallel. Each sequence defaults to Strict | of these sequences MAY be run in parallel. Each sequence defaults to | |||
| Order = True. To isolate each sequence from each other sequence, | Strict Order = True. To isolate each sequence from each other | |||
| each sequence MUST begin with a Set Component Index directive. The | sequence, each sequence MUST begin with a Set Component Index or Set | |||
| interpreter MUST track each Set Component Index directive, and cause | Dependency Index directive with the following exception: when the | |||
| an Abort if more than one Set Component Index directive targets the | index is either True or an array of indices, the Set Component Index | |||
| same Component Index. When Strict Order = False, each suit- | or Set Dependency Index is implied. Any further Set Component Index | |||
| directive-run-sequence MUST begin with a Set Component Index | directives MUST cause an Abort. This allows the interpreter that | |||
| directive. Any further Set Component Index directives MUST cause an | issues Run Sequence commands to check that the first element is | |||
| Abort. This allows the interpreter that forks suit-directive-run- | correct, then issue the sequence to a parallel execution context to | |||
| sequence processes to check that the first element is correct, then | handle the remainder of the sequence. | |||
| fork a process to handle the remainder of the sequence. | ||||
| 6.8. Processing Dependencies | 6.8. Processing Dependencies | |||
| As described in Section 6.2, each manifest must invoke each of its | As described in Section 6.2, each manifest must invoke each of its | |||
| dependencies sections from the corresponding section of the | dependencies sections from the corresponding section of the | |||
| dependent. Any changes made to parameters by the dependency persist | dependent. Any changes made to parameters by the dependency persist | |||
| in the dependent. | in the dependent. | |||
| When a Process Dependency command is encountered, the interpreter | When a Process Dependency command is encountered, the interpreter | |||
| loads the dependency identified by the Current Dependency Index. The | loads the dependency identified by the Current Dependency Index. The | |||
| interpreter first executes the common-sequence section of the | interpreter first executes the common-sequence section of the | |||
| identified dependency, then it executes the section of the dependency | identified dependency, then it executes the section of the dependency | |||
| that corresponds to the currently executing section of the dependent. | that corresponds to the currently executing section of the dependent. | |||
| If the specified dependency does not contain the current section, | ||||
| Process Dependency succeeds immediately. | ||||
| The Manifest Processor MUST also support a Dependency Index of True, | The Manifest Processor MUST also support a Dependency Index of True, | |||
| which applies to every dependency, as described in Section 6.5 | which applies to every dependency, as described in Section 6.5 | |||
| The interpreter also performs the checks described in Section 6.2 to | The interpreter also performs the checks described in Section 6.2 to | |||
| ensure that the dependent is processing the dependency correctly. | ensure that the dependent is processing the dependency correctly. | |||
| 6.9. Multiple Manifest Processors | 6.9. Multiple Manifest Processors | |||
| When a system has multiple security domains they MAY require | When a system has multiple security domains, each domain might | |||
| independent verification of authenticity or security policies. | require independent verification of authenticity or security | |||
| Security domains may be divided by separation technology such as Arm | policies. Security domains might be divided by separation technology | |||
| TrustZone, or Intel SGX. Security domains may also be divided into | such as Arm TrustZone, Intel SGX, or another TEE technology. | |||
| separate processors and memory spaces, with a communication interface | Security domains might also be divided into separate processors and | |||
| between them. | memory spaces, with a communication interface between them. | |||
| For example, an application processor may have an attached | For example, an application processor may have an attached | |||
| communications module that contains a processor. The communications | communications module that contains a processor. The communications | |||
| module may require metadata signed by a specific Trust Authority for | module might require metadata signed by a specific Trust Authority | |||
| regulatory approval. This may be a different Trust Authority than | for regulatory approval. This may be a different Trust Authority | |||
| the application processor. | than the application processor. | |||
| When there are two or more security domains, a manifest processor MAY | When there are two or more security domains (see | |||
| be required in each. The first manifest processor is the normal | [I-D.ietf-teep-architecture]), a manifest processor might be required | |||
| manifest processor as described for the Recipient in Abstract | in each. The first manifest processor is the normal manifest | |||
| Machine. The second manifest processor only executes sections when | processor as described for the Recipient in Section 6.4. The second | |||
| the first manifest processor requests it. An API interface is | manifest processor only executes sections when the first manifest | |||
| provided from the second manifest processor to the first. This | processor requests it. An API interface is provided from the second | |||
| allows the first manifest processor to request a limited set of | manifest processor to the first. This allows the first manifest | |||
| operations from the second. These operations are limited to: setting | processor to request a limited set of operations from the second. | |||
| parameters, inserting an Envelope, invoking a Manifest Command | These operations are limited to: setting parameters, inserting an | |||
| Sequence. The second manifest processor declares a prefix to the | Envelope, invoking a Manifest Command Sequence. The second manifest | |||
| first, which tells the first manifest processor when it should | processor declares a prefix to the first, which tells the first | |||
| delegate to the second. These rules are enforced by underlying | manifest processor when it should delegate to the second. These | |||
| separation of privilege infrastructure, such as TEEs, or physical | rules are enforced by underlying separation of privilege | |||
| separation. | infrastructure, such as TEEs, or physical separation. | |||
| When the first manifest processor encounters a dependency prefix, | When the first manifest processor encounters a dependency prefix, | |||
| that informs the first manifest processor that it should provide the | that informs the first manifest processor that it should provide the | |||
| second manifest processor with the corresponding dependency Envelope. | second manifest processor with the corresponding dependency Envelope. | |||
| This is done when the dependency is fetched. The second manifest | This is done when the dependency is fetched. The second manifest | |||
| processor immediately verifies any authentication information in the | processor immediately verifies any authentication information in the | |||
| dependency Envelope. When a parameter is set for any component that | dependency Envelope. When a parameter is set for any component that | |||
| matches the prefix, this parameter setting is passed to the second | matches the prefix, this parameter setting is passed to the second | |||
| manifest processor via an API. As the first manifest processor works | manifest processor via an API. As the first manifest processor works | |||
| through the Procedure (set of command sequences) it is executing, | through the Procedure (set of command sequences) it is executing, | |||
| each time it sees a Process Dependency command that is associated | each time it sees a Process Dependency command that is associated | |||
| with the prefix declared by the second manifest processor, it uses | with the prefix declared by the second manifest processor, it uses | |||
| the API to ask the second manifest processor to invoke that | the API to ask the second manifest processor to invoke that | |||
| dependency section instead. | dependency section instead. | |||
| This mechanism ensures that the two or more manifest processors do | ||||
| not need to trust each other, except in a very limited case. When | ||||
| parameter setting across security domains is used, it must be very | ||||
| carefully considered. Only parameters that do not have an effect on | ||||
| security properties should be allowed. The dependency manifest MAY | ||||
| control which parameters are allowed to be set by using the Override | ||||
| Parameters directive. The second manifest processor MAY also control | ||||
| which parameters may be set by the first manifest processor by means | ||||
| of an ACL that lists the allowed parameters. For example, a URI may | ||||
| be set by a dependent without a substantial impact on the security | ||||
| properties of the manifest. | ||||
| 7. Creating Manifests | 7. Creating Manifests | |||
| Manifests are created using tools for constructing COSE structures, | Manifests are created using tools for constructing COSE structures, | |||
| calculating cryptographic values and compiling desired system state | calculating cryptographic values and compiling desired system state | |||
| into a sequence of operations required to achieve that state. The | into a sequence of operations required to achieve that state. The | |||
| process of constructing COSE structures and the calculation of | process of constructing COSE structures and the calculation of | |||
| cryptographic values is covered in [RFC8152]. | cryptographic values is covered in [RFC8152]. | |||
| Compiling desired system state into a sequence of operations can be | Compiling desired system state into a sequence of operations can be | |||
| accomplished in many ways. Several templates are provided below to | accomplished in many ways. Several templates are provided below to | |||
| cover common use-cases. These templates can be combined to produce | cover common use-cases. These templates can be combined to produce | |||
| more complex behavior. | more complex behavior. | |||
| The Author MUST ensure that all parameters consumed by a command are | The author MUST ensure that all parameters consumed by a command are | |||
| set prior to invoking that command. Where Component Index = True or | set prior to invoking that command. Where Component Index = True or | |||
| Dependency Index = True, this means that the parameters consumed by | Dependency Index = True, this means that the parameters consumed by | |||
| each command MUST have been set for each Component or Dependency, | each command MUST have been set for each Component or Dependency, | |||
| respectively. | respectively. | |||
| NOTE: On systems that support only a single component, Set Current | This section details a set of templates for creating manifests. | |||
| Component has no effect and can be omitted. | These templates explain which parameters, commands, and orders of | |||
| commands are necessary to achieve a stated goal. | ||||
| NOTE: On systems that support only a single component and no | ||||
| dependencies, Set Component Index has no effect and can be omitted. | ||||
| NOTE: *A digest MUST always be set using Override Parameters, since | NOTE: *A digest MUST always be set using Override Parameters, since | |||
| this prevents a less-privileged dependent from replacing the digest.* | this prevents a less-privileged dependent from replacing the digest.* | |||
| 7.1. Compatibility Check Template | 7.1. Compatibility Check Template | |||
| The compatibility check ensures that Recipients only install | The goal of the compatibility check template ensure that Recipients | |||
| compatible images. In this template all information is contained in | only install compatible images. | |||
| the common block and the following sequence of operations are used: | ||||
| In this template all information is contained in the common sequence | ||||
| and the following sequence of commands is used: | ||||
| - Set Component Index directive (see Section 8.7.7.1) | - Set Component Index directive (see Section 8.7.7.1) | |||
| - Set Parameters directive (see Section 8.7.7.6) for Vendor ID and | - Set Parameters directive (see Section 8.7.7.5) for Vendor ID and | |||
| Class ID (see Section 8.7.5) | Class ID (see Section 8.7.5) | |||
| - Check Vendor Identifier condition (see Section 8.7.5.1) | - Check Vendor Identifier condition (see Section 8.7.5.2) | |||
| - Check Class Identifier condication (see Section 8.7.5.1) | - Check Class Identifier condition (see Section 8.7.5.2) | |||
| 7.2. Secure Boot Template | 7.2. Trusted Invocation Template | |||
| This template performs a secure boot operation. | The goal of the Trusted Invocation template is to ensure that only | |||
| authorized code is invoked; such as in Secure Boot or when a Trusted | ||||
| Application is loaded into a TEE. | ||||
| The following operations are placed into the common block: | The following commands are placed into the common sequence: | |||
| - Set Component Index directive (see Section 8.7.7.1) | - Set Component Index directive (see Section 8.7.7.1) | |||
| - Override Parameters directive (see Section 8.7.7.7) for Image | - Override Parameters directive (see Section 8.7.7.6) for Image | |||
| Digest and Image Size (see Section 8.7.5) | Digest and Image Size (see Section 8.7.5) | |||
| Then, the run block contains the following operations: | Then, the run sequence contains the following commands: | |||
| - Set Component Index directive (see Section 8.7.7.1) | - Set Component Index directive (see Section 8.7.7.1) | |||
| - Check Image Match condition (see Section 8.7.6.2) | - Check Image Match condition (see Section 8.7.6.2) | |||
| - Run directive (see Section 8.7.7.13) | - Run directive (see Section 8.7.7.12) | |||
| According to Section 6.4, the Run directive applies to the component | ||||
| referenced by the current Component Index. Hence, the Set Component | ||||
| Index directive has to be used to target a specific component. | ||||
| 7.3. Firmware Download Template | 7.3. Component Download Template | |||
| This template triggers the download of firmware. | The goal of the Component Download template is to acquire and store | |||
| an image. | ||||
| The following operations are placed into the common block: | The following commands are placed into the common sequence: | |||
| - Set Component Index directive (see Section 8.7.7.1) | - Set Component Index directive (see Section 8.7.7.1) | |||
| - Override Parameters directive (see Section 8.7.7.7) for Image | - Override Parameters directive (see Section 8.7.7.6) for Image | |||
| Digest and Image Size (see Section 8.7.5) | Digest and Image Size (see Section 8.7.5) | |||
| Then, the install block contains the following operations: | Then, the install sequence contains the following commands: | |||
| - Set Component Index directive (see Section 8.7.7.1) | - Set Component Index directive (see Section 8.7.7.1) | |||
| - Set Parameters directive (see Section 8.7.7.6) for URI (see | - Set Parameters directive (see Section 8.7.7.5) for URI (see | |||
| Section 8.7.5.12) | Section 8.7.5.13) | |||
| - Fetch directive (see Section 8.7.7.8) | - Fetch directive (see Section 8.7.7.7) | |||
| - Check Image Match condition (see Section 8.7.6.2) | - Check Image Match condition (see Section 8.7.6.2) | |||
| The Fetch directive needs the URI parameter to be set to determine | The Fetch directive needs the URI parameter to be set to determine | |||
| where the image is retrieved from. Additionally, the destination of | where the image is retrieved from. Additionally, the destination of | |||
| where the component shall be stored has to be configured. The URI is | where the component shall be stored has to be configured. The URI is | |||
| configured via the Set Parameters directive while the destination is | configured via the Set Parameters directive while the destination is | |||
| configured via the Set Component Index directive. | configured via the Set Component Index directive. | |||
| Optionally, the Set Parameters directive in the install sequence MAY | ||||
| also contain Encryption Info (see Section 8.7.5.10), Compression Info | ||||
| (see Section 8.7.5.11), or Unpack Info (see Section 8.7.5.12) to | ||||
| perform simultaneous download and decryption, decompression, or | ||||
| unpacking, respectively. | ||||
| 7.4. Install Template | 7.4. Install Template | |||
| This template modifies the Firmware Download template and adds an | The goal of the Install template is to use an image already stored in | |||
| additional sequence. The Firmware Download operations are moved from | an identified component to copy into a second component. | |||
| the Payload Install sequence to the Payload Fetch sequence. | ||||
| Then, the Install sequence contains the following operations: | This template is typically used with the Component Download template, | |||
| however a modification to that template is required: the Component | ||||
| Download operations are moved from the Payload Install sequence to | ||||
| the Payload Fetch sequence. | ||||
| Then, the install sequence contains the following commands: | ||||
| - Set Component Index directive (see Section 8.7.7.1) | - Set Component Index directive (see Section 8.7.7.1) | |||
| - Set Parameters directive (see Section 8.7.7.6) for Source | - Set Parameters directive (see Section 8.7.7.5) for Source | |||
| Component (see Section 8.7.5.13) | Component (see Section 8.7.5.14) | |||
| - Copy directive (see Section 8.7.7.10) | - Copy directive (see Section 8.7.7.9) | |||
| - Check Image Match condition (see Section 8.7.6.2) | - Check Image Match condition (see Section 8.7.6.2) | |||
| 7.5. Integrated Payload Template | 7.5. Install and Transform Template | |||
| This template triggers the installation of a payload included in the | The goal of the Install and Transform template is to use an image | |||
| manifest envelope. It is identical to Section 7.3 except that it | already stored in an identified component to decompress, decrypt, or | |||
| places an added restriction on the URI passed to the Set Parameters | unpack at time of installation. | |||
| directive. | ||||
| An implementor MAY choose to place a payload in the envelope of a | This template is typically used with the Component Download template, | |||
| however a modification to that template is required: all Component | ||||
| Download operations are moved from the common sequence and the | ||||
| install sequence to the fetch sequence. The Component Download | ||||
| template targets a download component identifier, while the Install | ||||
| and Transform template uses an install component identifier. In- | ||||
| place unpacking, decompression, and decryption is complex and | ||||
| vulnerable to power failure. Therefore, these identifiers SHOULD be | ||||
| different; in-place installation SHOULD NOT be used without | ||||
| establishing guarantees of robustness to power failure. | ||||
| The following commands are placed into the common sequence: | ||||
| - Set Component Index directive for install component identifier | ||||
| (see Section 8.7.7.1) | ||||
| - Override Parameters directive (see Section 8.7.7.6) for Image | ||||
| Digest and Image Size (see Section 8.7.5) | ||||
| Then, the install sequence contains the following commands: | ||||
| - Set Component Index directive for install component identifier | ||||
| (see Section 8.7.7.1) | ||||
| - Set Parameters directive (see Section 8.7.7.5) for: | ||||
| o Source Component for download component identifier (see | ||||
| Section 8.7.5.14) | ||||
| o Encryption Info (see Section 8.7.5.10) | ||||
| o Compression Info (see Section 8.7.5.11) | ||||
| o Unpack Info (see Section 8.7.5.12) | ||||
| - Copy directive (see Section 8.7.7.9) | ||||
| - Check Image Match condition (see Section 8.7.6.2) | ||||
| 7.6. Integrated Payload Template | ||||
| The goal of the Integrated Payload template is to install a payload | ||||
| that is included in the manifest envelope. It is identical to the | ||||
| Component Download template (Section 7.3) except that it places an | ||||
| added restriction on the URI passed to the Set Parameters directive. | ||||
| An implementer MAY choose to place a payload in the envelope of a | ||||
| manifest. The payload envelope key MAY be a positive or negative | manifest. The payload envelope key MAY be a positive or negative | |||
| integer. The payload envelope key MUST NOT be a value between 0 and | integer. The payload envelope key MUST NOT be a value between 0 and | |||
| 24 and it MUST NOT be used by any other envelope element in the | 24 and it MUST NOT be used by any other envelope element in the | |||
| manifest. The payload MUST be serialized in a bstr element. | manifest. The payload MUST be serialized in a bstr element. | |||
| The URI for a payload enclosed in this way MUST be expressed as a | The URI for a payload enclosed in this way MUST be expressed as a | |||
| fragment-only reference, as defined in [RFC3986], Section 4.4. The | fragment-only reference, as defined in [RFC3986], Section 4.4. The | |||
| fragment identifier is the stringified envelope key of the payload. | fragment identifier is the stringified envelope key of the payload. | |||
| For example, an envelope that contains a payload a key 42 would use a | For example, an envelope that contains a payload a key 42 would use a | |||
| URI "#42", key -73 would use a URI "#-73". | URI "#42", key -73 would use a URI "#-73". | |||
| 7.6. Load from Nonvolatile Storage Template | 7.7. Load from Nonvolatile Storage Template | |||
| This directive loads an firmware image from external storage. | The goal of the Load from Nonvolatile Storage template is to load an | |||
| image from a non-volatile component into a volatile component, for | ||||
| example loading a firmware image from external Flash into RAM. | ||||
| The following operations are placed into the load block: | The following commands are placed into the load sequence: | |||
| - Set Component Index directive (see Section 8.7.7.1) | - Set Component Index directive (see Section 8.7.7.1) | |||
| - Set Parameters directive (see Section 8.7.7.6) for Component Index | - Set Parameters directive (see Section 8.7.7.5) for Component Index | |||
| (see Section 8.7.5) | (see Section 8.7.5) | |||
| - Copy directive (see Section 8.7.7.10) | - Copy directive (see Section 8.7.7.9) | |||
| As outlined in Section 6.4, the Copy directive needs a source and a | As outlined in Section 6.4, the Copy directive needs a source and a | |||
| destination to be configured. The source is configured via Component | destination to be configured. The source is configured via Component | |||
| Index (with the Set Parameters directive) and the destination is | Index (with the Set Parameters directive) and the destination is | |||
| configured via the Set Component Index directive. | configured via the Set Component Index directive. | |||
| 7.7. Load & Decompress from Nonvolatile Storage Template | 7.8. Load & Decompress from Nonvolatile Storage Template | |||
| The following operations are placed into the load block: | The goal of the Load & Decompress from Nonvolatile Storage template | |||
| is to load an image from a non-volatile component into a volatile | ||||
| component, decompressing on-the-fly, for example loading a firmware | ||||
| image from external Flash into RAM. | ||||
| The following commands are placed into the load sequence: | ||||
| - Set Component Index directive (see Section 8.7.7.1) | - Set Component Index directive (see Section 8.7.7.1) | |||
| - Set Parameters directive (see Section 8.7.7.6) for Source | - Set Parameters directive (see Section 8.7.7.5) for Source | |||
| Component Index and Compression Info (see Section 8.7.5) | Component Index and Compression Info (see Section 8.7.5) | |||
| - Copy directive (see Section 8.7.7.10) | - Copy directive (see Section 8.7.7.9) | |||
| This template is similar to Section 7.6 but additionally performs | ||||
| This template is similar to Section 7.7 but additionally performs | ||||
| decompression. Hence, the only difference is in setting the | decompression. Hence, the only difference is in setting the | |||
| Compression Info parameter. | Compression Info parameter. | |||
| 7.8. Dependency Template | This template can be modified for decryption or unpacking by adding | |||
| Decryption Info or Unpack Info to the Set Parameters directive. | ||||
| The following operations are placed into the dependency resolution | 7.9. Dependency Template | |||
| block: | ||||
| The goal of the Dependency template is to obtain, verify, and process | ||||
| a dependency manifest as appropriate. | ||||
| The following commands are placed into the dependency resolution | ||||
| sequence: | ||||
| - Set Dependency Index directive (see Section 8.7.7.2) | - Set Dependency Index directive (see Section 8.7.7.2) | |||
| - Set Parameters directive (see Section 8.7.7.6) for URI (see | - Set Parameters directive (see Section 8.7.7.5) for URI (see | |||
| Section 8.7.5) | Section 8.7.5) | |||
| - Fetch directive (see Section 8.7.7.8) | - Fetch directive (see Section 8.7.7.7) | |||
| - Check Image Match condition (see Section 8.7.6.2) | - Check Image Match condition (see Section 8.7.6.2) | |||
| - Process Dependency directive (see Section 8.7.7.5) | - Process Dependency directive (see Section 8.7.7.4) | |||
| Then, the validate block contains the following operations: | Then, the validate sequence contains the following operations: | |||
| - Set Dependency Index directive (see Section 8.7.7.2) | - Set Dependency Index directive (see Section 8.7.7.2) | |||
| - Check Image Match condition (see Section 8.7.6.2) | - Check Image Match condition (see Section 8.7.6.2) | |||
| - Process Dependency directive (see Section 8.7.7.5) | - Process Dependency directive (see Section 8.7.7.4) | |||
| NOTE: Any changes made to parameters in a dependency persist in the | NOTE: Any changes made to parameters in a dependency persist in the | |||
| dependent. | dependent. | |||
| 7.8.1. Composite Manifests | 7.9.1. Composite Manifests | |||
| An implementor MAY choose to place a dependency's envelope in the | An implementer MAY choose to place a dependency's envelope in the | |||
| envelope of its dependent. The dependent envelope key for the | envelope of its dependent. The dependent envelope key for the | |||
| dependency envelope MUST NOT be a value between 0 and 24 and it MUST | dependency envelope MUST NOT be a value between 0 and 24 and it MUST | |||
| NOT be used by any other envelope element in the dependent manifest. | NOT be used by any other envelope element in the dependent manifest. | |||
| The URI for a dependency enclosed in this way MUST be expressed as a | The URI for a dependency enclosed in this way MUST be expressed as a | |||
| fragment-only reference, as defined in [RFC3986], Section 4.4. The | fragment-only reference, as defined in [RFC3986], Section 4.4. The | |||
| fragment identifier is the stringified envelope key of the | fragment identifier is the stringified envelope key of the | |||
| dependency. For example, an envelope that contains a dependency at | dependency. For example, an envelope that contains a dependency at | |||
| key 42 would use a URI "#42", key -73 would use a URI "#-73". | key 42 would use a URI "#42", key -73 would use a URI "#-73". | |||
| 7.9. Encrypted Manifest Template | 7.10. Encrypted Manifest Template | |||
| To use an encrypted manifest, create a plaintext dependent, and add | The goal of the Encrypted Manifest template is to fetch and decrypt a | |||
| the encrypted manifest as a dependency. The dependent can include | manifest so that it can be used as a dependency. To use an encrypted | |||
| very little information. | manifest, create a plaintext dependent, and add the encrypted | |||
| manifest as a dependency. The dependent can include very little | ||||
| information. | ||||
| The following operations are placed into the dependency resolution | The following operations are placed into the dependency resolution | |||
| block: | block: | |||
| - Set Dependency Index directive (see Section 8.7.7.2) | - Set Dependency Index directive (see Section 8.7.7.2) | |||
| - Set Parameters directive (see Section 8.7.7.6) for | - Set Parameters directive (see Section 8.7.7.5) for | |||
| o URI (see Section 8.7.5) | o URI (see Section 8.7.5) | |||
| o Encryption Info (see Section 8.7.5) | o Encryption Info (see Section 8.7.5) | |||
| - Fetch directive (see Section 8.7.7.8) | - Fetch directive (see Section 8.7.7.7) | |||
| - Check Image Match condition (see Section 8.7.6.2) | - Check Image Match condition (see Section 8.7.6.2) | |||
| - Process Dependency directive (see Section 8.7.7.5) | - Process Dependency directive (see Section 8.7.7.4) | |||
| Then, the validate block contains the following operations: | Then, the validate block contains the following operations: | |||
| - Set Dependency Index directive (see Section 8.7.7.2) | - Set Dependency Index directive (see Section 8.7.7.2) | |||
| - Check Image Match condition (see Section 8.7.6.2) | - Check Image Match condition (see Section 8.7.6.2) | |||
| - Process Dependency directive (see Section 8.7.7.5) | - Process Dependency directive (see Section 8.7.7.4) | |||
| A plaintext manifest and its encrypted dependency may also form a | A plaintext manifest and its encrypted dependency may also form a | |||
| composite manifest (Section 7.8.1). | composite manifest (Section 7.9.1). | |||
| 7.10. A/B Image Template | 7.11. A/B Image Template | |||
| The following operations are placed in the common block: | The goal of the A/B Image Template is to acquire, validate, and | |||
| invoke one of two images, based on a test. | ||||
| The following commands are placed in the common block: | ||||
| - Set Component Index directive (see Section 8.7.7.1) | - Set Component Index directive (see Section 8.7.7.1) | |||
| - Try Each | - Try Each | |||
| o First Sequence: | o First Sequence: | |||
| * Override Parameters directive (see Section 8.7.7.7, | * Override Parameters directive (see Section 8.7.7.6, | |||
| Section 8.7.5) for Offset A | Section 8.7.5) for Offset A | |||
| * Check Offset Condition (see Section 8.7.6.5) | * Check Offset Condition (see Section 8.7.6.5) | |||
| * Override Parameters directive (see Section 8.7.7.7) for | ||||
| * Override Parameters directive (see Section 8.7.7.6) for | ||||
| Image Digest A and Image Size A (see Section 8.7.5) | Image Digest A and Image Size A (see Section 8.7.5) | |||
| o Second Sequence: | o Second Sequence: | |||
| * Override Parameters directive (see Section 8.7.7.7, | * Override Parameters directive (see Section 8.7.7.6, | |||
| Section 8.7.5) for Offset B | Section 8.7.5) for Offset B | |||
| * Check Offset Condition (see Section 8.7.6.5) | * Check Offset Condition (see Section 8.7.6.5) | |||
| * Override Parameters directive (see Section 8.7.7.7) for | * Override Parameters directive (see Section 8.7.7.6) for | |||
| Image Digest B and Image Size B (see Section 8.7.5) | Image Digest B and Image Size B (see Section 8.7.5) | |||
| The following operations are placed in the fetch block or install | The following commands are placed in the fetch block or install block | |||
| block | ||||
| - Set Component Index directive (see Section 8.7.7.1) | - Set Component Index directive (see Section 8.7.7.1) | |||
| - Try Each | - Try Each | |||
| o First Sequence: | o First Sequence: | |||
| * Override Parameters directive (see Section 8.7.7.7, | * Override Parameters directive (see Section 8.7.7.6, | |||
| Section 8.7.5) for Offset A | Section 8.7.5) for Offset A | |||
| * Check Offset Condition (see Section 8.7.6.5) | * Check Offset Condition (see Section 8.7.6.5) | |||
| * Set Parameters directive (see Section 8.7.7.7) for URI A | * Set Parameters directive (see Section 8.7.7.6) for URI A | |||
| (see Section 8.7.5) | (see Section 8.7.5) | |||
| o Second Sequence: | o Second Sequence: | |||
| * Override Parameters directive (see Section 8.7.7.7, | * Override Parameters directive (see Section 8.7.7.6, | |||
| Section 8.7.5) for Offset B | Section 8.7.5) for Offset B | |||
| * Check Offset Condition (see Section 8.7.6.5) | * Check Offset Condition (see Section 8.7.6.5) | |||
| * Set Parameters directive (see Section 8.7.7.7) for URI B | * Set Parameters directive (see Section 8.7.7.6) for URI B | |||
| (see Section 8.7.5) | (see Section 8.7.5) | |||
| - Fetch | - Fetch | |||
| If Trusted Invocation (Section 7.2) is used, only the run sequence is | ||||
| added to this template, since the common sequence is populated by | ||||
| this template. | ||||
| NOTE: Any test can be used to select between images, Check Offset | ||||
| Condition is used in this template because it is a typical test for | ||||
| execute-in-place devices. | ||||
| 8. Metadata Structure | 8. Metadata Structure | |||
| The metadata for SUIT updates is composed of several primary | The metadata for SUIT updates is composed of several primary | |||
| constituent parts: the Envelope, Delegation Chains, Authentication | constituent parts: the Envelope, Delegation Chains, Authentication | |||
| Information, Manifest, and Severable Elements. | Information, Manifest, and Severable Elements. | |||
| For a diagram of the metadata structure, see Section 5. | For a diagram of the metadata structure, see Section 5. | |||
| 8.1. Encoding Considerations | 8.1. Encoding Considerations | |||
| The map indices in the envelope encoding are reset to 1 for each map | The map indices in the envelope encoding are reset to 1 for each map | |||
| within the structure. This is to keep the indices as small as | within the structure. This is to keep the indices as small as | |||
| possible. The goal is to keep the index objects to single bytes | possible. The goal is to keep the index objects to single bytes | |||
| (CBOR positive integers 1-23). | (CBOR positive integers 1-23). | |||
| Wherever enumerations are used, they are started at 1. This allows | Wherever enumerations are used, they are started at 1. This allows | |||
| detection of several common software errors that are caused by | detection of several common software errors that are caused by | |||
| uninitialised variables. Positive numbers in enumerations are | uninitialized variables. Positive numbers in enumerations are | |||
| reserved for IANA registration. Negative numbers are used to | reserved for IANA registration. Negative numbers are used to | |||
| identify application-specific implementations. | identify application-specific values, as described in Section 11. | |||
| All elements of the envelope must be wrapped in a bstr to minimize | All elements of the envelope must be wrapped in a bstr to minimize | |||
| the complexity of the code that evaluates the cryptographic integrity | the complexity of the code that evaluates the cryptographic integrity | |||
| of the element and to ensure correct serialization for integrity and | of the element and to ensure correct serialization for integrity and | |||
| authenticity checks. | authenticity checks. | |||
| 8.2. Envelope | 8.2. Envelope | |||
| The Envelope contains each of the other primary constituent parts of | The Envelope contains each of the other primary constituent parts of | |||
| the SUIT metadata. It allows for modular processing of the manifest | the SUIT metadata. It allows for modular processing of the manifest | |||
| by ordering components in the expected order of processing. | by ordering components in the expected order of processing. | |||
| The Envelope is encoded as a CBOR Map. Each element of the Envelope | The Envelope is encoded as a CBOR Map. Each element of the Envelope | |||
| is enclosed in a bstr, which allows computation of a message digest | is enclosed in a bstr, which allows computation of a message digest | |||
| against known bounds. | against known bounds. | |||
| 8.3. Delegation Chains | 8.3. Delegation Chains | |||
| The suit-delegation field MAY carry one or more CBOR Web Tokens | The suit-delegation element MAY carry one or more CBOR Web Tokens | |||
| (CWTs) [RFC8392], with [RFC8747] cnf claims. They can be used to | (CWTs) [RFC8392], with [RFC8747] cnf claims. They can be used to | |||
| perform enhanced authorization decisions. The CWTs are arranged into | perform enhanced authorization decisions. The CWTs are arranged into | |||
| a list of lists. Each list starts with CWT authorized by a Trust | a list of lists. Each list starts with a CWT authorized by a Trust | |||
| Anchor, and finishes with a key used to authenticate the Manifest | Anchor, and finishes with a key used to authenticate the Manifest | |||
| (see Section 8.4). This allows an Update Authority to delegate from | (see Section 8.4). This allows an Update Authority to delegate from | |||
| a long term Trust Anchor, down through intermediaries, to a delegate | a long term Trust Anchor, down through intermediaries, to a delegate | |||
| without any out-of-band updates Trust Anchors. | without any out-of-band provisioning of Trust Anchors or intermediary | |||
| keys. | ||||
| A Recipient MAY choose to cache intermediaries and/or delegates. If | A Recipient MAY choose to cache intermediaries and/or delegates. If | |||
| an Update Distributor knows that a targeted Recipient has cached some | an Update Distributor knows that a targeted Recipient has cached some | |||
| intermediaries or delegates, it MAY choose to strip any cached | intermediaries or delegates, it MAY choose to strip any cached | |||
| intermediaries or delegates from the Delegation Chains in order to | intermediaries or delegates from the Delegation Chains in order to | |||
| reduce bandwidth and energy. | reduce bandwidth and energy. | |||
| 8.4. Authenticated Manifests | 8.4. Authenticated Manifests | |||
| The suit-authentication-wrapper contains a list of one or more | The suit-authentication-wrapper contains a list containing a | |||
| cryptographic authentication wrappers for the Manifest. These are | Section 10 and one or more cryptographic authentication wrappers for | |||
| implemented as COSE_Mac_Tagged or COSE_Sign_Tagged blocks. Each of | the Manifest. These are implemented as COSE_Mac_Tagged or | |||
| these blocks contains a SUIT_Digest of the Manifest. This enables | COSE_Sign_Tagged blocks. Each of these blocks contains a SUIT_Digest | |||
| modular processing of the manifest. The COSE_Mac_Tagged and | of the Manifest. This enables modular processing of the manifest. | |||
| COSE_Sign_Tagged blocks are described in RFC 8152 [RFC8152]. The | The COSE_Mac_Tagged and COSE_Sign_Tagged blocks are described in RFC | |||
| suit-authentication-wrapper MUST come before any element in the | 8152 [RFC8152]. The suit-authentication-wrapper MUST come before any | |||
| SUIT_Envelope, except for the OPTIONAL suit-delegation, regardless of | element in the SUIT_Envelope, except for the OPTIONAL suit- | |||
| canonical encoding of CBOR. All validators MUST reject any | delegation, regardless of canonical encoding of CBOR. All validators | |||
| SUIT_Envelope that begins with any element other than a suit- | MUST reject any SUIT_Envelope that begins with any element other than | |||
| authentication-wrapper or suit-delegation. | a suit-authentication-wrapper or suit-delegation. | |||
| A SUIT_Envelope that has not had authentication information added | A SUIT_Envelope that has not had authentication information added | |||
| MUST still contain the suit-authentication-wrapper element, but the | MUST still contain the suit-authentication-wrapper element, but the | |||
| content MUST be an empty list. | content MUST be a list containing only the SUIT_Digest. | |||
| A signing application MUST verify the suit-manifest element against | ||||
| the SUIT_Digest prior to signing. | ||||
| 8.5. Encrypted Manifests | 8.5. Encrypted Manifests | |||
| To use an encrypted manifest, it must be a dependency of a plaintext | To use an encrypted manifest, it must be a dependency of a plaintext | |||
| manifest. This allows fine-grained control of what information is | manifest. This allows fine-grained control of what information is | |||
| accessible to intermediate systems for the purposes of management, | accessible to intermediate systems for the purposes of management, | |||
| while still preserving the confidentiality of the manifest contents. | while still preserving the confidentiality of the manifest contents. | |||
| This also means that a Recipient can process an encrypted manifest in | This also means that a Recipient can process an encrypted manifest in | |||
| the same way as an encrypted payload, allowing code reuse. | the same way as an encrypted payload, allowing code reuse. | |||
| A template for using an encrypted manifest is covered in Encrypted | A template for using an encrypted manifest is covered in Encrypted | |||
| Manifest Template (Section 7.9). | Manifest Template (Section 7.10). | |||
| 8.6. Manifest | 8.6. Manifest | |||
| The manifest contains: | The manifest contains: | |||
| - a version number (see Section 8.6.1) | - a version number (see Section 8.6.1) | |||
| - a sequence number (see Section 8.6.2) | - a sequence number (see Section 8.6.2) | |||
| - a reference URI (see Section 8.6.3) | - a reference URI (see Section 8.6.3) | |||
| skipping to change at page 32, line 44 ¶ | skipping to change at page 37, line 4 ¶ | |||
| 8.6. Manifest | 8.6. Manifest | |||
| The manifest contains: | The manifest contains: | |||
| - a version number (see Section 8.6.1) | - a version number (see Section 8.6.1) | |||
| - a sequence number (see Section 8.6.2) | - a sequence number (see Section 8.6.2) | |||
| - a reference URI (see Section 8.6.3) | - a reference URI (see Section 8.6.3) | |||
| - a common structure with information that is shared between command | - a common structure with information that is shared between command | |||
| sequences (see Section 8.7.2) | sequences (see Section 8.7.2) | |||
| - one or more lists of commands that the Recipient should perform | - one or more lists of commands that the Recipient should perform | |||
| (see Section 8.7.3) | (see Section 8.7.3) | |||
| - a reference to the full manifest (see Section 8.6.3) | - a reference to the full manifest (see Section 8.6.3) | |||
| - human-readable text describing the manifest found in the | - human-readable text describing the manifest found in the | |||
| SUIT_Envelope (see Section 8.6.4) | SUIT_Envelope (see Section 8.6.4) | |||
| - a Concise Software Identifier found in the SUIT_Envelope (see | - a Concise Software Identifier (CoSWID) found in the SUIT_Envelope | |||
| Section 8.7.1) | (see Section 8.7.1) | |||
| The CoSWID, Text section, or any Command Sequence of the Update | The CoSWID, Text section, or any Command Sequence of the Update | |||
| Procedure (Dependency Resolution, Image Fetch, Image Installation) | Procedure (Dependency Resolution, Image Fetch, Image Installation) | |||
| can be either a CBOR structure or a SUIT_Digest. In each of these | can be either a CBOR structure or a SUIT_Digest. In each of these | |||
| cases, the SUIT_Digest provides for a severable field. Severable | cases, the SUIT_Digest provides for a severable element. Severable | |||
| fields are RECOMMENDED to implement. In particular, the human- | elements are RECOMMENDED to implement. In particular, the human- | |||
| readable text SHOULD be severable, since most useful text elements | readable text SHOULD be severable, since most useful text elements | |||
| occupy more space than a SUIT_Digest, but are not needed by the | occupy more space than a SUIT_Digest, but are not needed by the | |||
| Recipient. Because SUIT_Digest is a CBOR Array and each severable | Recipient. Because SUIT_Digest is a CBOR Array and each severable | |||
| element is a CBOR bstr, it is straight-forward for a Recipient to | element is a CBOR bstr, it is straight-forward for a Recipient to | |||
| determine whether an element has been severed. The key used for a | determine whether an element has been severed. The key used for a | |||
| severable element is the same in the SUIT_Manifest and in the | severable element is the same in the SUIT_Manifest and in the | |||
| SUIT_Envelope so that a Recipient can easily identify the correct | SUIT_Envelope so that a Recipient can easily identify the correct | |||
| data in the envelope. See Section 8.7.8 for more detail. | data in the envelope. See Section 8.7.8 for more detail. | |||
| 8.6.1. suit-manifest-version | 8.6.1. suit-manifest-version | |||
| skipping to change at page 33, line 37 ¶ | skipping to change at page 37, line 45 ¶ | |||
| to encode the manifest. Version 1 is the version described in this | to encode the manifest. Version 1 is the version described in this | |||
| document. suit-manifest-version is REQUIRED to implement. | document. suit-manifest-version is REQUIRED to implement. | |||
| 8.6.2. suit-manifest-sequence-number | 8.6.2. suit-manifest-sequence-number | |||
| The suit-manifest-sequence-number is a monotonically increasing anti- | The suit-manifest-sequence-number is a monotonically increasing anti- | |||
| rollback counter. It also helps Recipients to determine which in a | rollback counter. It also helps Recipients to determine which in a | |||
| set of manifests is the "root" manifest in a given update. Each | set of manifests is the "root" manifest in a given update. Each | |||
| manifest MUST have a sequence number higher than each of its | manifest MUST have a sequence number higher than each of its | |||
| dependencies. Each Recipient MUST reject any manifest that has a | dependencies. Each Recipient MUST reject any manifest that has a | |||
| sequence number lower than its current sequence number. It MAY be | sequence number lower than its current sequence number. For | |||
| convenient to use a UTC timestamp in seconds as the sequence number. | convenience, an implementer MAY use a UTC timestamp in seconds as the | |||
| suit-manifest-sequence-number is REQUIRED to implement. | sequence number. suit-manifest-sequence-number is REQUIRED to | |||
| implement. | ||||
| 8.6.3. suit-reference-uri | 8.6.3. suit-reference-uri | |||
| suit-reference-uri is a text string that encodes a URI where a full | suit-reference-uri is a text string that encodes a URI where a full | |||
| version of this manifest can be found. This is convenient for | version of this manifest can be found. This is convenient for | |||
| allowing management systems to show the severed elements of a | allowing management systems to show the severed elements of a | |||
| manifest when this URI is reported by a Recipient after installation. | manifest when this URI is reported by a Recipient after installation. | |||
| 8.6.4. suit-text | 8.6.4. suit-text | |||
| suit-text SHOULD be a severable element. suit-text is a map of pairs. | suit-text SHOULD be a severable element. suit-text is a map | |||
| It MAY contain two different types of pair: | containing two different types of pair: | |||
| - integer => text mappings | - integer => text | |||
| - SUIT_Component_Identifier => map mappings | - SUIT_Component_Identifier => map | |||
| Each SUIT_Component_Identifier => map entry contains a map of integer | Each SUIT_Component_Identifier => map entry contains a map of integer | |||
| => text values. All SUIT_Component_Identifiers present in suit-text | => text values. All SUIT_Component_Identifiers present in suit-text | |||
| MUST also be present in suit-common (Section 8.7.2) or the suit- | MUST also be present in suit-common (Section 8.7.2) or the suit- | |||
| common of a dependency. | common of a dependency. | |||
| 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). The text section is typically severable, allowing | resource(s). The text section is typically severable, allowing | |||
| manifests to be distributed without the text, since end-nodes do not | manifests to be distributed without the text, since end-nodes do not | |||
| skipping to change at page 34, line 43 ¶ | skipping to change at page 39, line 17 ¶ | |||
| +--------------------------------+----------------------------------+ | +--------------------------------+----------------------------------+ | |||
| | suit-text-manifest-description | Free text description of the | | | suit-text-manifest-description | Free text description of the | | |||
| | | manifest | | | | manifest | | |||
| | | | | | | | | |||
| | suit-text-update-description | Free text description of the | | | suit-text-update-description | Free text description of the | | |||
| | | update | | | | update | | |||
| | | | | | | | | |||
| | suit-text-manifest-json-source | The JSON-formatted document that | | | suit-text-manifest-json-source | The JSON-formatted document that | | |||
| | | was used to create the manifest | | | | was used to create the manifest | | |||
| | | | | | | | | |||
| | suit-text-manifest-yaml-source | The yaml-formatted document that | | | suit-text-manifest-yaml-source | The YAML ([YAML])-formatted | | |||
| | | was used to create the manifest | | | | document that was used to create | | |||
| | | the manifest | | ||||
| +--------------------------------+----------------------------------+ | +--------------------------------+----------------------------------+ | |||
| The following table describes the text fields available in each map | The following table describes the text fields available in each map | |||
| identified by a SUIT_Component_Identifier. | identified by a SUIT_Component_Identifier. | |||
| +---------------------------------+---------------------------------+ | +---------------------------------+---------------------------------+ | |||
| | CDDL Structure | Description | | | CDDL Structure | Description | | |||
| +---------------------------------+---------------------------------+ | +---------------------------------+---------------------------------+ | |||
| | suit-text-vendor-name | Free text vendor name | | | suit-text-vendor-name | Free text vendor name | | |||
| | | | | | | | | |||
| skipping to change at page 35, line 21 ¶ | skipping to change at page 39, line 41 ¶ | |||
| | | | | | | | | |||
| | suit-text-vendor-domain | The domain used to create the | | | suit-text-vendor-domain | The domain used to create the | | |||
| | | vendor-id condition | | | | vendor-id condition | | |||
| | | | | | | | | |||
| | suit-text-model-info | The information used to create | | | suit-text-model-info | The information used to create | | |||
| | | the class-id condition | | | | the class-id condition | | |||
| | | | | | | | | |||
| | suit-text-component-description | Free text description of each | | | suit-text-component-description | Free text description of each | | |||
| | | component in the manifest | | | | component in the manifest | | |||
| | | | | | | | | |||
| | suit-text-component-version | A text version number | | | suit-text-component-version | A free text representation of | | |||
| | | the component version | | ||||
| | | | | | | | | |||
| | suit-text-version-required | A text expression of the | | | suit-text-version-required | A free text expression of the | | |||
| | | required version number | | | | required version number | | |||
| +---------------------------------+---------------------------------+ | +---------------------------------+---------------------------------+ | |||
| suit-text is OPTIONAL to implement. | suit-text is OPTIONAL to implement. | |||
| 8.7. text-version-required | 8.7. text-version-required | |||
| suit-text-version-required is used to represent a version-based | suit-text-version-required is used to represent a version-based | |||
| dependency on suit-parameter-version as described in Section 8.7.5.17 | dependency on suit-parameter-version as described in Section 8.7.5.18 | |||
| and Section 8.7.6.8. To describe a version dependency, a Manifest | and Section 8.7.6.8. To describe a version dependency, a Manifest | |||
| Author should populate the suit-text map with a | Author SHOULD populate the suit-text map with a | |||
| SUIT_Component_Identifier key for the dependency component, and place | SUIT_Component_Identifier key for the dependency component, and place | |||
| in the corresponding map a suit-text-version-required key with a text | in the corresponding map a suit-text-version-required key with a free | |||
| expression that is representative of the version constraints placed | text expression that is representative of the version constraints | |||
| on the dependency. | placed on the dependency. This text SHOULD be expressive enough that | |||
| a device operator can be expected to understand the dependency. This | ||||
| is a free text field and there are no specific formatting rules. | ||||
| For example, to express a dependency on a component "['x', 'y']", | By way of example only, to express a dependency on a component "['x', | |||
| where the version should be any v1.x later than v1.2.5, but not v2.0 | 'y']", where the version should be any v1.x later than v1.2.5, but | |||
| or above, the author would add the following structure to the suit- | not v2.0 or above, the author would add the following structure to | |||
| text element. Note that this text is in cbor-diag notation. | the suit-text element. Note that this text is in cbor-diag notation. | |||
| " [h'78',h'79'] : { 7 : ">=1.2.5,<2" } " | [h'78',h'79'] : { | |||
| 7 : ">=1.2.5,<2" | ||||
| } | ||||
| 8.7.1. suit-coswid | 8.7.1. suit-coswid | |||
| suit-coswid contains a Concise Software Identifier. This element | suit-coswid contains a Concise Software Identifier (CoSWID) as | |||
| SHOULD be made severable so that it can be discarded by the Recipient | defined in [I-D.ietf-sacm-coswid]. This element SHOULD be made | |||
| or an intermediary if it is not required by the Recipient. | severable so that it can be discarded by the Recipient or an | |||
| intermediary if it is not required by the Recipient. | ||||
| suit-coswid is OPTIONAL to implement. | suit-coswid typically requires no processing by the Recipient. | |||
| However all Recipients MUST NOT fail if a suit-coswid is present. | ||||
| 8.7.2. suit-common | 8.7.2. suit-common | |||
| suit-common encodes all the information that is shared between each | suit-common encodes all the information that is shared between each | |||
| of the command sequences, including: suit-dependencies, suit- | of the command sequences, including: suit-dependencies, suit- | |||
| components, and suit-common-sequence. suit-common is REQUIRED to | components, and suit-common-sequence. suit-common is REQUIRED to | |||
| implement. | implement. | |||
| suit-dependencies is a list of Section 8.7.2.1 blocks that specify | suit-dependencies is a list of Section 8.7.2.1 blocks that specify | |||
| manifests that must be present before the current manifest can be | manifests that must be present before the current manifest can be | |||
| skipping to change at page 36, line 27 ¶ | skipping to change at page 41, line 8 ¶ | |||
| suit-components is a list of SUIT_Component_Identifier | suit-components is a list of SUIT_Component_Identifier | |||
| (Section 8.7.2.2) blocks that specify the component identifiers that | (Section 8.7.2.2) blocks that specify the component identifiers that | |||
| will be affected by the content of the current manifest. suit- | will be affected by the content of the current manifest. suit- | |||
| components is REQUIRED to implement; at least one manifest in a | components is REQUIRED to implement; at least one manifest in a | |||
| dependency tree MUST contain a suit-components block. | dependency tree MUST contain a suit-components block. | |||
| 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 Recipient identity and image | common-sequence include setting expected Recipient identity and image | |||
| digests when they are conditional (see Section 8.7.7.4 and | digests when they are conditional (see Section 8.7.7.3 and | |||
| Section 7.10 for more information on conditional sequences). suit- | Section 7.11 for more information on conditional sequences). suit- | |||
| common-sequence is RECOMMENDED to implement. It is REQUIRED if the | common-sequence is RECOMMENDED to implement. It is REQUIRED if the | |||
| optimizations described in Section 6.2.1 will be used. Whenever a | optimizations described in Section 6.2.1 will be used. Whenever a | |||
| parameter or try-each is required by more than one Command Sequence, | parameter or Try Each command is required by more than one Command | |||
| suit-common-sequence results in a smaller encoding. | Sequence, placing that parameter or commamd in suit-common-sequence | |||
| results in a smaller encoding. | ||||
| 8.7.2.1. Dependencies | 8.7.2.1. Dependencies | |||
| SUIT_Dependency specifies a manifest that describes a dependency of | SUIT_Dependency specifies a manifest that describes a dependency of | |||
| the current manifest. The Manifest is identified, however the | the current manifest. The Manifest is identified, but the Recipient | |||
| Recipient should expect an Envelope when it acquires the dependency. | should expect an Envelope when it acquires the dependency. This is | |||
| This is because the Manifest is the one invariant element of the | because the Manifest is the one invariant element of the Envelope, | |||
| Envelope, where other elements may change by countersigning, adding | where other elements may change by countersigning, adding | |||
| authentication blocks, or severing elements. | authentication blocks, or severing elements. | |||
| The suit-dependency-digest specifies the dependency manifest uniquely | The suit-dependency-digest specifies the dependency manifest uniquely | |||
| by identifying a particular Manifest structure. This is identical to | by identifying a particular Manifest structure. This is identical to | |||
| the digest that would be present as the payload of any suit- | the digest that would be present as the payload of any suit- | |||
| authentication-block in the dependency's Envelope. The digest is | authentication-block in the dependency's Envelope. The digest is | |||
| calculated over the Manifest structure instead of the COSE | calculated over the Manifest structure instead of the COSE | |||
| Sig_structure or Mac_structure. This is necessary to ensure that | Sig_structure or Mac_structure. This is necessary to ensure that | |||
| removing a signature from a manifest does not break dependencies due | removing a signature from a manifest does not break dependencies due | |||
| to missing signature elements. This is also necessary to support the | to missing signature elements. This is also necessary to support the | |||
| trusted intermediary use case, where an intermediary re-signs the | trusted intermediary use case, where an intermediary re-signs the | |||
| Manifest, removing the original signature, potentially with a | Manifest, removing the original signature, potentially with a | |||
| 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 (see Section 8.7.2.2). This specifies the | SUIT_Component_Identifier (see Section 8.7.2.2). This specifies the | |||
| scope at which the dependency operates. This allows the dependency | scope at which the dependency operates. This allows the dependency | |||
| to be forwarded on to a component that is capable of parsing its own | to be forwarded on to a component that is capable of parsing its own | |||
| manifests. It also allows one manifest to be deployed to multiple | manifests. It also allows one manifest to be deployed to multiple | |||
| dependent Recipients without those Recipients needing consistent | dependent Recipients without those Recipients needing consistent | |||
| component hierarchy. This element is OPTIONAL. | component hierarchy. This element is OPTIONAL for Recipients to | |||
| implement. | ||||
| A dependency prefix can be used with a component identifier. This | A dependency prefix can be used with a component identifier. This | |||
| allows complex systems to understand where dependencies need to be | allows complex systems to understand where dependencies need to be | |||
| applied. The dependency prefix can be used in one of two ways. The | applied. The dependency prefix can be used in one of two ways. The | |||
| first simply prepends the prefix to all Component Identifiers in the | first simply prepends the prefix to all Component Identifiers in the | |||
| dependency. | dependency. | |||
| A dependency prefix can also be used to indicate when a dependency | A dependency prefix can also be used to indicate when a dependency | |||
| manifest needs to be processed by a secondary manifest processor, as | manifest needs to be processed by a secondary manifest processor, as | |||
| described in Section 6.9. | described in Section 6.9. | |||
| 8.7.2.2. SUIT_Component_Identifier | 8.7.2.2. SUIT_Component_Identifier | |||
| A component is a unit of code or data that can be targeted by an | A component is a unit of code or data that can be targeted by an | |||
| update. To facilitate composite devices, components are identified | update. To facilitate composite devices, components are identified | |||
| by a list of CBOR byte strings, which allows construction of | by a list of CBOR byte strings, which allows construction of | |||
| hierarchical component structures. A dependency MAY declare a prefix | hierarchical component structures. A dependency MAY declare a prefix | |||
| to the components defined in the dependency manifest. Components are | to the components defined in the dependency manifest. Components are | |||
| identified by Component Identifiers, i.e. arrays of binary strings, | identified by Component Identifiers, but referenced in commands by | |||
| but referenced in commands | Component Index; Component Identifiers are arrays of binary strings | |||
| and a Component Index is an index into the array of Component | ||||
| Identifiers. | ||||
| A Component Identifier can be trivial, such as the simple array | A Component Identifier can be trivial, such as the simple array | |||
| [h'00']. It can also represent a filesystem path by encoding each | [h'00']. It can also represent a filesystem path by encoding each | |||
| segment of the path as an element in the list. For example, the path | segment of the path as an element in the list. For example, the path | |||
| "/usr/bin/env" would encode to ['usr','bin','env']. | "/usr/bin/env" would encode to ['usr','bin','env']. | |||
| This hierarchical construction allows a component identifier to | This hierarchical construction allows a component identifier to | |||
| identify any part of a complex, multi-component system. | identify any part of a complex, multi-component system. | |||
| 8.7.3. SUIT_Command_Sequence | 8.7.3. SUIT_Command_Sequence | |||
| skipping to change at page 38, line 38 ¶ | skipping to change at page 43, line 23 ¶ | |||
| targeting all dependencies SHOULD be present in validate. | targeting all dependencies SHOULD be present in validate. | |||
| 5. Image Loading: suit-load is a SUIT_Command_Sequence to execute in | 5. Image Loading: suit-load is a SUIT_Command_Sequence to execute in | |||
| order to prepare a payload for execution. Typical actions | order to prepare a payload for execution. Typical actions | |||
| include copying an image from permanent storage into RAM, | include copying an image from permanent storage into RAM, | |||
| optionally including actions such as decryption or decompression. | optionally including actions such as decryption or decompression. | |||
| suit-load is OPTIONAL to implement. | suit-load is OPTIONAL to implement. | |||
| 6. Run or Boot: suit-run is a SUIT_Command_Sequence to execute in | 6. Run or Boot: suit-run is a SUIT_Command_Sequence to execute in | |||
| order to run an image. suit-run typically contains a single | order to run an image. suit-run typically contains a single | |||
| instruction: either the "run" directive for the bootable manifest | instruction: either the "run" directive for the invocable | |||
| or the "process dependencies" directive for any dependents of the | manifest or the "process dependencies" directive for any | |||
| bootable manifest. suit-run is OPTIONAL to implement. Only one | dependents of the invocable manifest. suit-run is OPTIONAL to | |||
| manifest in an update may contain the "run" directive. | implement. | |||
| Goals 1,2,3 form the Update Procedure. Goals 4,5,6 form the Boot | Goals 1,2,3 form the Update Procedure. Goals 4,5,6 form the | |||
| Procedure. | Invocation Procedure. | |||
| Each Command Sequence follows exactly the same structure to ensure | Each Command Sequence follows exactly the same structure to ensure | |||
| that the parser is as simple as possible. | that the parser is as simple as possible. | |||
| Lists of commands are constructed from two kinds of element: | Lists of commands are constructed from two kinds of element: | |||
| 1. Conditions that MUST be true-any failure is treated as a failure | 1. Conditions that MUST be true and any failure is treated as a | |||
| of the update/load/boot | failure of the update/load/invocation | |||
| 2. Directives that MUST be executed. | 2. Directives that MUST be executed. | |||
| Each condition is a command code identifier, followed by a | Each condition is composed of: | |||
| SUIT_Reporting_Policy (Section 8.7.4). | ||||
| 1. A command code identifier | ||||
| 2. A SUIT_Reporting_Policy (Section 8.7.4) | ||||
| Each directive is composed of: | Each directive is composed of: | |||
| 1. A command code identifier | 1. A command code identifier | |||
| 2. An argument block or a reporting policy | 2. An argument block or a SUIT_Reporting_Policy (Section 8.7.4) | |||
| Argument blocks are consumed only by flow-control directives: | Argument blocks are consumed only by flow-control directives: | |||
| - Set Component/Dependency Index | - Set Component/Dependency Index | |||
| - Set/Override Parameters | - Set/Override Parameters | |||
| - Try Each | - Try Each | |||
| - Run Sequence | - Run Sequence | |||
| Reporting policies provide a hint to the manifest processor of | Reporting policies provide a hint to the manifest processor of | |||
| whether or not to add the success or failure of a command to any | whether to add the success or failure of a command to any report that | |||
| report that it generates. | it generates. | |||
| Many conditions and directives apply to a given component, and these | Many conditions and directives apply to a given component, and these | |||
| generally grouped together. Therefore, a special command to set the | generally grouped together. Therefore, a special command to set the | |||
| current component index is provided with a matching command to set | current component index is provided with a matching command to set | |||
| the current dependency index. This index is a numeric index into the | the current dependency index. This index is a numeric index into the | |||
| component ID tables defined at the beginning of the document. For | Component Identifier tables defined at the beginning of the manifest. | |||
| the purpose of setting the index, the two component ID tables are | For the purpose of setting the index, the two Component Identifier | |||
| considered to be concatenated together. | tables are considered to be concatenated together. | |||
| To facilitate optional conditions, a special directive, | To facilitate optional conditions, a special directive, suit- | |||
| Section 8.7.7.4, is provided. It runs several new lists of | directive-try-each (Section 8.7.7.3), is provided. It runs several | |||
| conditions/directives, one after another, that are contained as an | new lists of conditions/directives, one after another, that are | |||
| argument to the directive. By default, it assumes that a failure of | contained as an argument to the directive. By default, it assumes | |||
| a condition should not indicate a failure of the update/boot, but a | that a failure of a condition should not indicate a failure of the | |||
| parameter is provided to override this behavior. See | update/invocation, but a parameter is provided to override this | |||
| Section 8.7.5.22. | behavior. See suit-parameter-soft-failure (Section 8.7.5.23). | |||
| 8.7.4. Reporting Policy | 8.7.4. Reporting Policy | |||
| To facilitate construction of Reports that describe the success, or | To facilitate construction of Reports that describe the success, or | |||
| failure of a given Procedure, each command is given a Reporting | failure of a given Procedure, each command is given a Reporting | |||
| Policy. This is an integer bitfield that follows the command and | Policy. This is an integer bitfield that follows the command and | |||
| indicates what the Recipient should do with the Record of executing | indicates what the Recipient should do with the Record of executing | |||
| the command. The options are summarized in the table below. | the command. The options are summarized in the table below. | |||
| +-----------------------------+-------------------------------------+ | +-----------------------------+-------------------------------------+ | |||
| skipping to change at page 40, line 29 ¶ | skipping to change at page 45, line 21 ¶ | |||
| | | | | | | | | |||
| | suit-send-sysinfo-success | Add system information when the | | | suit-send-sysinfo-success | Add system information when the | | |||
| | | command succeeds | | | | command succeeds | | |||
| | | | | | | | | |||
| | suit-send-sysinfo-failure | Add system information when the | | | suit-send-sysinfo-failure | Add system information when the | | |||
| | | command fails | | | | command fails | | |||
| +-----------------------------+-------------------------------------+ | +-----------------------------+-------------------------------------+ | |||
| Any or all of these policies may be enabled at once. | Any or all of these policies may be enabled at once. | |||
| If the component index is set to True when a command is executed with | At the completion of each command, a recipient MAY forward that | |||
| a non-zero reporting policy, then the Reporting Engine MUST receive | command's reporting policy, the result of the command, the current | |||
| one Record for each Component, in the order expressed in the | set of parameters, and the system information consumed by the command | |||
| Components list. If the dependency index is set to True when a | to a TODO | |||
| command is executed with a non-zero reporting policy, then the | ||||
| Reporting Engine MUST receive one Record for each Dependency, in the | ||||
| order expressed in the Dependencies list. | ||||
| SUIT does NOT REQUIRE a particular format of Records or Reports. | several information elements are provided to an implementation | |||
| SUIT only defines hints to the Reporting engine for which Records it | defined subsystem, the Reporting Engine: | |||
| should aggregate into the Report. | ||||
| For example, a system using DICE certificates MAY use instances of | - The reporting policies | |||
| suit-send-sysinfo-success to construct its certificates. | ||||
| An OPTIONAL Record format, SUIT_Record is defined in [full-cddl]. It | - The result of the command | |||
| is encoded as a map, with the following elements. | ||||
| +---------------------------------+---------------------------------+ | - The parameters consumed by the command | |||
| | Element | Description | | ||||
| +---------------------------------+---------------------------------+ | ||||
| | suit-record-success | The boolean or integer success | | ||||
| | | or failure code of the command. | | ||||
| | | | | ||||
| | suit-record-component-id | The current component when the | | ||||
| | | record was generated. | | ||||
| | | | | ||||
| | suit-record-dependency-id | The current dependency digest | | ||||
| | | when the record was generated. | | ||||
| | | | | ||||
| | suit-record-command-sequence-id | The label of the Command | | ||||
| | | Sequence that was executing | | ||||
| | | when the record was generated. | | ||||
| | | | | ||||
| | suit-record-command-id | The label of the command that | | ||||
| | | was in progress when the record | | ||||
| | | was generated. | | ||||
| | | | | ||||
| | suit-record-params | The set of parameters that was | | ||||
| | | consumed by the current | | ||||
| | | command. | | ||||
| | | | | ||||
| | suit-record-actual | The value against which a suit- | | ||||
| | | condition compared a parameter. | | ||||
| +---------------------------------+---------------------------------+ | ||||
| In Secure Boot operations, the Reporting engine MAY aggregate the | - The system information consumed by the command | |||
| Records produced in a Procedure into the evidence used for an | ||||
| attestation report. | If the component index is set to True or an array when a command is | |||
| executed with a non-zero reporting policy, then the Reporting Engine | ||||
| MUST receive one Record for each Component, in the order expressed in | ||||
| the Components list or the component index array, respectively. If | ||||
| the dependency index is set to True or an array when a command is | ||||
| executed with a non-zero reporting policy, then the Reporting Engine | ||||
| MUST receive one Record for each Dependency, in the order expressed | ||||
| in the Dependencies list or the component index array, respectively. | ||||
| This specification does define a particular format of Records or | ||||
| Reports. This specification only defines hints to the Reporting | ||||
| Engine for which Records it should aggregate into the Report. The | ||||
| Reporting Engine MAY choose to ignore these hints and apply its own | ||||
| policy instead. | ||||
| When used in a Invocation Process, the report MAY form the basis of | ||||
| an attestation report. When used in an Update Process, the report | ||||
| MAY form the basis for one or more log entries. | ||||
| 8.7.5. SUIT_Parameters | 8.7.5. SUIT_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. This allows reduction of manifest size and | consistent way. This allows reduction of manifest size and | |||
| replacement of parameters from one manifest to the next. | replacement of parameters from one manifest to the next. | |||
| Most parameters are scoped to a specific component. This means that | Most parameters are scoped to a specific component. This means that | |||
| setting a parameter for one component has no effect on the parameters | setting a parameter for one component has no effect on the parameters | |||
| of any other component. The only exceptions to this are two Manifest | of any other component. The only exceptions to this are two Manifest | |||
| Processor parameters: Strict Order and Soft Failure. | Processor parameters: Strict Order and Soft Failure. | |||
| The defined manifest parameters are described below. | The defined manifest parameters are described below. | |||
| +----------------+----------------------------------+---------------+ | +----------------+----------------------------------+---------------+ | |||
| | Name | CDDL Structure | Reference | | | Name | CDDL Structure | Reference | | |||
| +----------------+----------------------------------+---------------+ | +----------------+----------------------------------+---------------+ | |||
| | Vendor ID | suit-parameter-vendor-identifier | Section 8.7.5 | | | Vendor ID | suit-parameter-vendor-identifier | Section 8.7.5 | | |||
| | | | .2 | | | | | .3 | | |||
| | | | | | | | | | | |||
| | Class ID | suit-parameter-class-identifier | Section 8.7.5 | | | Class ID | suit-parameter-class-identifier | Section 8.7.5 | | |||
| | | | .3 | | | | | .4 | | |||
| | | | | | | | | | | |||
| | Image Digest | suit-parameter-image-digest | Section 8.7.5 | | | Device ID | suit-parameter-device-identifier | Section 8.7.5 | | |||
| | | | .5 | | | | | .5 | | |||
| | | | | | | | | | | |||
| | Image Size | suit-parameter-image-size | Section 8.7.5 | | | Image Digest | suit-parameter-image-digest | Section 8.7.5 | | |||
| | | | .6 | | | | | .6 | | |||
| | | | | | | | | | | |||
| | Use Before | suit-parameter-use-before | Section 8.7.5 | | | Image Size | suit-parameter-image-size | Section 8.7.5 | | |||
| | | | .7 | | | | | .7 | | |||
| | | | | | | | | | | |||
| | Use Before | suit-parameter-use-before | Section 8.7.5 | | ||||
| | | | .8 | | ||||
| | | | | | ||||
| | Component | suit-parameter-component-offset | Section 8.7.5 | | | Component | suit-parameter-component-offset | Section 8.7.5 | | |||
| | Offset | | .8 | | | Offset | | .9 | | |||
| | | | | | | | | | | |||
| | Encryption | suit-parameter-encryption-info | Section 8.7.5 | | | Encryption | suit-parameter-encryption-info | Section 8.7.5 | | |||
| | Info | | .9 | | | Info | | .10 | | |||
| | | | | | | | | | | |||
| | Compression | suit-parameter-compression-info | Section 8.7.5 | | | Compression | suit-parameter-compression-info | Section 8.7.5 | | |||
| | Info | | .10 | | | Info | | .11 | | |||
| | | | | | | | | | | |||
| | Unpack Info | suit-parameter-unpack-info | Section 8.7.5 | | | Unpack Info | suit-parameter-unpack-info | Section 8.7.5 | | |||
| | | | .11 | | | | | .12 | | |||
| | | | | | | | | | | |||
| | URI | suit-parameter-uri | Section 8.7.5 | | | URI | suit-parameter-uri | Section 8.7.5 | | |||
| | | | .12 | | | | | .13 | | |||
| | | | | | | | | | | |||
| | Source | suit-parameter-source-component | Section 8.7.5 | | | Source | suit-parameter-source-component | Section 8.7.5 | | |||
| | Component | | .13 | | | Component | | .14 | | |||
| | | | | | | | | | | |||
| | Run Args | suit-parameter-run-args | Section 8.7.5 | | | Run Args | suit-parameter-run-args | Section 8.7.5 | | |||
| | | | .14 | | | | | .15 | | |||
| | | | | | ||||
| | Device ID | suit-parameter-device-identifier | Section 8.7.5 | | ||||
| | | | .4 | | ||||
| | | | | | | | | | | |||
| | Minimum | suit-parameter-minimum-battery | Section 8.7.5 | | | Minimum | suit-parameter-minimum-battery | Section 8.7.5 | | |||
| | Battery | | .15 | | | Battery | | .16 | | |||
| | | | | | | | | | | |||
| | Update | suit-parameter-update-priority | Section 8.7.5 | | | Update | suit-parameter-update-priority | Section 8.7.5 | | |||
| | Priority | | .16 | | | Priority | | .17 | | |||
| | | | | | | | | | | |||
| | Version | suit-parameter-version | Section 8.7.5 | | | Version | suit-parameter-version | Section 8.7.5 | | |||
| | | | .17 | | | | | .18 | | |||
| | | | | | | | | | | |||
| | Wait Info | suit-parameter-wait-info | Section 8.7.5 | | | Wait Info | suit-parameter-wait-info | Section 8.7.5 | | |||
| | | | .18 | | | | | .19 | | |||
| | | | | | | | | | | |||
| | URI List | suit-parameter-uri-list | Section 8.7.5 | | | URI List | suit-parameter-uri-list | Section 8.7.5 | | |||
| | | | .19 | | | | | .20 | | |||
| | | | | | | | | | | |||
| | Fetch | suit-parameter-fetch-arguments | Section 8.7.5 | | | Fetch | suit-parameter-fetch-arguments | Section 8.7.5 | | |||
| | Arguments | | .20 | | | Arguments | | .21 | | |||
| | | | | | | | | | | |||
| | Strict Order | suit-parameter-strict-order | Section 8.7.5 | | | Strict Order | suit-parameter-strict-order | Section 8.7.5 | | |||
| | | | .21 | | | | | .22 | | |||
| | | | | | | | | | | |||
| | Soft Failure | suit-parameter-soft-failure | Section 8.7.5 | | | Soft Failure | suit-parameter-soft-failure | Section 8.7.5 | | |||
| | | | .22 | | | | | .23 | | |||
| | | | | | | | | | | |||
| | Custom | suit-parameter-custom | Section 8.7.5 | | | Custom | suit-parameter-custom | Section 8.7.5 | | |||
| | | | .23 | | | | | .24 | | |||
| +----------------+----------------------------------+---------------+ | +----------------+----------------------------------+---------------+ | |||
| 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 modularization and | understanding the contents. This is important for modularization and | |||
| division of responsibility within a pull parser. The same | division of responsibility within a pull parser. The same | |||
| consideration does not apply to Directives because those elements are | consideration does not apply to Directives because those elements are | |||
| invoked with their arguments immediately | invoked with their arguments immediately | |||
| 8.7.5.1. Constructing Identifiers | 8.7.5.1. CBOR PEN UUID Namespace Identifier | |||
| The CBOR PEN UUID Namespace Identifier is constructed as follows: | ||||
| It uses the OID Namespace as a starting point, then uses the CBOR OID | ||||
| encoding for the IANA PEN OID (1.3.6.1.4.1): | ||||
| D8 DE # tag(111) | ||||
| 45 # bytes(5) | ||||
| 2B 06 01 04 01 # X.690 Clause 8.19 | ||||
| # 1.3 6 1 4 1 show component encoding | ||||
| Computing a type 5 UUID from these produces: | ||||
| NAMESPACE_CBOR_PEN = UUID5(NAMESPACE_OID, h'D86F452B06010401') | ||||
| NAMESPACE_CBOR_PEN = 08cfcc43-47d9-5696-85b1-9c738465760e | ||||
| 8.7.5.2. Constructing UUIDs | ||||
| Several conditions use identifiers to determine whether a manifest | Several 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 not human-readable and | be RFC 4122 [RFC4122] UUIDs. These UUIDs are not human-readable and | |||
| are therefore used for machine-based processing only. | are therefore used for machine-based processing only. | |||
| A Recipient MAY match any number of UUIDs for vendor or class | A Recipient 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 Recipient that has an OS and one or more applications | For example, a Recipient 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 44, line 16 ¶ | skipping to change at page 49, line 4 ¶ | |||
| components: 1. A host MCU 2. A WiFi module | components: 1. A host MCU 2. A WiFi module | |||
| This same device has three software modules: 1. An operating system | This same device has three software modules: 1. An operating system | |||
| 2. A WiFi module interface driver 3. An application | 2. A WiFi module interface driver 3. An application | |||
| Suppose that the WiFi module's firmware has a proprietary update | Suppose that the WiFi module's firmware has a proprietary update | |||
| mechanism and doesn't support manifest processing. This device can | mechanism and doesn't support manifest processing. This device can | |||
| report four class IDs: | report four class IDs: | |||
| 1. Hardware model/revision | 1. Hardware model/revision | |||
| 2. OS | 2. OS | |||
| 3. WiFi module model/revision | 3. WiFi module model/revision | |||
| 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. | |||
| 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: | |||
| UUID5(DNS_PREFIX, vendor domain name) | ||||
| The RECOMMENDED method to create a class ID is: Class ID = | Vendor ID = UUID5(DNS_PREFIX, vendor domain name) | |||
| UUID5(Vendor ID, Class-Specific-Information) | ||||
| Class-specific information is composed of a variety of data, for | If the Vendor ID is a UUID, the RECOMMENDED method to create a Class | |||
| ID is: | ||||
| Class ID = UUID5(Vendor ID, Class-Specific-Information) | ||||
| If the Vendor ID is a CBOR PEN (see Section 8.7.5.3), the RECOMMENDED | ||||
| method to create a Class ID is: | ||||
| Class ID = UUID5( | ||||
| UUID5(NAMESPACE_CBOR_PEN, CBOR_PEN), | ||||
| Class-Specific-Information) | ||||
| 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). | |||
| 8.7.5.2. suit-parameter-vendor-identifier | 8.7.5.3. suit-parameter-vendor-identifier | |||
| A RFC 4122 UUID representing the vendor of the device or component. | suit-parameter-vendor-identifier may be presented in one of two ways: | |||
| The UUID is encoded as a 16 byte bstr, containing the raw bytes of | ||||
| the UUID. It MUST be constructed as described in Section 8.7.5.1 | ||||
| 8.7.5.3. suit-parameter-class-identifier | - A Private Enterprise Number | |||
| - A byte string containing a UUID ([RFC4122]) | ||||
| Private Enterprise Numbers are encoded as a relative OID, according | ||||
| to the definition in [I-D.ietf-cbor-tags-oid]. All PENs are relative | ||||
| to the IANA PEN: 1.3.6.1.4.1. | ||||
| 8.7.5.4. suit-parameter-class-identifier | ||||
| A RFC 4122 UUID representing the class of the device or component. | A RFC 4122 UUID representing the class of the device or component. | |||
| The UUID is encoded as a 16 byte bstr, containing the raw bytes of | The UUID is encoded as a 16 byte bstr, containing the raw bytes of | |||
| the UUID. It MUST be constructed as described in Section 8.7.5.1 | the UUID. It MUST be constructed as described in Section 8.7.5.2 | |||
| 8.7.5.4. suit-parameter-device-identifier | 8.7.5.5. suit-parameter-device-identifier | |||
| A RFC 4122 UUID representing the specific device or component. The | A RFC 4122 UUID representing the specific device or component. The | |||
| UUID is encoded as a 16 byte bstr, containing the raw bytes of the | UUID is encoded as a 16 byte bstr, containing the raw bytes of the | |||
| UUID. It MUST be constructed as described in Section 8.7.5.1 | UUID. It MUST be constructed as described in Section 8.7.5.2 | |||
| 8.7.5.5. suit-parameter-image-digest | 8.7.5.6. suit-parameter-image-digest | |||
| A fingerprint computed over the component itself, encoded in the | A fingerprint computed over the component itself, encoded in the | |||
| Section 10 structure. The SUIT_Digest is wrapped in a bstr, as | SUIT_Digest Section 10 structure. The SUIT_Digest is wrapped in a | |||
| required in Section 8.7.5. | bstr, as required in Section 8.7.5. | |||
| 8.7.5.6. suit-parameter-image-size | 8.7.5.7. suit-parameter-image-size | |||
| The size of the firmware image in bytes. This size is encoded as a | The size of the firmware image in bytes. This size is encoded as a | |||
| positive integer. | positive integer. | |||
| 8.7.5.7. suit-parameter-use-before | 8.7.5.8. suit-parameter-use-before | |||
| An expiry date for the use of the manifest encoded as a POSIX | An expiry date for the use of the manifest encoded as the positive | |||
| timestamp; a positive integer. Implementations that use this | integer number of seconds since 1970-01-01. Implementations that use | |||
| parameter MUST use a 64-bit internal representation of the integer. | this parameter MUST use a 64-bit internal representation of the | |||
| integer. | ||||
| 8.7.5.8. suit-parameter-component-offset | 8.7.5.9. suit-parameter-component-offset | |||
| This parameter sets the offset in a component. Some components | This parameter sets the offset in a component. Some components | |||
| support multiple possible Slots (offsets into a storage area). This | support multiple possible Slots (offsets into a storage area). This | |||
| parameter describes the intended Slot to use, identified by its | parameter describes the intended Slot to use, identified by its | |||
| offset into the component's storage area. This offset MUST be | offset into the component's storage area. This offset MUST be | |||
| encoded as a positive integer. | encoded as a positive integer. | |||
| 8.7.5.9. suit-parameter-encryption-info | 8.7.5.10. 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. | |||
| 8.7.5.10. suit-parameter-compression-info | 8.7.5.11. suit-parameter-compression-info | |||
| Compression Info defines any information that is required for a | SUIT_Compression_Info defines any information that is required for a | |||
| Recipient to perform decompression operations. Typically, this | Recipient to perform decompression operations. SUIT_Compression_Info | |||
| includes the algorithm identifier. This document defines the use of | is a map containing this data. The only element defined for the map | |||
| ZLIB [RFC1950], Brotli [RFC7932], and ZSTD | in this specification is the suit-compression-algorithm. This | |||
| [I-D.kucherawy-rfc8478bis]. | document defines the following suit-compression-algorithm's: ZLIB | |||
| [RFC1950], Brotli [RFC7932], and ZSTD [I-D.kucherawy-rfc8478bis]. | ||||
| Additional compression formats can be registered through the IANA- | Additional suit-compression-algorithm's can be registered through the | |||
| maintained registry. | IANA-maintained registry. If such a format requires more data than | |||
| an algorithm identifier, one or more new elements MUST be introduced | ||||
| by specifying an element for SUIT_Compression_Info-extensions. | ||||
| 8.7.5.11. suit-parameter-unpack-info | 8.7.5.12. suit-parameter-unpack-info | |||
| SUIT_Unpack_Info defines the information required for a Recipient to | SUIT_Unpack_Info defines the information required for a Recipient to | |||
| interpret a packed format. This document defines the use of the | interpret a packed format. This document defines the use of the | |||
| following binary encodings: Intel HEX [HEX], Motorola S-record | following binary encodings: Intel HEX [HEX], Motorola S-record | |||
| [SREC], Executable and Linkable Format (ELF) [ELF], and Common Object | [SREC], Executable and Linkable Format (ELF) [ELF], and Common Object | |||
| File Format (COFF) [COFF]. | File Format (COFF) [COFF]. | |||
| Additional packing formats can be registered through the IANA- | Additional packing formats can be registered through the IANA- | |||
| maintained registry. | maintained registry. | |||
| 8.7.5.12. suit-parameter-uri | 8.7.5.13. suit-parameter-uri | |||
| A URI from which to fetch a resource. | A URI from which to fetch a resource, encoded as a text string. CBOR | |||
| Tag 32 is not used because the meaning of the text string is | ||||
| unambiguous in this context. | ||||
| 8.7.5.13. suit-parameter-source-component | 8.7.5.14. suit-parameter-source-component | |||
| This parameter sets the source component to be used with either | This parameter sets the source component to be used with either suit- | |||
| Section 8.7.7.10 or with Section 8.7.7.14. The current Component, as | directive-copy (Section 8.7.7.9) or with suit-directive-swap | |||
| set by suit-directive-set-component-index defines the destination, | (Section 8.7.7.13). The current Component, as set by suit-directive- | |||
| and suit-parameter-source-component defines the source. | set-component-index defines the destination, and suit-parameter- | |||
| source-component defines the source. | ||||
| 8.7.5.14. suit-parameter-run-args | 8.7.5.15. suit-parameter-run-args | |||
| This parameter contains an encoded set of arguments for | This parameter contains an encoded set of arguments for suit- | |||
| Section 8.7.7.11. The arguments MUST be provided as an | directive-run (Section 8.7.7.10). The arguments MUST be provided as | |||
| implementation-defined bstr. | an implementation-defined bstr. | |||
| 8.7.5.15. suit-parameter-minimum-battery | 8.7.5.16. suit-parameter-minimum-battery | |||
| This parameter sets the minimum battery level in mWh. This parameter | This parameter sets the minimum battery level in mWh. This parameter | |||
| is encoded as a positive integer. Used with Section 8.7.6.6. | is encoded as a positive integer. Used with suit-condition-minimum- | |||
| battery (Section 8.7.6.6). | ||||
| 8.7.5.16. suit-parameter-update-priority | 8.7.5.17. suit-parameter-update-priority | |||
| This parameter sets the priority of the update. This parameter is | This parameter sets the priority of the update. This parameter is | |||
| encoded as an integer. It is used along with suit-condition-update- | encoded as an integer. It is used along with suit-condition-update- | |||
| authorized [1] to ask an application for permission to initiate an | authorized (Section 8.7.6.7) to ask an application for permission to | |||
| update. This does not constitute a privilege inversion because an | initiate an update. This does not constitute a privilege inversion | |||
| explicit request for authorization has been provided by the Update | because an explicit request for authorization has been provided by | |||
| Authority in the form of the suit-condition-update-authorized | the Update Authority in the form of the suit-condition-update- | |||
| command. | authorized command. | |||
| Applications MAY define their own meanings for the update priority. | Applications MAY define their own meanings for the update priority. | |||
| For example, critical reliability & vulnerability fixes MAY be given | For example, critical reliability & vulnerability fixes MAY be given | |||
| negative numbers, while bug fixes MAY be given small positive | negative numbers, while bug fixes MAY be given small positive | |||
| numbers, and feature additions MAY be given larger positive numbers, | numbers, and feature additions MAY be given larger positive numbers, | |||
| which allows an application to make an informed decision about | which allows an application to make an informed decision about | |||
| whether and when to allow an update to proceed. | whether and when to allow an update to proceed. | |||
| 8.7.5.17. suit-parameter-version | 8.7.5.18. suit-parameter-version | |||
| Indicates allowable versions for the specified component. Allowable | Indicates allowable versions for the specified component. Allowable | |||
| versions can be specified, either with a list or with range matching. | versions can be specified, either with a list or with range matching. | |||
| This parameter is compared with version asserted by the current | This parameter is compared with version asserted by the current | |||
| component when Section 8.7.6.8 is invoked. The current component may | component when suit-condition-version (Section 8.7.6.8) is invoked. | |||
| assert the current version in many ways, including storage in a | The current component may assert the current version in many ways, | |||
| parameter storage database, in a metadata object, or in a known | including storage in a parameter storage database, in a metadata | |||
| location within the component itself. | object, or in a known location within the component itself. | |||
| The component version can be compared as: | The component version can be compared as: | |||
| - Greater. | - Greater. | |||
| - Greater or Equal. | - Greater or Equal. | |||
| - Equal. | - Equal. | |||
| - Lesser or Equal. | - Lesser or Equal. | |||
| skipping to change at page 48, line 43 ¶ | skipping to change at page 54, line 5 ¶ | |||
| Where Alpha (-3), Beta (-2), and Release Candidate (-1) are used, | Where Alpha (-3), Beta (-2), and Release Candidate (-1) are used, | |||
| they are inserted as a negative number between Minor and Patch | they are inserted as a negative number between Minor and Patch | |||
| numbers. This allows these releases to compare correctly with final | numbers. This allows these releases to compare correctly with final | |||
| releases. For example, Version 2.0, RC1 should be lower than Version | releases. For example, Version 2.0, RC1 should be lower than Version | |||
| 2.0.0 and higher than any Version 1.x. By encoding RC as -1, this | 2.0.0 and higher than any Version 1.x. By encoding RC as -1, this | |||
| works correctly: [2,0,-1,1] compares as lower than [2,0,0]. | works correctly: [2,0,-1,1] compares as lower than [2,0,0]. | |||
| Similarly, beta (-2) is lower than RC and alpha (-3) is lower than | Similarly, beta (-2) is lower than RC and alpha (-3) is lower than | |||
| RC. | RC. | |||
| 8.7.5.18. suit-parameter-wait-info | 8.7.5.19. suit-parameter-wait-info | |||
| suit-directive-wait Section 8.7.7.12 directs the manifest processor | suit-directive-wait (Section 8.7.7.11) directs the manifest processor | |||
| to pause until a specified event occurs. The suit-parameter-wait- | to pause until a specified event occurs. The suit-parameter-wait- | |||
| info encodes the parameters needed for the directive. | info encodes the parameters needed for the directive. | |||
| The exact implementation of the pause is implementation-defined. For | The exact implementation of the pause is implementation-defined. For | |||
| example, this could be done by blocking on a semaphore, registering | example, this could be done by blocking on a semaphore, registering | |||
| an event handler and suspending the manifest processor, polling for a | an event handler and suspending the manifest processor, polling for a | |||
| notification, or aborting the update entirely, then restarting when a | notification, or aborting the update entirely, then restarting when a | |||
| notification is received. | notification is received. | |||
| suit-parameter-wait-info is encoded as a map of wait events. When | suit-parameter-wait-info is encoded as a map of wait events. When | |||
| ALL wait events are satisfied, the Manifest Processor continues. The | ALL wait events are satisfied, the Manifest Processor continues. The | |||
| wait events currently defined are described in the following table. | wait events currently defined are described in the following table. | |||
| +--------------------------------------+----------+-----------------+ | +------------------------------+---------+--------------------------+ | |||
| | Name | Encoding | Description | | | Name | Encodin | Description | | |||
| +--------------------------------------+----------+-----------------+ | | | g | | | |||
| | suit-wait-event-authorization | int | Same as Section | | +------------------------------+---------+--------------------------+ | |||
| | | | 8.7.5.16 | | | suit-wait-event- | int | Same as suit-parameter- | | |||
| | | | | | | authorization | | update-priority | | |||
| | suit-wait-event-power | int | Wait until | | | | | | | |||
| | | | power state | | | suit-wait-event-power | int | Wait until power state | | |||
| | | | | | | | | | | |||
| | suit-wait-event-network | int | Wait until | | | suit-wait-event-network | int | Wait until network state | | |||
| | | | network state | | | | | | | |||
| | | | | | | suit-wait-event-other- | See | Wait for other device to | | |||
| | suit-wait-event-other-device-version | See | Wait for other | | | device-version | below | match version | | |||
| | | below | device to match | | | | | | | |||
| | | | version | | | suit-wait-event-time | uint | Wait until time (seconds | | |||
| | | | | | | | | since 1970-01-01) | | |||
| | suit-wait-event-time | uint | Wait until time | | | | | | | |||
| | | | (POSIX | | | suit-wait-event-time-of-day | uint | Wait until seconds since | | |||
| | | | timestamp) | | | | | 00:00:00 | | |||
| | | | | | | | | | | |||
| | suit-wait-event-time-of-day | uint | Wait until | | | suit-wait-event-time-of-day- | uint | Wait until seconds since | | |||
| | | | seconds since | | | utc | | 00:00:00 UTC | | |||
| | | | 00:00:00 | | | | | | | |||
| | | | | | | suit-wait-event-day-of-week | uint | Wait until days since | | |||
| | suit-wait-event-day-of-week | uint | Wait until days | | | | | Sunday | | |||
| | | | since Sunday | | | | | | | |||
| +--------------------------------------+----------+-----------------+ | | suit-wait-event-day-of-week- | uint | Wait until days since | | |||
| | utc | | Sunday UTC | | ||||
| +------------------------------+---------+--------------------------+ | ||||
| suit-wait-event-other-device-version reuses the encoding of suit- | suit-wait-event-other-device-version reuses the encoding of suit- | |||
| parameter-version-match. It is encoded as a sequence that contains | parameter-version-match. It is encoded as a sequence that contains | |||
| an implementation-defined bstr identifier for the other device, and a | an implementation-defined bstr identifier for the other device, and a | |||
| list of one or more SUIT_Parameter_Version_Match. | list of one or more SUIT_Parameter_Version_Match. | |||
| 8.7.5.19. suit-parameter-uri-list | 8.7.5.20. suit-parameter-uri-list | |||
| Indicates a list of URIs from which to fetch a resource. The URI | Indicates a list of URIs from which to fetch a resource. The URI | |||
| list is encoded as a list of tstr, in priority order. The Recipient | list is encoded as a list of text string, in priority order. CBOR | |||
| should attempt to fetch the resource from each URI in turn, ruling | Tag 32 is not used because the meaning of the text string is | |||
| out each, in order, if the resource is inaccessible or it is | unambiguous in this context. The Recipient should attempt to fetch | |||
| otherwise undesirable to fetch from that URI. suit-parameter-uri-list | the resource from each URI in turn, ruling out each, in order, if the | |||
| is consumed by Section 8.7.7.9. | resource is inaccessible or it is otherwise undesirable to fetch from | |||
| that URI. suit-parameter-uri-list is consumed by suit-directive- | ||||
| fetch-uri-list (Section 8.7.7.8). | ||||
| 8.7.5.20. suit-parameter-fetch-arguments | 8.7.5.21. suit-parameter-fetch-arguments | |||
| An implementation-defined set of arguments to Section 8.7.7.8. | An implementation-defined set of arguments to suit-directive-fetch | |||
| Arguments are encoded in a bstr. | (Section 8.7.7.7). Arguments are encoded in a bstr. | |||
| 8.7.5.21. suit-parameter-strict-order | 8.7.5.22. 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 | |||
| parallelize their handling of updates. Strict Order defaults to | parallelize 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. SUIT_Process_Dependency must preserve | |||
| returned to True, ALL preceding commands MUST complete before the | and restore the state of SUIT_Parameter_Strict_Order. If | |||
| next command is executed. | SUIT_Parameter_Strict_Order is returned to True, ALL preceding | |||
| commands MUST complete before the next command is executed. | ||||
| See Section 6.7 for behavioral description of Strict Order. | See Section 6.7 for behavioral description of Strict Order. | |||
| 8.7.5.22. suit-parameter-soft-failure | 8.7.5.23. suit-parameter-soft-failure | |||
| When executing a command sequence inside Section 8.7.7.4 or | When executing a command sequence inside suit-directive-try-each | |||
| Section 8.7.7.13 and a condition failure occurs, the manifest | (Section 8.7.7.3) or suit-directive-run-sequence (Section 8.7.7.12) | |||
| processor aborts the sequence. For suit-directive-try-each, if Soft | and a condition failure occurs, the manifest processor aborts the | |||
| Failure is True, the next sequence in Try Each is invoked, otherwise | sequence. For suit-directive-try-each, if Soft Failure is True, the | |||
| suit-directive-try-each fails with the condition failure code. In | next sequence in Try Each is invoked, otherwise suit-directive-try- | |||
| suit-directive-run-sequence, if Soft Failure is True the suit- | each fails with the condition failure code. In suit-directive-run- | |||
| directive-run-sequence simply halts with no side-effects and the | sequence, if Soft Failure is True the suit-directive-run-sequence | |||
| Manifest Processor continues with the following command, otherwise, | simply halts with no side-effects and the Manifest Processor | |||
| the suit-directive-run-sequence fails with the condition failure | continues with the following command, otherwise, the suit-directive- | |||
| code. | run-sequence fails with the condition failure code. | |||
| suit-parameter-soft-failure is scoped to the enclosing | suit-parameter-soft-failure is scoped to the enclosing | |||
| SUIT_Command_Sequence. Its value is discarded when | SUIT_Command_Sequence. Its value is discarded when | |||
| SUIT_Command_Sequence terminates. It MUST NOT be set outside of | SUIT_Command_Sequence terminates. It MUST NOT be set outside of | |||
| suit-directive-try-each or suit-directive-run-sequence. | suit-directive-try-each or suit-directive-run-sequence. | |||
| When suit-directive-try-each is invoked, Soft Failure defaults to | When suit-directive-try-each is invoked, Soft Failure defaults to | |||
| True. An Update Author may choose to set Soft Failure to False if | True. An Update Author may choose to set Soft Failure to False if | |||
| they require a failed condition in a sequence to force an Abort. | they require a failed condition in a sequence to force an Abort. | |||
| When suit-directive-run-sequence is invoked, Soft Failure defaults to | When suit-directive-run-sequence is invoked, Soft Failure defaults to | |||
| False. An Update Author may choose to make failures soft within a | False. An Update Author may choose to make failures soft within a | |||
| suit-directive-run-sequence. | suit-directive-run-sequence. | |||
| 8.7.5.23. suit-parameter-custom | 8.7.5.24. suit-parameter-custom | |||
| This parameter is an extension point for any proprietary, application | This parameter is an extension point for any proprietary, application | |||
| specific conditions and directives. | specific conditions and directives. It MUST NOT be used in the | |||
| common sequence. This effectively scopes each custom command to a | ||||
| particular Vendor Identifier/Class Identifier pair. | ||||
| 8.7.6. SUIT_Condition | 8.7.6. 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-conditions of any directive or series of directives, depending | post-conditions of any directive or series of directives, depending | |||
| on where they are placed in the list. All Conditions specify a | on where they are placed in the list. All Conditions specify a | |||
| Reporting Policy as described Section 8.7.4. Conditions include: | Reporting Policy as described Section 8.7.4. Conditions include: | |||
| +----------------+----------------------------------+---------------+ | +----------------+----------------------------------+---------------+ | |||
| skipping to change at page 52, line 38 ¶ | skipping to change at page 57, line 38 ¶ | |||
| | | | | | | | | | | |||
| | Minimum | suit-condition-minimum-battery | Section 8.7.6 | | | Minimum | suit-condition-minimum-battery | Section 8.7.6 | | |||
| | Battery | | .6 | | | Battery | | .6 | | |||
| | | | | | | | | | | |||
| | Update | suit-condition-update-authorized | Section 8.7.6 | | | Update | suit-condition-update-authorized | Section 8.7.6 | | |||
| | Authorized | | .7 | | | Authorized | | .7 | | |||
| | | | | | | | | | | |||
| | Version | suit-condition-version | Section 8.7.6 | | | Version | suit-condition-version | Section 8.7.6 | | |||
| | | | .8 | | | | | .8 | | |||
| | | | | | | | | | | |||
| | Custom | SUIT_Condition_Custom | Section 8.7.6 | | | Abort | suit-condition-abort | Section 8.7.6 | | |||
| | Condition | | .9 | | | | | .9 | | |||
| | | | | | ||||
| | Custom | suit-condition-custom | Section 8.7.6 | | ||||
| | Condition | | .10 | | ||||
| +----------------+----------------------------------+---------------+ | +----------------+----------------------------------+---------------+ | |||
| The abstract description of these conditions is defined in | The abstract description of these conditions is defined in | |||
| Section 6.4. | Section 6.4. | |||
| Conditions compare parameters against properties of the system. | Conditions compare parameters against properties of the system. | |||
| These properties may be asserted in many different ways, including: | These properties may be asserted in many different ways, including: | |||
| calculation on-demand, volatile definition in memory, static | calculation on-demand, volatile definition in memory, static | |||
| definition within the manifest processor, storage in known location | definition within the manifest processor, storage in known location | |||
| within an image, storage within a key storage system, storage in One- | within an image, storage within a key storage system, storage in One- | |||
| Time-Programmable memory, inclusion in mask ROM, or inclusion as a | Time-Programmable memory, inclusion in mask ROM, or inclusion as a | |||
| register in hardware. Some of these assertion methods are global in | register in hardware. Some of these assertion methods are global in | |||
| scope, such as a hardware register, some are scoped to an individual | scope, such as a hardware register, some are scoped to an individual | |||
| component, such as storage at a known location in an image, and some | component, such as storage at a known location in an image, and some | |||
| assertion methods can be either global or component-scope, based on | assertion methods can be either global or component-scope, based on | |||
| implementation. | implementation. | |||
| Each condition MUST report a result code on completion. If a | Each condition MUST report a result 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. A subsequent command or command sequence MAY continue | terminate. A subsequent command or command sequence MAY continue | |||
| executing if Section 8.7.5.22 is set. If a condition requires | executing if suit-parameter-soft-failure (Section 8.7.5.23) is set. | |||
| additional information, this MUST be specified in one or more | If a condition requires additional information, this MUST be | |||
| parameters before the condition is executed. If a Recipient attempts | specified in one or more parameters before the condition is executed. | |||
| to process a condition that expects additional information and that | If a Recipient attempts to process a condition that expects | |||
| information has not been set, it MUST report a failure. If a | additional information and that information has not been set, it MUST | |||
| Recipient encounters an unknown condition, it MUST report a failure. | report a failure. If a Recipient encounters an unknown condition, it | |||
| MUST report a failure. | ||||
| Condition labels in the positive number range are reserved for IANA | Condition labels in the positive number range are reserved for IANA | |||
| registration while those in the negative range are custom conditions | registration while those in the negative range are custom conditions | |||
| reserved for proprietary use. See Section 11 for more details. | reserved for proprietary definition by the author of a manifest | |||
| processor. See Section 11 for more details. | ||||
| 8.7.6.1. suit-condition-vendor-identifier, suit-condition-class- | 8.7.6.1. suit-condition-vendor-identifier, suit-condition-class- | |||
| identifier, and suit-condition-device-identifier | identifier, and suit-condition-device-identifier | |||
| 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 Recipient MUST match the specified UUID in order to | installing Recipient MUST match the specified UUID in order to | |||
| consider the manifest valid. These identifiers are scoped by | consider the manifest valid. These identifiers are scoped by | |||
| component in the manifest. The Recipient MAY treat them as scoped by | component in the manifest. Each component MAY match more than one | |||
| component or as global identifiers. | identifier. Care is needed to ensure that manifests correctly | |||
| identify their targets using these conditions. Using only a generic | ||||
| class ID for a device-specific firmware could result in matching | ||||
| devices that are not compatible. | ||||
| 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. | |||
| Each identifier condition compares the corresponding identifier | Each identifier condition compares the corresponding identifier | |||
| parameter to a parameter asserted to the Manifest Processor by the | parameter to a parameter asserted to the Manifest Processor by the | |||
| Recipient. Identifiers MUST be known to the Manifest Processor in | Recipient. Identifiers MUST be known to the Manifest Processor in | |||
| order to evaluate compatibility. | order to evaluate compatibility. | |||
| Globally-scoped identifiers MUST match, regardless of current | ||||
| component index. Component-scoped identifiers match only when the | ||||
| current component index resolves to the component associated with the | ||||
| component-scoped identifier. | ||||
| 8.7.6.2. suit-condition-image-match | 8.7.6.2. suit-condition-image-match | |||
| Verify that the current component matches the Section 8.7.5.5 for the | Verify that the current component matches the suit-parameter-image- | |||
| current component. The digest is verified against the digest | digest (Section 8.7.5.6) for the current component. The digest is | |||
| specified in the Component's parameters list. If no digest is | verified against the digest specified in the Component's parameters | |||
| specified, the condition fails. suit-condition-image-match is | list. If no digest is specified, the condition fails. suit- | |||
| REQUIRED to implement. | condition-image-match is REQUIRED to implement. | |||
| 8.7.6.3. suit-condition-image-not-match | 8.7.6.3. suit-condition-image-not-match | |||
| Verify that the current component does not match the Section 8.7.5.5. | Verify that the current component does not match the suit-parameter- | |||
| If no digest is specified, the condition fails. suit-condition-image- | image-digest (Section 8.7.5.6). If no digest is specified, the | |||
| not-match is OPTIONAL to implement. | condition fails. suit-condition-image-not-match is OPTIONAL to | |||
| implement. | ||||
| 8.7.6.4. suit-condition-use-before | 8.7.6.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. The recipient evaluates the current time | update should be installed. The recipient evaluates the current time | |||
| against the suit-parameter-use-before parameter (Section 8.7.5.7), | against the suit-parameter-use-before parameter (Section 8.7.5.8), | |||
| which must have already been set as a parameter, encoded as a POSIX | which must have already been set as a parameter, encoded as seconds | |||
| timestamp, that is seconds after 1970-01-01 00:00:00. Timestamp | after 1970-01-01 00:00:00 UTC. Timestamp conditions MUST be | |||
| conditions MUST be evaluated in 64 bits, regardless of encoded CBOR | evaluated in 64 bits, regardless of encoded CBOR size. suit- | |||
| size. suit-condition-use-before is OPTIONAL to implement. | condition-use-before is OPTIONAL to implement. | |||
| 8.7.6.5. suit-condition-component-offset | 8.7.6.5. suit-condition-component-offset | |||
| Verify that the offset of the current component matches the offset | Verify that the offset of the current component matches the offset | |||
| set in Section 8.7.5.8. This condition allows a manifest to select | set in suit-parameter-component-offset (Section 8.7.5.9). This | |||
| between several images to match a target offset. | condition allows a manifest to select between several images to match | |||
| a target offset. | ||||
| 8.7.6.6. suit-condition-minimum-battery | 8.7.6.6. suit-condition-minimum-battery | |||
| suit-condition-minimum-battery provides a mechanism to test a | suit-condition-minimum-battery provides a mechanism to test a | |||
| Recipient's battery level before installing an update. This | Recipient's battery level before installing an update. This | |||
| condition is primarily for use in primary-cell applications, where | condition is primarily for use in primary-cell applications, where | |||
| the battery is only ever discharged. For batteries that are charged, | the battery is only ever discharged. For batteries that are charged, | |||
| suit-directive-wait is more appropriate, since it defines a "wait" | suit-directive-wait is more appropriate, since it defines a "wait" | |||
| until the battery level is sufficient to install the update. suit- | until the battery level is sufficient to install the update. suit- | |||
| condition-minimum-battery is specified in mWh. suit-condition- | condition-minimum-battery is specified in mWh. suit-condition- | |||
| minimum-battery is OPTIONAL to implement. suit-condition-minimum- | minimum-battery is OPTIONAL to implement. suit-condition-minimum- | |||
| battery consumes Section 8.7.5.15. | battery consumes suit-parameter-minimum-battery (Section 8.7.5.16). | |||
| 8.7.6.7. suit-condition-update-authorized | 8.7.6.7. suit-condition-update-authorized | |||
| Request Authorization from the application and fail if not | Request Authorization from the application and fail if not | |||
| authorized. This can allow a user to decline an update. | authorized. This can allow a user to decline an update. suit- | |||
| Section 8.7.5.16 provides an integer priority level that the | parameter-update-priority (Section 8.7.5.17) provides an integer | |||
| application can use to determine whether or not to authorize the | priority level that the application can use to determine whether or | |||
| update. Priorities are application defined. suit-condition-update- | not to authorize the update. Priorities are application defined. | |||
| authorized is OPTIONAL to implement. | suit-condition-update-authorized is OPTIONAL to implement. | |||
| 8.7.6.8. suit-condition-version | 8.7.6.8. 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. suit-condition-version examines a | digests are more precise. suit-condition-version examines a | |||
| component's version against the version info specified in | component's version against the version info specified in suit- | |||
| Section 8.7.5.17 | parameter-version (Section 8.7.5.18) | |||
| 8.7.6.9. SUIT_Condition_Custom | 8.7.6.9. suit-condition-abort | |||
| SUIT_Condition_Custom describes any proprietary, application specific | Unconditionally fail. This operation is typically used in | |||
| conjunction with suit-directive-try-each (Section 8.7.7.3). | ||||
| 8.7.6.10. suit-condition-custom | ||||
| 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. If additional information must be provided to | firmware developer. If additional information must be provided to | |||
| the condition, it should be encoded in a custom parameter (a nint) as | the condition, it should be encoded in a custom parameter (a nint) as | |||
| described in Section 8.7.5. SUIT_Condition_Custom is OPTIONAL to | described in Section 8.7.5. SUIT_Condition_Custom is OPTIONAL to | |||
| implement. | implement. | |||
| 8.7.7. SUIT_Directive | 8.7.7. SUIT_Directive | |||
| Directives are used to define the behavior of the recipient. | Directives are used to define the behavior of the recipient. | |||
| Directives include: | Directives include: | |||
| skipping to change at page 56, line 15 ¶ | skipping to change at page 61, line 15 ¶ | |||
| +---------------+-------------------------------------+-------------+ | +---------------+-------------------------------------+-------------+ | |||
| | Name | CDDL Structure | Reference | | | Name | CDDL Structure | Reference | | |||
| +---------------+-------------------------------------+-------------+ | +---------------+-------------------------------------+-------------+ | |||
| | Set Component | suit-directive-set-component-index | Section 8.7 | | | Set Component | suit-directive-set-component-index | Section 8.7 | | |||
| | Index | | .7.1 | | | Index | | .7.1 | | |||
| | | | | | | | | | | |||
| | Set | suit-directive-set-dependency-index | Section 8.7 | | | Set | suit-directive-set-dependency-index | Section 8.7 | | |||
| | Dependency | | .7.2 | | | Dependency | | .7.2 | | |||
| | Index | | | | | Index | | | | |||
| | | | | | | | | | | |||
| | Abort | suit-directive-abort | Section 8.7 | | ||||
| | | | .7.3 | | ||||
| | | | | | ||||
| | Try Each | suit-directive-try-each | Section 8.7 | | | Try Each | suit-directive-try-each | Section 8.7 | | |||
| | | | .7.4 | | | | | .7.3 | | |||
| | | | | | | | | | | |||
| | Process | suit-directive-process-dependency | Section 8.7 | | | Process | suit-directive-process-dependency | Section 8.7 | | |||
| | Dependency | | .7.5 | | | Dependency | | .7.4 | | |||
| | | | | | | | | | | |||
| | Set | suit-directive-set-parameters | Section 8.7 | | | Set | suit-directive-set-parameters | Section 8.7 | | |||
| | Parameters | | .7.6 | | | Parameters | | .7.5 | | |||
| | | | | | | | | | | |||
| | Override | suit-directive-override-parameters | Section 8.7 | | | Override | suit-directive-override-parameters | Section 8.7 | | |||
| | Parameters | | .7.7 | | | Parameters | | .7.6 | | |||
| | | | | | | | | | | |||
| | Fetch | suit-directive-fetch | Section 8.7 | | | Fetch | suit-directive-fetch | Section 8.7 | | |||
| | | | .7.8 | | | | | .7.7 | | |||
| | | | | | ||||
| | Fetch URI | suit-directive-fetch-uri-list | Section 8.7 | | ||||
| | list | | .7.8 | | ||||
| | | | | | | | | | | |||
| | Copy | suit-directive-copy | Section 8.7 | | | Copy | suit-directive-copy | Section 8.7 | | |||
| | | | .7.10 | | | | | .7.9 | | |||
| | | | | | | | | | | |||
| | Run | suit-directive-run | Section 8.7 | | | Run | suit-directive-run | Section 8.7 | | |||
| | | | .7.11 | | | | | .7.10 | | |||
| | | | | | | | | | | |||
| | Wait For | suit-directive-wait | Section 8.7 | | | Wait For | suit-directive-wait | Section 8.7 | | |||
| | Event | | .7.12 | | | Event | | .7.11 | | |||
| | | | | | | | | | | |||
| | Run Sequence | suit-directive-run-sequence | Section 8.7 | | | Run Sequence | suit-directive-run-sequence | Section 8.7 | | |||
| | | | .7.13 | | | | | .7.12 | | |||
| | | | | | | | | | | |||
| | Swap | suit-directive-swap | Section 8.7 | | | Swap | suit-directive-swap | Section 8.7 | | |||
| | | | .7.14 | | | | | .7.13 | | |||
| | | | | | ||||
| | Fetch URI | suit-directive-fetch-uri-list | Section 8.7 | | ||||
| | list | | .7.9 | | ||||
| +---------------+-------------------------------------+-------------+ | +---------------+-------------------------------------+-------------+ | |||
| The abstract description of these commands is defined in Section 6.4. | The abstract description of these commands is defined in Section 6.4. | |||
| When a Recipient executes a Directive, it MUST report a result code. | When a Recipient executes a Directive, it MUST report a result code. | |||
| If the Directive reports failure, then the current Command Sequence | If the Directive reports failure, then the current Command Sequence | |||
| MUST terminate. | MUST be terminated. | |||
| 8.7.7.1. suit-directive-set-component-index | 8.7.7.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 suit-components. | one of three types: | |||
| If the following commands apply to ALL components, then the boolean | ||||
| value "True" is used instead of an index. If the following commands | 1. An unsigned integer (REQUIRED to implement in parser) | |||
| apply to NO components, then the boolean value "False" is used. When | ||||
| suit-directive-set-dependency-index is used, suit-directive-set- | 2. A boolean (REQUIRED to implement in parser ONLY IF 2 or more | |||
| component-index = False is implied. When suit-directive-set- | components supported) | |||
| component-index is used, suit-directive-set-dependency-index = False | ||||
| is implied. | 3. An array of unsigned integers (REQUIRED to implement in parser | |||
| ONLY IF 3 or more components supported) | ||||
| If the following commands apply to ONE component, an unsigned integer | ||||
| index into the component list is used. If the following commands | ||||
| apply to ALL components, then the boolean value "True" is used | ||||
| instead of an index. If the following commands apply to more than | ||||
| one, but not all components, then an array of unsigned integer | ||||
| indices into the component list is used. TODO: Component list | ||||
| If the following commands apply to NO components, then the boolean | ||||
| value "False" is used. When suit-directive-set-dependency-index is | ||||
| used, suit-directive-set-component-index = False is implied. When | ||||
| suit-directive-set-component-index is used, suit-directive-set- | ||||
| dependency-index = False is implied. | ||||
| If component index is set to True when a command is invoked, then the | If component index is set to True when a command is invoked, then the | |||
| command applies to all components, in the order they appear in suit- | command applies to all components, in the order they appear in suit- | |||
| common-components. When the Manifest Processor invokes a command | common-components. When the Manifest Processor invokes a command | |||
| while the component index is set to True, it must execute the command | while the component index is set to True, it must execute the command | |||
| once for each possible component index, ensuring that the command | once for each possible component index, ensuring that the command | |||
| receives the parameters corresponding to that component index. | receives the parameters corresponding to that component index. | |||
| 8.7.7.2. suit-directive-set-dependency-index | 8.7.7.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- | |||
| index = False is implied. | index = False is implied. TODO: Component list|Dependency List | |||
| If dependency index is set to True when a command is invoked, then | If dependency index is set to True when a command is invoked, then | |||
| the command applies to all dependencies, in the order they appear in | the command applies to all dependencies, in the order they appear in | |||
| suit-common-components. When the Manifest Processor invokes a | suit-common-components. When the Manifest Processor invokes a | |||
| command while the dependency index is set to True, it must execute | command while the dependency index is set to True, it must execute | |||
| the command once for each possible dependency index, ensuring that | the command once for each possible dependency index, ensuring that | |||
| the command receives the parameters corresponding to that dependency | the command receives the parameters corresponding to that dependency | |||
| index. | index. | |||
| Typical operations that require suit-directive-set-dependency-index | Typical operations that require suit-directive-set-dependency-index | |||
| include setting a source URI or Encryption Information, invoking | include setting a source URI or Encryption Information, invoking | |||
| "Fetch," or invoking "Process Dependency" for an individual | "Fetch," or invoking "Process Dependency" for an individual | |||
| dependency. | dependency. | |||
| 8.7.7.3. suit-directive-abort | 8.7.7.3. suit-directive-try-each | |||
| Unconditionally fail. This operation is typically used in | ||||
| conjunction with suit-directive-try-each. | ||||
| 8.7.7.4. suit-directive-try-each | ||||
| This command runs several SUIT_Command_Sequence, one after another, | This command runs several SUIT_Command_Sequence instances, one after | |||
| in a strict order. Use this command to implement a "try/catch-try/ | another, in a strict order. Use this command to implement a "try/ | |||
| catch" sequence. Manifest processors MAY implement this command. | catch-try/catch" sequence. Manifest processors MAY implement this | |||
| command. | ||||
| Section 8.7.5.22 is initialized to True at the beginning of each | suit-parameter-soft-failure (Section 8.7.5.23) is initialized to True | |||
| sequence. If one sequence aborts due to a condition failure, the | at the beginning of each sequence. If one sequence aborts due to a | |||
| next is started. If no sequence completes without condition failure, | condition failure, the next is started. If no sequence completes | |||
| then suit-directive-try-each returns an error. If a particular | without condition failure, then suit-directive-try-each returns an | |||
| application calls for all sequences to fail and still continue, then | error. If a particular application calls for all sequences to fail | |||
| an empty sequence (nil) can be added to the Try Each Argument. | and still continue, then an empty sequence (nil) can be added to the | |||
| Try Each Argument. | ||||
| The argument to suit-directive-try-each is a list of | The argument to suit-directive-try-each is a list of | |||
| SUIT_Command_Sequence. suit-directive-try-each does not specify a | SUIT_Command_Sequence. suit-directive-try-each does not specify a | |||
| reporting policy. | reporting policy. | |||
| 8.7.7.5. suit-directive-process-dependency | 8.7.7.4. 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 | |||
| the current dependency is True, then this directive applies to all | the current dependency is True, then this directive applies to all | |||
| dependencies. If the current section is "common," this directive | dependencies. If the current section is "common," then the command | |||
| MUST have no effect. | sequence MUST be terminated with an error. | |||
| 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. | |||
| 8.7.7.6. suit-directive-set-parameters | 8.7.7.5. suit-directive-set-parameters | |||
| suit-directive-set-parameters allows the manifest to configure | suit-directive-set-parameters allows the manifest to configure | |||
| behavior of future directives by changing parameters that are read by | behavior of future directives by changing parameters that are read by | |||
| those directives. When dependencies are used, suit-directive-set- | those directives. When dependencies are used, suit-directive-set- | |||
| parameters also allows a manifest to modify the behavior of its | parameters also allows a manifest to modify the behavior of its | |||
| dependencies. | dependencies. | |||
| Available parameters are defined in Section 8.7.5. | Available parameters are defined in Section 8.7.5. | |||
| 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 | |||
| behavior of a manifest. | behavior of a manifest. | |||
| suit-directive-set-parameters does not specify a reporting policy. | suit-directive-set-parameters does not specify a reporting policy. | |||
| 8.7.7.7. suit-directive-override-parameters | 8.7.7.6. 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 8.7.5. | Available parameters are defined in Section 8.7.5. | |||
| suit-directive-override-parameters does not specify a reporting | suit-directive-override-parameters does not specify a reporting | |||
| policy. | policy. | |||
| 8.7.7.8. suit-directive-fetch | 8.7.7.7. 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 dependency-index, | manifest listed in component-index and dependency-index, | |||
| respectively. If component-index or dependency-index is True, | respectively. If component-index or dependency-index is True, | |||
| instead of an integer, then all current manifest components/manifests | instead of an integer, then all current manifest components/manifests | |||
| skipping to change at page 60, line 9 ¶ | skipping to change at page 65, line 21 ¶ | |||
| suit-directive-fetch reads the URI parameter to find the source of | suit-directive-fetch reads the URI parameter to find the source of | |||
| the fetch it performs. | the fetch it performs. | |||
| The behavior of suit-directive-fetch can be modified by setting one | The behavior of suit-directive-fetch can be modified by setting one | |||
| or more of SUIT_Parameter_Encryption_Info, | or more of SUIT_Parameter_Encryption_Info, | |||
| 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. | |||
| 8.7.7.9. suit-directive-fetch-uri-list | 8.7.7.8. suit-directive-fetch-uri-list | |||
| suit-directive-fetch-uri-list uses the same semantics as | suit-directive-fetch-uri-list uses the same semantics as suit- | |||
| Section 8.7.7.8, however it iterates over the URI List | directive-fetch (Section 8.7.7.7), except that it iterates over the | |||
| (Section 8.7.5.19) to select a URI to fetch from. | URI List (Section 8.7.5.20) to select a URI to fetch from. | |||
| 8.7.7.10. suit-directive-copy | 8.7.7.9. 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. As described in | |||
| copy retrieves each component listed in component-index, | Section 6.5 component index may be a single integer, a list of | |||
| respectively. If component-index is True, instead of an integer, | integers, or True. suit-directive-copy retrieves each component | |||
| then all current manifest components are copied. The current | specified by the current component-index, respectively. 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. | |||
| The behavior of suit-directive-copy can be modified by setting one or | The behavior of suit-directive-copy can be modified by setting one or | |||
| more of SUIT_Parameter_Encryption_Info, | more of SUIT_Parameter_Encryption_Info, | |||
| 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- | |||
| copy. | copy. | |||
| suit-directive-copy reads its source from Section 8.7.5.13. | suit-directive-copy reads its source from suit-parameter-source- | |||
| component (Section 8.7.5.14). | ||||
| 8.7.7.11. suit-directive-run | If either the source component parameter or the source component | |||
| itself is absent, this command fails. | ||||
| 8.7.7.10. 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 are provided to suit-directive-run | Component Index. Arguments are provided to suit-directive-run | |||
| through suit-parameter-run-arguments (Section 8.7.5.14) and are | through suit-parameter-run-arguments (Section 8.7.5.15) and are | |||
| forwarded to the executable code located in Component Index in an | forwarded to the executable code located in Component Index in an | |||
| application-specific way. For example, this could form the Linux | application-specific way. For example, this could form the Linux | |||
| Kernel Command Line if booting a Linux device. | Kernel Command 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. | |||
| 8.7.7.12. suit-directive-wait | 8.7.7.11. 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. Authorization | 1. Authorization | |||
| 2. External Power | 2. External Power | |||
| 3. Network availability | 3. Network availability | |||
| 4. Other Device Firmware Version | 4. Other Device Firmware Version | |||
| 5. Time | 5. Time | |||
| 6. Time of Day | 6. Time of Day | |||
| 7. Day of Week | 7. Day of Week | |||
| 8.7.7.13. suit-directive-run-sequence | 8.7.7.12. 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. | |||
| 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 Soft Failure | status code that occurred in the sequence. If the Soft Failure | |||
| parameter is true, then suit-directive-run-sequence only fails when a | parameter is true, then suit-directive-run-sequence only fails when a | |||
| directive in the argument sequence fails. | directive in the argument sequence fails. | |||
| Section 8.7.5.22 defaults to False when suit-directive-run-sequence | suit-parameter-soft-failure (Section 8.7.5.23) defaults to False when | |||
| begins. Its value is discarded when suit-directive-run-sequence | suit-directive-run-sequence begins. Its value is discarded when | |||
| terminates. | suit-directive-run-sequence terminates. | |||
| 8.7.7.14. suit-directive-swap | 8.7.7.13. 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. As with suit-directive-copy, if the source component is | |||
| SUIT_Parameter_Encryption_Info are present, they MUST be handled in a | missing, this command fails. | |||
| symmetric way, so that the source is decompressed into the | ||||
| destination and the destination is compressed into the source. The | If SUIT_Parameter_Compression_Info or SUIT_Parameter_Encryption_Info | |||
| source is decrypted into the destination and the destination is | are present, they MUST be handled in a symmetric way, so that the | |||
| encrypted into the source. suit-directive-swap is OPTIONAL to | source is decompressed into the destination and the destination is | |||
| implement. | compressed into the source. The source is decrypted into the | |||
| destination and the destination is encrypted into the source. suit- | ||||
| directive-swap is OPTIONAL to implement. | ||||
| 8.7.8. Integrity Check Values | 8.7.8. Integrity Check Values | |||
| When the CoSWID, Text section, or any Command Sequence of the Update | When the CoSWID, Text section, or any Command Sequence of the Update | |||
| Procedure is made severable, it is moved to the Envelope and replaced | Procedure is made severable, it is moved to the Envelope and replaced | |||
| with a SUIT_Digest. The SUIT_Digest is computed over the entire bstr | with a SUIT_Digest. The SUIT_Digest is computed over the entire bstr | |||
| enclosing the Manifest element that has been moved to the Envelope. | enclosing the Manifest element that has been moved to the Envelope. | |||
| Each element that is made severable from the Manifest is placed in | Each element that is made severable from the Manifest is placed in | |||
| the Envelope with an identical key, so that it matches the key of the | the Envelope. The keys for the envelope elements have the same | |||
| corresponding Integrity Check Value. | values as the keys for the manifest elements. | |||
| Each Integrity Check Value covers the corresponding Envelope Element | Each Integrity Check Value covers the corresponding Envelope Element | |||
| as described in Section 8.8. | as described in Section 8.8. | |||
| 8.8. Severable Elements | 8.8. Severable Elements | |||
| Because the manifest can be used by different actors at different | Because the manifest can be used by different actors at different | |||
| times, some parts of the manifest can be removed or "Severed" without | times, some parts of the manifest can be removed or "Severed" without | |||
| affecting later stages of the lifecycle. Severing of information is | affecting later stages of the lifecycle. Severing of information is | |||
| achieved by separating that information from the signed container so | achieved by separating that information from the signed container so | |||
| skipping to change at page 63, line 20 ¶ | skipping to change at page 68, line 36 ¶ | |||
| 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 | |||
| much increase in complexity. | much increase in complexity. | |||
| A second model requires an ACL to be presented to the Recipient, | A second model requires an ACL to be presented to the Recipient, | |||
| authenticated by a trusted party or stored on the Recipient. This | authenticated by a trusted party or stored on the Recipient. This | |||
| ACL grants access rights for specific component IDs or component ID | ACL grants access rights for specific component IDs or Component | |||
| prefixes to the listed identities or identity groups. Any identity | Identifier prefixes to the listed identities or identity groups. Any | |||
| may verify an image digest, but fetching into or fetching from a | identity can verify an image digest, but fetching into or fetching | |||
| component ID requires approval from the ACL. | from a Component Identifier requires approval from the ACL. | |||
| A third model allows a Recipient to provide even more fine-grained | A third model allows a Recipient to provide even more fine-grained | |||
| controls: The ACL lists the component ID or component ID prefix that | controls: The ACL lists the Component Identifier or Component | |||
| an identity may use, and also lists the commands that the identity | Identifier prefix that an identity can use, and also lists the | |||
| may use in combination with that component ID. | commands and parameters that the identity can use in combination with | |||
| that Component Identifier. | ||||
| 10. SUIT Digest Container | 10. 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. | These can be added following the digest. | |||
| The SUIT digest is a CBOR List containing two elements: a suit- | The SUIT digest is a CBOR List containing two elements: a suit- | |||
| digest-algorithm-id and a bstr containing the bytes of the digest. | digest-algorithm-id and a bstr containing the bytes of the digest. | |||
| 11. IANA Considerations | 11. IANA Considerations | |||
| IANA is requested to: | IANA is requested to: | |||
| - allocate a CBOR tag for the SUIT Envelope and another for the SUIT | - allocate CBOR tag 48 in the CBOR Tags registry for the SUIT | |||
| Envelope. | ||||
| - allocate CBOR tag 480 in the CBOR Tags registry for the SUIT | ||||
| Manifest. | Manifest. | |||
| - allocate a media type for suit: application/suit-envelope | - allocate media type application/suit-envelope in the Media Types | |||
| registry. | ||||
| - setup several registries as described below. | ||||
| - setup several registries as described below | ||||
| IANA is requested to setup a registry for SUIT manifests. Several | IANA is requested to setup a registry for SUIT manifests. Several | |||
| registries defined in the subsections below need to be created. | registries defined in the subsections below need to be created. | |||
| For each registry, values 0-23 are Standards Action, 24-255 are IETF | For each registry, values 0-23 are Standards Action, 24-255 are IETF | |||
| Review, 256-65535 are Expert Review, and 65536 or greater are First | Review, 256-65535 are Expert Review, and 65536 or greater are First | |||
| Come First Served. | Come First Served. | |||
| Negative values -23 to 0 are Experimental Use, -24 and lower are | Negative values -23 to 0 are Experimental Use, -24 and lower are | |||
| Private Use. | Private Use. | |||
| 11.1. SUIT Commands | 11.1. SUIT Commands | |||
| +-------+----------------------+ | +-------+------------+-----------------------------------+----------+ | |||
| | Label | Name | | | Label | Name | Reference | | | |||
| +-------+----------------------+ | +-------+------------+-----------------------------------+----------+ | |||
| | 1 | Vendor Identifier | | | 1 | Vendor | Section 8.7.6.1 | | | |||
| | | | | | | Identifier | | | | |||
| | 2 | Class Identifier | | | | | | | | |||
| | | | | | 2 | Class | Section 8.7.6.1 | | | |||
| | 3 | Image Match | | | | Identifier | | | | |||
| | | | | | | | | | | |||
| | 4 | Use Before | | | 3 | Image | Section 8.7.6.2 | | | |||
| | | | | | | Match | | | | |||
| | 5 | Component Offset | | | | | | | | |||
| | | | | | 4 | Use Before | Section 8.7.6.4 | | | |||
| | 12 | Set Component Index | | | | | | | | |||
| | | | | | 5 | Component | Section 8.7.6.5 | | | |||
| | 13 | Set Dependency Index | | | | Offset | | | | |||
| | | | | | | | | | | |||
| | 14 | Abort | | | 12 | Set | Section 8.7.7.1 | | | |||
| | | | | | | Component | | | | |||
| | 15 | Try Each | | | | Index | | | | |||
| | | | | | | | | | | |||
| | 16 | Reserved | | | 13 | Set | Section 8.7.7.2 | | | |||
| | | | | | | Dependency | | | | |||
| | 17 | Reserved | | | | Index | | | | |||
| | | | | | | | | | | |||
| | 18 | Process Dependency | | | 14 | Abort | | | | |||
| | | | | | | | | | | |||
| | 19 | Set Parameters | | | 15 | Try Each | Section 8.7.7.3 | | | |||
| | | | | | | | | | | |||
| | 20 | Override Parameters | | | 16 | Reserved | | | | |||
| | | | | | | | | | | |||
| | 21 | Fetch | | | 17 | Reserved | | | | |||
| | | | | | | | | | | |||
| | 22 | Copy | | | 18 | Process | suit-directive-process-dependency | Section | | |||
| | | | | | | Dependency | | 8.7.7.4 | | |||
| | 23 | Run | | | | | | | | |||
| | | | | | 19 | Set | Section 8.7.7.5 | | | |||
| | 24 | Device Identifier | | | | Parameters | | | | |||
| | | | | | | | | | | |||
| | 25 | Image Not Match | | | 20 | Override | Section 8.7.7.6 | | | |||
| | | | | | | Parameters | | | | |||
| | 26 | Minimum Battery | | | | | | | | |||
| | | | | | 21 | Fetch | Section 8.7.7.7 | | | |||
| | 27 | Update Authorized | | | | | | | | |||
| | | | | | 22 | Copy | Section 8.7.7.9 | | | |||
| | 28 | Version | | | | | | | | |||
| | | | | | 23 | Run | Section 8.7.7.10 | | | |||
| | 29 | Wait For Event | | | | | | | | |||
| | | | | | 24 | Device | Section 8.7.6.1 | | | |||
| | 30 | Fetch URI List | | | | Identifier | | | | |||
| | | | | | | | | | | |||
| | 31 | Swap | | | 25 | Image Not | Section 8.7.6.3 | | | |||
| | | | | | | Match | | | | |||
| | 32 | Run Sequence | | | | | | | | |||
| | | | | | 26 | Minimum | Section 8.7.6.6 | | | |||
| | nint | Custom Condition | | | | Battery | | | | |||
| +-------+----------------------+ | | | | | | | |||
| | 27 | Update | Section 8.7.6.7 | | | ||||
| | | Authorized | | | | ||||
| | | | | | | ||||
| | 28 | Version | Section 8.7.6.8 | | | ||||
| | | | | | | ||||
| | 29 | Wait For | Section 8.7.7.11 | | | ||||
| | | Event | | | | ||||
| | | | | | | ||||
| | 30 | Fetch URI | Section 8.7.7.8 | | | ||||
| | | List | | | | ||||
| | | | | | | ||||
| | 31 | Swap | Section 8.7.7.13 | | | ||||
| | | | | | | ||||
| | 32 | Run | Section 8.7.7.12 | | | ||||
| | | Sequence | | | | ||||
| | | | | | | ||||
| | nint | Custom | Section 8.7.6.10 | | | ||||
| | | Condition | | | | ||||
| +-------+------------+-----------------------------------+----------+ | ||||
| 11.2. SUIT Parameters | 11.2. SUIT Parameters | |||
| +-------+------------------+ | +-------+------------------+---------------------------+ | |||
| | Label | Name | | | Label | Name | Reference | | |||
| +-------+------------------+ | +-------+------------------+---------------------------+ | |||
| | 1 | Vendor ID | | | 1 | Vendor ID | Section 8.7.5.3 | | |||
| | | | | | | | | | |||
| | 2 | Class ID | | | 2 | Class ID | Section 8.7.5.4 | | |||
| | | | | | | | | | |||
| | 3 | Image Digest | | | 3 | Image Digest | Section 8.7.5.6 | | |||
| | | | | | | | | | |||
| | 4 | Use Before | | | 4 | Use Before | Section 8.7.5.8 | | |||
| | | | | | | | | | |||
| | 5 | Component Offset | | | 5 | Component Offset | Section 8.7.5.9 | | |||
| | | | | | | | | | |||
| | 12 | Strict Order | | | 12 | Strict Order | Section 8.7.5.22 | | |||
| | | | | | | | | | |||
| | 13 | Soft Failure | | | 13 | Soft Failure | Section 8.7.5.23 | | |||
| | | | | | | | | | |||
| | 14 | Image Size | | | 14 | Image Size | Section 8.7.5.7 | | |||
| | | | | | | | | | |||
| | 18 | Encryption Info | | | 18 | Encryption Info | Section 8.7.5.10 | | |||
| | | | | | | | | | |||
| | 19 | Compression Info | | | 19 | Compression Info | Section 8.7.5.11 | | |||
| | | | | | | | | | |||
| | 20 | Unpack Info | | | 20 | Unpack Info | Section 8.7.5.12 | | |||
| | | | | | | | | | |||
| | 21 | URI | | | 21 | URI | Section 8.7.5.13 | | |||
| | | | | | | | | | |||
| | 22 | Source Component | | | 22 | Source Component | Section 8.7.5.14 | | |||
| | | | | | | | | | |||
| | 23 | Run Args | | | 23 | Run Args | Section 8.7.5.15 | | |||
| | | | | | | | | | |||
| | 24 | Device ID | | | 24 | Device ID | Section 8.7.5.5 | | |||
| | | | | | | | | | |||
| | 26 | Minimum Battery | | | 26 | Minimum Battery | Section 8.7.5.16 | | |||
| | | | | | | | | | |||
| | 27 | Update Priority | | | 27 | Update Priority | Section 8.7.5.17 | | |||
| | | | | | | | | | |||
| | 28 | Version | | | 28 | Version | {{suit-parameter-version} | | |||
| | | | | | | | | | |||
| | 29 | Wait Info | | | 29 | Wait Info | Section 8.7.5.19 | | |||
| | | | | | | | | | |||
| | 30 | URI List | | | 30 | URI List | Section 8.7.5.20 | | |||
| | | | | | | | | | |||
| | 31 | Component Index | | | nint | Custom | Section 8.7.5.24 | | |||
| | | | | +-------+------------------+---------------------------+ | |||
| | nint | Custom | | ||||
| +-------+------------------+ | ||||
| 11.3. SUIT Text Values | 11.3. SUIT Text Values | |||
| +-------+----------------------+ | +-------+----------------------+---------------+ | |||
| | Label | Name | | | Label | Name | Reference | | |||
| +-------+----------------------+ | +-------+----------------------+---------------+ | |||
| | 1 | Manifest Description | | | 1 | Manifest Description | Section 8.6.4 | | |||
| | | | | | | | | | |||
| | 2 | Update Description | | | 2 | Update Description | Section 8.6.4 | | |||
| | | | | | | | | | |||
| | 3 | Manifest JSON Source | | | 3 | Manifest JSON Source | Section 8.6.4 | | |||
| | | | | | | | | | |||
| | 4 | Manifest YAML Source | | | 4 | Manifest YAML Source | Section 8.6.4 | | |||
| | | | | | | | | | |||
| | nint | Custom | | | nint | Custom | Section 8.6.4 | | |||
| +-------+----------------------+ | +-------+----------------------+---------------+ | |||
| 11.4. SUIT Component Text Values | 11.4. SUIT Component Text Values | |||
| +-------+----------------------------+ | +-------+----------------------------+---------------+ | |||
| | Label | Name | | | Label | Name | Reference | | |||
| +-------+----------------------------+ | +-------+----------------------------+---------------+ | |||
| | 1 | Vendor Name | | | 1 | Vendor Name | Section 8.6.4 | | |||
| | | | | | | | | | |||
| | 2 | Model Name | | | 2 | Model Name | Section 8.6.4 | | |||
| | | | | | | | | | |||
| | 3 | Vendor Domain | | | 3 | Vendor Domain | Section 8.6.4 | | |||
| | | | | | | | | | |||
| | 4 | Model Info | | | 4 | Model Info | Section 8.6.4 | | |||
| | | | | | | | | | |||
| | 5 | Component Description | | | 5 | Component Description | Section 8.6.4 | | |||
| | | | | | | | | | |||
| | 6 | Component Version | | | 6 | Component Version | Section 8.6.4 | | |||
| | | | | | | | | | |||
| | 7 | Component Version Required | | | 7 | Component Version Required | Section 8.6.4 | | |||
| | | | | | | | | | |||
| | nint | Custom | | | nint | Custom | Section 8.6.4 | | |||
| +-------+----------------------------+ | +-------+----------------------------+---------------+ | |||
| 11.5. SUIT Algorithm Identifiers | 11.5. SUIT Algorithm Identifiers | |||
| 11.5.1. SUIT Digest Algorithm Identifiers | 11.5.1. SUIT Digest Algorithm Identifiers | |||
| +-------+----------+ | +-------+----------+------------+ | |||
| | Label | Name | | | Label | Name | | | |||
| +-------+----------+ | +-------+----------+------------+ | |||
| | 1 | SHA224 | | | 1 | SHA224 | Section 10 | | |||
| | | | | | | | | | |||
| | 2 | SHA256 | | | 2 | SHA256 | Section 10 | | |||
| | | | | | | | | | |||
| | 3 | SHA384 | | | 3 | SHA384 | Section 10 | | |||
| | | | | | | | | | |||
| | 4 | SHA512 | | | 4 | SHA512 | Section 10 | | |||
| | | | | | | | | | |||
| | 5 | SHA3-224 | | | 5 | SHA3-224 | Section 10 | | |||
| | | | | | | | | | |||
| | 6 | SHA3-256 | | | 6 | SHA3-256 | Section 10 | | |||
| | | | | | | | | | |||
| | 7 | SHA3-384 | | | 7 | SHA3-384 | Section 10 | | |||
| | | | | | | | | | |||
| | 8 | SHA3-512 | | | 8 | SHA3-512 | Section 10 | | |||
| +-------+----------+ | +-------+----------+------------+ | |||
| 11.5.2. SUIT Compression Algorithm Identifiers | 11.5.2. SUIT Compression Algorithm Identifiers | |||
| +-------+--------+ | +-------+--------+------------------+ | |||
| | Label | Name | | | Label | Name | Reference | | |||
| +-------+--------+ | +-------+--------+------------------+ | |||
| | 1 | zlib | | | 1 | zlib | Section 8.7.5.11 | | |||
| | | | | | | | | | |||
| | 2 | Brotli | | | 2 | Brotli | Section 8.7.5.11 | | |||
| | | | | | | | | | |||
| | 3 | zstd | | | 3 | zstd | Section 8.7.5.11 | | |||
| +-------+--------+ | +-------+--------+------------------+ | |||
| 11.5.3. Unpack Algorithms | 11.5.3. Unpack Algorithms | |||
| +-------+------+ | +-------+------+------------------+ | |||
| | Label | Name | | | Label | Name | Reference | | |||
| +-------+------+ | +-------+------+------------------+ | |||
| | 1 | HEX | | | 1 | HEX | Section 8.7.5.12 | | |||
| | | | | | | | | | |||
| | 2 | ELF | | | 2 | ELF | Section 8.7.5.12 | | |||
| | | | | | | | | | |||
| | 3 | COFF | | | 3 | COFF | Section 8.7.5.12 | | |||
| | | | | | | | | | |||
| | 4 | SREC | | | 4 | SREC | Section 8.7.5.12 | | |||
| +-------+------+ | +-------+------+------------------+ | |||
| 12. Security Considerations | 12. Security Considerations | |||
| This document is about a manifest format describing and protecting | This document is about a manifest format protecting and describing | |||
| firmware images and as such it is part of a larger solution for | how to retrieve, install, and invoke firmware images and as such it | |||
| offering a standardized way of delivering firmware updates to IoT | is part of a larger solution for delivering firmware updates to IoT | |||
| devices. A detailed security treatment can be found in the | devices. A detailed security treatment can be found in the | |||
| architecture [I-D.ietf-suit-architecture] and in the information | architecture [I-D.ietf-suit-architecture] and in the information | |||
| model [I-D.ietf-suit-information-model] documents. | model [I-D.ietf-suit-information-model] documents. | |||
| 13. Acknowledgements | 13. 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 | |||
| skipping to change at page 70, line 35 ¶ | skipping to change at page 76, line 35 ¶ | |||
| [COFF] Wikipedia, ., "Common Object File Format (COFF)", 2020, | [COFF] Wikipedia, ., "Common Object File Format (COFF)", 2020, | |||
| <https://en.wikipedia.org/wiki/COFF>. | <https://en.wikipedia.org/wiki/COFF>. | |||
| [ELF] Wikipedia, ., "Executable and Linkable Format (ELF)", | [ELF] Wikipedia, ., "Executable and Linkable Format (ELF)", | |||
| 2020, <https://en.wikipedia.org/wiki/ | 2020, <https://en.wikipedia.org/wiki/ | |||
| Executable_and_Linkable_Format>. | Executable_and_Linkable_Format>. | |||
| [HEX] Wikipedia, ., "Intel HEX", 2020, | [HEX] Wikipedia, ., "Intel HEX", 2020, | |||
| <https://en.wikipedia.org/wiki/Intel_HEX>. | <https://en.wikipedia.org/wiki/Intel_HEX>. | |||
| [I-D.ietf-cbor-tags-oid] | ||||
| Bormann, C. and S. Leonard, "Concise Binary Object | ||||
| Representation (CBOR) Tags for Object Identifiers", draft- | ||||
| ietf-cbor-tags-oid-02 (work in progress), October 2020. | ||||
| [I-D.ietf-sacm-coswid] | ||||
| Birkholz, H., Fitzgerald-McKay, J., Schmidt, C., and D. | ||||
| Waltermire, "Concise Software Identification Tags", draft- | ||||
| ietf-sacm-coswid-15 (work in progress), May 2020. | ||||
| [I-D.ietf-suit-architecture] | [I-D.ietf-suit-architecture] | |||
| Moran, B., Tschofenig, H., Brown, D., and M. Meriac, "A | Moran, B., Tschofenig, H., Brown, D., and M. Meriac, "A | |||
| Firmware Update Architecture for Internet of Things", | Firmware Update Architecture for Internet of Things", | |||
| draft-ietf-suit-architecture-11 (work in progress), May | draft-ietf-suit-architecture-14 (work in progress), | |||
| 2020. | October 2020. | |||
| [I-D.ietf-suit-information-model] | [I-D.ietf-suit-information-model] | |||
| Moran, B., Tschofenig, H., and H. Birkholz, "An | Moran, B., Tschofenig, H., and H. Birkholz, "An | |||
| Information Model for Firmware Updates in IoT Devices", | Information Model for Firmware Updates in IoT Devices", | |||
| draft-ietf-suit-information-model-07 (work in progress), | draft-ietf-suit-information-model-08 (work in progress), | |||
| June 2020. | October 2020. | |||
| [I-D.ietf-teep-architecture] | [I-D.ietf-teep-architecture] | |||
| Pei, M., Tschofenig, H., Thaler, D., and D. Wheeler, | Pei, M., Tschofenig, H., Thaler, D., and D. Wheeler, | |||
| "Trusted Execution Environment Provisioning (TEEP) | "Trusted Execution Environment Provisioning (TEEP) | |||
| Architecture", draft-ietf-teep-architecture-11 (work in | Architecture", draft-ietf-teep-architecture-12 (work in | |||
| progress), July 2020. | progress), July 2020. | |||
| [I-D.kucherawy-rfc8478bis] | [I-D.kucherawy-rfc8478bis] | |||
| Collet, Y. and M. Kucherawy, "Zstandard Compression and | Collet, Y. and M. Kucherawy, "Zstandard Compression and | |||
| the application/zstd Media Type", draft-kucherawy- | the application/zstd Media Type", draft-kucherawy- | |||
| rfc8478bis-05 (work in progress), April 2020. | rfc8478bis-05 (work in progress), April 2020. | |||
| [RFC1950] Deutsch, P. and J-L. Gailly, "ZLIB Compressed Data Format | [RFC1950] Deutsch, P. and J-L. Gailly, "ZLIB Compressed Data Format | |||
| Specification version 3.3", RFC 1950, | Specification version 3.3", RFC 1950, | |||
| DOI 10.17487/RFC1950, May 1996, | DOI 10.17487/RFC1950, May 1996, | |||
| skipping to change at page 71, line 36 ¶ | skipping to change at page 77, line 48 ¶ | |||
| May 2018, <https://www.rfc-editor.org/info/rfc8392>. | May 2018, <https://www.rfc-editor.org/info/rfc8392>. | |||
| [RFC8747] Jones, M., Seitz, L., Selander, G., Erdtman, S., and H. | [RFC8747] Jones, M., Seitz, L., Selander, G., Erdtman, S., and H. | |||
| Tschofenig, "Proof-of-Possession Key Semantics for CBOR | Tschofenig, "Proof-of-Possession Key Semantics for CBOR | |||
| Web Tokens (CWTs)", RFC 8747, DOI 10.17487/RFC8747, March | Web Tokens (CWTs)", RFC 8747, DOI 10.17487/RFC8747, March | |||
| 2020, <https://www.rfc-editor.org/info/rfc8747>. | 2020, <https://www.rfc-editor.org/info/rfc8747>. | |||
| [SREC] Wikipedia, ., "SREC (file format)", 2020, | [SREC] Wikipedia, ., "SREC (file format)", 2020, | |||
| <https://en.wikipedia.org/wiki/SREC_(file_format)>. | <https://en.wikipedia.org/wiki/SREC_(file_format)>. | |||
| 14.3. URIs | [YAML] "YAML Ain't Markup Language", 2020, <https://yaml.org/>. | |||
| [1] suit-condition-update-authorized | ||||
| A. Full CDDL | Appendix A. A. 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_Envelope_Tagged = #6.48(SUIT_Envelope) | ||||
| SUIT_Envelope = { | SUIT_Envelope = { | |||
| ? suit-delegation => bstr .cbor SUIT_Delegation, | ? suit-delegation => bstr .cbor SUIT_Delegation, | |||
| ? suit-authentication-wrapper => bstr .cbor SUIT_Authentication, | suit-authentication-wrapper => bstr .cbor SUIT_Authentication, | |||
| suit-manifest => bstr .cbor SUIT_Manifest, | suit-manifest => bstr .cbor SUIT_Manifest, | |||
| SUIT_Severable_Manifest_Members, | SUIT_Severable_Manifest_Members, | |||
| * SUIT_Integrated_Payload, | ||||
| * SUIT_Integrated_Dependency, | ||||
| * $$SUIT_Envelope_Extensions, | * $$SUIT_Envelope_Extensions, | |||
| (int => bstr) | * (int => bstr) | |||
| } | } | |||
| SUIT_Delegation = [ + [ + bstr .cbor CWT ] ] | SUIT_Delegation = [ + [ + bstr .cbor CWT ] ] | |||
| CWT = SUIT_Authentication_Block | CWT = SUIT_Authentication_Block | |||
| SUIT_Authentication = [ + bstr .cbor SUIT_Authentication_Block ] | SUIT_Authentication = [ | |||
| bstr .cbor SUIT_Digest, | ||||
| SUIT_Authentication_Block /= COSE_Mac_Tagged | * bstr .cbor SUIT_Authentication_Block | |||
| SUIT_Authentication_Block /= COSE_Sign_Tagged | ] | |||
| SUIT_Authentication_Block /= COSE_Mac0_Tagged | ||||
| SUIT_Authentication_Block /= COSE_Sign1_Tagged | ||||
| SUIT_Severable_Manifest_Members = ( | ||||
| ? suit-dependency-resolution => bstr .cbor SUIT_Command_Sequence, | ||||
| ? suit-payload-fetch => bstr .cbor SUIT_Command_Sequence, | ||||
| ? suit-install => bstr .cbor SUIT_Command_Sequence, | ||||
| ? suit-text => bstr .cbor SUIT_Text_Map, | ||||
| ? suit-coswid => bstr .cbor concise-software-identity, | ||||
| * $$SUIT_severable-members-extensions, | ||||
| ) | ||||
| COSE_Mac_Tagged = any | ||||
| COSE_Sign_Tagged = any | ||||
| COSE_Mac0_Tagged = any | ||||
| COSE_Sign1_Tagged = any | ||||
| COSE_Encrypt_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 : bstr, | suit-digest-bytes : bstr, | |||
| * $$SUIT_Digest-extensions | * $$SUIT_Digest-extensions | |||
| ] | ] | |||
| ; 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 | SUIT_Authentication_Block /= COSE_Mac_Tagged | |||
| algorithm-id-sha256 = 2 | SUIT_Authentication_Block /= COSE_Sign_Tagged | |||
| algorithm-id-sha384 = 3 | SUIT_Authentication_Block /= COSE_Mac0_Tagged | |||
| algorithm-id-sha512 = 4 | SUIT_Authentication_Block /= COSE_Sign1_Tagged | |||
| algorithm-id-sha3-224 = 5 | COSE_Mac_Tagged = any | |||
| algorithm-id-sha3-256 = 6 | COSE_Sign_Tagged = any | |||
| algorithm-id-sha3-384 = 7 | COSE_Mac0_Tagged = any | |||
| algorithm-id-sha3-512 = 8 | COSE_Sign1_Tagged = any | |||
| COSE_Encrypt_Tagged = any | ||||
| COSE_Encrypt0_Tagged = any | ||||
| SUIT_Severable_Manifest_Members = ( | ||||
| ? suit-dependency-resolution => bstr .cbor SUIT_Command_Sequence, | ||||
| ? suit-payload-fetch => bstr .cbor SUIT_Command_Sequence, | ||||
| ? suit-install => bstr .cbor SUIT_Command_Sequence, | ||||
| ? suit-text => bstr .cbor SUIT_Text_Map, | ||||
| ? suit-coswid => bstr .cbor concise-software-identity, | ||||
| * $$SUIT_severable-members-extensions, | ||||
| ) | ||||
| SUIT_Integrated_Payload = (suit-integrated-payload-key => bstr) | ||||
| SUIT_Integrated_Dependency = ( | ||||
| suit-integrated-payload-key => bstr .cbor SUIT_Envelope | ||||
| ) | ||||
| suit-integrated-payload-key = nint / uint .ge 24 | ||||
| SUIT_Manifest_Tagged = #6.480(SUIT_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-reference-uri => tstr, | ? suit-reference-uri => tstr, | |||
| SUIT_Severable_Members, | SUIT_Severable_Manifest_Members, | |||
| SUIT_Severable_Members_Digests, | SUIT_Severable_Members_Digests, | |||
| SUIT_Unseverable_Members, | SUIT_Unseverable_Members, | |||
| * $$SUIT_Manifest_Extensions, | * $$SUIT_Manifest_Extensions, | |||
| } | } | |||
| SUIT_Unseverable_Members = ( | SUIT_Unseverable_Members = ( | |||
| ? 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, | |||
| * $$unserverble-manifest-member-extensions, | * $$unserverble-manifest-member-extensions, | |||
| ) | ) | |||
| SUIT_Severable_Members_Digests = ( | SUIT_Severable_Members_Digests = ( | |||
| ? suit-dependency-resolution-digest => SUIT_Digest, | ? suit-dependency-resolution => SUIT_Digest, | |||
| ? suit-payload-fetch-digest => SUIT_Digest, | ? suit-payload-fetch => SUIT_Digest, | |||
| ? suit-install-digest => SUIT_Digest, | ? suit-install => SUIT_Digest, | |||
| ? suit-text-digest => SUIT_Digest, | ? suit-text => SUIT_Digest, | |||
| ? suit-coswid-digest => SUIT_Digest, | ? suit-coswid => SUIT_Digest, | |||
| * $$severable-manifest-members-digests-extensions | * $$severable-manifest-members-digests-extensions | |||
| ) | ) | |||
| SUIT_Common = { | SUIT_Common = { | |||
| ? suit-dependencies => SUIT_Dependencies, | ? suit-dependencies => SUIT_Dependencies, | |||
| ? suit-components => SUIT_Components, | ? suit-components => SUIT_Components, | |||
| ? suit-common-sequence => bstr .cbor SUIT_Common_Sequence, | ? suit-common-sequence => bstr .cbor SUIT_Common_Sequence, | |||
| * $$SUIT_Common-extensions, | * $$SUIT_Common-extensions, | |||
| } | } | |||
| skipping to change at page 74, line 22 ¶ | skipping to change at page 80, line 27 ¶ | |||
| concise-software-identity = any | concise-software-identity = any | |||
| 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_Dependency-extensions, | * $$SUIT_Dependency-extensions, | |||
| } | } | |||
| SUIT_Component_Identifier = [* bstr] | SUIT_Component_Identifier = [* bstr] | |||
| SUIT_Component_Reference = { | ||||
| suit-component-identifier => SUIT_Component_Identifier, | ||||
| suit-component-dependency-index => uint | ||||
| } | ||||
| SUIT_Common_Sequence = [ | SUIT_Common_Sequence = [ | |||
| + ( SUIT_Condition // SUIT_Common_Commands ) | + ( SUIT_Condition // SUIT_Common_Commands ) | |||
| ] | ] | |||
| SUIT_Common_Commands //= (suit-directive-set-component-index, uint/bool) | SUIT_Common_Commands //= (suit-directive-set-component-index, IndexArg) | |||
| SUIT_Common_Commands //= (suit-directive-set-dependency-index, uint/bool) | SUIT_Common_Commands //= (suit-directive-set-dependency-index, IndexArg) | |||
| SUIT_Common_Commands //= (suit-directive-run-sequence, | SUIT_Common_Commands //= (suit-directive-run-sequence, | |||
| bstr .cbor SUIT_Command_Sequence) | bstr .cbor SUIT_Command_Sequence) | |||
| SUIT_Common_Commands //= (suit-directive-try-each, | SUIT_Common_Commands //= (suit-directive-try-each, | |||
| SUIT_Directive_Try_Each_Argument) | SUIT_Directive_Try_Each_Argument) | |||
| SUIT_Common_Commands //= (suit-directive-set-parameters, | SUIT_Common_Commands //= (suit-directive-set-parameters, | |||
| {+ SUIT_Parameters}) | {+ SUIT_Parameters}) | |||
| SUIT_Common_Commands //= (suit-directive-override-parameters, | SUIT_Common_Commands //= (suit-directive-override-parameters, | |||
| {+ SUIT_Parameters}) | {+ SUIT_Parameters}) | |||
| IndexArg /= uint | ||||
| IndexArg /= bool | ||||
| IndexArg /= [+uint] | ||||
| SUIT_Command_Sequence = [ + ( | SUIT_Command_Sequence = [ + ( | |||
| SUIT_Condition // SUIT_Directive // SUIT_Command_Custom | SUIT_Condition // SUIT_Directive // SUIT_Command_Custom | |||
| ) ] | ) ] | |||
| SUIT_Command_Custom = (suit-command-custom, bstr/tstr/int/nil) | SUIT_Command_Custom = (suit-command-custom, bstr/tstr/int/nil) | |||
| SUIT_Condition //= (suit-condition-vendor-identifier, SUIT_Reporting_Policy) | SUIT_Condition //= (suit-condition-vendor-identifier, SUIT_Rep_Policy) | |||
| SUIT_Condition //= (suit-condition-class-identifier, SUIT_Reporting_Policy) | SUIT_Condition //= (suit-condition-class-identifier, SUIT_Rep_Policy) | |||
| SUIT_Condition //= (suit-condition-device-identifier, SUIT_Reporting_Policy) | SUIT_Condition //= (suit-condition-device-identifier, SUIT_Rep_Policy) | |||
| SUIT_Condition //= (suit-condition-image-match, SUIT_Reporting_Policy) | SUIT_Condition //= (suit-condition-image-match, SUIT_Rep_Policy) | |||
| SUIT_Condition //= (suit-condition-image-not-match, SUIT_Reporting_Policy) | SUIT_Condition //= (suit-condition-image-not-match, SUIT_Rep_Policy) | |||
| SUIT_Condition //= (suit-condition-use-before, SUIT_Reporting_Policy) | SUIT_Condition //= (suit-condition-use-before, SUIT_Rep_Policy) | |||
| SUIT_Condition //= (suit-condition-minimum-battery, SUIT_Reporting_Policy) | SUIT_Condition //= (suit-condition-minimum-battery, SUIT_Rep_Policy) | |||
| SUIT_Condition //= (suit-condition-update-authorized, SUIT_Reporting_Policy) | SUIT_Condition //= (suit-condition-update-authorized, SUIT_Rep_Policy) | |||
| SUIT_Condition //= (suit-condition-version, SUIT_Reporting_Policy) | SUIT_Condition //= (suit-condition-version, SUIT_Rep_Policy) | |||
| SUIT_Condition //= (suit-condition-component-offset, SUIT_Reporting_Policy) | SUIT_Condition //= (suit-condition-component-offset, SUIT_Rep_Policy) | |||
| SUIT_Condition //= (suit-condition-abort, SUIT_Rep_Policy) | ||||
| SUIT_Directive //= (suit-directive-set-component-index, uint/bool) | SUIT_Directive //= (suit-directive-set-component-index, IndexArg) | |||
| SUIT_Directive //= (suit-directive-set-dependency-index, uint/bool) | SUIT_Directive //= (suit-directive-set-dependency-index, IndexArg) | |||
| 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, SUIT_Reporting_Policy) | SUIT_Directive //= (suit-directive-process-dependency, SUIT_Rep_Policy) | |||
| SUIT_Directive //= (suit-directive-set-parameters, | SUIT_Directive //= (suit-directive-set-parameters, | |||
| {+ SUIT_Parameters}) | {+ SUIT_Parameters}) | |||
| SUIT_Directive //= (suit-directive-override-parameters, | SUIT_Directive //= (suit-directive-override-parameters, | |||
| {+ SUIT_Parameters}) | {+ SUIT_Parameters}) | |||
| SUIT_Directive //= (suit-directive-fetch, SUIT_Reporting_Policy) | SUIT_Directive //= (suit-directive-fetch, SUIT_Rep_Policy) | |||
| SUIT_Directive //= (suit-directive-copy, SUIT_Reporting_Policy) | SUIT_Directive //= (suit-directive-copy, SUIT_Rep_Policy) | |||
| SUIT_Directive //= (suit-directive-swap, SUIT_Reporting_Policy) | SUIT_Directive //= (suit-directive-swap, SUIT_Rep_Policy) | |||
| SUIT_Directive //= (suit-directive-run, SUIT_Reporting_Policy) | SUIT_Directive //= (suit-directive-run, SUIT_Rep_Policy) | |||
| SUIT_Directive //= (suit-directive-wait, SUIT_Reporting_Policy) | SUIT_Directive //= (suit-directive-wait, SUIT_Rep_Policy) | |||
| SUIT_Directive //= (suit-directive-abort, SUIT_Reporting_Policy) | SUIT_Directive //= (suit-directive-fetch-uri-list, SUIT_Rep_Policy) | |||
| SUIT_Directive //= (suit-directive-fetch-uri-list, SUIT_Reporting_Policy) | ||||
| 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 | |||
| ] | ] | |||
| SUIT_Reporting_Policy = uint .bits suit-reporting-bits | SUIT_Rep_Policy = uint .bits suit-reporting-bits | |||
| suit-reporting-bits = &( | suit-reporting-bits = &( | |||
| suit-send-record-success : 0, | suit-send-record-success : 0, | |||
| suit-send-record-failure : 1, | suit-send-record-failure : 1, | |||
| suit-send-sysinfo-success : 2, | suit-send-sysinfo-success : 2, | |||
| suit-send-sysinfo-failure : 3 | suit-send-sysinfo-failure : 3 | |||
| ) | ) | |||
| SUIT_Command_ID /= suit-command-custom | ||||
| SUIT_Command_ID /= suit-condition-vendor-identifier | ||||
| SUIT_Command_ID /= suit-condition-class-identifier | ||||
| SUIT_Command_ID /= suit-condition-image-match | ||||
| SUIT_Command_ID /= suit-condition-use-before | ||||
| SUIT_Command_ID /= suit-condition-component-offset | ||||
| SUIT_Command_ID /= suit-condition-device-identifier | ||||
| SUIT_Command_ID /= suit-condition-image-not-match | ||||
| SUIT_Command_ID /= suit-condition-minimum-battery | ||||
| SUIT_Command_ID /= suit-condition-update-authorized | ||||
| SUIT_Command_ID /= suit-condition-version | ||||
| SUIT_Command_ID /= suit-directive-set-component-index | ||||
| SUIT_Command_ID /= suit-directive-set-dependency-index | ||||
| SUIT_Command_ID /= suit-directive-abort | ||||
| SUIT_Command_ID /= suit-directive-try-each | ||||
| ;SUIT_Command_ID /= suit-directive-do-each | ||||
| ;SUIT_Command_ID /= suit-directive-map-filter | ||||
| SUIT_Command_ID /= suit-directive-process-dependency | ||||
| SUIT_Command_ID /= suit-directive-set-parameters | ||||
| SUIT_Command_ID /= suit-directive-override-parameters | ||||
| SUIT_Command_ID /= suit-directive-fetch | ||||
| SUIT_Command_ID /= suit-directive-copy | ||||
| SUIT_Command_ID /= suit-directive-run | ||||
| SUIT_Command_ID /= suit-directive-wait | ||||
| SUIT_Command_ID /= suit-directive-run-sequence | ||||
| SUIT_Command_ID /= suit-directive-swap | ||||
| SUIT_Command_ID /= suit-directive-fetch-uri-list | ||||
| suit-record = { | ||||
| suit-record-success => bool/int, | ||||
| ? suit-record-component-id => SUIT_Component_ID, | ||||
| ? suit-record-dependency-id => SUIT_Digest, | ||||
| ? suit-record-command-sequence-id => ( | ||||
| suit-common-sequence / | ||||
| suit-dependency-resolution / | ||||
| suit-payload-fetch / | ||||
| suit-install / | ||||
| suit-validate / | ||||
| suit-load / | ||||
| suit-run / | ||||
| * $$suit-command-sequence-list-extensions | ||||
| ), | ||||
| ? suit-record-interpeter-offset => uint, | ||||
| ? suit-record-command-id => SUIT_Command_ID, | ||||
| ? suit-record-params => SUIT_Parameters, | ||||
| ? suit-record-actual => SUIT_Parameters, | ||||
| * $$suit-record-extensions | ||||
| } | ||||
| SUIT_Wait_Event = { + SUIT_Wait_Events } | SUIT_Wait_Event = { + SUIT_Wait_Events } | |||
| SUIT_Wait_Events //= (suit-wait-event-authorization => int) | SUIT_Wait_Events //= (suit-wait-event-authorization => int) | |||
| SUIT_Wait_Events //= (suit-wait-event-power => int) | SUIT_Wait_Events //= (suit-wait-event-power => int) | |||
| SUIT_Wait_Events //= (suit-wait-event-network => int) | SUIT_Wait_Events //= (suit-wait-event-network => int) | |||
| SUIT_Wait_Events //= (suit-wait-event-other-device-version | SUIT_Wait_Events //= (suit-wait-event-other-device-version | |||
| => SUIT_Wait_Event_Argument_Other_Device_Version) | => SUIT_Wait_Event_Argument_Other_Device_Version) | |||
| SUIT_Wait_Events //= (suit-wait-event-time => uint); Timestamp | SUIT_Wait_Events //= (suit-wait-event-time => uint); Timestamp | |||
| SUIT_Wait_Events //= (suit-wait-event-time-of-day | SUIT_Wait_Events //= (suit-wait-event-time-of-day | |||
| => uint); Time of Day (seconds since 00:00:00) | => uint); Time of Day (seconds since 00:00:00) | |||
| SUIT_Wait_Events //= (suit-wait-event-day-of-week | SUIT_Wait_Events //= (suit-wait-event-day-of-week | |||
| => uint); Days since Sunday | => uint); Days since Sunday | |||
| SUIT_Wait_Event_Argument_Other_Device_Version = [ | SUIT_Wait_Event_Argument_Other_Device_Version = [ | |||
| other-device: bstr, | other-device: bstr, | |||
| other-device-version: [ + SUIT_Parameter_Version_Match ] | other-device-version: [ + SUIT_Parameter_Version_Match ] | |||
| ] | ] | |||
| SUIT_Parameters //= (suit-parameter-vendor-identifier => RFC4122_UUID) | SUIT_Parameters //= (suit-parameter-vendor-identifier => | |||
| (RFC4122_UUID / cbor-pen)) | ||||
| cbor-pen = #6.112(bstr) | ||||
| SUIT_Parameters //= (suit-parameter-class-identifier => RFC4122_UUID) | SUIT_Parameters //= (suit-parameter-class-identifier => RFC4122_UUID) | |||
| SUIT_Parameters //= (suit-parameter-image-digest | SUIT_Parameters //= (suit-parameter-image-digest | |||
| => bstr .cbor SUIT_Digest) | => bstr .cbor SUIT_Digest) | |||
| SUIT_Parameters //= (suit-parameter-image-size => uint) | SUIT_Parameters //= (suit-parameter-image-size => uint) | |||
| SUIT_Parameters //= (suit-parameter-use-before => uint) | SUIT_Parameters //= (suit-parameter-use-before => uint) | |||
| SUIT_Parameters //= (suit-parameter-component-offset => uint) | SUIT_Parameters //= (suit-parameter-component-offset => uint) | |||
| SUIT_Parameters //= (suit-parameter-encryption-info | SUIT_Parameters //= (suit-parameter-encryption-info | |||
| => bstr .cbor SUIT_Encryption_Info) | => bstr .cbor SUIT_Encryption_Info) | |||
| SUIT_Parameters //= (suit-parameter-compression-info | SUIT_Parameters //= (suit-parameter-compression-info | |||
| skipping to change at page 79, line 14 ¶ | skipping to change at page 84, line 20 ¶ | |||
| SUIT_Unpack_Algorithms /= SUIT_Unpack_Algorithm_Srec | SUIT_Unpack_Algorithms /= SUIT_Unpack_Algorithm_Srec | |||
| SUIT_Unpack_Algorithm_Hex = 1 | SUIT_Unpack_Algorithm_Hex = 1 | |||
| SUIT_Unpack_Algorithm_Elf = 2 | SUIT_Unpack_Algorithm_Elf = 2 | |||
| SUIT_Unpack_Algorithm_Coff = 3 | SUIT_Unpack_Algorithm_Coff = 3 | |||
| SUIT_Unpack_Algorithm_Srec = 4 | SUIT_Unpack_Algorithm_Srec = 4 | |||
| SUIT_URI_List = [+ tstr ] | SUIT_URI_List = [+ tstr ] | |||
| SUIT_Text_Map = { | SUIT_Text_Map = { | |||
| ? suit-text-components => | * SUIT_Component_Identifier => { | |||
| [ | SUIT_Text_Component_Keys | |||
| + { | }, | |||
| 1 => SUIT_Component_Identifier | ||||
| SUIT_Text_Component_Keys | ||||
| } | ||||
| ], | ||||
| SUIT_Text_Keys | SUIT_Text_Keys | |||
| } | } | |||
| SUIT_Text_Component_Keys = ( | SUIT_Text_Component_Keys = ( | |||
| ? suit-text-vendor-name => tstr, | ? suit-text-vendor-name => tstr, | |||
| ? suit-text-model-name => tstr, | ? suit-text-model-name => tstr, | |||
| ? suit-text-vendor-domain => tstr, | ? suit-text-vendor-domain => tstr, | |||
| ? suit-text-model-info => tstr, | ? suit-text-model-info => tstr, | |||
| ? suit-text-component-description => tstr, | ? suit-text-component-description => tstr, | |||
| ? suit-text-component-version => tstr, | ? suit-text-component-version => tstr, | |||
| skipping to change at page 79, line 47 ¶ | skipping to change at page 84, line 49 ¶ | |||
| ? suit-text-update-description => tstr, | ? suit-text-update-description => tstr, | |||
| ? suit-text-manifest-json-source => tstr, | ? suit-text-manifest-json-source => tstr, | |||
| ? suit-text-manifest-yaml-source => tstr, | ? suit-text-manifest-yaml-source => tstr, | |||
| * $$suit-text-key-extensions | * $$suit-text-key-extensions | |||
| ) | ) | |||
| suit-delegation = 1 | suit-delegation = 1 | |||
| suit-authentication-wrapper = 2 | suit-authentication-wrapper = 2 | |||
| suit-manifest = 3 | suit-manifest = 3 | |||
| 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-version = 1 | suit-manifest-version = 1 | |||
| suit-manifest-sequence-number = 2 | suit-manifest-sequence-number = 2 | |||
| suit-common = 3 | suit-common = 3 | |||
| suit-reference-uri = 4 | suit-reference-uri = 4 | |||
| suit-dependency-resolution = 7 | suit-dependency-resolution = 7 | |||
| suit-payload-fetch = 8 | suit-payload-fetch = 8 | |||
| suit-install = 9 | suit-install = 9 | |||
| suit-validate = 10 | suit-validate = 10 | |||
| suit-load = 11 | suit-load = 11 | |||
| suit-run = 12 | suit-run = 12 | |||
| suit-text = 13 | suit-text = 13 | |||
| suit-coswid = 14 | suit-coswid = 14 | |||
| suit-dependencies = 1 | suit-dependencies = 1 | |||
| suit-components = 2 | suit-components = 2 | |||
| suit-dependency-components = 3 | ||||
| suit-common-sequence = 4 | suit-common-sequence = 4 | |||
| suit-dependency-digest = 1 | suit-dependency-digest = 1 | |||
| suit-dependency-prefix = 2 | suit-dependency-prefix = 2 | |||
| suit-component-identifier = 1 | ||||
| suit-component-dependency-index = 2 | ||||
| suit-command-custom = nint | suit-command-custom = nint | |||
| suit-condition-vendor-identifier = 1 | suit-condition-vendor-identifier = 1 | |||
| suit-condition-class-identifier = 2 | suit-condition-class-identifier = 2 | |||
| suit-condition-image-match = 3 | suit-condition-image-match = 3 | |||
| suit-condition-use-before = 4 | suit-condition-use-before = 4 | |||
| suit-condition-component-offset = 5 | suit-condition-component-offset = 5 | |||
| suit-condition-abort = 14 | ||||
| suit-condition-device-identifier = 24 | suit-condition-device-identifier = 24 | |||
| suit-condition-image-not-match = 25 | suit-condition-image-not-match = 25 | |||
| suit-condition-minimum-battery = 26 | suit-condition-minimum-battery = 26 | |||
| suit-condition-update-authorized = 27 | suit-condition-update-authorized = 27 | |||
| suit-condition-version = 28 | suit-condition-version = 28 | |||
| suit-directive-set-component-index = 12 | suit-directive-set-component-index = 12 | |||
| suit-directive-set-dependency-index = 13 | suit-directive-set-dependency-index = 13 | |||
| suit-directive-abort = 14 | ||||
| suit-directive-try-each = 15 | suit-directive-try-each = 15 | |||
| ;suit-directive-do-each = 16 ; TBD | ;suit-directive-do-each = 16 ; TBD | |||
| ;suit-directive-map-filter = 17 ; TBD | ;suit-directive-map-filter = 17 ; TBD | |||
| suit-directive-process-dependency = 18 | suit-directive-process-dependency = 18 | |||
| 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 | |||
| skipping to change at page 81, line 42 ¶ | skipping to change at page 86, line 48 ¶ | |||
| suit-parameter-device-identifier = 24 | suit-parameter-device-identifier = 24 | |||
| suit-parameter-minimum-battery = 26 | suit-parameter-minimum-battery = 26 | |||
| suit-parameter-update-priority = 27 | suit-parameter-update-priority = 27 | |||
| suit-parameter-version = 28 | suit-parameter-version = 28 | |||
| suit-parameter-wait-info = 29 | suit-parameter-wait-info = 29 | |||
| suit-parameter-uri-list = 30 | suit-parameter-uri-list = 30 | |||
| suit-parameter-custom = nint | suit-parameter-custom = nint | |||
| suit-compression-algorithm = 1 | suit-compression-algorithm = 1 | |||
| suit-compression-parameters = 2 | ||||
| suit-unpack-algorithm = 1 | suit-unpack-algorithm = 1 | |||
| suit-unpack-parameters = 2 | ||||
| suit-text-manifest-description = 1 | suit-text-manifest-description = 1 | |||
| suit-text-update-description = 2 | suit-text-update-description = 2 | |||
| suit-text-manifest-json-source = 3 | suit-text-manifest-json-source = 3 | |||
| suit-text-manifest-yaml-source = 4 | suit-text-manifest-yaml-source = 4 | |||
| suit-text-vendor-name = 1 | suit-text-vendor-name = 1 | |||
| suit-text-model-name = 2 | suit-text-model-name = 2 | |||
| suit-text-vendor-domain = 3 | suit-text-vendor-domain = 3 | |||
| suit-text-model-info = 4 | suit-text-model-info = 4 | |||
| suit-text-component-description = 5 | suit-text-component-description = 5 | |||
| suit-text-component-version = 6 | suit-text-component-version = 6 | |||
| suit-text-version-required = 7 | suit-text-version-required = 7 | |||
| B. Examples | Appendix B. B. 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. Even a simple manifest processor can | |||
| manifest processor can execute most of these manifests. | execute most of these manifests. | |||
| The examples are signed using the following ECDSA secp256r1 key: | The examples are signed using the following ECDSA secp256r1 key: | |||
| -----BEGIN PRIVATE KEY----- | -----BEGIN PRIVATE KEY----- | |||
| MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgApZYjZCUGLM50VBC | MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgApZYjZCUGLM50VBC | |||
| CjYStX+09jGmnyJPrpDLTz/hiXOhRANCAASEloEarguqq9JhVxie7NomvqqL8Rtv | CjYStX+09jGmnyJPrpDLTz/hiXOhRANCAASEloEarguqq9JhVxie7NomvqqL8Rtv | |||
| P+bitWWchdvArTsfKktsCYExwKNtrNHXi9OB3N+wnAUtszmR23M4tKiW | P+bitWWchdvArTsfKktsCYExwKNtrNHXi9OB3N+wnAUtszmR23M4tKiW | |||
| -----END PRIVATE KEY----- | -----END PRIVATE KEY----- | |||
| The corresponding public key can be used to verify these examples: | The corresponding public key can be used to verify these examples: | |||
| skipping to change at page 83, line 38 ¶ | skipping to change at page 88, line 50 ¶ | |||
| This example covers the following templates: | This example covers the following templates: | |||
| - Compatibility Check (Section 7.1) | - Compatibility Check (Section 7.1) | |||
| - Secure Boot (Section 7.2) | - Secure Boot (Section 7.2) | |||
| It also serves as the minimum example. | It also serves as the minimum example. | |||
| { | { | |||
| / authentication-wrapper / 2:h'81588fd28443a10126a0584482025840356 | / authentication-wrapper / 2:bstr .cbor ({ digest: bstr | |||
| 3303937656636346266336262396234393465373165316632343138656566386434363 | .cbor ([ | |||
| 6636339303266363339613835356563396166336539656464623939584093347ceebc1 | / algorithm-id / 2 / "sha256" /, | |||
| 209a2d660bfbbe78e461079f1952c614e1ae8f734ff0ea438110d056c1a0cce6b0599d | / digest-bytes / | |||
| b54e6704847de49efe60e9a7b821215d83368a2c8c7c088' / [ | h'5c097ef64bf3bb9b494e71e1f2418eef8d466cc902f639a855ec9af3e9eddb99' | |||
| h'd28443a10126a05844820258403563303937656636346266336262396234 | ]) signatures: [ | |||
| 3934653731653166323431386565663864343636636339303266363339613835356563 | bstr .cbor (18([ | |||
| 396166336539656464623939584093347ceebc1209a2d660bfbbe78e461079f1952c61 | / protected / bstr .cbor ({ | |||
| 4e1ae8f734ff0ea438110d056c1a0cce6b0599db54e6704847de49efe60e9a7b821215 | / alg / 1:-7 / "ES256" /, | |||
| d83368a2c8c7c088' / 18([ | }), | |||
| / protected / h'a10126' / { | / unprotected / { | |||
| / alg / 1:-7 / "ES256" /, | }, | |||
| } /, | / payload / bstr .cbor ([ | |||
| / unprotected / { | / algorithm-id / 2 / "sha256" /, | |||
| }, | / digest-bytes / | |||
| / payload / h'8202584035633039376566363462663362623962 | h'5c097ef64bf3bb9b494e71e1f2418eef8d466cc902f639a855ec9af3e9eddb99' | |||
| 3439346537316531663234313865656638643436366363393032663633396138353565 | ]), | |||
| 63396166336539656464623939' / [ | / signature / h'60f5c3d03a3aa759bfef2ef0f5f97a93b1 | |||
| / algorithm-id / 2 / "sha256" /, | f5e741f7463f4385af88513a5c2957bea2d6c4cfddd03392a267aab0fc0fd515560ed5 | |||
| / digest-bytes / h'3563303937656636346266336262396 | 8e33fad26ac32a024c5a7143' | |||
| 2343934653731653166323431386565663864343636636339303266363339613835356 | ])) | |||
| 563396166336539656464623939' | ] | |||
| ] /, | }), | |||
| / signature / h'93347ceebc1209a2d660bfbbe78e461079f195 | / manifest / 3:bstr .cbor ({ | |||
| 2c614e1ae8f734ff0ea438110d056c1a0cce6b0599db54e6704847de49efe60e9a7b82 | ||||
| 1215d83368a2c8c7c088' | ||||
| ]) / | ||||
| ] /, | ||||
| / manifest / 3:h'a50101020003585fa202818141000458568614a40150fa6b4 | ||||
| a53d5ad5fdfbe9de663e4d41ffe02501492af1425695e48bf429b2d51f2ab450358248 | ||||
| 202582000112233445566778899aabbccddeeff0123456789abcdeffedcba987654321 | ||||
| 00e1987d0010f020f0a4382030f0c43821702' / { | ||||
| / manifest-version / 1:1, | / manifest-version / 1:1, | |||
| / manifest-sequence-number / 2:0, | / manifest-sequence-number / 2:0, | |||
| / common / 3:h'a202818141000458568614a40150fa6b4a53d5ad5fdfbe9 | / common / 3:bstr .cbor ({ | |||
| de663e4d41ffe02501492af1425695e48bf429b2d51f2ab45035824820258200011223 | ||||
| 3445566778899aabbccddeeff0123456789abcdeffedcba98765432100e1987d0010f0 | ||||
| 20f' / { | ||||
| / components / 2:[ | / components / 2:[ | |||
| [h'00'] | [h'00'] | |||
| ], | ], | |||
| / common-sequence / 4:h'8614a40150fa6b4a53d5ad5fdfbe9de663 | / common-sequence / 4:bstr .cbor ([ | |||
| e4d41ffe02501492af1425695e48bf429b2d51f2ab4503582482025820001122334455 | ||||
| 66778899aabbccddeeff0123456789abcdeffedcba98765432100e1987d0010f020f' | ||||
| / [ | ||||
| / directive-override-parameters / 20,{ | / directive-override-parameters / 20,{ | |||
| / vendor-id / | / vendor-id / | |||
| 1:h'"fa6b4a53d5ad5fdfbe9de663e4d41ffe"' / fa6b4a53-d5ad-5fdf- | 1:h'fa6b4a53d5ad5fdfbe9de663e4d41ffe' / fa6b4a53-d5ad-5fdf- | |||
| be9d-e663e4d41ffe /, | be9d-e663e4d41ffe /, | |||
| / class-id / | / class-id / 2:h'1492af1425695e48bf429b2d51f2ab45' | |||
| 2:h'"1492af1425695e48bf429b2d51f2ab45"' / | / 1492af14-2569-5e48-bf42-9b2d51f2ab45 /, | |||
| 1492af14-2569-5e48-bf42-9b2d51f2ab45 /, | / image-digest / 3:bstr .cbor ([ | |||
| / image-digest / 3:h'8202582000112233445566778899a | ||||
| abbccddeeff0123456789abcdeffedcba9876543210' / [ | ||||
| / algorithm-id / 2 / "sha256" /, | / algorithm-id / 2 / "sha256" /, | |||
| / digest-bytes / | / digest-bytes / | |||
| h'00112233445566778899aabbccddeeff0123456789abcdeffedcba9876543210' | h'00112233445566778899aabbccddeeff0123456789abcdeffedcba9876543210' | |||
| ] /, | ]), | |||
| / image-size / 14:34768, | / image-size / 14:34768, | |||
| } , | } , | |||
| / condition-vendor-identifier / 1,15 , | / condition-vendor-identifier / 1,15 , | |||
| / condition-class-identifier / 2,15 | / condition-class-identifier / 2,15 | |||
| ] /, | ]), | |||
| }), | ||||
| } /, | / validate / 10:bstr .cbor ([ | |||
| / validate / 10:h'82030f' / [ | ||||
| / condition-image-match / 3,15 | / condition-image-match / 3,15 | |||
| ] /, | ]), | |||
| / run / 12:h'821702' / [ | / run / 12:bstr .cbor ([ | |||
| / directive-run / 23,2 | / directive-run / 23,2 | |||
| ] /, | ]), | |||
| } /, | }), | |||
| } | } | |||
| Total size of Envelope without COSE authentication object: 117 | Total size of Envelope without COSE authentication object: 159 | |||
| Envelope: | Envelope: | |||
| a1035871a50101020003585fa202818141000458568614a40150fa6b4a53 | a2025827815824820258205c097ef64bf3bb9b494e71e1f2418eef8d466c | |||
| d5ad5fdfbe9de663e4d41ffe02501492af1425695e48bf429b2d51f2ab45 | c902f639a855ec9af3e9eddb99035871a50101020003585fa20281814100 | |||
| 0358248202582000112233445566778899aabbccddeeff0123456789abcd | 0458568614a40150fa6b4a53d5ad5fdfbe9de663e4d41ffe02501492af14 | |||
| effedcba98765432100e1987d0010f020f0a4382030f0c43821702 | 25695e48bf429b2d51f2ab450358248202582000112233445566778899aa | |||
| bbccddeeff0123456789abcdeffedcba98765432100e1987d0010f020f0a | ||||
| 4382030f0c43821702 | ||||
| Total size of Envelope with COSE authentication object: 266 | Total size of Envelope with COSE authentication object: 272 | |||
| Envelope with COSE authentication object: | Envelope with COSE authentication object: | |||
| a202589281588fd28443a10126a058448202584035633039376566363462 | a2025898825824820258205c097ef64bf3bb9b494e71e1f2418eef8d466c | |||
| 663362623962343934653731653166323431386565663864343636636339 | c902f639a855ec9af3e9eddb99586fd28443a10126a05824820258205c09 | |||
| 303266363339613835356563396166336539656464623939584093347cee | 7ef64bf3bb9b494e71e1f2418eef8d466cc902f639a855ec9af3e9eddb99 | |||
| bc1209a2d660bfbbe78e461079f1952c614e1ae8f734ff0ea438110d056c | 584060f5c3d03a3aa759bfef2ef0f5f97a93b1f5e741f7463f4385af8851 | |||
| 1a0cce6b0599db54e6704847de49efe60e9a7b821215d83368a2c8c7c088 | 3a5c2957bea2d6c4cfddd03392a267aab0fc0fd515560ed58e33fad26ac3 | |||
| 035871a50101020003585fa202818141000458568614a40150fa6b4a53d5 | 2a024c5a7143035871a50101020003585fa202818141000458568614a401 | |||
| ad5fdfbe9de663e4d41ffe02501492af1425695e48bf429b2d51f2ab4503 | 50fa6b4a53d5ad5fdfbe9de663e4d41ffe02501492af1425695e48bf429b | |||
| 58248202582000112233445566778899aabbccddeeff0123456789abcdef | 2d51f2ab450358248202582000112233445566778899aabbccddeeff0123 | |||
| fedcba98765432100e1987d0010f020f0a4382030f0c43821702 | 456789abcdeffedcba98765432100e1987d0010f020f0a4382030f0c4382 | |||
| 1702 | ||||
| B.2. Example 1: Simultaneous Download and Installation of Payload | B.2. Example 1: Simultaneous Download and Installation of Payload | |||
| This example covers the following templates: | This example covers the following templates: | |||
| - Compatibility Check (Section 7.1) | - Compatibility Check (Section 7.1) | |||
| - Firmware Download (Section 7.3) | - Firmware Download (Section 7.3) | |||
| Simultaneous download and installation of payload. No secure boot is | Simultaneous download and installation of payload. No secure boot is | |||
| present in this example to demonstrate a download-only manifest. | present in this example to demonstrate a download-only manifest. | |||
| { | { | |||
| / authentication-wrapper / 2:h'81588fd28443a10126a0584482025840393 | / authentication-wrapper / 2:bstr .cbor ({ digest: bstr | |||
| 8376565633835666139396664333164333332333831623938313066393062303563326 | .cbor ([ | |||
| 530643466323834613666343231313230376564303066666637353058404931df82e15 | / algorithm-id / 2 / "sha256" /, | |||
| 3bf1e3af5a59800216d8a47c33a37839e7d63d9f526fd369aa8359daae18f7619c9591 | / digest-bytes / | |||
| 23e7f7f928ee92a9893afedd35d06a936d6ed3d5843bf2a' / [ | ||||
| h'd28443a10126a05844820258403938376565633835666139396664333164 | h'987eec85fa99fd31d332381b9810f90b05c2e0d4f284a6f4211207ed00fff750' | |||
| 3333323338316239383130663930623035633265306434663238346136663432313132 | ]) signatures: [ | |||
| 30376564303066666637353058404931df82e153bf1e3af5a59800216d8a47c33a3783 | bstr .cbor (18([ | |||
| 9e7d63d9f526fd369aa8359daae18f7619c959123e7f7f928ee92a9893afedd35d06a9 | / protected / bstr .cbor ({ | |||
| 36d6ed3d5843bf2a' / 18([ | / alg / 1:-7 / "ES256" /, | |||
| / protected / h'a10126' / { | }), | |||
| / alg / 1:-7 / "ES256" /, | / unprotected / { | |||
| } /, | }, | |||
| / unprotected / { | / payload / bstr .cbor ([ | |||
| }, | / algorithm-id / 2 / "sha256" /, | |||
| / payload / h'8202584039383765656338356661393966643331 | / digest-bytes / | |||
| 6433333233383162393831306639306230356332653064346632383461366634323131 | h'987eec85fa99fd31d332381b9810f90b05c2e0d4f284a6f4211207ed00fff750' | |||
| 32303765643030666666373530' / [ | ]), | |||
| / algorithm-id / 2 / "sha256" /, | / signature / h'750141d65b4f20a88dc70c6785a67e0f4f | |||
| / digest-bytes / h'3938376565633835666139396664333 | 085aead83ba2289d6e37271508cc91e0a0592f5c940c2257c9c0b26403c0ba4477f2ce | |||
| 1643333323338316239383130663930623035633265306434663238346136663432313 | 37b60089fe02cde7911d1c15' | |||
| 132303765643030666666373530' | ])) | |||
| ] /, | ] | |||
| / signature / h'4931df82e153bf1e3af5a59800216d8a47c33a | }), | |||
| 37839e7d63d9f526fd369aa8359daae18f7619c959123e7f7f928ee92a9893afedd35d | / manifest / 3:bstr .cbor ({ | |||
| 06a936d6ed3d5843bf2a' | ||||
| ]) / | ||||
| ] /, | ||||
| / manifest / 3:h'a50101020103585fa202818141000458568614a40150fa6b4 | ||||
| a53d5ad5fdfbe9de663e4d41ffe02501492af1425695e48bf429b2d51f2ab450358248 | ||||
| 202582000112233445566778899aabbccddeeff0123456789abcdeffedcba987654321 | ||||
| 00e1987d0010f020f0958258613a115781b687474703a2f2f6578616d706c652e636f6 | ||||
| d2f66696c652e62696e1502030f0a4382030f' / { | ||||
| / manifest-version / 1:1, | / manifest-version / 1:1, | |||
| / manifest-sequence-number / 2:1, | / manifest-sequence-number / 2:1, | |||
| / common / 3:h'a202818141000458568614a40150fa6b4a53d5ad5fdfbe9 | / common / 3:bstr .cbor ({ | |||
| de663e4d41ffe02501492af1425695e48bf429b2d51f2ab45035824820258200011223 | ||||
| 3445566778899aabbccddeeff0123456789abcdeffedcba98765432100e1987d0010f0 | ||||
| 20f' / { | ||||
| / components / 2:[ | / components / 2:[ | |||
| [h'00'] | [h'00'] | |||
| ], | ], | |||
| / common-sequence / 4:h'8614a40150fa6b4a53d5ad5fdfbe9de663 | / common-sequence / 4:bstr .cbor ([ | |||
| e4d41ffe02501492af1425695e48bf429b2d51f2ab4503582482025820001122334455 | ||||
| 66778899aabbccddeeff0123456789abcdeffedcba98765432100e1987d0010f020f' | ||||
| / [ | ||||
| / directive-override-parameters / 20,{ | / directive-override-parameters / 20,{ | |||
| / vendor-id / | / vendor-id / | |||
| 1:h'"fa6b4a53d5ad5fdfbe9de663e4d41ffe"' / fa6b4a53-d5ad-5fdf- | 1:h'fa6b4a53d5ad5fdfbe9de663e4d41ffe' / fa6b4a53-d5ad-5fdf- | |||
| be9d-e663e4d41ffe /, | be9d-e663e4d41ffe /, | |||
| / class-id / | / class-id / 2:h'1492af1425695e48bf429b2d51f2ab45' | |||
| / 1492af14-2569-5e48-bf42-9b2d51f2ab45 /, | ||||
| 2:h'"1492af1425695e48bf429b2d51f2ab45"' / | / image-digest / 3:bstr .cbor ([ | |||
| 1492af14-2569-5e48-bf42-9b2d51f2ab45 /, | ||||
| / image-digest / 3:h'8202582000112233445566778899a | ||||
| abbccddeeff0123456789abcdeffedcba9876543210' / [ | ||||
| / algorithm-id / 2 / "sha256" /, | / algorithm-id / 2 / "sha256" /, | |||
| / digest-bytes / | / digest-bytes / | |||
| h'00112233445566778899aabbccddeeff0123456789abcdeffedcba9876543210' | h'00112233445566778899aabbccddeeff0123456789abcdeffedcba9876543210' | |||
| ] /, | ]), | |||
| / image-size / 14:34768, | / image-size / 14:34768, | |||
| } , | } , | |||
| / condition-vendor-identifier / 1,15 , | / condition-vendor-identifier / 1,15 , | |||
| / condition-class-identifier / 2,15 | / condition-class-identifier / 2,15 | |||
| ] /, | ]), | |||
| } /, | }), | |||
| / install / 9:h'8613a115781b687474703a2f2f6578616d706c652e636f | / install / 9:bstr .cbor ([ | |||
| 6d2f66696c652e62696e1502030f' / [ | ||||
| / directive-set-parameters / 19,{ | / directive-set-parameters / 19,{ | |||
| / uri / 21:'http://example.com/file.bin', | / uri / 21:'http://example.com/file.bin', | |||
| } , | } , | |||
| / directive-fetch / 21,2 , | / directive-fetch / 21,2 , | |||
| / condition-image-match / 3,15 | / condition-image-match / 3,15 | |||
| ] /, | ]), | |||
| / validate / 10:h'82030f' / [ | / validate / 10:bstr .cbor ([ | |||
| / condition-image-match / 3,15 | / condition-image-match / 3,15 | |||
| ] /, | ]), | |||
| } /, | }), | |||
| } | } | |||
| Total size of Envelope without COSE authentication object: 152 | Total size of Envelope without COSE authentication object: 194 | |||
| Envelope: | Envelope: | |||
| a1035894a50101020103585fa202818141000458568614a40150fa6b4a53 | a202582781582482025820987eec85fa99fd31d332381b9810f90b05c2e0 | |||
| d5ad5fdfbe9de663e4d41ffe02501492af1425695e48bf429b2d51f2ab45 | d4f284a6f4211207ed00fff750035894a50101020103585fa20281814100 | |||
| 0358248202582000112233445566778899aabbccddeeff0123456789abcd | 0458568614a40150fa6b4a53d5ad5fdfbe9de663e4d41ffe02501492af14 | |||
| effedcba98765432100e1987d0010f020f0958258613a115781b68747470 | 25695e48bf429b2d51f2ab450358248202582000112233445566778899aa | |||
| 3a2f2f6578616d706c652e636f6d2f66696c652e62696e1502030f0a4382 | bbccddeeff0123456789abcdeffedcba98765432100e1987d0010f020f09 | |||
| 030f | 58258613a115781b687474703a2f2f6578616d706c652e636f6d2f66696c | |||
| 652e62696e1502030f0a4382030f | ||||
| Total size of Envelope with COSE authentication object: 301 | Total size of Envelope with COSE authentication object: 307 | |||
| Envelope with COSE authentication object: | Envelope with COSE authentication object: | |||
| a202589281588fd28443a10126a058448202584039383765656338356661 | a202589882582482025820987eec85fa99fd31d332381b9810f90b05c2e0 | |||
| 393966643331643333323338316239383130663930623035633265306434 | d4f284a6f4211207ed00fff750586fd28443a10126a0582482025820987e | |||
| 66323834613666343231313230376564303066666637353058404931df82 | ec85fa99fd31d332381b9810f90b05c2e0d4f284a6f4211207ed00fff750 | |||
| e153bf1e3af5a59800216d8a47c33a37839e7d63d9f526fd369aa8359daa | 5840750141d65b4f20a88dc70c6785a67e0f4f085aead83ba2289d6e3727 | |||
| e18f7619c959123e7f7f928ee92a9893afedd35d06a936d6ed3d5843bf2a | 1508cc91e0a0592f5c940c2257c9c0b26403c0ba4477f2ce37b60089fe02 | |||
| 035894a50101020103585fa202818141000458568614a40150fa6b4a53d5 | cde7911d1c15035894a50101020103585fa202818141000458568614a401 | |||
| ad5fdfbe9de663e4d41ffe02501492af1425695e48bf429b2d51f2ab4503 | 50fa6b4a53d5ad5fdfbe9de663e4d41ffe02501492af1425695e48bf429b | |||
| 58248202582000112233445566778899aabbccddeeff0123456789abcdef | 2d51f2ab450358248202582000112233445566778899aabbccddeeff0123 | |||
| fedcba98765432100e1987d0010f020f0958258613a115781b687474703a | 456789abcdeffedcba98765432100e1987d0010f020f0958258613a11578 | |||
| 2f2f6578616d706c652e636f6d2f66696c652e62696e1502030f0a438203 | 1b687474703a2f2f6578616d706c652e636f6d2f66696c652e62696e1502 | |||
| 0f | 030f0a4382030f | |||
| B.3. Example 2: Simultaneous Download, Installation, Secure Boot, | B.3. Example 2: Simultaneous Download, Installation, Secure Boot, | |||
| Severed Fields | Severed Fields | |||
| This example covers the following templates: | This example covers the following templates: | |||
| - Compatibility Check (Section 7.1) | - Compatibility Check (Section 7.1) | |||
| - Secure Boot (Section 7.2) | - Secure Boot (Section 7.2) | |||
| skipping to change at page 88, line 27 ¶ | skipping to change at page 93, line 4 ¶ | |||
| B.3. Example 2: Simultaneous Download, Installation, Secure Boot, | B.3. Example 2: Simultaneous Download, Installation, Secure Boot, | |||
| Severed Fields | Severed Fields | |||
| This example covers the following templates: | This example covers the following templates: | |||
| - Compatibility Check (Section 7.1) | - Compatibility Check (Section 7.1) | |||
| - Secure Boot (Section 7.2) | - Secure Boot (Section 7.2) | |||
| - Firmware Download (Section 7.3) | - Firmware Download (Section 7.3) | |||
| This example also demonstrates severable elements (Section 5.5), and | This example also demonstrates severable elements (Section 5.5), and | |||
| text (Section 8.6.4). | text (Section 8.6.4). | |||
| { | { | |||
| / authentication-wrapper / 2:h'81588fd28443a10126a0584482025840373 | / authentication-wrapper / 2:bstr .cbor ({ digest: bstr | |||
| 5363835353739613833626162643731656338656632326661343961633837336637386 | .cbor ([ | |||
| 13730386134336136373465373832616433306236353938643137615840faca70796c3 | / algorithm-id / 2 / "sha256" /, | |||
| 19ce6dae69690a64ced3ab91b9bb7f3e9a5004122d629d2816216a870448424ce4410d | / digest-bytes / | |||
| 658b80215185e32d8ec6feb15c7275d64437c36418463e4' / [ | h'75685579a83babd71ec8ef22fa49ac873f78a708a43a674e782ad30b6598d17a' | |||
| h'd28443a10126a05844820258403735363835353739613833626162643731 | ]) signatures: [ | |||
| 6563386566323266613439616338373366373861373038613433613637346537383261 | bstr .cbor (18([ | |||
| 6433306236353938643137615840faca70796c319ce6dae69690a64ced3ab91b9bb7f3 | / protected / bstr .cbor ({ | |||
| e9a5004122d629d2816216a870448424ce4410d658b80215185e32d8ec6feb15c7275d | / alg / 1:-7 / "ES256" /, | |||
| 64437c36418463e4' / 18([ | }), | |||
| / protected / h'a10126' / { | / unprotected / { | |||
| / alg / 1:-7 / "ES256" /, | }, | |||
| } /, | / payload / bstr .cbor ([ | |||
| / unprotected / { | / algorithm-id / 2 / "sha256" /, | |||
| }, | / digest-bytes / | |||
| / payload / h'8202584037353638353537396138336261626437 | h'75685579a83babd71ec8ef22fa49ac873f78a708a43a674e782ad30b6598d17a' | |||
| 3165633865663232666134396163383733663738613730386134336136373465373832 | ]), | |||
| 61643330623635393864313761' / [ | / signature / h'861b9bfb449125742baa648bc9d148cba4 | |||
| / algorithm-id / 2 / "sha256" /, | 5519cca8efecf705c2165ecdecaeba8b6ce2131284e66708788d741e8779d5973fa8e2 | |||
| / digest-bytes / h'3735363835353739613833626162643 | 5da49eb203c81920719da949' | |||
| 7316563386566323266613439616338373366373861373038613433613637346537383 | ])) | |||
| 261643330623635393864313761' | ] | |||
| ] /, | }), | |||
| / signature / h'faca70796c319ce6dae69690a64ced3ab91b9b | / manifest / 3:bstr .cbor ({ | |||
| b7f3e9a5004122d629d2816216a870448424ce4410d658b80215185e32d8ec6feb15c7 | ||||
| 275d64437c36418463e4' | ||||
| ]) / | ||||
| ] /, | ||||
| / manifest / 3:h'a70101020203585fa202818141000458568614a40150fa6b4 | ||||
| a53d5ad5fdfbe9de663e4d41ffe02501492af1425695e48bf429b2d51f2ab450358248 | ||||
| 202582000112233445566778899aabbccddeeff0123456789abcdeffedcba987654321 | ||||
| 00e1987d0010f020f09820258203ee96dc79641970ae46b929ccf0b72ba9536dd84602 | ||||
| 0dbdc9f949d84ea0e18d20a4382030f0c438217020d8202582023f48b2e2838650f43c | ||||
| 144234aee18401ffe3cce4733b23881c3a8ae2d2b66e8' / { | ||||
| / manifest-version / 1:1, | / manifest-version / 1:1, | |||
| / manifest-sequence-number / 2:2, | / manifest-sequence-number / 2:2, | |||
| / common / 3:h'a202818141000458568614a40150fa6b4a53d5ad5fdfbe9 | / common / 3:bstr .cbor ({ | |||
| de663e4d41ffe02501492af1425695e48bf429b2d51f2ab45035824820258200011223 | ||||
| 3445566778899aabbccddeeff0123456789abcdeffedcba98765432100e1987d0010f0 | ||||
| 20f' / { | ||||
| / components / 2:[ | / components / 2:[ | |||
| [h'00'] | [h'00'] | |||
| ], | ], | |||
| / common-sequence / 4:h'8614a40150fa6b4a53d5ad5fdfbe9de663 | / common-sequence / 4:bstr .cbor ([ | |||
| e4d41ffe02501492af1425695e48bf429b2d51f2ab4503582482025820001122334455 | ||||
| 66778899aabbccddeeff0123456789abcdeffedcba98765432100e1987d0010f020f' | ||||
| / [ | ||||
| / directive-override-parameters / 20,{ | / directive-override-parameters / 20,{ | |||
| / vendor-id / | / vendor-id / | |||
| 1:h'"fa6b4a53d5ad5fdfbe9de663e4d41ffe"' / fa6b4a53-d5ad-5fdf- | 1:h'fa6b4a53d5ad5fdfbe9de663e4d41ffe' / fa6b4a53-d5ad-5fdf- | |||
| be9d-e663e4d41ffe /, | be9d-e663e4d41ffe /, | |||
| / class-id / | / class-id / 2:h'1492af1425695e48bf429b2d51f2ab45' | |||
| 2:h'"1492af1425695e48bf429b2d51f2ab45"' / | / 1492af14-2569-5e48-bf42-9b2d51f2ab45 /, | |||
| 1492af14-2569-5e48-bf42-9b2d51f2ab45 /, | / image-digest / 3:bstr .cbor ([ | |||
| / image-digest / 3:h'8202582000112233445566778899a | ||||
| abbccddeeff0123456789abcdeffedcba9876543210' / [ | ||||
| / algorithm-id / 2 / "sha256" /, | / algorithm-id / 2 / "sha256" /, | |||
| / digest-bytes / | / digest-bytes / | |||
| h'00112233445566778899aabbccddeeff0123456789abcdeffedcba9876543210' | h'00112233445566778899aabbccddeeff0123456789abcdeffedcba9876543210' | |||
| ] /, | ]), | |||
| / image-size / 14:34768, | / image-size / 14:34768, | |||
| } , | } , | |||
| / condition-vendor-identifier / 1,15 , | / condition-vendor-identifier / 1,15 , | |||
| / condition-class-identifier / 2,15 | / condition-class-identifier / 2,15 | |||
| ] /, | ]), | |||
| } /, | }), | |||
| / install / 9:[ | / install / 9:[ | |||
| / algorithm-id / 2 / "sha256" /, | / algorithm-id / 2 / "sha256" /, | |||
| / digest-bytes / | / digest-bytes / | |||
| h'3ee96dc79641970ae46b929ccf0b72ba9536dd846020dbdc9f949d84ea0e18d2' | h'3ee96dc79641970ae46b929ccf0b72ba9536dd846020dbdc9f949d84ea0e18d2' | |||
| ], | ], | |||
| / validate / 10:h'82030f' / [ | / validate / 10:bstr .cbor ([ | |||
| / condition-image-match / 3,15 | / condition-image-match / 3,15 | |||
| ] /, | ]), | |||
| / run / 12:h'821702' / [ | / run / 12:bstr .cbor ([ | |||
| / directive-run / 23,2 | / directive-run / 23,2 | |||
| ] /, | ]), | |||
| / text / 13:[ | / text / 13:[ | |||
| / algorithm-id / 2 / "sha256" /, | / algorithm-id / 2 / "sha256" /, | |||
| / digest-bytes / | / digest-bytes / | |||
| h'23f48b2e2838650f43c144234aee18401ffe3cce4733b23881c3a8ae2d2b66e8' | h'23f48b2e2838650f43c144234aee18401ffe3cce4733b23881c3a8ae2d2b66e8' | |||
| ], | ], | |||
| } /, | }), | |||
| / install / 9:h'8613a1157832687474703a2f2f6578616d706c652e636f6d2f | / install / 9:bstr .cbor ([ | |||
| 766572792f6c6f6e672f706174682f746f2f66696c652f66696c652e62696e1502030f | ||||
| ' / [ | ||||
| / directive-set-parameters / 19,{ | / directive-set-parameters / 19,{ | |||
| / uri / | / uri / | |||
| 21:'http://example.com/very/long/path/to/file/file.bin', | 21:'http://example.com/very/long/path/to/file/file.bin', | |||
| } , | } , | |||
| / directive-fetch / 21,2 , | / directive-fetch / 21,2 , | |||
| / condition-image-match / 3,15 | / condition-image-match / 3,15 | |||
| ] /, | ]), | |||
| / text / 13:h'a1814100a2036761726d2e636f6d0578525468697320636f6d70 | / text / 13:bstr .cbor ({ | |||
| 6f6e656e7420697320612064656d6f6e7374726174696f6e2e20546865206469676573 | ||||
| 7420697320612073616d706c65207061747465726e2c206e6f742061207265616c206f | ||||
| 6e652e' / { | ||||
| [h'00']:{ | [h'00']:{ | |||
| / vendor-domain / 3:'arm.com', | / vendor-domain / 3:'arm.com', | |||
| / component-description / 5:'This component is a | / component-description / 5:'This component is a | |||
| demonstration. The digest is a sample pattern, not a real one.', | demonstration. The digest is a sample pattern, not a real one.', | |||
| } | } | |||
| } /, | }), | |||
| } | } | |||
| Total size of the Envelope without COSE authentication object or | Total size of the Envelope without COSE authentication object or | |||
| Severable Elements: 191 | Severable Elements: 233 | |||
| Envelope: | Envelope: | |||
| a10358bba70101020203585fa202818141000458568614a40150fa6b4a53 | a20258278158248202582075685579a83babd71ec8ef22fa49ac873f78a7 | |||
| d5ad5fdfbe9de663e4d41ffe02501492af1425695e48bf429b2d51f2ab45 | 08a43a674e782ad30b6598d17a0358bba70101020203585fa20281814100 | |||
| 0358248202582000112233445566778899aabbccddeeff0123456789abcd | 0458568614a40150fa6b4a53d5ad5fdfbe9de663e4d41ffe02501492af14 | |||
| effedcba98765432100e1987d0010f020f09820258203ee96dc79641970a | 25695e48bf429b2d51f2ab450358248202582000112233445566778899aa | |||
| e46b929ccf0b72ba9536dd846020dbdc9f949d84ea0e18d20a4382030f0c | bbccddeeff0123456789abcdeffedcba98765432100e1987d0010f020f09 | |||
| 438217020d8202582023f48b2e2838650f43c144234aee18401ffe3cce47 | 820258203ee96dc79641970ae46b929ccf0b72ba9536dd846020dbdc9f94 | |||
| 33b23881c3a8ae2d2b66e8 | 9d84ea0e18d20a4382030f0c438217020d8202582023f48b2e2838650f43 | |||
| c144234aee18401ffe3cce4733b23881c3a8ae2d2b66e8 | ||||
| Total size of the Envelope with COSE authentication object but | Total size of the Envelope with COSE authentication object but | |||
| without Severable Elements: 340 | without Severable Elements: 346 | |||
| Envelope: | Envelope: | |||
| a202589281588fd28443a10126a058448202584037353638353537396138 | a20258988258248202582075685579a83babd71ec8ef22fa49ac873f78a7 | |||
| 336261626437316563386566323266613439616338373366373861373038 | 08a43a674e782ad30b6598d17a586fd28443a10126a05824820258207568 | |||
| 6134336136373465373832616433306236353938643137615840faca7079 | 5579a83babd71ec8ef22fa49ac873f78a708a43a674e782ad30b6598d17a | |||
| 6c319ce6dae69690a64ced3ab91b9bb7f3e9a5004122d629d2816216a870 | 5840861b9bfb449125742baa648bc9d148cba45519cca8efecf705c2165e | |||
| 448424ce4410d658b80215185e32d8ec6feb15c7275d64437c36418463e4 | cdecaeba8b6ce2131284e66708788d741e8779d5973fa8e25da49eb203c8 | |||
| 0358bba70101020203585fa202818141000458568614a40150fa6b4a53d5 | 1920719da9490358bba70101020203585fa202818141000458568614a401 | |||
| ad5fdfbe9de663e4d41ffe02501492af1425695e48bf429b2d51f2ab4503 | 50fa6b4a53d5ad5fdfbe9de663e4d41ffe02501492af1425695e48bf429b | |||
| 58248202582000112233445566778899aabbccddeeff0123456789abcdef | 2d51f2ab450358248202582000112233445566778899aabbccddeeff0123 | |||
| fedcba98765432100e1987d0010f020f09820258203ee96dc79641970ae4 | 456789abcdeffedcba98765432100e1987d0010f020f09820258203ee96d | |||
| 6b929ccf0b72ba9536dd846020dbdc9f949d84ea0e18d20a4382030f0c43 | c79641970ae46b929ccf0b72ba9536dd846020dbdc9f949d84ea0e18d20a | |||
| 8217020d8202582023f48b2e2838650f43c144234aee18401ffe3cce4733 | 4382030f0c438217020d8202582023f48b2e2838650f43c144234aee1840 | |||
| b23881c3a8ae2d2b66e8 | 1ffe3cce4733b23881c3a8ae2d2b66e8 | |||
| Total size of Envelope with COSE authentication object: 923 | Total size of Envelope with COSE authentication object: 929 | |||
| Envelope with COSE authentication object: | Envelope with COSE authentication object: | |||
| a402589281588fd28443a10126a058448202584037353638353537396138 | a40258988258248202582075685579a83babd71ec8ef22fa49ac873f78a7 | |||
| 336261626437316563386566323266613439616338373366373861373038 | 08a43a674e782ad30b6598d17a586fd28443a10126a05824820258207568 | |||
| 6134336136373465373832616433306236353938643137615840faca7079 | 5579a83babd71ec8ef22fa49ac873f78a708a43a674e782ad30b6598d17a | |||
| 6c319ce6dae69690a64ced3ab91b9bb7f3e9a5004122d629d2816216a870 | 5840861b9bfb449125742baa648bc9d148cba45519cca8efecf705c2165e | |||
| 448424ce4410d658b80215185e32d8ec6feb15c7275d64437c36418463e4 | cdecaeba8b6ce2131284e66708788d741e8779d5973fa8e25da49eb203c8 | |||
| 0358bba70101020203585fa202818141000458568614a40150fa6b4a53d5 | 1920719da9490358bba70101020203585fa202818141000458568614a401 | |||
| ad5fdfbe9de663e4d41ffe02501492af1425695e48bf429b2d51f2ab4503 | 50fa6b4a53d5ad5fdfbe9de663e4d41ffe02501492af1425695e48bf429b | |||
| 58248202582000112233445566778899aabbccddeeff0123456789abcdef | 2d51f2ab450358248202582000112233445566778899aabbccddeeff0123 | |||
| fedcba98765432100e1987d0010f020f09820258203ee96dc79641970ae4 | 456789abcdeffedcba98765432100e1987d0010f020f09820258203ee96d | |||
| 6b929ccf0b72ba9536dd846020dbdc9f949d84ea0e18d20a4382030f0c43 | c79641970ae46b929ccf0b72ba9536dd846020dbdc9f949d84ea0e18d20a | |||
| 8217020d8202582023f48b2e2838650f43c144234aee18401ffe3cce4733 | 4382030f0c438217020d8202582023f48b2e2838650f43c144234aee1840 | |||
| b23881c3a8ae2d2b66e809583c8613a1157832687474703a2f2f6578616d | 1ffe3cce4733b23881c3a8ae2d2b66e809583c8613a1157832687474703a | |||
| 706c652e636f6d2f766572792f6c6f6e672f706174682f746f2f66696c65 | 2f2f6578616d706c652e636f6d2f766572792f6c6f6e672f706174682f74 | |||
| 2f66696c652e62696e1502030f0d590204a20179019d2323204578616d70 | 6f2f66696c652f66696c652e62696e1502030f0d590204a20179019d2323 | |||
| 6c6520323a2053696d756c74616e656f757320446f776e6c6f61642c2049 | 204578616d706c6520323a2053696d756c74616e656f757320446f776e6c | |||
| 6e7374616c6c6174696f6e2c2053656375726520426f6f742c2053657665 | 6f61642c20496e7374616c6c6174696f6e2c2053656375726520426f6f74 | |||
| 726564204669656c64730a0a2020202054686973206578616d706c652063 | 2c2053657665726564204669656c64730a0a202020205468697320657861 | |||
| 6f766572732074686520666f6c6c6f77696e672074656d706c617465733a | 6d706c6520636f766572732074686520666f6c6c6f77696e672074656d70 | |||
| 0a202020200a202020202a20436f6d7061746962696c6974792043686563 | 6c617465733a0a202020200a202020202a20436f6d7061746962696c6974 | |||
| 6b20287b7b74656d706c6174652d636f6d7061746962696c6974792d6368 | 7920436865636b20287b7b74656d706c6174652d636f6d7061746962696c | |||
| 65636b7d7d290a202020202a2053656375726520426f6f7420287b7b7465 | 6974792d636865636b7d7d290a202020202a2053656375726520426f6f74 | |||
| 6d706c6174652d7365637572652d626f6f747d7d290a202020202a204669 | 20287b7b74656d706c6174652d7365637572652d626f6f747d7d290a2020 | |||
| 726d7761726520446f776e6c6f616420287b7b6669726d776172652d646f | 20202a204669726d7761726520446f776e6c6f616420287b7b6669726d77 | |||
| 776e6c6f61642d74656d706c6174657d7d290a202020200a202020205468 | 6172652d646f776e6c6f61642d74656d706c6174657d7d290a202020200a | |||
| 6973206578616d706c6520616c736f2064656d6f6e737472617465732073 | 2020202054686973206578616d706c6520616c736f2064656d6f6e737472 | |||
| 6576657261626c6520656c656d656e747320287b7b6f76722d7365766572 | 6174657320736576657261626c6520656c656d656e747320287b7b6f7672 | |||
| 61626c657d7d292c20616e64207465787420287b7b6d616e69666573742d | 2d736576657261626c657d7d292c20616e64207465787420287b7b6d616e | |||
| 6469676573742d746578747d7d292e814100a2036761726d2e636f6d0578 | 69666573742d6469676573742d746578747d7d292e814100a2036761726d | |||
| 525468697320636f6d706f6e656e7420697320612064656d6f6e73747261 | 2e636f6d0578525468697320636f6d706f6e656e7420697320612064656d | |||
| 74696f6e2e205468652064696765737420697320612073616d706c652070 | 6f6e7374726174696f6e2e20546865206469676573742069732061207361 | |||
| 61747465726e2c206e6f742061207265616c206f6e652e | 6d706c65207061747465726e2c206e6f742061207265616c206f6e652e | |||
| B.4. Example 3: A/B images | B.4. Example 3: A/B images | |||
| This example covers the following templates: | This example covers the following templates: | |||
| - Compatibility Check (Section 7.1) | - Compatibility Check (Section 7.1) | |||
| - Secure Boot (Section 7.2) | - Secure Boot (Section 7.2) | |||
| - Firmware Download (Section 7.3) | - Firmware Download (Section 7.3) | |||
| - A/B Image Template (Section 7.10) | - A/B Image Template (Section 7.11) | |||
| { | { | |||
| / authentication-wrapper / 2:h'81588fd28443a10126a0584482025840616 | / authentication-wrapper / 2:bstr .cbor ({ digest: bstr | |||
| 5306331656136383963393830306138343335353066333837393662366664626435326 | .cbor ([ | |||
| 1306337386265356432363031316438653738346461343364343763584010222ddbce4 | / algorithm-id / 2 / "sha256" /, | |||
| e82a85f6ec7b72db34d7c5be8d2e822e4b2d099a4cf1d08aa2174c56c2e93bf20c785b | / digest-bytes / | |||
| ca298900208d92d352faf86e6cddc902a726bbc443c21ff' / [ | h'ae0c1ea689c9800a843550f38796b6fdbd52a0c78be5d26011d8e784da43d47c' | |||
| h'd28443a10126a05844820258406165306331656136383963393830306138 | ]) signatures: [ | |||
| 3433353530663338373936623666646264353261306337386265356432363031316438 | bstr .cbor (18([ | |||
| 653738346461343364343763584010222ddbce4e82a85f6ec7b72db34d7c5be8d2e822 | / protected / bstr .cbor ({ | |||
| e4b2d099a4cf1d08aa2174c56c2e93bf20c785bca298900208d92d352faf86e6cddc90 | / alg / 1:-7 / "ES256" /, | |||
| 2a726bbc443c21ff' / 18([ | }), | |||
| / protected / h'a10126' / { | / unprotected / { | |||
| / alg / 1:-7 / "ES256" /, | }, | |||
| } /, | / payload / bstr .cbor ([ | |||
| / unprotected / { | / algorithm-id / 2 / "sha256" /, | |||
| }, | / digest-bytes / | |||
| / payload / h'8202584061653063316561363839633938303061 | h'ae0c1ea689c9800a843550f38796b6fdbd52a0c78be5d26011d8e784da43d47c' | |||
| 3834333535306633383739366236666462643532613063373862653564323630313164 | ]), | |||
| 38653738346461343364343763' / [ | / signature / h'359960bae5a7de2457c8f48d3250d96d1a | |||
| / algorithm-id / 2 / "sha256" /, | f2d36e08764b62d76f8a3f3041774b150b2c835bb1b2d7b1b2e629e1f08cc3b1b48fce | |||
| / digest-bytes / h'6165306331656136383963393830306 | bb8fb38182c116161e02b33f' | |||
| 1383433353530663338373936623666646264353261306337386265356432363031316 | ])) | |||
| 438653738346461343364343763' | ] | |||
| ] /, | }), | |||
| / signature / h'10222ddbce4e82a85f6ec7b72db34d7c5be8d2 | / manifest / 3:bstr .cbor ({ | |||
| e822e4b2d099a4cf1d08aa2174c56c2e93bf20c785bca298900208d92d352faf86e6cd | ||||
| dc902a726bbc443c21ff' | ||||
| ]) / | ||||
| ] /, | ||||
| / manifest / 3:h'a5010102030358aaa202818141000458a18814a20150fa6b4 | ||||
| a53d5ad5fdfbe9de663e4d41ffe02501492af1425695e48bf429b2d51f2ab450f82583 | ||||
| 68614a105198400050514a20358248202582000112233445566778899aabbccddeeff0 | ||||
| 123456789abcdeffedcba98765432100e1987d0583a8614a1051a00084400050514a20 | ||||
| 35824820258200123456789abcdeffedcba987654321000112233445566778899aabbc | ||||
| cddeeff0e1a00012c22010f020f095861860f82582a8613a105198400050513a115781 | ||||
| c687474703a2f2f6578616d706c652e636f6d2f66696c65312e62696e582c8613a1051 | ||||
| a00084400050513a115781c687474703a2f2f6578616d706c652e636f6d2f66696c653 | ||||
| 22e62696e1502030f0a4382030f' / { | ||||
| / manifest-version / 1:1, | / manifest-version / 1:1, | |||
| / manifest-sequence-number / 2:3, | / manifest-sequence-number / 2:3, | |||
| / common / 3:h'a202818141000458a18814a20150fa6b4a53d5ad5fdfbe9 | / common / 3:bstr .cbor ({ | |||
| de663e4d41ffe02501492af1425695e48bf429b2d51f2ab450f8258368614a10519840 | ||||
| 0050514a20358248202582000112233445566778899aabbccddeeff0123456789abcde | ||||
| ffedcba98765432100e1987d0583a8614a1051a00084400050514a2035824820258200 | ||||
| 123456789abcdeffedcba987654321000112233445566778899aabbccddeeff0e1a000 | ||||
| 12c22010f020f' / { | ||||
| / components / 2:[ | / components / 2:[ | |||
| [h'00'] | [h'00'] | |||
| ], | ], | |||
| / common-sequence / 4:h'8814a20150fa6b4a53d5ad5fdfbe9de663 | / common-sequence / 4:bstr .cbor ([ | |||
| e4d41ffe02501492af1425695e48bf429b2d51f2ab450f8258368614a1051984000505 | ||||
| 14a20358248202582000112233445566778899aabbccddeeff0123456789abcdeffedc | ||||
| ba98765432100e1987d0583a8614a1051a00084400050514a203582482025820012345 | ||||
| 6789abcdeffedcba987654321000112233445566778899aabbccddeeff0e1a00012c22 | ||||
| 010f020f' / [ | ||||
| / directive-override-parameters / 20,{ | / directive-override-parameters / 20,{ | |||
| / vendor-id / | / vendor-id / | |||
| 1:h'"fa6b4a53d5ad5fdfbe9de663e4d41ffe"' / fa6b4a53-d5ad-5fdf- | 1:h'fa6b4a53d5ad5fdfbe9de663e4d41ffe' / fa6b4a53-d5ad-5fdf- | |||
| be9d-e663e4d41ffe /, | be9d-e663e4d41ffe /, | |||
| / class-id / | / class-id / 2:h'1492af1425695e48bf429b2d51f2ab45' | |||
| 2:h'"1492af1425695e48bf429b2d51f2ab45"' / | / 1492af14-2569-5e48-bf42-9b2d51f2ab45 /, | |||
| 1492af14-2569-5e48-bf42-9b2d51f2ab45 /, | ||||
| } , | } , | |||
| / directive-try-each / 15,[ | / directive-try-each / 15,[ | |||
| h'8614a105198400050514a203582482025820001122334455 | bstr .cbor ([ | |||
| 66778899aabbccddeeff0123456789abcdeffedcba98765432100e1987d0' / [ | ||||
| / directive-override-parameters / 20,{ | / directive-override-parameters / 20,{ | |||
| / offset / 5:33792, | / offset / 5:33792, | |||
| } , | } , | |||
| / condition-component-offset / 5,5 , | / condition-component-offset / 5,5 , | |||
| / directive-override-parameters / 20,{ | / directive-override-parameters / 20,{ | |||
| / image-digest / 3:h'820258200011223344556 | / image-digest / 3:bstr .cbor ([ | |||
| 6778899aabbccddeeff0123456789abcdeffedcba9876543210' / [ | ||||
| / algorithm-id / 2 / "sha256" /, | / algorithm-id / 2 / "sha256" /, | |||
| / digest-bytes / | / digest-bytes / | |||
| h'00112233445566778899aabbccddeeff0123456789abcdeffedcba9876543210' | h'00112233445566778899aabbccddeeff0123456789abcdeffedcba9876543210' | |||
| ] /, | ]), | |||
| / image-size / 14:34768, | / image-size / 14:34768, | |||
| } | } | |||
| ] / , | ]) , | |||
| h'8614a1051a00084400050514a20358248202582001234567 | bstr .cbor ([ | |||
| 89abcdeffedcba987654321000112233445566778899aabbccddeeff0e1a00012c22' | ||||
| / [ | ||||
| / directive-override-parameters / 20,{ | / directive-override-parameters / 20,{ | |||
| / offset / 5:541696, | / offset / 5:541696, | |||
| } , | } , | |||
| / condition-component-offset / 5,5 , | / condition-component-offset / 5,5 , | |||
| / directive-override-parameters / 20,{ | / directive-override-parameters / 20,{ | |||
| / image-digest / 3:h'820258200123456789abc | / image-digest / 3:bstr .cbor ([ | |||
| deffedcba987654321000112233445566778899aabbccddeeff' / [ | ||||
| / algorithm-id / 2 / "sha256" /, | / algorithm-id / 2 / "sha256" /, | |||
| / digest-bytes / | / digest-bytes / | |||
| h'0123456789abcdeffedcba987654321000112233445566778899aabbccddeeff' | h'0123456789abcdeffedcba987654321000112233445566778899aabbccddeeff' | |||
| ] /, | ]), | |||
| / image-size / 14:76834, | / image-size / 14:76834, | |||
| } | } | |||
| ] / | ]) | |||
| ] , | ] , | |||
| / condition-vendor-identifier / 1,15 , | / condition-vendor-identifier / 1,15 , | |||
| / condition-class-identifier / 2,15 | / condition-class-identifier / 2,15 | |||
| ]), | ||||
| ] /, | }), | |||
| } /, | / install / 9:bstr .cbor ([ | |||
| / install / 9:h'860f82582a8613a105198400050513a115781c68747470 | ||||
| 3a2f2f6578616d706c652e636f6d2f66696c65312e62696e582c8613a1051a00084400 | ||||
| 050513a115781c687474703a2f2f6578616d706c652e636f6d2f66696c65322e62696e | ||||
| 1502030f' / [ | ||||
| / directive-try-each / 15,[ | / directive-try-each / 15,[ | |||
| h'8613a105198400050513a115781c687474703a2f2f6578616d70 | bstr .cbor ([ | |||
| 6c652e636f6d2f66696c65312e62696e' / [ | ||||
| / directive-set-parameters / 19,{ | / directive-set-parameters / 19,{ | |||
| / offset / 5:33792, | / offset / 5:33792, | |||
| } , | } , | |||
| / condition-component-offset / 5,5 , | / condition-component-offset / 5,5 , | |||
| / directive-set-parameters / 19,{ | / directive-set-parameters / 19,{ | |||
| / uri / 21:'http://example.com/file1.bin', | / uri / 21:'http://example.com/file1.bin', | |||
| } | } | |||
| ] / , | ]) , | |||
| h'8613a1051a00084400050513a115781c687474703a2f2f657861 | bstr .cbor ([ | |||
| 6d706c652e636f6d2f66696c65322e62696e' / [ | ||||
| / directive-set-parameters / 19,{ | / directive-set-parameters / 19,{ | |||
| / offset / 5:541696, | / offset / 5:541696, | |||
| } , | } , | |||
| / condition-component-offset / 5,5 , | / condition-component-offset / 5,5 , | |||
| / directive-set-parameters / 19,{ | / directive-set-parameters / 19,{ | |||
| / uri / 21:'http://example.com/file2.bin', | / uri / 21:'http://example.com/file2.bin', | |||
| } | } | |||
| ] / | ]) | |||
| ] , | ] , | |||
| / directive-fetch / 21,2 , | / directive-fetch / 21,2 , | |||
| / condition-image-match / 3,15 | / condition-image-match / 3,15 | |||
| ] /, | ]), | |||
| / validate / 10:h'82030f' / [ | / validate / 10:bstr .cbor ([ | |||
| / condition-image-match / 3,15 | / condition-image-match / 3,15 | |||
| ] /, | ]), | |||
| } /, | ||||
| }), | ||||
| } | } | |||
| Total size of Envelope without COSE authentication object: 288 | Total size of Envelope without COSE authentication object: 330 | |||
| Envelope: | Envelope: | |||
| a10359011ba5010102030358aaa202818141000458a18814a20150fa6b4a | a202582781582482025820ae0c1ea689c9800a843550f38796b6fdbd52a0 | |||
| 53d5ad5fdfbe9de663e4d41ffe02501492af1425695e48bf429b2d51f2ab | c78be5d26011d8e784da43d47c0359011ba5010102030358aaa202818141 | |||
| 450f8258368614a105198400050514a20358248202582000112233445566 | 000458a18814a20150fa6b4a53d5ad5fdfbe9de663e4d41ffe02501492af | |||
| 778899aabbccddeeff0123456789abcdeffedcba98765432100e1987d058 | 1425695e48bf429b2d51f2ab450f8258368614a105198400050514a20358 | |||
| 3a8614a1051a00084400050514a2035824820258200123456789abcdeffe | 248202582000112233445566778899aabbccddeeff0123456789abcdeffe | |||
| dcba987654321000112233445566778899aabbccddeeff0e1a00012c2201 | dcba98765432100e1987d0583a8614a1051a00084400050514a203582482 | |||
| 0f020f095861860f82582a8613a105198400050513a115781c687474703a | 0258200123456789abcdeffedcba987654321000112233445566778899aa | |||
| 2f2f6578616d706c652e636f6d2f66696c65312e62696e582c8613a1051a | bbccddeeff0e1a00012c22010f020f095861860f82582a8613a105198400 | |||
| 00084400050513a115781c687474703a2f2f6578616d706c652e636f6d2f | 050513a115781c687474703a2f2f6578616d706c652e636f6d2f66696c65 | |||
| 66696c65322e62696e1502030f0a4382030f | 312e62696e582c8613a1051a00084400050513a115781c687474703a2f2f | |||
| 6578616d706c652e636f6d2f66696c65322e62696e1502030f0a4382030f | ||||
| Total size of Envelope with COSE authentication object: 437 | Total size of Envelope with COSE authentication object: 443 | |||
| Envelope with COSE authentication object: | Envelope with COSE authentication object: | |||
| a202589281588fd28443a10126a058448202584061653063316561363839 | a202589882582482025820ae0c1ea689c9800a843550f38796b6fdbd52a0 | |||
| 633938303061383433353530663338373936623666646264353261306337 | c78be5d26011d8e784da43d47c586fd28443a10126a0582482025820ae0c | |||
| 386265356432363031316438653738346461343364343763584010222ddb | 1ea689c9800a843550f38796b6fdbd52a0c78be5d26011d8e784da43d47c | |||
| ce4e82a85f6ec7b72db34d7c5be8d2e822e4b2d099a4cf1d08aa2174c56c | 5840359960bae5a7de2457c8f48d3250d96d1af2d36e08764b62d76f8a3f | |||
| 2e93bf20c785bca298900208d92d352faf86e6cddc902a726bbc443c21ff | 3041774b150b2c835bb1b2d7b1b2e629e1f08cc3b1b48fcebb8fb38182c1 | |||
| 0359011ba5010102030358aaa202818141000458a18814a20150fa6b4a53 | 16161e02b33f0359011ba5010102030358aaa202818141000458a18814a2 | |||
| d5ad5fdfbe9de663e4d41ffe02501492af1425695e48bf429b2d51f2ab45 | 0150fa6b4a53d5ad5fdfbe9de663e4d41ffe02501492af1425695e48bf42 | |||
| 0f8258368614a105198400050514a2035824820258200011223344556677 | 9b2d51f2ab450f8258368614a105198400050514a2035824820258200011 | |||
| 8899aabbccddeeff0123456789abcdeffedcba98765432100e1987d0583a | 2233445566778899aabbccddeeff0123456789abcdeffedcba9876543210 | |||
| 8614a1051a00084400050514a2035824820258200123456789abcdeffedc | 0e1987d0583a8614a1051a00084400050514a20358248202582001234567 | |||
| ba987654321000112233445566778899aabbccddeeff0e1a00012c22010f | 89abcdeffedcba987654321000112233445566778899aabbccddeeff0e1a | |||
| 020f095861860f82582a8613a105198400050513a115781c687474703a2f | 00012c22010f020f095861860f82582a8613a105198400050513a115781c | |||
| 2f6578616d706c652e636f6d2f66696c65312e62696e582c8613a1051a00 | 687474703a2f2f6578616d706c652e636f6d2f66696c65312e62696e582c | |||
| 084400050513a115781c687474703a2f2f6578616d706c652e636f6d2f66 | 8613a1051a00084400050513a115781c687474703a2f2f6578616d706c65 | |||
| 696c65322e62696e1502030f0a4382030f | 2e636f6d2f66696c65322e62696e1502030f0a4382030f | |||
| B.5. Example 4: Load and Decompress from External Storage | B.5. Example 4: Load and Decompress from External Storage | |||
| This example covers the following templates: | This example covers the following templates: | |||
| - Compatibility Check (Section 7.1) | - Compatibility Check (Section 7.1) | |||
| - Secure Boot (Section 7.2) | - Secure Boot (Section 7.2) | |||
| - Firmware Download (Section 7.3) | - Firmware Download (Section 7.3) | |||
| skipping to change at page 96, line 45 ¶ | skipping to change at page 100, line 4 ¶ | |||
| B.5. Example 4: Load and Decompress from External Storage | B.5. Example 4: Load and Decompress from External Storage | |||
| This example covers the following templates: | This example covers the following templates: | |||
| - Compatibility Check (Section 7.1) | - Compatibility Check (Section 7.1) | |||
| - Secure Boot (Section 7.2) | - Secure Boot (Section 7.2) | |||
| - Firmware Download (Section 7.3) | - Firmware Download (Section 7.3) | |||
| - Install (Section 7.4) | - Install (Section 7.4) | |||
| - Load & Decompress (Section 7.7) | - Load & Decompress (Section 7.8) | |||
| { | { | |||
| / authentication-wrapper / 2:h'81588fd28443a10126a0584482025840346 | / authentication-wrapper / 2:bstr .cbor ({ digest: bstr | |||
| 2346337633863306664613736633963393539316139646231363039313865326233633 | .cbor ([ | |||
| 93661353862306135653439383466643465386639333539613932385840d7063361f65 | / algorithm-id / 2 / "sha256" /, | |||
| 3d57e63691e1bd9c856058c773b94e488bff58d599c45277788e90eb92fbef666f584e | / digest-bytes / | |||
| 8d35b3b20ceef50a69b94dcff12beee92e426a06ea31320' / [ | h'4b4c7c8c0fda76c9c9591a9db160918e2b3c96a58b0a5e4984fd4e8f9359a928' | |||
| h'd28443a10126a05844820258403462346337633863306664613736633963 | ]) signatures: [ | |||
| 3935393161396462313630393138653262336339366135386230613565343938346664 | bstr .cbor (18([ | |||
| 3465386639333539613932385840d7063361f653d57e63691e1bd9c856058c773b94e4 | / protected / bstr .cbor ({ | |||
| 88bff58d599c45277788e90eb92fbef666f584e8d35b3b20ceef50a69b94dcff12beee | / alg / 1:-7 / "ES256" /, | |||
| 92e426a06ea31320' / 18([ | }), | |||
| / protected / h'a10126' / { | / unprotected / { | |||
| / alg / 1:-7 / "ES256" /, | }, | |||
| } /, | / payload / bstr .cbor ([ | |||
| / unprotected / { | / algorithm-id / 2 / "sha256" /, | |||
| }, | / digest-bytes / | |||
| / payload / h'8202584034623463376338633066646137366339 | h'4b4c7c8c0fda76c9c9591a9db160918e2b3c96a58b0a5e4984fd4e8f9359a928' | |||
| 6339353931613964623136303931386532623363393661353862306135653439383466 | ]), | |||
| 64346538663933353961393238' / [ | / signature / h'd721cb3415f27cfeb8ef066bb6312ba758 | |||
| / algorithm-id / 2 / "sha256" /, | 32b57410a0c700de71cf8004ea23b9dd3c912a99fab111e9b8f2cc55c7dffcc37012de | |||
| / digest-bytes / h'3462346337633863306664613736633 | cf72e44f69b3d3db8cc98cb6' | |||
| 9633935393161396462313630393138653262336339366135386230613565343938346 | ])) | |||
| 664346538663933353961393238' | ] | |||
| ] /, | }), | |||
| / signature / h'd7063361f653d57e63691e1bd9c856058c773b | / manifest / 3:bstr .cbor ({ | |||
| 94e488bff58d599c45277788e90eb92fbef666f584e8d35b3b20ceef50a69b94dcff12 | ||||
| beee92e426a06ea31320' | ||||
| ]) / | ||||
| ] /, | ||||
| / manifest / 3:h'a801010204035867a20283814100814102814101045858880 | ||||
| c0014a40150fa6b4a53d5ad5fdfbe9de663e4d41ffe02501492af1425695e48bf429b2 | ||||
| d51f2ab450358248202582000112233445566778899aabbccddeeff0123456789abcde | ||||
| ffedcba98765432100e1987d0010f020f085827880c0113a115781b687474703a2f2f6 | ||||
| 578616d706c652e636f6d2f66696c652e62696e1502030f094b880c0013a1160116020 | ||||
| 30f0a45840c00030f0b583a880c0213a4035824820258200123456789abcdeffedcba9 | ||||
| 87654321000112233445566778899aabbccddeeff0e1a00012c22130116001602030f0 | ||||
| c45840c021702' / { | ||||
| / manifest-version / 1:1, | / manifest-version / 1:1, | |||
| / manifest-sequence-number / 2:4, | / manifest-sequence-number / 2:4, | |||
| / common / 3:h'a20283814100814102814101045858880c0014a40150fa6 | / common / 3:bstr .cbor ({ | |||
| b4a53d5ad5fdfbe9de663e4d41ffe02501492af1425695e48bf429b2d51f2ab4503582 | ||||
| 48202582000112233445566778899aabbccddeeff0123456789abcdeffedcba9876543 | ||||
| 2100e1987d0010f020f' / { | ||||
| / components / 2:[ | / components / 2:[ | |||
| [h'00'] , | [h'00'] , | |||
| [h'02'] , | [h'02'] , | |||
| [h'01'] | [h'01'] | |||
| ], | ], | |||
| / common-sequence / 4:h'880c0014a40150fa6b4a53d5ad5fdfbe9d | / common-sequence / 4:bstr .cbor ([ | |||
| e663e4d41ffe02501492af1425695e48bf429b2d51f2ab450358248202582000112233 | ||||
| 445566778899aabbccddeeff0123456789abcdeffedcba98765432100e1987d0010f02 | ||||
| 0f' / [ | ||||
| / directive-set-component-index / 12,0 , | / directive-set-component-index / 12,0 , | |||
| / directive-override-parameters / 20,{ | / directive-override-parameters / 20,{ | |||
| / vendor-id / | / vendor-id / | |||
| 1:h'"fa6b4a53d5ad5fdfbe9de663e4d41ffe"' / fa6b4a53-d5ad-5fdf- | 1:h'fa6b4a53d5ad5fdfbe9de663e4d41ffe' / fa6b4a53-d5ad-5fdf- | |||
| be9d-e663e4d41ffe /, | be9d-e663e4d41ffe /, | |||
| / class-id / | / class-id / 2:h'1492af1425695e48bf429b2d51f2ab45' | |||
| 2:h'"1492af1425695e48bf429b2d51f2ab45"' / | / 1492af14-2569-5e48-bf42-9b2d51f2ab45 /, | |||
| 1492af14-2569-5e48-bf42-9b2d51f2ab45 /, | / image-digest / 3:bstr .cbor ([ | |||
| / image-digest / 3:h'8202582000112233445566778899a | ||||
| abbccddeeff0123456789abcdeffedcba9876543210' / [ | ||||
| / algorithm-id / 2 / "sha256" /, | / algorithm-id / 2 / "sha256" /, | |||
| / digest-bytes / | / digest-bytes / | |||
| h'00112233445566778899aabbccddeeff0123456789abcdeffedcba9876543210' | h'00112233445566778899aabbccddeeff0123456789abcdeffedcba9876543210' | |||
| ] /, | ]), | |||
| / image-size / 14:34768, | / image-size / 14:34768, | |||
| } , | } , | |||
| / condition-vendor-identifier / 1,15 , | / condition-vendor-identifier / 1,15 , | |||
| / condition-class-identifier / 2,15 | / condition-class-identifier / 2,15 | |||
| ] /, | ]), | |||
| } /, | }), | |||
| / payload-fetch / 8:h'880c0113a115781b687474703a2f2f6578616d70 | / payload-fetch / 8:bstr .cbor ([ | |||
| 6c652e636f6d2f66696c652e62696e1502030f' / [ | ||||
| / directive-set-component-index / 12,1 , | / directive-set-component-index / 12,1 , | |||
| / directive-set-parameters / 19,{ | / directive-set-parameters / 19,{ | |||
| / uri / 21:'http://example.com/file.bin', | / uri / 21:'http://example.com/file.bin', | |||
| } , | } , | |||
| / directive-fetch / 21,2 , | / directive-fetch / 21,2 , | |||
| / condition-image-match / 3,15 | / condition-image-match / 3,15 | |||
| ] /, | ]), | |||
| / install / 9:h'880c0013a116011602030f' / [ | / install / 9:bstr .cbor ([ | |||
| / directive-set-component-index / 12,0 , | / directive-set-component-index / 12,0 , | |||
| / directive-set-parameters / 19,{ | / directive-set-parameters / 19,{ | |||
| / source-component / 22:1 / [h'02'] /, | / source-component / 22:1 / [h'02'] /, | |||
| } , | } , | |||
| / directive-copy / 22,2 , | / directive-copy / 22,2 , | |||
| / condition-image-match / 3,15 | / condition-image-match / 3,15 | |||
| ] /, | ]), | |||
| / validate / 10:h'840c00030f' / [ | / validate / 10:bstr .cbor ([ | |||
| / directive-set-component-index / 12,0 , | / directive-set-component-index / 12,0 , | |||
| / condition-image-match / 3,15 | / condition-image-match / 3,15 | |||
| ] /, | ]), | |||
| / load / 11:h'880c0213a4035824820258200123456789abcdeffedcba98 | / load / 11:bstr .cbor ([ | |||
| 7654321000112233445566778899aabbccddeeff0e1a00012c22130116001602030f' | ||||
| / [ | ||||
| / directive-set-component-index / 12,2 , | / directive-set-component-index / 12,2 , | |||
| / directive-set-parameters / 19,{ | / directive-set-parameters / 19,{ | |||
| / image-digest / 3:h'820258200123456789abcdeffedcba987 | / image-digest / 3:bstr .cbor ([ | |||
| 654321000112233445566778899aabbccddeeff' / [ | ||||
| / algorithm-id / 2 / "sha256" /, | / algorithm-id / 2 / "sha256" /, | |||
| / digest-bytes / | / digest-bytes / | |||
| h'0123456789abcdeffedcba987654321000112233445566778899aabbccddeeff' | h'0123456789abcdeffedcba987654321000112233445566778899aabbccddeeff' | |||
| ] /, | ]), | |||
| / image-size / 14:76834, | / image-size / 14:76834, | |||
| / source-component / 22:0 / [h'00'] /, | / source-component / 22:0 / [h'00'] /, | |||
| / compression-info / 19:1 / "gzip" /, | / compression-info / 19:1 / "gzip" /, | |||
| } , | } , | |||
| / directive-copy / 22,2 , | / directive-copy / 22,2 , | |||
| / condition-image-match / 3,15 | / condition-image-match / 3,15 | |||
| ] /, | ]), | |||
| / run / 12:h'840c021702' / [ | / run / 12:bstr .cbor ([ | |||
| / directive-set-component-index / 12,2 , | / directive-set-component-index / 12,2 , | |||
| / directive-run / 23,2 | / directive-run / 23,2 | |||
| ] /, | ]), | |||
| } /, | }), | |||
| } | } | |||
| Total size of Envelope without COSE authentication object: 245 | Total size of Envelope without COSE authentication object: 287 | |||
| Envelope: | Envelope: | |||
| a10358f1a801010204035867a20283814100814102814101045858880c00 | a2025827815824820258204b4c7c8c0fda76c9c9591a9db160918e2b3c96 | |||
| 14a40150fa6b4a53d5ad5fdfbe9de663e4d41ffe02501492af1425695e48 | a58b0a5e4984fd4e8f9359a9280358f1a801010204035867a20283814100 | |||
| bf429b2d51f2ab450358248202582000112233445566778899aabbccddee | 814102814101045858880c0014a40150fa6b4a53d5ad5fdfbe9de663e4d4 | |||
| ff0123456789abcdeffedcba98765432100e1987d0010f020f085827880c | 1ffe02501492af1425695e48bf429b2d51f2ab4503582482025820001122 | |||
| 0113a115781b687474703a2f2f6578616d706c652e636f6d2f66696c652e | 33445566778899aabbccddeeff0123456789abcdeffedcba98765432100e | |||
| 62696e1502030f094b880c0013a116011602030f0a45840c00030f0b583a | 1987d0010f020f085827880c0113a115781b687474703a2f2f6578616d70 | |||
| 880c0213a4035824820258200123456789abcdeffedcba98765432100011 | 6c652e636f6d2f66696c652e62696e1502030f094b880c0013a116011602 | |||
| 2233445566778899aabbccddeeff0e1a00012c22130116001602030f0c45 | 030f0a45840c00030f0b583a880c0213a4035824820258200123456789ab | |||
| 840c021702 | cdeffedcba987654321000112233445566778899aabbccddeeff0e1a0001 | |||
| 2c22130116001602030f0c45840c021702 | ||||
| Total size of Envelope with COSE authentication object: 394 | Total size of Envelope with COSE authentication object: 400 | |||
| Envelope with COSE authentication object: | Envelope with COSE authentication object: | |||
| a202589281588fd28443a10126a058448202584034623463376338633066 | a2025898825824820258204b4c7c8c0fda76c9c9591a9db160918e2b3c96 | |||
| 646137366339633935393161396462313630393138653262336339366135 | a58b0a5e4984fd4e8f9359a928586fd28443a10126a05824820258204b4c | |||
| 3862306135653439383466643465386639333539613932385840d7063361 | 7c8c0fda76c9c9591a9db160918e2b3c96a58b0a5e4984fd4e8f9359a928 | |||
| f653d57e63691e1bd9c856058c773b94e488bff58d599c45277788e90eb9 | 5840d721cb3415f27cfeb8ef066bb6312ba75832b57410a0c700de71cf80 | |||
| 2fbef666f584e8d35b3b20ceef50a69b94dcff12beee92e426a06ea31320 | 04ea23b9dd3c912a99fab111e9b8f2cc55c7dffcc37012decf72e44f69b3 | |||
| 0358f1a801010204035867a20283814100814102814101045858880c0014 | d3db8cc98cb60358f1a801010204035867a2028381410081410281410104 | |||
| a40150fa6b4a53d5ad5fdfbe9de663e4d41ffe02501492af1425695e48bf | 5858880c0014a40150fa6b4a53d5ad5fdfbe9de663e4d41ffe02501492af | |||
| 429b2d51f2ab450358248202582000112233445566778899aabbccddeeff | 1425695e48bf429b2d51f2ab450358248202582000112233445566778899 | |||
| 0123456789abcdeffedcba98765432100e1987d0010f020f085827880c01 | aabbccddeeff0123456789abcdeffedcba98765432100e1987d0010f020f | |||
| 13a115781b687474703a2f2f6578616d706c652e636f6d2f66696c652e62 | 085827880c0113a115781b687474703a2f2f6578616d706c652e636f6d2f | |||
| 696e1502030f094b880c0013a116011602030f0a45840c00030f0b583a88 | 66696c652e62696e1502030f094b880c0013a116011602030f0a45840c00 | |||
| 0c0213a4035824820258200123456789abcdeffedcba9876543210001122 | 030f0b583a880c0213a4035824820258200123456789abcdeffedcba9876 | |||
| 33445566778899aabbccddeeff0e1a00012c22130116001602030f0c4584 | 54321000112233445566778899aabbccddeeff0e1a00012c221301160016 | |||
| 0c021702 | 02030f0c45840c021702 | |||
| B.6. Example 5: Two Images | B.6. Example 5: Two Images | |||
| This example covers the following templates: | This example covers the following templates: | |||
| - Compatibility Check (Section 7.1) | - Compatibility Check (Section 7.1) | |||
| - Secure Boot (Section 7.2) | - Secure Boot (Section 7.2) | |||
| - Firmware Download (Section 7.3) | - Firmware Download (Section 7.3) | |||
| Furthermore, it shows using these templates with two images. | Furthermore, it shows using these templates with two images. | |||
| { | { | |||
| / authentication-wrapper / 2:h'81588fd28443a10126a0584482025840323 | / authentication-wrapper / 2:bstr .cbor ({ digest: bstr | |||
| 1306231323835306332333930393164386538326330653965393130363632623638616 | .cbor ([ | |||
| 33834323435386136343138653333663637303165643538333432635840b5b8cb30c2b | / algorithm-id / 2 / "sha256" /, | |||
| bb646c4d32426d72768668d6d6af54c26ac46c4020ca37ada47b9468340b4d0b2ddd15 | / digest-bytes / | |||
| db824a7e6b0bc233e753940dfb7131fa145ddc456da3cf6' / [ | h'de7c7927a15bd2eda59cab1512875f17c9f1e9e23885ce1ac6d671eefcefa37a' | |||
| h'd28443a10126a05844820258403231306231323835306332333930393164 | ]) signatures: [ | |||
| 3865383263306539653931303636326236386163383432343538613634313865333366 | bstr .cbor (18([ | |||
| 3637303165643538333432635840b5b8cb30c2bbb646c4d32426d72768668d6d6af54c | / protected / bstr .cbor ({ | |||
| 26ac46c4020ca37ada47b9468340b4d0b2ddd15db824a7e6b0bc233e753940dfb7131f | / alg / 1:-7 / "ES256" /, | |||
| a145ddc456da3cf6' / 18([ | }), | |||
| / protected / h'a10126' / { | / unprotected / { | |||
| / alg / 1:-7 / "ES256" /, | }, | |||
| } /, | / payload / bstr .cbor ([ | |||
| / unprotected / { | / algorithm-id / 2 / "sha256" /, | |||
| }, | / digest-bytes / | |||
| / payload / h'8202584032313062313238353063323339303931 | h'de7c7927a15bd2eda59cab1512875f17c9f1e9e23885ce1ac6d671eefcefa37a' | |||
| 6438653832633065396539313036363262363861633834323435386136343138653333 | ]), | |||
| 66363730316564353833343263' / [ | / signature / h'e71e332c985fb0479f296685669d05348b | |||
| / algorithm-id / 2 / "sha256" /, | cdba8e186f25a5418f4682ea168df61661f54bf48f964577225ed455b22d277dd94de8 | |||
| / digest-bytes / h'3231306231323835306332333930393 | 7c57f1baceedd6719f3d56ec' | |||
| ])) | ||||
| 1643865383263306539653931303636326236386163383432343538613634313865333 | ] | |||
| 366363730316564353833343263' | }), | |||
| ] /, | / manifest / 3:bstr .cbor ({ | |||
| / signature / h'b5b8cb30c2bbb646c4d32426d72768668d6d6a | ||||
| f54c26ac46c4020ca37ada47b9468340b4d0b2ddd15db824a7e6b0bc233e753940dfb7 | ||||
| 131fa145ddc456da3cf6' | ||||
| ]) / | ||||
| ] /, | ||||
| / manifest / 3:h'a601010205035895a202828141008141010458898c0c0014a | ||||
| 40150fa6b4a53d5ad5fdfbe9de663e4d41ffe02501492af1425695e48bf429b2d51f2a | ||||
| b450358248202582000112233445566778899aabbccddeeff0123456789abcdeffedcb | ||||
| a98765432100e1987d0010f020f0c0114a2035824820258200123456789abcdeffedcb | ||||
| a987654321000112233445566778899aabbccddeeff0e1a00012c2209584f900c0013a | ||||
| 115781c687474703a2f2f6578616d706c652e636f6d2f66696c65312e62696e1502030 | ||||
| f0c0113a115781c687474703a2f2f6578616d706c652e636f6d2f66696c65322e62696 | ||||
| e1502030f0a49880c00030f0c01030f0c47860c0017021702' / { | ||||
| / manifest-version / 1:1, | / manifest-version / 1:1, | |||
| / manifest-sequence-number / 2:5, | / manifest-sequence-number / 2:5, | |||
| / common / 3:h'a202828141008141010458898c0c0014a40150fa6b4a53d | / common / 3:bstr .cbor ({ | |||
| 5ad5fdfbe9de663e4d41ffe02501492af1425695e48bf429b2d51f2ab4503582482025 | ||||
| 82000112233445566778899aabbccddeeff0123456789abcdeffedcba98765432100e1 | ||||
| 987d0010f020f0c0114a2035824820258200123456789abcdeffedcba9876543210001 | ||||
| 12233445566778899aabbccddeeff0e1a00012c22' / { | ||||
| / components / 2:[ | / components / 2:[ | |||
| [h'00'] , | [h'00'] , | |||
| [h'01'] | [h'01'] | |||
| ], | ], | |||
| / common-sequence / 4:h'8c0c0014a40150fa6b4a53d5ad5fdfbe9d | / common-sequence / 4:bstr .cbor ([ | |||
| e663e4d41ffe02501492af1425695e48bf429b2d51f2ab450358248202582000112233 | ||||
| 445566778899aabbccddeeff0123456789abcdeffedcba98765432100e1987d0010f02 | ||||
| 0f0c0114a2035824820258200123456789abcdeffedcba987654321000112233445566 | ||||
| 778899aabbccddeeff0e1a00012c22' / [ | ||||
| / directive-set-component-index / 12,0 , | / directive-set-component-index / 12,0 , | |||
| / directive-override-parameters / 20,{ | / directive-override-parameters / 20,{ | |||
| / vendor-id / | / vendor-id / | |||
| 1:h'"fa6b4a53d5ad5fdfbe9de663e4d41ffe"' / fa6b4a53-d5ad-5fdf- | 1:h'fa6b4a53d5ad5fdfbe9de663e4d41ffe' / fa6b4a53-d5ad-5fdf- | |||
| be9d-e663e4d41ffe /, | be9d-e663e4d41ffe /, | |||
| / class-id / | / class-id / 2:h'1492af1425695e48bf429b2d51f2ab45' | |||
| 2:h'"1492af1425695e48bf429b2d51f2ab45"' / | / 1492af14-2569-5e48-bf42-9b2d51f2ab45 /, | |||
| 1492af14-2569-5e48-bf42-9b2d51f2ab45 /, | / image-digest / 3:bstr .cbor ([ | |||
| / image-digest / 3:h'8202582000112233445566778899a | ||||
| abbccddeeff0123456789abcdeffedcba9876543210' / [ | ||||
| / algorithm-id / 2 / "sha256" /, | / algorithm-id / 2 / "sha256" /, | |||
| / digest-bytes / | / digest-bytes / | |||
| h'00112233445566778899aabbccddeeff0123456789abcdeffedcba9876543210' | h'00112233445566778899aabbccddeeff0123456789abcdeffedcba9876543210' | |||
| ] /, | ]), | |||
| / image-size / 14:34768, | / image-size / 14:34768, | |||
| } , | } , | |||
| / condition-vendor-identifier / 1,15 , | / condition-vendor-identifier / 1,15 , | |||
| / condition-class-identifier / 2,15 , | / condition-class-identifier / 2,15 , | |||
| / directive-set-component-index / 12,1 , | / directive-set-component-index / 12,1 , | |||
| / directive-override-parameters / 20,{ | / directive-override-parameters / 20,{ | |||
| / image-digest / 3:h'820258200123456789abcdeffedcb | / image-digest / 3:bstr .cbor ([ | |||
| a987654321000112233445566778899aabbccddeeff' / [ | ||||
| / algorithm-id / 2 / "sha256" /, | / algorithm-id / 2 / "sha256" /, | |||
| / digest-bytes / | / digest-bytes / | |||
| h'0123456789abcdeffedcba987654321000112233445566778899aabbccddeeff' | h'0123456789abcdeffedcba987654321000112233445566778899aabbccddeeff' | |||
| ] /, | ]), | |||
| / image-size / 14:76834, | / image-size / 14:76834, | |||
| } | } | |||
| ] /, | ]), | |||
| } /, | }), | |||
| / install / 9:h'900c0013a115781c687474703a2f2f6578616d706c652e | / install / 9:bstr .cbor ([ | |||
| 636f6d2f66696c65312e62696e1502030f0c0113a115781c687474703a2f2f6578616d | ||||
| 706c652e636f6d2f66696c65322e62696e1502030f' / [ | ||||
| / directive-set-component-index / 12,0 , | / directive-set-component-index / 12,0 , | |||
| / directive-set-parameters / 19,{ | / directive-set-parameters / 19,{ | |||
| / uri / 21:'http://example.com/file1.bin', | / uri / 21:'http://example.com/file1.bin', | |||
| } , | } , | |||
| / directive-fetch / 21,2 , | / directive-fetch / 21,2 , | |||
| / condition-image-match / 3,15 , | / condition-image-match / 3,15 , | |||
| / directive-set-component-index / 12,1 , | / directive-set-component-index / 12,1 , | |||
| / directive-set-parameters / 19,{ | / directive-set-parameters / 19,{ | |||
| / uri / 21:'http://example.com/file2.bin', | / uri / 21:'http://example.com/file2.bin', | |||
| } , | } , | |||
| / directive-fetch / 21,2 , | / directive-fetch / 21,2 , | |||
| / condition-image-match / 3,15 | / condition-image-match / 3,15 | |||
| ] /, | ]), | |||
| / validate / 10:h'880c00030f0c01030f' / [ | / validate / 10:bstr .cbor ([ | |||
| / directive-set-component-index / 12,0 , | / directive-set-component-index / 12,0 , | |||
| / condition-image-match / 3,15 , | / condition-image-match / 3,15 , | |||
| / directive-set-component-index / 12,1 , | / directive-set-component-index / 12,1 , | |||
| / condition-image-match / 3,15 | / condition-image-match / 3,15 | |||
| ] /, | ]), | |||
| / run / 12:h'860c0017021702' / [ | / run / 12:bstr .cbor ([ | |||
| / directive-set-component-index / 12,0 , | / directive-set-component-index / 12,0 , | |||
| / directive-run / 23,2 , | ||||
| / directive-run / 23,2 | / directive-run / 23,2 | |||
| ] /, | ]), | |||
| } /, | }), | |||
| } | } | |||
| Total size of Envelope without COSE authentication object: 264 | Total size of Envelope without COSE authentication object: 304 | |||
| Envelope: | Envelope: | |||
| a103590103a601010205035895a202828141008141010458898c0c0014a4 | a202582781582482025820de7c7927a15bd2eda59cab1512875f17c9f1e9 | |||
| 0150fa6b4a53d5ad5fdfbe9de663e4d41ffe02501492af1425695e48bf42 | e23885ce1ac6d671eefcefa37a03590101a601010205035895a202828141 | |||
| 9b2d51f2ab450358248202582000112233445566778899aabbccddeeff01 | 008141010458898c0c0014a40150fa6b4a53d5ad5fdfbe9de663e4d41ffe | |||
| 23456789abcdeffedcba98765432100e1987d0010f020f0c0114a2035824 | 02501492af1425695e48bf429b2d51f2ab45035824820258200011223344 | |||
| 820258200123456789abcdeffedcba987654321000112233445566778899 | 5566778899aabbccddeeff0123456789abcdeffedcba98765432100e1987 | |||
| aabbccddeeff0e1a00012c2209584f900c0013a115781c687474703a2f2f | d0010f020f0c0114a2035824820258200123456789abcdeffedcba987654 | |||
| 6578616d706c652e636f6d2f66696c65312e62696e1502030f0c0113a115 | 321000112233445566778899aabbccddeeff0e1a00012c2209584f900c00 | |||
| 781c687474703a2f2f6578616d706c652e636f6d2f66696c65322e62696e | 13a115781c687474703a2f2f6578616d706c652e636f6d2f66696c65312e | |||
| 1502030f0a49880c00030f0c01030f0c47860c0017021702 | 62696e1502030f0c0113a115781c687474703a2f2f6578616d706c652e63 | |||
| 6f6d2f66696c65322e62696e1502030f0a49880c00030f0c01030f0c4584 | ||||
| 0c001702 | ||||
| Total size of Envelope with COSE authentication object: 413 | Total size of Envelope with COSE authentication object: 417 | |||
| Envelope with COSE authentication object: | Envelope with COSE authentication object: | |||
| a202589281588fd28443a10126a058448202584032313062313238353063 | a202589882582482025820de7c7927a15bd2eda59cab1512875f17c9f1e9 | |||
| 323339303931643865383263306539653931303636326236386163383432 | e23885ce1ac6d671eefcefa37a586fd28443a10126a0582482025820de7c | |||
| 3435386136343138653333663637303165643538333432635840b5b8cb30 | 7927a15bd2eda59cab1512875f17c9f1e9e23885ce1ac6d671eefcefa37a | |||
| c2bbb646c4d32426d72768668d6d6af54c26ac46c4020ca37ada47b94683 | 5840e71e332c985fb0479f296685669d05348bcdba8e186f25a5418f4682 | |||
| 40b4d0b2ddd15db824a7e6b0bc233e753940dfb7131fa145ddc456da3cf6 | ea168df61661f54bf48f964577225ed455b22d277dd94de87c57f1baceed | |||
| 03590103a601010205035895a202828141008141010458898c0c0014a401 | d6719f3d56ec03590101a601010205035895a20282814100814101045889 | |||
| 50fa6b4a53d5ad5fdfbe9de663e4d41ffe02501492af1425695e48bf429b | 8c0c0014a40150fa6b4a53d5ad5fdfbe9de663e4d41ffe02501492af1425 | |||
| 2d51f2ab450358248202582000112233445566778899aabbccddeeff0123 | 695e48bf429b2d51f2ab450358248202582000112233445566778899aabb | |||
| 456789abcdeffedcba98765432100e1987d0010f020f0c0114a203582482 | ccddeeff0123456789abcdeffedcba98765432100e1987d0010f020f0c01 | |||
| 0258200123456789abcdeffedcba987654321000112233445566778899aa | 14a2035824820258200123456789abcdeffedcba98765432100011223344 | |||
| bbccddeeff0e1a00012c2209584f900c0013a115781c687474703a2f2f65 | 5566778899aabbccddeeff0e1a00012c2209584f900c0013a115781c6874 | |||
| 78616d706c652e636f6d2f66696c65312e62696e1502030f0c0113a11578 | 74703a2f2f6578616d706c652e636f6d2f66696c65312e62696e1502030f | |||
| 1c687474703a2f2f6578616d706c652e636f6d2f66696c65322e62696e15 | 0c0113a115781c687474703a2f2f6578616d706c652e636f6d2f66696c65 | |||
| 02030f0a49880c00030f0c01030f0c47860c0017021702 | 322e62696e1502030f0a49880c00030f0c01030f0c45840c001702 | |||
| C. Design Rational | Appendix C. C. Design Rational | |||
| In order to provide flexible behavior to constrained devices, while | In order to provide flexible behavior 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 behavior of a Recipient | the SUIT manifest encodes the required behavior of a Recipient | |||
| device. Behavior is encoded as a specialized byte code, contained in | device. Behavior is encoded as a specialized byte code, contained in | |||
| a CBOR list. This promotes a flat encoding, which simplifies the | 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 | invocation operations are represented in the byte code. The byte | |||
| can be extended by registering new operations. | code can be extended by registering new operations. | |||
| The specialized byte code approach gives benefits equivalent to those | The specialized byte code approach gives benefits equivalent to those | |||
| provided by a scripting language or conventional byte code, with two | provided by a scripting language or conventional byte code, with two | |||
| substantial differences. First, the language is extremely high | substantial differences. First, the language is extremely high | |||
| level, consisting of only the operations that a device may perform | level, consisting of only the operations that a device may perform | |||
| during update and trusted execution of a firmware image. Second, the | during update and trusted invocation of a firmware image. Second, | |||
| language specifies linear behavior, without reverse branches. | the language specifies linear behavior, without reverse branches. | |||
| Conditional processing is supported, and parallel and out-of-order | Conditional processing is supported, and parallel and out-of-order | |||
| processing may be performed by sufficiently capable devices. | processing may be performed by sufficiently capable devices. | |||
| By structuring the data in this way, the manifest processor becomes a | By structuring the data in this way, the manifest processor becomes a | |||
| very simple engine that uses a pull parser to interpret the manifest. | very simple engine that uses a pull parser to interpret the manifest. | |||
| This pull parser invokes a series of command handlers that evaluate a | This pull parser invokes a series of command handlers that evaluate a | |||
| Condition or execute a Directive. Most data is structured in a | Condition or execute a Directive. Most data is structured in a | |||
| highly regular pattern, which simplifies the parser. | highly regular pattern, which simplifies the parser. | |||
| The results of this allow a Recipient to implement a very small | The results of this allow a Recipient to implement a very small | |||
| skipping to change at page 106, line 13 ¶ | skipping to change at page 108, line 17 ¶ | |||
| command sequences are also wrapped in the manifest. This also allows | command sequences are also wrapped in the manifest. This also allows | |||
| the parser to discern the difference between a command sequence and a | the parser to discern the difference between a command sequence and a | |||
| SUIT_Digest. | SUIT_Digest. | |||
| Parameters that are structured types (arrays and maps) are also | Parameters that are structured types (arrays and maps) are also | |||
| wrapped in a bstr. This is so that parser extents can be set | wrapped in a bstr. This is so that parser extents can be set | |||
| correctly using only a reference to the beginning of the parameter. | correctly using only a reference to the beginning of the parameter. | |||
| This enables a parser to store a simple list of references to | This enables a parser to store a simple list of references to | |||
| parameters that can be retrieved when needed. | parameters that can be retrieved when needed. | |||
| D. Implementation Conformance Matrix | Appendix D. D. Implementation Conformance Matrix | |||
| This section summarizes the functionality a minimal implementation | This section summarizes the functionality a minimal implementation | |||
| needs to offer to claim conformance to this specification, in the | needs to offer to claim conformance to this specification, in the | |||
| absence of an application profile standard specifying otherwise. | absence of an application profile standard specifying otherwise. | |||
| The subsequent table shows the conditions. | The subsequent table shows the conditions. | |||
| +-------------------+-----------------+----------------+ | +-------------------+------------------+----------------+ | |||
| | Name | Reference | Implementation | | | Name | Reference | Implementation | | |||
| +-------------------+-----------------+----------------+ | +-------------------+------------------+----------------+ | |||
| | Vendor Identifier | Section 8.7.5.1 | REQUIRED | | | Vendor Identifier | Section 8.7.5.2 | REQUIRED | | |||
| | | | | | | | | | | |||
| | Class Identifier | Section 8.7.5.1 | REQUIRED | | | Class Identifier | Section 8.7.5.2 | REQUIRED | | |||
| | | | | | | | | | | |||
| | Device Identifier | Section 8.7.5.1 | OPTIONAL | | | Device Identifier | Section 8.7.5.2 | OPTIONAL | | |||
| | | | | | | | | | | |||
| | Image Match | Section 8.7.6.2 | REQUIRED | | | Image Match | Section 8.7.6.2 | REQUIRED | | |||
| | | | | | | | | | | |||
| | Image Not Match | Section 8.7.6.3 | OPTIONAL | | | Image Not Match | Section 8.7.6.3 | OPTIONAL | | |||
| | | | | | | | | | | |||
| | Use Before | Section 8.7.6.4 | OPTIONAL | | | Use Before | Section 8.7.6.4 | OPTIONAL | | |||
| | | | | | | | | | | |||
| | Component Offset | Section 8.7.6.5 | OPTIONAL | | | Component Offset | Section 8.7.6.5 | OPTIONAL | | |||
| | | | | | | | | | | |||
| | Minimum Battery | Section 8.7.6.6 | OPTIONAL | | | Abort | Section 8.7.6.9 | OPTIONAL | | |||
| | | | | | | | | | | |||
| | Update Authorized | Section 8.7.6.7 | OPTIONAL | | | Minimum Battery | Section 8.7.6.6 | OPTIONAL | | |||
| | | | | | | | | | | |||
| | Version | Section 8.7.6.8 | OPTIONAL | | | Update Authorized | Section 8.7.6.7 | OPTIONAL | | |||
| | | | | | | | | | | |||
| | Custom Condition | Section 8.7.6.9 | OPTIONAL | | | Version | Section 8.7.6.8 | OPTIONAL | | |||
| +-------------------+-----------------+----------------+ | | | | | | |||
| | Custom Condition | Section 8.7.6.10 | OPTIONAL | | ||||
| +-------------------+------------------+----------------+ | ||||
| The subsequent table shows the directives. | The subsequent table shows the directives. | |||
| +-------------------+----------------+------------------------------+ | +-------------------+----------------+------------------------------+ | |||
| | Name | Reference | Implementation | | | Name | Reference | Implementation | | |||
| +-------------------+----------------+------------------------------+ | +-------------------+----------------+------------------------------+ | |||
| | Set Component | Section 8.7.7. | REQUIRED if more than one | | | Set Component | Section 8.7.7. | REQUIRED if more than one | | |||
| | Index | 1 | component | | | Index | 1 | component | | |||
| | | | | | | | | | | |||
| | Set Dependency | Section 8.7.7. | REQUIRED if dependencies | | | Set Dependency | Section 8.7.7. | REQUIRED if dependencies | | |||
| | Index | 2 | used | | | Index | 2 | used | | |||
| | | | | | | | | | | |||
| | Abort | Section 8.7.7. | OPTIONAL | | ||||
| | | 3 | | | ||||
| | | | | | ||||
| | Try Each | Section 8.7.7. | OPTIONAL | | | Try Each | Section 8.7.7. | OPTIONAL | | |||
| | | 4 | | | | | 3 | | | |||
| | | | | | | | | | | |||
| | Process | Section 8.7.7. | OPTIONAL | | | Process | Section 8.7.7. | OPTIONAL | | |||
| | Dependency | 5 | | | | Dependency | 4 | | | |||
| | | | | | | | | | | |||
| | Set Parameters | Section 8.7.7. | OPTIONAL | | | Set Parameters | Section 8.7.7. | OPTIONAL | | |||
| | | 6 | | | | | 5 | | | |||
| | | | | | | | | | | |||
| | Override | Section 8.7.7. | REQUIRED | | | Override | Section 8.7.7. | REQUIRED | | |||
| | Parameters | 7 | | | | Parameters | 6 | | | |||
| | | | | | | | | | | |||
| | Fetch | Section 8.7.7. | REQUIRED for Updater | | | Fetch | Section 8.7.7. | REQUIRED for Updater | | |||
| | | 8 | | | | | 7 | | | |||
| | | | | | | | | | | |||
| | Copy | Section 8.7.7. | OPTIONAL | | | Copy | Section 8.7.7. | OPTIONAL | | |||
| | | 10 | | | | | 9 | | | |||
| | | | | | | | | | | |||
| | Run | Section 8.7.7. | REQUIRED for Bootloader | | | Run | Section 8.7.7. | REQUIRED for Bootloader | | |||
| | | 11 | | | | | 10 | | | |||
| | | | | | | | | | | |||
| | Wait For Event | Section 8.7.7. | OPTIONAL | | | Wait For Event | Section 8.7.7. | OPTIONAL | | |||
| | | 12 | | | | | 11 | | | |||
| | | | | | | | | | | |||
| | Run Sequence | Section 8.7.7. | OPTIONAL | | | Run Sequence | Section 8.7.7. | OPTIONAL | | |||
| | | 13 | | | | | 12 | | | |||
| | | | | | | | | | | |||
| | Swap | Section 8.7.7. | OPTIONAL | | | Swap | Section 8.7.7. | OPTIONAL | | |||
| | | 14 | | | | | 13 | | | |||
| | | | | | | | | | | |||
| | Fetch URI List | Section 8.7.7. | OPTIONAL | | | Fetch URI List | Section 8.7.7. | OPTIONAL | | |||
| | | 9 | | | | | 8 | | | |||
| +-------------------+----------------+------------------------------+ | +-------------------+----------------+------------------------------+ | |||
| The subsequent table shows the parameters. | The subsequent table shows the parameters. | |||
| +------------------+------------------+----------------------+ | +------------------+------------------+----------------------+ | |||
| | Name | Reference | Implementation | | | Name | Reference | Implementation | | |||
| +------------------+------------------+----------------------+ | +------------------+------------------+----------------------+ | |||
| | Vendor ID | Section 8.7.5.2 | REQUIRED | | | Vendor ID | Section 8.7.5.3 | REQUIRED | | |||
| | | | | | | | | | | |||
| | Class ID | Section 8.7.5.3 | REQUIRED | | | Class ID | Section 8.7.5.4 | REQUIRED | | |||
| | | | | | | | | | | |||
| | Image Digest | Section 8.7.5.5 | REQUIRED | | | Image Digest | Section 8.7.5.6 | REQUIRED | | |||
| | | | | | | | | | | |||
| | Image Size | Section 8.7.5.6 | REQUIRED | | | Image Size | Section 8.7.5.7 | REQUIRED | | |||
| | | | | | | | | | | |||
| | Use Before | Section 8.7.5.7 | RECOMMENDED | | | Use Before | Section 8.7.5.8 | RECOMMENDED | | |||
| | | | | | | | | | | |||
| | Component Offset | Section 8.7.5.8 | OPTIONAL | | | Component Offset | Section 8.7.5.9 | OPTIONAL | | |||
| | | | | | | | | | | |||
| | Encryption Info | Section 8.7.5.9 | RECOMMENDED | | | Encryption Info | Section 8.7.5.10 | RECOMMENDED | | |||
| | | | | | | | | | | |||
| | Compression Info | Section 8.7.5.10 | RECOMMENDED | | | Compression Info | Section 8.7.5.11 | RECOMMENDED | | |||
| | | | | | | | | | | |||
| | Unpack Info | Section 8.7.5.11 | RECOMMENDED | | | Unpack Info | Section 8.7.5.12 | RECOMMENDED | | |||
| | | | | | | | | | | |||
| | URI | Section 8.7.5.12 | REQUIRED for Updater | | | URI | Section 8.7.5.13 | REQUIRED for Updater | | |||
| | | | | | | | | | | |||
| | Source Component | Section 8.7.5.13 | OPTIONAL | | | Source Component | Section 8.7.5.14 | OPTIONAL | | |||
| | | | | | | | | | | |||
| | Run Args | Section 8.7.5.14 | OPTIONAL | | | Run Args | Section 8.7.5.15 | OPTIONAL | | |||
| | | | | | | | | | | |||
| | Device ID | Section 8.7.5.4 | OPTIONAL | | | Device ID | Section 8.7.5.5 | OPTIONAL | | |||
| | | | | | | | | | | |||
| | Minimum Battery | Section 8.7.5.15 | OPTIONAL | | | Minimum Battery | Section 8.7.5.16 | OPTIONAL | | |||
| | | | | | | | | | | |||
| | Update Priority | Section 8.7.5.16 | OPTIONAL | | | Update Priority | Section 8.7.5.17 | OPTIONAL | | |||
| | | | | | | | | | | |||
| | Version Match | Section 8.7.5.17 | OPTIONAL | | | Version Match | Section 8.7.5.18 | OPTIONAL | | |||
| | | | | | | | | | | |||
| | Wait Info | Section 8.7.5.18 | OPTIONAL | | | Wait Info | Section 8.7.5.19 | OPTIONAL | | |||
| | | | | | | | | | | |||
| | URI List | Section 8.7.5.19 | OPTIONAL | | | URI List | Section 8.7.5.20 | OPTIONAL | | |||
| | | | | | | | | | | |||
| | Strict Order | Section 8.7.5.21 | OPTIONAL | | | Strict Order | Section 8.7.5.22 | OPTIONAL | | |||
| | | | | | | | | | | |||
| | Soft Failure | Section 8.7.5.22 | OPTIONAL | | | Soft Failure | Section 8.7.5.23 | OPTIONAL | | |||
| | | | | | | | | | | |||
| | Custom | Section 8.7.5.23 | OPTIONAL | | | Custom | Section 8.7.5.24 | OPTIONAL | | |||
| +------------------+------------------+----------------------+ | +------------------+------------------+----------------------+ | |||
| Authors' Addresses | Authors' Addresses | |||
| Brendan Moran | Brendan Moran | |||
| Arm Limited | Arm Limited | |||
| EMail: Brendan.Moran@arm.com | EMail: Brendan.Moran@arm.com | |||
| Hannes Tschofenig | Hannes Tschofenig | |||
| End of changes. 519 change blocks. | ||||
| 1738 lines changed or deleted | 1860 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/ | ||||