| < draft-ietf-suit-manifest-02.txt | draft-ietf-suit-manifest-03.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: May 7, 2020 H. Birkholz | Expires: August 10, 2020 H. Birkholz | |||
| Fraunhofer SIT | Fraunhofer SIT | |||
| November 04, 2019 | February 07, 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-02 | draft-ietf-suit-manifest-03 | |||
| Abstract | Abstract | |||
| This specification describes the format of a manifest. A manifest is | This specification describes the format of a manifest. A manifest is | |||
| a bundle of metadata about the firmware for an IoT device, where to | a bundle of metadata about the firmware for an IoT device, where to | |||
| find the firmware, the devices to which it applies, and cryptographic | find the firmware, the devices to which it applies, and cryptographic | |||
| information protecting the manifest. | information protecting the manifest. | |||
| Status of This Memo | Status of This Memo | |||
| skipping to change at page 1, line 36 ¶ | skipping to change at page 1, line 36 ¶ | |||
| Internet-Drafts are working documents of the Internet Engineering | Internet-Drafts are working documents of the Internet Engineering | |||
| Task Force (IETF). Note that other groups may also distribute | Task Force (IETF). Note that other groups may also distribute | |||
| working documents as Internet-Drafts. The list of current Internet- | working documents as Internet-Drafts. The list of current Internet- | |||
| Drafts is at https://datatracker.ietf.org/drafts/current/. | Drafts is at https://datatracker.ietf.org/drafts/current/. | |||
| Internet-Drafts are draft documents valid for a maximum of six months | Internet-Drafts are draft documents valid for a maximum of six months | |||
| and may be updated, replaced, or obsoleted by other documents at any | and may be updated, replaced, or obsoleted by other documents at any | |||
| time. It is inappropriate to use Internet-Drafts as reference | time. It is inappropriate to use Internet-Drafts as reference | |||
| material or to cite them other than as "work in progress." | material or to cite them other than as "work in progress." | |||
| This Internet-Draft will expire on May 7, 2020. | This Internet-Draft will expire on August 10, 2020. | |||
| Copyright Notice | Copyright Notice | |||
| Copyright (c) 2019 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 | |||
| carefully, as they describe your rights and restrictions with respect | carefully, as they describe your rights and restrictions with respect | |||
| to this document. Code Components extracted from this document must | to this document. Code Components extracted from this document must | |||
| include Simplified BSD License text as described in Section 4.e of | include Simplified BSD License text as described in Section 4.e of | |||
| the Trust Legal Provisions and are provided without warranty as | the Trust Legal Provisions and are provided without warranty as | |||
| skipping to change at page 2, line 23 ¶ | skipping to change at page 2, line 23 ¶ | |||
| the copyright in such materials, this document may not be modified | the copyright in such materials, this document may not be modified | |||
| outside the IETF Standards Process, and derivative works of it may | outside the IETF Standards Process, and derivative works of it may | |||
| not be created outside the IETF Standards Process, except to format | not be created outside the IETF Standards Process, except to format | |||
| it for publication as an RFC or to translate it into languages other | it for publication as an RFC or to translate it into languages other | |||
| than English. | than English. | |||
| Table of Contents | Table of Contents | |||
| 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 4 | 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 4 | |||
| 2. Conventions and Terminology . . . . . . . . . . . . . . . . . 5 | 2. Conventions and Terminology . . . . . . . . . . . . . . . . . 5 | |||
| 3. How to use this document . . . . . . . . . . . . . . . . . . 6 | 3. How to use this Document . . . . . . . . . . . . . . . . . . 6 | |||
| 4. Background . . . . . . . . . . . . . . . . . . . . . . . . . 6 | 4. Background . . . . . . . . . . . . . . . . . . . . . . . . . 6 | |||
| 4.1. Landscape . . . . . . . . . . . . . . . . . . . . . . . . 6 | 4.1. Landscape . . . . . . . . . . . . . . . . . . . . . . . . 6 | |||
| 4.2. Update Workflow Model . . . . . . . . . . . . . . . . . . 7 | 4.2. Update Workflow Model . . . . . . . . . . . . . . . . . . 7 | |||
| 4.3. SUIT Manifest goals . . . . . . . . . . . . . . . . . . . 8 | 4.3. SUIT Manifest Goals . . . . . . . . . . . . . . . . . . . 8 | |||
| 4.4. SUIT manifest design summary . . . . . . . . . . . . . . 9 | 4.4. SUIT Manifest Design Summary . . . . . . . . . . . . . . 9 | |||
| 5. Interpreter Behaviour . . . . . . . . . . . . . . . . . . . . 10 | 5. Interpreter Behavior . . . . . . . . . . . . . . . . . . . . 10 | |||
| 5.1. Interpreter Setup . . . . . . . . . . . . . . . . . . . . 10 | 5.1. Interpreter Setup . . . . . . . . . . . . . . . . . . . . 10 | |||
| 5.2. Required Checks . . . . . . . . . . . . . . . . . . . . . 11 | 5.2. Required Checks . . . . . . . . . . . . . . . . . . . . . 11 | |||
| 5.3. Interpreter fundamental properties . . . . . . . . . . . 12 | 5.3. Interpreter Fundamental Properties . . . . . . . . . . . 12 | |||
| 5.4. Abstract Machine Description . . . . . . . . . . . . . . 12 | 5.4. Abstract Machine Description . . . . . . . . . . . . . . 12 | |||
| 5.4.1. Parameters . . . . . . . . . . . . . . . . . . . . . 13 | 5.4.1. Parameters . . . . . . . . . . . . . . . . . . . . . 13 | |||
| 5.4.2. Commands . . . . . . . . . . . . . . . . . . . . . . 13 | 5.4.2. Commands . . . . . . . . . . . . . . . . . . . . . . 14 | |||
| 5.4.3. Command Behaviour . . . . . . . . . . . . . . . . . . 15 | 5.4.3. Command Behavior . . . . . . . . . . . . . . . . . . 15 | |||
| 5.5. Serialized Processing Interpreter . . . . . . . . . . . . 16 | 5.5. Serialized Processing Interpreter . . . . . . . . . . . . 16 | |||
| 5.6. Parallel Processing Interpreter . . . . . . . . . . . . . 16 | 5.6. Parallel Processing Interpreter . . . . . . . . . . . . . 16 | |||
| 5.7. Processing Dependencies . . . . . . . . . . . . . . . . . 17 | 5.7. Processing Dependencies . . . . . . . . . . . . . . . . . 17 | |||
| 6. Creating Manifests . . . . . . . . . . . . . . . . . . . . . 17 | 6. Creating Manifests . . . . . . . . . . . . . . . . . . . . . 17 | |||
| 6.1. Manifest Source Material . . . . . . . . . . . . . . . . 18 | 6.1. Manifest Source Material . . . . . . . . . . . . . . . . 18 | |||
| 6.2. Required Template: Compatibility Check . . . . . . . . . 18 | 6.2. Required Template: Compatibility Check . . . . . . . . . 18 | |||
| 6.3. Use Case Template: XIP Secure Boot . . . . . . . . . . . 19 | 6.3. Use Case Template: XIP Secure Boot . . . . . . . . . . . 19 | |||
| 6.4. Use Case Template: Firmware Download . . . . . . . . . . 19 | 6.4. Use Case Template: Firmware Download . . . . . . . . . . 20 | |||
| 6.5. Use Case Template: Load from External Storage . . . . . . 20 | 6.5. Use Case Template: Load from External Storage . . . . . . 20 | |||
| 6.6. Use Case Template Load & Decompress from External Storage 20 | 6.6. Use Case Template Load & Decompress from External Storage 20 | |||
| 6.7. Use Case Template: Dependency . . . . . . . . . . . . . . 20 | 6.7. Use Case Template: Dependency . . . . . . . . . . . . . . 21 | |||
| 7. Manifest Structure . . . . . . . . . . . . . . . . . . . . . 21 | 7. Manifest Structure . . . . . . . . . . . . . . . . . . . . . 21 | |||
| 7.1. Severable Elements . . . . . . . . . . . . . . . . . . . 22 | 7.1. Severable Elements . . . . . . . . . . . . . . . . . . . 22 | |||
| 7.2. Outer wrapper . . . . . . . . . . . . . . . . . . . . . . 23 | 7.2. Outer Wrapper . . . . . . . . . . . . . . . . . . . . . . 23 | |||
| 7.3. Manifest . . . . . . . . . . . . . . . . . . . . . . . . 24 | 7.3. Manifest . . . . . . . . . . . . . . . . . . . . . . . . 25 | |||
| 7.4. SUIT_Dependency . . . . . . . . . . . . . . . . . . . . . 27 | 7.4. SUIT_Dependency . . . . . . . . . . . . . . . . . . . . . 28 | |||
| 7.5. SUIT_Component_Reference . . . . . . . . . . . . . . . . 28 | 7.5. SUIT_Component_Reference . . . . . . . . . . . . . . . . 29 | |||
| 7.6. Manifest Parameters . . . . . . . . . . . . . . . . . . . 28 | 7.6. Manifest Parameters . . . . . . . . . . . . . . . . . . . 29 | |||
| 7.6.1. SUIT_Parameter_Strict_Order . . . . . . . . . . . . . 30 | 7.6.1. SUIT_Parameter_Strict_Order . . . . . . . . . . . . . 31 | |||
| 7.6.2. SUIT_Parameter_Soft_Failure . . . . . . . . . . . . . 31 | 7.6.2. SUIT_Parameter_Soft_Failure . . . . . . . . . . . . . 32 | |||
| 7.7. SUIT_Parameter_Encryption_Info . . . . . . . . . . . . . 31 | 7.7. SUIT_Parameter_Encryption_Info . . . . . . . . . . . . . 32 | |||
| 7.8. SUIT_Parameter_Compression_Info . . . . . . . . . . . . . 31 | 7.7.1. SUIT_Parameter_Compression_Info . . . . . . . . . . . 32 | |||
| 7.9. SUIT_Parameter_Unpack_Info . . . . . . . . . . . . . . . 31 | 7.7.2. SUIT_Parameter_Unpack_Info . . . . . . . . . . . . . 32 | |||
| 7.10. SUIT_Parameters CDDL . . . . . . . . . . . . . . . . . . 32 | 7.7.3. SUIT_Parameters CDDL . . . . . . . . . . . . . . . . 33 | |||
| 7.11. SUIT_Command_Sequence . . . . . . . . . . . . . . . . . . 33 | 7.8. SUIT_Command_Sequence . . . . . . . . . . . . . . . . . . 35 | |||
| 7.12. SUIT_Condition . . . . . . . . . . . . . . . . . . . . . 35 | 7.9. SUIT_Condition . . . . . . . . . . . . . . . . . . . . . 36 | |||
| 7.12.1. Identifier Conditions . . . . . . . . . . . . . . . 36 | 7.9.1. Identifier Conditions . . . . . . . . . . . . . . . . 37 | |||
| 7.12.2. suit-condition-image-match . . . . . . . . . . . . . 36 | 7.9.2. suit-condition-image-match . . . . . . . . . . . . . 38 | |||
| 7.12.3. suit-condition-image-not-match . . . . . . . . . . . 36 | 7.9.3. suit-condition-image-not-match . . . . . . . . . . . 38 | |||
| 7.12.4. suit-condition-use-before . . . . . . . . . . . . . 36 | 7.9.4. suit-condition-use-before . . . . . . . . . . . . . . 38 | |||
| 7.12.5. suit-condition-minimum-battery . . . . . . . . . . . 36 | 7.9.5. suit-condition-minimum-battery . . . . . . . . . . . 38 | |||
| 7.12.6. suit-condition-update-authorised . . . . . . . . . . 37 | 7.9.6. suit-condition-update-authorized . . . . . . . . . . 38 | |||
| 7.12.7. suit-condition-version . . . . . . . . . . . . . . . 37 | 7.9.7. suit-condition-version . . . . . . . . . . . . . . . 39 | |||
| 7.12.8. SUIT_Condition_Custom . . . . . . . . . . . . . . . 38 | 7.9.8. SUIT_Condition_Custom . . . . . . . . . . . . . . . . 40 | |||
| 7.12.9. Identifiers . . . . . . . . . . . . . . . . . . . . 38 | 7.9.9. Identifiers . . . . . . . . . . . . . . . . . . . . . 40 | |||
| 7.12.10. SUIT_Condition CDDL . . . . . . . . . . . . . . . . 40 | 7.9.10. SUIT_Condition CDDL . . . . . . . . . . . . . . . . . 41 | |||
| 7.13. SUIT_Directive . . . . . . . . . . . . . . . . . . . . . 40 | 7.10. SUIT_Directive . . . . . . . . . . . . . . . . . . . . . 42 | |||
| 7.13.1. suit-directive-set-component-index . . . . . . . . . 41 | 7.10.1. suit-directive-set-component-index . . . . . . . . . 43 | |||
| 7.13.2. suit-directive-set-dependency-index . . . . . . . . 42 | 7.10.2. suit-directive-set-dependency-index . . . . . . . . 44 | |||
| 7.13.3. suit-directive-abort . . . . . . . . . . . . . . . . 42 | 7.10.3. suit-directive-abort . . . . . . . . . . . . . . . . 44 | |||
| 7.13.4. suit-directive-run-sequence . . . . . . . . . . . . 42 | 7.10.4. suit-directive-run-sequence . . . . . . . . . . . . 44 | |||
| 7.13.5. suit-directive-try-each . . . . . . . . . . . . . . 43 | 7.10.5. suit-directive-try-each . . . . . . . . . . . . . . 45 | |||
| 7.13.6. suit-directive-process-dependency . . . . . . . . . 43 | 7.10.6. suit-directive-process-dependency . . . . . . . . . 45 | |||
| 7.13.7. suit-directive-set-parameters . . . . . . . . . . . 44 | 7.10.7. suit-directive-set-parameters . . . . . . . . . . . 46 | |||
| 7.13.8. suit-directive-override-parameters . . . . . . . . . 44 | 7.10.8. suit-directive-override-parameters . . . . . . . . . 46 | |||
| 7.13.9. suit-directive-fetch . . . . . . . . . . . . . . . . 45 | 7.10.9. suit-directive-fetch . . . . . . . . . . . . . . . . 47 | |||
| 7.13.10. suit-directive-copy . . . . . . . . . . . . . . . . 45 | 7.10.10. suit-directive-copy . . . . . . . . . . . . . . . . 47 | |||
| 7.13.11. suit-directive-swap . . . . . . . . . . . . . . . . 46 | 7.10.11. suit-directive-swap . . . . . . . . . . . . . . . . 48 | |||
| 7.13.12. suit-directive-run . . . . . . . . . . . . . . . . . 46 | 7.10.12. suit-directive-run . . . . . . . . . . . . . . . . . 48 | |||
| 7.13.13. suit-directive-wait . . . . . . . . . . . . . . . . 47 | 7.10.13. suit-directive-wait . . . . . . . . . . . . . . . . 49 | |||
| 7.13.14. SUIT_Directive CDDL . . . . . . . . . . . . . . . . 48 | 7.10.14. SUIT_Directive CDDL . . . . . . . . . . . . . . . . 50 | |||
| 7.14. SUIT_Text_Map . . . . . . . . . . . . . . . . . . . . . . 50 | 7.11. SUIT_Text_Map . . . . . . . . . . . . . . . . . . . . . . 52 | |||
| 8. Access Control Lists . . . . . . . . . . . . . . . . . . . . 50 | 8. Access Control Lists . . . . . . . . . . . . . . . . . . . . 52 | |||
| 9. SUIT digest container . . . . . . . . . . . . . . . . . . . . 51 | 9. SUIT digest container . . . . . . . . . . . . . . . . . . . . 53 | |||
| 10. Creating conditional sequences . . . . . . . . . . . . . . . 52 | 10. Creating Conditional Sequences . . . . . . . . . . . . . . . 54 | |||
| 11. Full CDDL . . . . . . . . . . . . . . . . . . . . . . . . . . 54 | 11. Full CDDL . . . . . . . . . . . . . . . . . . . . . . . . . . 56 | |||
| 12. Examples . . . . . . . . . . . . . . . . . . . . . . . . . . 61 | 12. Examples . . . . . . . . . . . . . . . . . . . . . . . . . . 63 | |||
| 12.1. Example 0: . . . . . . . . . . . . . . . . . . . . . . . 61 | 12.1. Example 0: Secure Boot . . . . . . . . . . . . . . . . . 64 | |||
| 12.2. Example 1: . . . . . . . . . . . . . . . . . . . . . . . 64 | 12.2. Example 1: Simultaneous Download and Installation of | |||
| 12.3. Example 2: . . . . . . . . . . . . . . . . . . . . . . . 66 | Payload . . . . . . . . . . . . . . . . . . . . . . . . 66 | |||
| 12.4. Example 3: . . . . . . . . . . . . . . . . . . . . . . . 69 | 12.3. Example 2: Simultaneous Download, Installation, and | |||
| 12.5. Example 4: . . . . . . . . . . . . . . . . . . . . . . . 73 | Secure Boot . . . . . . . . . . . . . . . . . . . . . . 68 | |||
| 12.6. Example 5: . . . . . . . . . . . . . . . . . . . . . . . 77 | 12.4. Example 3: Load from External Storage . . . . . . . . . 69 | |||
| 12.7. Example 6: . . . . . . . . . . . . . . . . . . . . . . . 81 | 12.5. Example 4: Load and Decompress from External Storage . . 72 | |||
| 13. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 86 | 12.6. Example 5: Compatibility Test, Download, Installation, | |||
| 14. Security Considerations . . . . . . . . . . . . . . . . . . . 86 | and Secure Boot . . . . . . . . . . . . . . . . . . . . 75 | |||
| 15. Mailing List Information . . . . . . . . . . . . . . . . . . 86 | 12.7. Example 6: Two Images . . . . . . . . . . . . . . . . . 77 | |||
| 16. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . 86 | 13. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 80 | |||
| 17. References . . . . . . . . . . . . . . . . . . . . . . . . . 87 | 14. Security Considerations . . . . . . . . . . . . . . . . . . . 80 | |||
| 17.1. Normative References . . . . . . . . . . . . . . . . . . 87 | 15. Mailing List Information . . . . . . . . . . . . . . . . . . 81 | |||
| 17.2. Informative References . . . . . . . . . . . . . . . . . 87 | 16. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . 81 | |||
| 17.3. URIs . . . . . . . . . . . . . . . . . . . . . . . . . . 88 | 17. References . . . . . . . . . . . . . . . . . . . . . . . . . 81 | |||
| Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 88 | 17.1. Normative References . . . . . . . . . . . . . . . . . . 81 | |||
| 17.2. Informative References . . . . . . . . . . . . . . . . . 82 | ||||
| 17.3. URIs . . . . . . . . . . . . . . . . . . . . . . . . . . 82 | ||||
| Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 82 | ||||
| 1. Introduction | 1. Introduction | |||
| A firmware update mechanism is an essential security feature for IoT | A firmware update mechanism is an essential security feature for IoT | |||
| devices to deal with vulnerabilities. While the transport of | devices to deal with vulnerabilities. While the transport of | |||
| firmware images to the devices themselves is important there are | firmware images to the devices themselves is important there are | |||
| already various techniques available, such as the Lightweight | already various techniques available, such as the Lightweight | |||
| Machine-to-Machine (LwM2M) protocol offering device management of IoT | Machine-to-Machine (LwM2M) protocol offering device management of IoT | |||
| devices. Equally important is the inclusion of meta-data about the | devices. Equally important is the inclusion of meta-data about the | |||
| conveyed firmware image (in the form of a manifest) and the use of | conveyed firmware image (in the form of a manifest) and the use of | |||
| skipping to change at page 4, line 36 ¶ | skipping to change at page 4, line 39 ¶ | |||
| security allows the author, who builds the firmware image, to be sure | security allows the author, who builds the firmware image, to be sure | |||
| that no other party (including potential adversaries) can install | that no other party (including potential adversaries) can install | |||
| firmware updates on IoT devices without adequate privileges. This | firmware updates on IoT devices without adequate privileges. This | |||
| authorization process is ensured by the use of dedicated symmetric or | authorization process is ensured by the use of dedicated symmetric or | |||
| asymmetric keys installed on the IoT device: for use cases where only | asymmetric keys installed on the IoT device: for use cases where only | |||
| integrity protection is required it is sufficient to install a trust | integrity protection is required it is sufficient to install a trust | |||
| anchor on the IoT device. For confidentiality protected firmware | anchor on the IoT device. For confidentiality protected firmware | |||
| images it is additionally required to install either one or multiple | images it is additionally required to install either one or multiple | |||
| symmetric or asymmetric keys on the IoT device. Starting security | symmetric or asymmetric keys on the IoT device. Starting security | |||
| protection at the author is a risk mitigation technique so firmware | protection at the author is a risk mitigation technique so firmware | |||
| images and manifests can be stored on untrusted respositories; it | images and manifests can be stored on untrusted repositories; it also | |||
| also reduces the scope of a compromise of any repository or | reduces the scope of a compromise of any repository or intermediate | |||
| intermediate system to be no worse than a denial of service. | system to be no worse than a denial of service. | |||
| It is assumed that the reader is familiar with the high-level | It is assumed that the reader is familiar with the high-level | |||
| firmware update architecture [I-D.ietf-suit-architecture]. | firmware update architecture [I-D.ietf-suit-architecture]. | |||
| The SUIT manifest is heavily optimised for consumption by constrained | The SUIT manifest is heavily optimized for consumption by constrained | |||
| devices. This means that it is not constructed as a conventional | devices. This means that it is not constructed as a conventional | |||
| descriptive document. Instead, of describing what an update IS, it | descriptive document. Instead, of describing what an update IS, it | |||
| describes what a recipient should DO. | describes what a recipient should DO. | |||
| While the SUIT manifest is informed by and optimised for firmware | While the SUIT manifest is informed by and optimized for firmware | |||
| update use cases, there is nothing in the | update 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 | |||
| firmware use cases. Software update and delivery of arbitrary data | firmware use cases. Software update and delivery of arbitrary data | |||
| can equally be managed by SUIT-based metadata. | can equally be managed by SUIT-based metadata. | |||
| 2. Conventions and Terminology | 2. Conventions and Terminology | |||
| The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | |||
| "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | |||
| "OPTIONAL" in this document are to be interpreted as described in | "OPTIONAL" in this document are to be interpreted as described in | |||
| BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all | BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all | |||
| capitals, as shown here. | capitals, as shown here. | |||
| - SUIT: Sofware Update for the Internet of Things, the IETF working | The following terminology is used throughout this document. | |||
| - SUIT: Software Update for the Internet of Things, the IETF working | ||||
| group for this standard. | 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 piece of information that describes one or more | - Manifest: A piece of information that describes one or more | |||
| payloads, one or more resources, and the processors needed to | payloads, one or more resources, and the processors needed to | |||
| transform resources into payloads. | transform resources into payloads. | |||
| - 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 recipient devices. | updates, trusted by Recipients. | |||
| - Recipient: The system, typically an IoT device, that receives a | - Recipient: The system, typically an IoT device, that receives a | |||
| manifest. | manifest. | |||
| - Condition: A test for a property of the Recipient or its | - Condition: A test for a property of the Recipient or its | |||
| components. | components. | |||
| - Directive: An action for the Recipient to perform. | - Directive: An action for the Recipient to perform. | |||
| - Command: A Condition or a Directive. | - Command: A Condition or a Directive. | |||
| skipping to change at page 6, line 4 ¶ | skipping to change at page 6, line 11 ¶ | |||
| - Trusted Execution: A process by which a system ensures that only | - Trusted Execution: A process by which a system ensures that only | |||
| trusted code is executed, for example secure boot. | trusted code is executed, for example secure boot. | |||
| - A/B images: Dividing a device's storage into two or more bootable | - A/B images: Dividing a device's storage into two or more bootable | |||
| images, at different offsets, such that the active image can write | images, at different offsets, such that the active image can write | |||
| to the inactive image(s). | to the inactive image(s). | |||
| The map indices in this encoding are reset to 1 for each map within | The map indices in this encoding are reset to 1 for each map within | |||
| the structure. This is to keep the indices as small as possible. | the structure. This is to keep the indices as small as possible. | |||
| The goal is to keep the index objects to single bytes (CBOR positive | The goal is to keep the index objects to single bytes (CBOR positive | |||
| integers 1-23). | 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 | uninitialised 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 implementations. | |||
| CDDL names are hyphenated and CDDL structures follow the convention | CDDL names are hyphenated and CDDL structures follow the convention | |||
| adopted in COSE [RFC8152]: SUIT_Structure_Name. | adopted in COSE [RFC8152]: SUIT_Structure_Name. | |||
| 3. How to use this document | 3. How to use this Document | |||
| For information about firmware update in general and the background | For information about firmware update in general and the background | |||
| of the suit manifest, see Section 4. To implement an updatable | of the suit manifest, see Section 4. To implement an updatable | |||
| device, see Section 5 and Section 7. To implement a tool that | device, see Section 5 and Section 7. To implement a tool that | |||
| generates updates, see Section 6 and Section 7. | generates updates, see Section 6 and Section 7. | |||
| 4. Background | 4. Background | |||
| Distributing firmware updates to diverse devices with diverse trust | Distributing firmware 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 | |||
| skipping to change at page 7, line 24 ¶ | skipping to change at page 7, line 29 ¶ | |||
| 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. Update Workflow Model | 4.2. Update Workflow Model | |||
| There are several fundamental assumptions that inform the model of | There are several fundamental assumptions that inform the model of | |||
| the firmware update workflow: | the firmware update workflow: | |||
| - 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 secure boot workflow: | the secure boot 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. | |||
| The expected workflow for a device installing an update can be broken | The expected workflow for a device installing an update can be broken | |||
| down into 5 steps: | down into 5 steps: | |||
| 1. Verify the signature of the manifest | 1. Verify the signature of the manifest. | |||
| 2. Verify the applicability of the manifest | 2. Verify the applicability of the manifest. | |||
| 3. Resolve dependencies | 3. Resolve dependencies. | |||
| 4. Fetch payload(s) | ||||
| 5. Install payload(s) | 4. Fetch payload(s). | |||
| 5. Install payload(s). | ||||
| When installation is complete, similar information can be used for | When installation is complete, similar information can be used for | |||
| validating and running images in a further 3 steps: | validating and running images in a further 3 steps: | |||
| 1. Verify image(s) | 1. Verify image(s). | |||
| 2. Load image(s) | 2. Load image(s). | |||
| 3. Run image(s) | 3. Run image(s). | |||
| If verification and running is implemented in bootloader, then the | If verification and running is implemented in bootloader, then the | |||
| When multiple manifests are used for an update, each manifest's steps | When multiple manifests are used for an update, each manifest's steps | |||
| occur in a lockstep fashion; all manifests have dependency resolution | occur in a lockstep fashion; all manifests have dependency resolution | |||
| performed before any manifest performs a payload fetch, etc. | performed before any manifest performs a payload fetch, etc. | |||
| 4.3. SUIT Manifest goals | 4.3. SUIT Manifest Goals | |||
| The manifest described in this document is intended to meet several | The manifest described in this document is intended to meet several | |||
| goals, as described below. | goals, as described below. | |||
| 1. Meet the requirements defined in | 1. Meet the requirements defined in | |||
| [I-D.ietf-suit-information-model]. | [I-D.ietf-suit-information-model]. | |||
| 2. Simple to parse on a constrained node | 2. Simple to parse on a constrained node | |||
| 3. Simple to process on a constrained node | 3. Simple to process on a constrained node | |||
| skipping to change at page 9, line 24 ¶ | skipping to change at page 9, line 28 ¶ | |||
| 7. the device to reason about the applicability of a firmware. | 7. the device to reason about the applicability of a firmware. | |||
| 8. the device to reason about the installation of a firmware. | 8. the device to reason about the installation of a firmware. | |||
| 9. the device to reason about the authenticity & encoding of a | 9. the device to reason about the authenticity & encoding of a | |||
| firmware at boot. | firmware at boot. | |||
| Each of these uses happens at a different stage of the manifest | Each of these uses happens at a different stage of the manifest | |||
| lifecycle, so each has different requirements. | lifecycle, so each has different requirements. | |||
| 4.4. SUIT manifest design summary | 4.4. SUIT Manifest Design Summary | |||
| In order to provide flexible behaviour 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 behaviour of a Recipient | the SUIT manifest encodes the required behavior of a Recipient | |||
| device. Behaviour is encoded as a specialised byte code, contained | device. Behavior is encoded as a specialized byte code, contained in | |||
| 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 | execution operations are represented in the byte code. The byte code | |||
| can be extended by registering new operations. | can be extended by registering new operations. | |||
| The specialised 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 execution of a firmware image. Second, the | |||
| language specifies behaviours in a linearised form, without reverse | language specifies behaviors in a linearized form, without reverse | |||
| branches. Conditional processing is supported, and parallel and out- | branches. Conditional processing is supported, and parallel and out- | |||
| of-order processing may be performed by sufficiently capable devices. | of-order 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 | |||
| parser for constrained applications. If needed, such a parser also | parser for constrained applications. If needed, such a parser also | |||
| allows the Recipient to perform complex updates with reduced | allows the Recipient to perform complex updates with reduced | |||
| overhead. Conditional execution of commands allows a simple device | overhead. Conditional execution of commands allows a simple device | |||
| to perform important decisions at validation-time. | to perform important decisions at validation-time. | |||
| Dependency handling is vastly simplified as well. Dependencies | Dependency handling is vastly simplified as well. Dependencies | |||
| function like subroutines of the language. When a manifest has a | function like subroutines of the language. When a manifest has a | |||
| dependency, it can invoke that dependency's commands and modify their | dependency, it can invoke that dependency's commands and modify their | |||
| behaviour by setting parameters. Because some parameters come with | behavior by setting parameters. Because some parameters come with | |||
| security implications, the dependencies also have a mechanism to | security implications, the dependencies also have a mechanism to | |||
| reject modifications to parameters on a fine-grained level. | reject modifications to parameters on a fine-grained level. | |||
| Developing a robust permissions system works in this model too. The | Developing a robust permissions system works in this model too. The | |||
| Recipient can use a simple ACL that is a table of Identities and | Recipient can use a simple ACL that is a table of Identities and | |||
| Component Identifier permissions to ensure that only manifests | Component Identifier permissions to ensure that only manifests | |||
| authenticated by the appropriate identity have access to operate on a | authenticated by the appropriate identity have access to operate on a | |||
| component. | component. | |||
| Capability reporting is similarly simplified. A Recipient can report | Capability reporting is similarly simplified. A Recipient can report | |||
| the Commands, Parameters, Algorithms, and Component Identifiers that | the Commands, Parameters, Algorithms, and Component Identifiers that | |||
| it supports. This is sufficiently precise for a manifest author to | it supports. This is sufficiently precise for a manifest author to | |||
| create a manifest that the Recipient can accept. | create a manifest that the Recipient can accept. | |||
| The simplicity of design in the Recipient due to all of these | The simplicity of design in the Recipient due to all of these | |||
| benefits allows even a highly constrained platform to use advanced | benefits allows even a highly constrained platform to use advanced | |||
| update capabilities. | update capabilities. | |||
| 5. Interpreter Behaviour | 5. Interpreter Behavior | |||
| This section describes the behaviour of the manifest interpreter. | This section describes the behavior of the manifest interpreter. | |||
| This section focuses primarily on interpreting commands in the | This section focuses primarily on interpreting commands in the | |||
| manifest. However, there are several other important behaviours of | manifest. However, there are several other important behaviors of | |||
| the interpreter: encoding version detection, rollback protection, and | the interpreter: encoding version detection, rollback protection, and | |||
| authenticity verification are chief among these. | authenticity verification are chief among these. | |||
| 5.1. Interpreter Setup | 5.1. Interpreter Setup | |||
| Prior to executing any command sequence, the interpreter or its host | Prior to executing any command sequence, the interpreter or its host | |||
| application MUST inspect the manifest version field and fail when it | application MUST inspect the manifest version field and fail when it | |||
| encounters an unsupported encoding version. Next, the interpreter or | encounters an unsupported encoding version. Next, the interpreter or | |||
| its host application MUST extract the manifest sequence number and | its host application MUST extract the manifest sequence number and | |||
| perform a rollback check using this sequence number. The exact logic | perform a rollback check using this sequence number. The exact logic | |||
| skipping to change at page 11, line 13 ¶ | skipping to change at page 11, line 16 ¶ | |||
| MUST select the latest valid manifest, authentic manifest. | MUST select the latest valid manifest, 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. | |||
| 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 ID encountered. | |||
| - Payload not available (update interpreter) | - Payload not available (update interpreter). | |||
| - Dependency not available (update interpreter) | - Dependency not available (update interpreter). | |||
| - Application crashed when executed (bootloader interpreter) | - Application crashed when executed (bootloader interpreter). | |||
| - Watchdog timeout occurred (bootloader interpreter) | - Watchdog timeout occurred (bootloader interpreter). | |||
| - Dependency or Payload verification failed (bootloader interpreter) | - Dependency or Payload verification failed (bootloader | |||
| interpreter). | ||||
| 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 | Following these initial tests, the interpreter clears all parameter | |||
| storage. This ensures that the interpreter begins without any leaked | storage. This ensures that the interpreter begins without any leaked | |||
| data. | data. | |||
| 5.2. Required Checks | 5.2. Required Checks | |||
| skipping to change at page 12, line 21 ¶ | skipping to change at page 12, line 26 ¶ | |||
| 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. | |||
| 5.3. Interpreter fundamental properties | 5.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 secure boot MUST either result in an error, or a | |||
| booted system. | booted system. | |||
| 3. Executing the same manifest on multiple devices MUST result in | 3. Executing the same manifest on multiple devices 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. | |||
| 5.4. Abstract Machine Description | 5.4. Abstract Machine Description | |||
| The byte code that forms the bulk of the manifest is processed by an | The byte code that forms the bulk of the manifest is processed by an | |||
| interpreter. This interpreter can be modelled as a simple abstract | interpreter. This interpreter can be modeled as a simple abstract | |||
| machine. This machine consists of several data storage locations | machine. This machine consists of several data storage locations | |||
| that are modified by commands. Certain commands also affect the | that are modified by commands. Certain commands also affect the | |||
| machine's behaviour. | machine's behavior. | |||
| Every command that modifies system state targets a specific | Every command that modifies system state targets a specific | |||
| component. Components are units of code or data that can be targeted | component. Components are units of code or data that can be targeted | |||
| by an update. They are identified by Component identifiers, arrays | by an update. They are identified by Component identifiers, arrays | |||
| of binary-strings-effectively a binary path. Each component has a | of binary-strings-effectively a binary path. Each component has a | |||
| corresponding set of configuration, Parameters. Parameters are used | corresponding set of configuration, Parameters. Parameters are used | |||
| as the inputs to commands. | as the inputs to commands. | |||
| 5.4.1. Parameters | 5.4.1. Parameters | |||
| Some parameters are REQUIRED to implement. These parameters allow a | Some parameters are REQUIRED to implement. These parameters allow a | |||
| device to perform core functions. | device to perform core functions. | |||
| - Vendor ID | - Vendor ID. | |||
| - Class ID | - Class ID. | |||
| - Image Digest | - Image Digest. | |||
| Some parameters are RECOMMENDED to implement. These parameters are | Some parameters are RECOMMENDED to implement. These parameters are | |||
| needed for most use-cases. | needed for most use-cases. | |||
| - Image Size | - Image Size. | |||
| - URI | - URI. | |||
| Other parameters are OPTIONAL to implement. These parameters allow a | Other parameters are OPTIONAL to implement. These parameters allow a | |||
| device to implement specific use-cases. | device to implement specific use-cases. | |||
| - Strict Order | - Strict Order. | |||
| - Soft Failure | - Soft Failure. | |||
| - Device ID | - Device ID. | |||
| - Encryption Info | - Encryption Info. | |||
| - Unpack Info | - Unpack Info. | |||
| - Source Component | - Source Component. | |||
| - URI List | - URI List. | |||
| - Custom Parameters | - Custom Parameters. | |||
| 5.4.2. Commands | 5.4.2. Commands | |||
| Commands define the behaviour of a device. The commands are divided | Commands define the behavior of a device. The commands are divided | |||
| into two groups: those that modify state (directives) and those that | into two groups: those that modify state (directives) and those that | |||
| perform tests (conditions). There are also several Control Flow | perform tests (conditions). There are also several Control Flow | |||
| operations. | operations. | |||
| Some commands are REQUIRED to implement. These commands allow a | Some commands are REQUIRED to implement. These commands allow a | |||
| device to perform core functions | device to perform core functions | |||
| - Check Vendor Identifier (cvid) | - Check Vendor Identifier (cvid). | |||
| - Check Class Identifier (ccid) | ||||
| - Verify Image (cimg) | - Check Class Identifier (ccid). | |||
| - Set Current Component (setc) | - Verify Image (cimg). | |||
| - Override Parameters (ovrp) | - Set Current Component (setc). | |||
| - Override Parameters (ovrp). | ||||
| NOTE: on systems that support only a single component, Set Current | NOTE: on systems that support only a single component, Set Current | |||
| Component has no effect. | Component has no effect. | |||
| Some commands are RECOMMENDED to implement. These commands are | Some commands are RECOMMENDED to implement. These commands are | |||
| needed for most use-cases | needed for most use-cases | |||
| - Set Current Dependency (setd) | - Set Current Dependency (setd). | |||
| - Set Parameters (setp) | - Set Parameters (setp). | |||
| - Process Dependency (pdep) | - Process Dependency (pdep). | |||
| - Run (run) | - Run (run). | |||
| - Fetch (getc) | - Fetch (getc). | |||
| Other commands are OPTIONAL to implement. These commands allow a | Other commands are OPTIONAL to implement. These commands allow a | |||
| device to implement specific use-cases. | device to implement specific use-cases. | |||
| - Use Before (ubf) | - Use Before (ubf). | |||
| - Check Component Offset (cco) | - Check Component Offset (cco). | |||
| - Check Device Identifier (cdid) | - Check Device Identifier (cdid). | |||
| - Check Image Not Match (nimg) | - Check Image Not Match (nimg). | |||
| - Check Minimum Battery (minb) | - Check Minimum Battery (minb). | |||
| - Check Update Authorised (auth) | - Check Update Authorized (auth). | |||
| - Check Version (cver) | - Check Version (cver). | |||
| - Abort (abrt) | - Abort (abrt). | |||
| - Try Each (try) | - Try Each (try). | |||
| - Copy (copy) | - Copy (copy). | |||
| - Swap (swap) | - Swap (swap). | |||
| - Wait For Event (wfe) | ||||
| - Run Sequence (srun) mandatory component set | - Wait For Event (wfe). | |||
| - Run with Arguments (arun) | - Run Sequence (srun) mandatory component set. | |||
| 5.4.3. Command Behaviour | - Run with Arguments (arun). | |||
| The following table describes the behaviour of each command. "params" | 5.4.3. Command Behavior | |||
| 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. | |||
| +------+------------------------------------------------------------+ | +------+------------------------------------------------------------+ | |||
| | Code | Operation | | | Code | Operation | | |||
| +------+------------------------------------------------------------+ | +------+------------------------------------------------------------+ | |||
| | cvid | binary-match(component, params[vendor-id]) | | | cvid | binary-match(component, params[vendor-id]) | | |||
| | | | | | | | | |||
| | ccid | binary-match(component, params[class-id]) | | | ccid | binary-match(component, params[class-id]) | | |||
| | | | | | | | | |||
| | cimg | binary-match(digest(component), params[digest]) | | | cimg | binary-match(digest(component), params[digest]) | | |||
| skipping to change at page 15, line 49 ¶ | skipping to change at page 16, line 13 ¶ | |||
| | ubf | assert(now() < arg) | | | ubf | assert(now() < arg) | | |||
| | | | | | | | | |||
| | cco | assert(offsetof(component) == arg) | | | cco | assert(offsetof(component) == arg) | | |||
| | | | | | | | | |||
| | cdid | binary-match(component, params[device-id]) | | | cdid | binary-match(component, params[device-id]) | | |||
| | | | | | | | | |||
| | nimg | not binary-match(digest(component), params[digest]) | | | nimg | not binary-match(digest(component), params[digest]) | | |||
| | | | | | | | | |||
| | minb | assert(battery >= arg) | | | minb | assert(battery >= arg) | | |||
| | | | | | | | | |||
| | auth | assert(isAuthorised()) | | | auth | assert(isAuthorized()) | | |||
| | | | | | | | | |||
| | cver | assert(version_check(component, arg)) | | | cver | assert(version_check(component, arg)) | | |||
| | | | | | | | | |||
| | abrt | assert(0) | | | abrt | assert(0) | | |||
| | | | | | | | | |||
| | try | break if exec(seq) is not error for seq in arg | | | try | break if exec(seq) is not error for seq in arg | | |||
| | | | | | | | | |||
| | copy | store(component, params[src-component]) | | | copy | store(component, params[src-component]) | | |||
| | | | | | | | | |||
| | swap | swap(component, params[src-component]) | | | swap | swap(component, params[src-component]) | | |||
| skipping to change at page 16, line 48 ¶ | skipping to change at page 17, line 12 ¶ | |||
| command until the Strict Order parameter is returned to True or the | command until the Strict Order parameter is returned to True or the | |||
| command sequence ends. Then, it joins all forked processes before | command sequence ends. Then, it joins all forked processes before | |||
| continuing processing of commands. To perform out-of-order | continuing processing of commands. To perform out-of-order | |||
| processing, a similar approach is used, except the device consumes | processing, a similar approach is used, except the device consumes | |||
| all commands after the Strict Order parameter is set to False, then | all commands after the Strict Order parameter is set to False, then | |||
| it sorts these commands into its preferred order, invokes them all, | it sorts these commands into its preferred order, invokes them all, | |||
| then continues processing. | then continues processing. | |||
| Under each of these scenarios the parallel processing must halt: | Under each of these scenarios the parallel processing must halt: | |||
| - Set Parameters | - Set Parameters. | |||
| - Override Parameters | - Override Parameters. | |||
| - Set Strict Order = True | ||||
| - Set Dependency Index | - Set Strict Order = True. | |||
| - Set Component Index | - Set Dependency Index. | |||
| - Set Component Index. | ||||
| To perform more useful parallel operations, sequences of commands may | To perform more useful parallel operations, sequences of commands may | |||
| be collected in a suit-directive-run-sequence. Then, each of these | be collected in a suit-directive-run-sequence. Then, each of these | |||
| sequences may be run in parallel. Each sequence defaults to Strict | sequences may be run in parallel. Each sequence defaults to Strict | |||
| Order = True. To isolate each sequence from each other sequence, | Order = True. To isolate each sequence from each other sequence, | |||
| each sequence must declare a single target component. Set Component | each sequence must declare a single target component. Set Component | |||
| Index is not permitted inside this sequence. | Index is not permitted inside this sequence. | |||
| 5.7. Processing Dependencies | 5.7. Processing Dependencies | |||
| As described in Section 5.2, each manifest must invoke each of its | As described in Section 5.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 Depdendency 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. | |||
| The interpreter also performs the checks described in Section 5.2 to | The interpreter also performs the checks described in Section 5.2 to | |||
| ensure that the dependent is processing the dependency correctly. | ensure that the dependent is processing the dependency correctly. | |||
| 6. Creating Manifests | 6. 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 is covered in [RFC8152] and | process of constructing COSE structures is covered in [RFC8152] and | |||
| the calculation of cryptographic values is beyond the scope of this | the calculation of cryptographic values is beyond the scope of this | |||
| document. | document. | |||
| 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, however several templates are provided | accomplished in many ways, however several templates are provided | |||
| here to cover common use-cases. Many of these templates can be | here to cover common use-cases. Many of these templates can be | |||
| aggregated to produce more complex behaviour. | aggregated to produce more complex behavior. | |||
| NOTE: On systems that support only a single component, Set Current | NOTE: On systems that support only a single component, Set Current | |||
| Component has no effect and can be omitted. | Component has no effect and can be omitted. | |||
| NOTE: Digest should always be set using Override Parameters, since | NOTE: Digest should 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. | |||
| 6.1. Manifest Source Material | 6.1. Manifest Source Material | |||
| When a manifest is constructed from a descriptive document, the | When a manifest is constructed from a descriptive document, the | |||
| skipping to change at page 18, line 37 ¶ | skipping to change at page 19, line 4 ¶ | |||
| and that the manifest does not exceed the capabilities of the target | and that the manifest does not exceed the capabilities of the target | |||
| device. | device. | |||
| 6.2. Required Template: Compatibility Check | 6.2. Required Template: Compatibility Check | |||
| The compatibility check ensures that devices only install compatible | The compatibility check ensures that devices only install compatible | |||
| images. | images. | |||
| Common: Set Current Component Check Vendor Identifier Check Class | Common: Set Current Component Check Vendor Identifier Check Class | |||
| Identifier | Identifier | |||
| All manifests MUST contain the compatibility check template, except | All manifests MUST contain the compatibility check template, except | |||
| as outlined below. | as outlined below. | |||
| If a device class has a unique trust anchor, and every element in its | If a device class has a unique trust anchor, and every element in its | |||
| trust chain is unique-different from every element in any other | trust chain is unique-different from every element in any other | |||
| device class, then it MAY include the compatibility check. | device class, then it MAY include the compatibility check. | |||
| If a manifest includes a dependency that performs a compatibility | If a manifest includes a dependency that performs a compatibility | |||
| check, then the dependent manifest MAY include the compatibility | check, then the dependent manifest MAY include the compatibility | |||
| check. | check. | |||
| The compatibility check template contains a data dependency: Vendor | The compatibility check template contains a data dependency: Vendor | |||
| Identifier and Class Identifier MUST be set prior to executing the | Identifier and Class Identifier MUST be set prior to executing the | |||
| template. One examples of the full template is included below, | template. One example of the full template is included below, | |||
| however Parameters may be set within a Try-Each block as well. They | however Parameters may be set within a Try-Each block as well. They | |||
| may also be inherited from a dependent manifest. | may also be inherited from a dependent manifest. | |||
| - Common: | - Common: | |||
| o Set Current Component | o Set Current Component. | |||
| o Set Parameters: | o Set Parameters: | |||
| * Vendor ID | * Vendor ID. | |||
| * Class ID | * Class ID. | |||
| o Check Vendor Identifier | o Check Vendor Identifier. | |||
| o Check Class Identifier | o Check Class Identifier. | |||
| 6.3. Use Case Template: XIP Secure Boot | 6.3. Use Case Template: XIP Secure Boot | |||
| - Common: | - Common: | |||
| o Set Current Component | o Set Current Component. | |||
| o Override Parameters: | o Override Parameters: | |||
| * Digest | * Digest. | |||
| * Size | * Size. | |||
| - Run: | - Run: | |||
| o Set Current Component | o Set Current Component. | |||
| o Check Image Match | o Check Image Match. | |||
| o Directive Run | o Directive Run. | |||
| 6.4. Use Case Template: Firmware Download | 6.4. Use Case Template: Firmware Download | |||
| - Common: | - Common: | |||
| o Set Current Component | o Set Current Component. | |||
| o Override Parameters: | o Override Parameters: | |||
| * Digest | * Digest. | |||
| * Size | * Size. | |||
| - Install: | - Install: | |||
| o Set Current Component | o Set Current Component. | |||
| o Set Parameters: | o Set Parameters: | |||
| * URI | * URI. | |||
| o Fetch | o Fetch. | |||
| 6.5. Use Case Template: Load from External Storage | 6.5. Use Case Template: Load from External Storage | |||
| - Load: | - Load: | |||
| o Set Current Component | o Set Current Component. | |||
| o Set Parameters: | o Set Parameters: | |||
| * Source Index | * Source Index. | |||
| o Copy | o Copy. | |||
| 6.6. Use Case Template Load & Decompress from External Storage | 6.6. Use Case Template Load & Decompress from External Storage | |||
| - Load: | - Load: | |||
| o Set Current Component | o Set Current Component. | |||
| o Set Parameters: | o Set Parameters: | |||
| * Source Index | * Source Index. | |||
| * Compression Info | * Compression Info. | |||
| o Copy | o Copy. | |||
| 6.7. Use Case Template: Dependency | 6.7. Use Case Template: Dependency | |||
| - Dependency Resolution: | - Dependency Resolution: | |||
| o Set Current Dependency | o Set Current Dependency. | |||
| o Set Parameters: | o Set Parameters: | |||
| * URI | * URI. | |||
| o Fetch | o Fetch. | |||
| o Check Image Match | ||||
| o Process Dependency | o Check Image Match. | |||
| o Process Dependency. | ||||
| - Validate: | - Validate: | |||
| o Set Current Dependency | o Set Current Dependency. | |||
| o Check Image Match | o Check Image Match. | |||
| o Process Dependency | o Process Dependency. | |||
| For any other section that the dependency has, the dependent MUST | For any other section that the dependency has, the dependent MUST | |||
| invoke Process Dependency. | invoke Process Dependency. | |||
| 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. Manifest Structure | 7. Manifest Structure | |||
| The manifest is divided into several sections in a hierarchy as | The manifest is divided into several sections in a hierarchy as | |||
| follows: | follows: | |||
| 1. The outer wrapper | 1. The outer wrapper | |||
| 1. The authentication wrapper | 1. Authentication delegation chain(s) | |||
| 2. The manifest | 2. The authentication wrapper | |||
| 1. Critical Information | 3. The manifest | |||
| 2. Information shared by all command sequences | 1. Critical Information | |||
| 1. List of dependencies | 2. Information shared by all command sequences | |||
| 1. List of dependencies | ||||
| 2. List of payloads | 2. List of payloads | |||
| 3. List of payloads in dependencies | 3. List of payloads in dependencies | |||
| 4. Common list of conditions, directives | 4. Common list of conditions, directives | |||
| 3. Dependency resolution Reference or list of conditions, | 3. Dependency resolution Reference or list of conditions, | |||
| directives | directives | |||
| 4. Payload fetch Reference or list of conditions, | 4. Payload fetch Reference or list of conditions, | |||
| directives | directives | |||
| 5. Installation Reference or list of conditions, directives | 5. Installation Reference or list of conditions, | |||
| 6. Verification conditions/directives | directives | |||
| 7. Load conditions/directives | 6. Verification conditions/directives | |||
| 8. Run conditions/directives | 7. Load conditions/directives | |||
| 9. Text / Reference | 8. Run conditions/directives | |||
| 10. COSWID / Reference | 9. Text / Reference | |||
| 3. Dependency resolution conditions/directives | 10. COSWID / Reference | |||
| 4. Payload fetch conditions/directives | 4. Dependency resolution conditions/directives | |||
| 5. Installation conditions/directives | 5. Payload fetch conditions/directives | |||
| 6. Text | 6. Installation conditions/directives | |||
| 7. COSWID / Reference | 7. Text | |||
| 8. Intermediate Certificate(s) / CWTs | 8. COSWID / Reference | |||
| 9. Inline Payload(s) | 9. Intermediate Certificate(s) / CWTs | |||
| 10. Inline Payload(s) | ||||
| 7.1. Severable Elements | 7.1. 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 without affecting | times, some parts of the manifest can be removed without affecting | |||
| later stages of the lifecycle. This is called "Severing." Severing | later stages of the lifecycle. This is called "Severing." Severing | |||
| of information is achieved by separating that information from the | of information is achieved by separating that information from the | |||
| signed container so that removing it does not affect the signature. | signed container so that removing it does not affect the signature. | |||
| This means that ensuring authenticity of severable parts of the | This means that ensuring authenticity of severable parts of the | |||
| manifest is a requirement for the signed portion of the manifest. | manifest is a requirement for the signed portion of the manifest. | |||
| Severing some parts makes it possible to discard parts of the | Severing some parts makes it possible to discard parts of the | |||
| manifest that are no longer necessary. This is important because it | manifest that are no longer necessary. This is important because it | |||
| allows the storage used by the manifest to be greatly reduced. For | allows the storage used by the manifest to be greatly reduced. For | |||
| example, no text size limits are needed if text is removed from the | example, no text size limits are needed if text is removed from the | |||
| manifest prior to delivery to a constrained device. | manifest prior to delivery to a constrained device. | |||
| Elements are made severable by removing them from the manifest, | Elements are made severable by removing them from the manifest, | |||
| encoding them in a bstr, and placing a SUIT_Digest of the bstr in the | encoding them in a bstr, and placing a SUIT_Digest of the bstr in the | |||
| skipping to change at page 23, line 9 ¶ | skipping to change at page 23, line 26 ¶ | |||
| typically consumes 4 bytes more than the size of the raw digest, | typically consumes 4 bytes more than the size of the raw digest, | |||
| therefore elements smaller than (Digest Bits)/8 + 4 SHOULD never be | therefore elements smaller than (Digest Bits)/8 + 4 SHOULD never be | |||
| severable. Elements larger than (Digest Bits)/8 + 4 MAY be | severable. Elements larger than (Digest Bits)/8 + 4 MAY be | |||
| severable, while elements that are much larger than (Digest Bits)/8 + | severable, while elements that are much larger than (Digest Bits)/8 + | |||
| 4 SHOULD be severable. | 4 SHOULD be severable. | |||
| Because of this, all command sequences in the manifest are encoded in | Because of this, all command sequences in the manifest are encoded in | |||
| a bstr so that there is a single code path needed for all command | a bstr so that there is a single code path needed for all command | |||
| sequences | sequences | |||
| 7.2. Outer wrapper | 7.2. Outer Wrapper | |||
| This object is a container for the other pieces of the manifest to | This object is a container for the other pieces of the manifest to | |||
| provide a common mechanism to find each of the parts. All elements | provide a common mechanism to find each of the parts. All elements | |||
| of the outer wrapper are contained in bstr objects. Wherever the | of the outer wrapper are contained in bstr objects. Wherever the | |||
| manifest references an object in the outer wrapper, the bstr is | manifest references an object in the outer wrapper, the bstr is | |||
| included in the digest calculation. | included in the digest calculation. | |||
| The CDDL that describes the wrapper is below | The CDDL that describes the wrapper is below | |||
| SUIT_Outer_Wrapper = { | SUIT_Outer_Wrapper = { | |||
| suit-delegation => bstr .cbor SUIT_Delegation | ||||
| suit-authentication-wrapper => bstr .cbor | suit-authentication-wrapper => bstr .cbor | |||
| SUIT_Authentication_Wrapper / nil, | SUIT_Authentication_Wrapper / nil, | |||
| $SUIT_Manifest_Wrapped, | $SUIT_Manifest_Wrapped, | |||
| ? suit-dependency-resolution => bstr .cbor SUIT_Command_Sequence, | ? suit-dependency-resolution => bstr .cbor SUIT_Command_Sequence, | |||
| ? suit-payload-fetch => bstr .cbor SUIT_Command_Sequence, | ? suit-payload-fetch => bstr .cbor SUIT_Command_Sequence, | |||
| ? suit-install => bstr .cbor SUIT_Command_Sequence, | ? suit-install => bstr .cbor SUIT_Command_Sequence, | |||
| ? suit-text => bstr .cbor SUIT_Text_Map, | ? suit-text => bstr .cbor SUIT_Text_Map, | |||
| ? suit-coswid => bstr .cbor COSWID | ? suit-coswid => bstr .cbor COSWID | |||
| } | } | |||
| SUIT_Delegation = [ + [ + CWT ] ] | ||||
| SUIT_Authentication_Wrapper = [ + (COSE_Mac_Tagged / COSE_Sign_Tagged / | SUIT_Authentication_Wrapper = [ + (COSE_Mac_Tagged / COSE_Sign_Tagged / | |||
| COSE_Mac0_Tagged / COSE_Sign1_Tagged)] | COSE_Mac0_Tagged / COSE_Sign1_Tagged)] | |||
| SUIT_Encryption_Wrapper = COSE_Encrypt_Tagged / COSE_Encrypt0_Tagged | SUIT_Encryption_Wrapper = COSE_Encrypt_Tagged / COSE_Encrypt0_Tagged | |||
| SUIT_Manifest_Wrapped //= (suit-manifest => bstr .cbor SUIT_Manifest) | SUIT_Manifest_Wrapped //= (suit-manifest => bstr .cbor SUIT_Manifest) | |||
| SUIT_Manifest_Wrapped //= ( | SUIT_Manifest_Wrapped //= ( | |||
| suit-manifest-encryption-info => bstr .cbor SUIT_Encryption_Wrapper, | suit-manifest-encryption-info => bstr .cbor SUIT_Encryption_Wrapper, | |||
| suit-manifest-encrypted => bstr | suit-manifest-encrypted => bstr | |||
| ) | ) | |||
| All elements of the outer wrapper must be wrapped in a bstr to | All elements of the outer wrapper must be wrapped in a bstr to | |||
| minimize the complexity of the code that evaluates the cryptographic | minimize the complexity of the code that evaluates the cryptographic | |||
| integrity of the element and to ensure correct serialisation for | integrity of the element and to ensure correct serialization for | |||
| integrity and authenticity checks. | integrity and authenticity checks. | |||
| The suit-authentication-wrapper contains a list of 1 or more | The suit-authentication-wrapper contains a list of 1 or more | |||
| cryptographic authentication wrappers for the core part of the | cryptographic authentication wrappers for the core part of the | |||
| manifest. These are implemented as COSE_Mac_Tagged or | manifest. These are implemented as COSE_Mac_Tagged or | |||
| COSE_Sign_Tagged blocks. The Manifest is authenticated by these | COSE_Sign_Tagged blocks. The Manifest is authenticated by these | |||
| blocks in "detached payload" mode. The COSE_Mac_Tagged and | blocks in "detached payload" mode. The COSE_Mac_Tagged and | |||
| COSE_Sign_Tagged blocks are described in RFC 8152 [RFC8152] and are | COSE_Sign_Tagged blocks are described in RFC 8152 [RFC8152] and are | |||
| beyond the scope of this document. The suit-authentication-wrapper | beyond the scope of this document. The suit-authentication-wrapper | |||
| MUST come first in the SUIT_Outer_Wrapper, regardless of canonical | MUST come first in the SUIT_Outer_Wrapper, regardless of canonical | |||
| encoding of CBOR. All validators MUST reject any SUIT_Outer_Wrapper | encoding of CBOR. All validators MUST reject any SUIT_Outer_Wrapper | |||
| that begins with any element other than a suit-authentication- | that begins with any element other than a suit-authentication- | |||
| wrapper. | wrapper. | |||
| A manifest that has not had authentication information added MUST | A manifest that has not had authentication information added MUST | |||
| still contain the suit-authentication-wrapper element, but the | still contain the suit-authentication-wrapper element, but the | |||
| content MUST be nil. | content MUST be nil. | |||
| The outer wrapper MUST contain only one of | The outer wrapper MUST contain only one of | |||
| - a plaintext manifest: SUIT_Manifest | - a plaintext manifest: SUIT_Manifest. | |||
| - an encrypted manifest: both a SUIT_Encryption_Wrapper and the | - an encrypted manifest: both a SUIT_Encryption_Wrapper and the | |||
| ciphertext of a manifest. | ciphertext of a manifest. | |||
| When the outer wrapper contains SUIT_Encryption_Wrapper, the suit- | When the outer wrapper contains SUIT_Encryption_Wrapper, the suit- | |||
| authentication-wrapper MUST authenticate the plaintext of suit- | authentication-wrapper MUST authenticate the plaintext of suit- | |||
| manifest-encrypted. | manifest-encrypted. | |||
| suit-manifest contains a SUIT_Manifest structure, which describes the | suit-manifest contains a SUIT_Manifest structure, which describes the | |||
| payload(s) to be installed and any dependencies on other manifests. | payload(s) to be installed and any dependencies on other manifests. | |||
| skipping to change at page 24, line 41 ¶ | skipping to change at page 25, line 30 ¶ | |||
| Each of suit-dependency-resolution, suit-payload-fetch, and suit- | Each of suit-dependency-resolution, suit-payload-fetch, and suit- | |||
| payload-installation contain the severable contents of the | payload-installation contain the severable contents of the | |||
| identically named portions of the manifest, described in Section 7.3. | identically named portions of the manifest, described in Section 7.3. | |||
| suit-text contains all the human-readable information that describes | suit-text contains all the human-readable information that describes | |||
| any and all parts of the manifest, its payload(s) and its | any and all parts of the manifest, its payload(s) and its | |||
| resource(s). | resource(s). | |||
| suit-coswid contains a Concise Software Identifier. This may be | suit-coswid contains a Concise Software Identifier. This may be | |||
| discarded by the recipient if not needed. | discarded by the Recipient if not needed. | |||
| 7.3. Manifest | 7.3. Manifest | |||
| The manifest describes the critical metadata for the referenced | The manifest describes the critical metadata for the referenced | |||
| payload(s). In addition, it contains: | payload(s). In addition, it contains: | |||
| 1. a version number for the manifest structure itself | 1. a version number for the manifest structure itself | |||
| 2. a sequence number | 2. a sequence number | |||
| 3. a list of dependencies | 3. a list of dependencies | |||
| 4. a list of components affected | 4. a list of components affected | |||
| 5. a list of components affected by dependencies | 5. a list of components affected by dependencies | |||
| 6. a reference for each of the severable blocks. | 6. a reference for each of the severable blocks. | |||
| 7. a list of actions that the recipient should perform. | 7. a list of actions that the Recipient should perform. | |||
| The following CDDL fragment defines the manifest. | The following CDDL fragment defines the manifest. | |||
| SUIT_Manifest = { | SUIT_Manifest = { | |||
| suit-manifest-version => 1, | suit-manifest-version | |||
| suit-manifest-sequence-number => uint, | => 1, | |||
| suit-common => bstr .cbor SUIT_Common, | suit-manifest-sequence-number | |||
| ? suit-dependency-resolution => Digest / bstr .cbor SUIT_Command_Sequence, | => uint, | |||
| ? suit-payload-fetch => Digest / bstr .cbor SUIT_Command_Sequence, | suit-common | |||
| ? suit-install => Digest / bstr .cbor SUIT_Command_Sequence, | => bstr .cbor SUIT_Common, | |||
| ? suit-validate => bstr .cbor SUIT_Command_Sequence, | ? suit-dependency-resolution | |||
| ? suit-load => bstr .cbor SUIT_Command_Sequence, | => Digest / bstr .cbor SUIT_Command_Sequence, | |||
| ? suit-run => bstr .cbor SUIT_Command_Sequence, | ? suit-payload-fetch | |||
| ? suit-text => Digest, | => Digest / bstr .cbor SUIT_Command_Sequence, | |||
| ? suit-coswid => Digest / bstr .cbor concise-software-identity, | ? suit-install | |||
| } | => Digest / bstr .cbor SUIT_Command_Sequence, | |||
| ? suit-validate | ||||
| => bstr .cbor SUIT_Command_Sequence, | ||||
| ? suit-load | ||||
| => bstr .cbor SUIT_Command_Sequence, | ||||
| ? suit-run | ||||
| => bstr .cbor SUIT_Command_Sequence, | ||||
| ? suit-text | ||||
| => Digest, | ||||
| ? suit-coswid | ||||
| => Digest / bstr .cbor concise-software-identity, | ||||
| } | ||||
| SUIT_Common = { | SUIT_Common = { | |||
| ? suit-dependencies => bstr .cbor [ + SUIT_Dependency ], | ? suit-dependencies | |||
| ? suit-components => bstr .cbor [ + SUIT_Component_Identifier ], | => bstr .cbor [ + SUIT_Dependency ], | |||
| ? suit-dependency-components => bstr .cbor [ + SUIT_Component_Reference ], | ? suit-components | |||
| ? suit-common-sequence => bstr .cbor SUIT_Command_Sequence, | => bstr .cbor [ + SUIT_Component_Identifier ], | |||
| } | ? suit-dependency-components | |||
| => bstr .cbor [ + SUIT_Component_Reference ], | ||||
| ? suit-common-sequence | ||||
| => bstr .cbor SUIT_Command_Sequence, | ||||
| } | ||||
| Several fields in the Manifest can be either a CBOR structure or a | Several fields in the Manifest can be either a CBOR structure or a | |||
| SUIT_Digest. In each of these cases, the SUIT_Digest provides for a | SUIT_Digest. In each of these cases, the SUIT_Digest provides for a | |||
| severable field. Severable fields are RECOMMENDED to implement. In | severable field. Severable fields are RECOMMENDED to implement. In | |||
| particular, text SHOULD be severable, since most useful text elements | particular, text SHOULD be severable, since most useful text elements | |||
| occupy more space than a SUIT_Digest, but are not needed by recipient | occupy more space than a SUIT_Digest, but are not needed by the | |||
| devices. 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 is been severable. The key used for a | determine whether an element is been severable. 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_Outer_Wrapper so that a recipient can easily identify the | SUIT_Outer_Wrapper so that a Recipient can easily identify the | |||
| correct data in the outer wrapper. | correct data in the outer wrapper. | |||
| The suit-manifest-version indicates the version of serialisation used | The suit-manifest-version indicates the version of serialization used | |||
| 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. | document. suit-manifest-version is REQUIRED. | |||
| 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 devices to determine which in a set | rollback counter. It also helps devices to determine which in a set | |||
| of manifests is the "root" manifest in a given update. Each manifest | of manifests is the "root" manifest in a given update. Each manifest | |||
| MUST have a sequence number higher than each of its dependencies. | MUST have a sequence number higher than each of its dependencies. | |||
| Each recipient MUST reject any manifest that has a sequence number | Each Recipient MUST reject any manifest that has a sequence number | |||
| lower than its current sequence number. It MAY be convenient to use | lower than its current sequence number. It MAY be convenient to use | |||
| a UTC timestamp in seconds as the sequence number. suit-manifest- | a UTC timestamp in seconds as the sequence number. suit-manifest- | |||
| sequence-number is REQUIRED. | sequence-number is REQUIRED. | |||
| 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, suit-dependency-components, and suit-common-sequence. | components, suit-dependency-components, and suit-common-sequence. | |||
| suit-common is REQUIRED to implement. | suit-common is REQUIRED to implement. | |||
| suit-dependencies is a list of SUIT_Dependency blocks that specify | suit-dependencies is a list of SUIT_Dependency blocks that specify | |||
| skipping to change at page 28, line 32 ¶ | skipping to change at page 29, line 34 ¶ | |||
| SUIT_Component_Identifier. This specifies the scope at which the | SUIT_Component_Identifier. This specifies the scope at which the | |||
| dependency operates. This allows the dependency to be forwarded on | dependency operates. This allows the dependency to be forwarded on | |||
| to a component that is capable of parsing its own manifests. It also | to a component that is capable of parsing its own manifests. It also | |||
| allows one manifest to be deployed to multiple dependent devices | allows one manifest to be deployed to multiple dependent devices | |||
| without those devices needing consistent component hierarchy. This | without those devices needing consistent component hierarchy. This | |||
| element is OPTIONAL. | element is OPTIONAL. | |||
| 7.5. SUIT_Component_Reference | 7.5. SUIT_Component_Reference | |||
| The SUIT_Component_Reference describes an image that is defined by | The SUIT_Component_Reference describes an image that is defined by | |||
| another manifest. This is useful for overriding the behaviour of | another manifest. This is useful for overriding the behavior of | |||
| another manifest, for example by directing the recipient to look at a | another manifest, for example by directing the recipient to look at a | |||
| different URI for the image or by changing the expected format, such | different URI for the image or by changing the expected format, such | |||
| as when a gateway performs decryption on behalf of a constrained | as when a gateway performs decryption on behalf of a constrained | |||
| device. The following CDDL describes the SUIT_Component_Reference. | device. The following CDDL describes the SUIT_Component_Reference. | |||
| SUIT_Component_Reference = { | SUIT_Component_Reference = { | |||
| suit-component-identifier => SUIT_Component_Identifier, | suit-component-identifier => SUIT_Component_Identifier, | |||
| suit-component-dependency-index => uint | suit-component-dependency-index => uint | |||
| } | } | |||
| skipping to change at page 30, line 34 ¶ | skipping to change at page 31, line 35 ¶ | |||
| | | n | ncy | Append | list of ranked | | | | n | ncy | Append | list of ranked | | |||
| | | | | | URIs | | | | | | | URIs | | |||
| | | | | | | | | | | | | | | |||
| | nin | int/bs | Custom | Custom | Application- | | | nin | int/bs | Custom | Custom | Application- | | |||
| | t | tr | | Parameter | defined parameter | | | t | tr | | Parameter | defined parameter | | |||
| +-----+--------+-------------------+------------+-------------------+ | +-----+--------+-------------------+------------+-------------------+ | |||
| CBOR-encoded object parameters are still wrapped in a bstr. This is | CBOR-encoded object parameters are still wrapped in a bstr. This is | |||
| because it allows a parser that is aggregating parameters to | because it allows a parser that is aggregating parameters to | |||
| reference the object with a single pointer and traverse it without | reference the object with a single pointer and traverse it without | |||
| understanding the contents. This is important for modularisation and | understanding the contents. This is important for 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 Conditions and Directives because | consideration does not apply to Conditions and Directives because | |||
| those elements are invoked with their arguments immediately | those elements are invoked with their arguments immediately | |||
| 7.6.1. SUIT_Parameter_Strict_Order | 7.6.1. SUIT_Parameter_Strict_Order | |||
| The Strict Order Parameter allows a manifest to govern when | The Strict Order Parameter allows a manifest to govern when | |||
| directives can be executed out-of-order. This allows for systems | directives can be executed out-of-order. This allows for systems | |||
| that have a sensitivity to order of updates to choose the order in | that have a sensitivity to order of updates to choose the order in | |||
| which they are executed. It also allows for more advanced systems to | which they are executed. It also allows for more advanced systems to | |||
| parallelise their handling of updates. Strict Order defaults to | 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. If SUIT_Parameter_Strict_Order is | |||
| returned to True, ALL preceding commands MUST complete before the | returned to True, ALL preceding commands MUST complete before the | |||
| next command is executed. | next command is executed. | |||
| 7.6.2. SUIT_Parameter_Soft_Failure | 7.6.2. SUIT_Parameter_Soft_Failure | |||
| When executing a command sequence inside SUIT_Directive_Try_Each and | When executing a command sequence inside SUIT_Directive_Try_Each and | |||
| skipping to change at page 31, line 20 ¶ | skipping to change at page 32, line 22 ¶ | |||
| it returns the original condition failure. | it returns the original condition failure. | |||
| 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. | SUIT_Command_Sequence terminates. | |||
| 7.7. SUIT_Parameter_Encryption_Info | 7.7. SUIT_Parameter_Encryption_Info | |||
| Encryption Info defines the mechanism that Fetch or Copy should use | Encryption Info defines the mechanism that Fetch or Copy should use | |||
| to decrypt the data they transfer. SUIT_Parameter_Encryption_Info is | to decrypt the data they transfer. SUIT_Parameter_Encryption_Info is | |||
| encoded as a COSE_Encrypt_Tagged or a COSE_Encrypt0_Tagged, wrapped | encoded as a COSE_Encrypt_Tagged or a COSE_Encrypt0_Tagged, wrapped | |||
| in a bstr | in a bstr. | |||
| 7.8. SUIT_Parameter_Compression_Info | 7.7.1. SUIT_Parameter_Compression_Info | |||
| Compression Info defines any information that is required for a | Compression Info defines any information that is required for a | |||
| device to perform decompression operations. Typically, this includes | device to perform decompression operations. Typically, this includes | |||
| the algorithm identifier. | the algorithm identifier. | |||
| SUIT_Parameter_Compression_Info is defined by the following CDDL: | SUIT_Parameter_Compression_Info is defined by the following CDDL: | |||
| SUIT_Compression_Info = { | SUIT_Compression_Info = { | |||
| suit-compression-algorithm => SUIT_Compression_Algorithms | suit-compression-algorithm => SUIT_Compression_Algorithms | |||
| ? suit-compression-parameters => bstr | ? suit-compression-parameters => bstr | |||
| } | } | |||
| SUIT_Compression_Algorithms /= SUIT_Compression_Algorithm_gzip | SUIT_Compression_Algorithms /= SUIT_Compression_Algorithm_gzip | |||
| SUIT_Compression_Algorithms /= SUIT_Compression_Algorithm_bzip2 | SUIT_Compression_Algorithms /= SUIT_Compression_Algorithm_bzip2 | |||
| SUIT_Compression_Algorithms /= SUIT_Compression_Algorithm_deflate | SUIT_Compression_Algorithms /= SUIT_Compression_Algorithm_deflate | |||
| SUIT_Compression_Algorithms /= SUIT_Compression_Algorithm_LZ4 | SUIT_Compression_Algorithms /= SUIT_Compression_Algorithm_LZ4 | |||
| SUIT_Compression_Algorithms /= SUIT_Compression_Algorithm_lzma | SUIT_Compression_Algorithms /= SUIT_Compression_Algorithm_lzma | |||
| 7.9. SUIT_Parameter_Unpack_Info | 7.7.2. SUIT_Parameter_Unpack_Info | |||
| SUIT_Unpack_Info defines the information required for a device to | SUIT_Unpack_Info defines the information required for a device to | |||
| interpret a packed format, such as elf, hex, or binary diff. | interpret a packed format, such as elf, hex, or binary diff. | |||
| SUIT_Unpack_Info is defined by the following CDDL: | SUIT_Unpack_Info is defined by the following CDDL: | |||
| SUIT_Unpack_Info = { | SUIT_Unpack_Info = { | |||
| suit-unpack-algorithm => SUIT_Unpack_Algorithms | suit-unpack-algorithm => SUIT_Unpack_Algorithms | |||
| ? suit-unpack-parameters => bstr | ? suit-unpack-parameters => bstr | |||
| } | } | |||
| SUIT_Unpack_Algorithms //= SUIT_Unpack_Algorithm_Delta | SUIT_Unpack_Algorithms //= SUIT_Unpack_Algorithm_Delta | |||
| SUIT_Unpack_Algorithms //= SUIT_Unpack_Algorithm_Hex | SUIT_Unpack_Algorithms //= SUIT_Unpack_Algorithm_Hex | |||
| SUIT_Unpack_Algorithms //= SUIT_Unpack_Algorithm_Elf | SUIT_Unpack_Algorithms //= SUIT_Unpack_Algorithm_Elf | |||
| 7.10. SUIT_Parameters CDDL | 7.7.3. SUIT_Parameters CDDL | |||
| The following CDDL describes all SUIT_Parameters. | The following CDDL describes all SUIT_Parameters. | |||
| SUIT_Parameters //= (suit-parameter-strict-order => bool) | SUIT_Parameters //= (suit-parameter-strict-order => bool) | |||
| SUIT_Parameters //= (suit-parameter-soft-failure => bool) | SUIT_Parameters //= (suit-parameter-soft-failure => bool) | |||
| SUIT_Parameters //= (suit-parameter-vendor-id => bstr) | SUIT_Parameters //= (suit-parameter-vendor-id => bstr) | |||
| SUIT_Parameters //= (suit-parameter-class-id => bstr) | SUIT_Parameters //= (suit-parameter-class-id => bstr) | |||
| SUIT_Parameters //= (suit-parameter-device-id => bstr) | SUIT_Parameters //= (suit-parameter-device-id => bstr) | |||
| SUIT_Parameters //= (suit-parameter-uri => tstr) | SUIT_Parameters //= (suit-parameter-uri => tstr) | |||
| SUIT_Parameters //= (suit-parameter-encryption-info => bstr .cbor SUIT_Encryption_Info) | SUIT_Parameters //= (suit-parameter-encryption-info | |||
| SUIT_Parameters //= (suit-parameter-compression-info => bstr .cbor SUIT_Compression_Info) | => bstr .cbor SUIT_Encryption_Info) | |||
| SUIT_Parameters //= (suit-parameter-unpack-info => bstr .cbor SUIT_Unpack_Info) | SUIT_Parameters //= (suit-parameter-compression-info | |||
| SUIT_Parameters //= (suit-parameter-source-component => uint) | => bstr .cbor SUIT_Compression_Info) | |||
| SUIT_Parameters //= (suit-parameter-image-digest => bstr .cbor SUIT_Digest) | SUIT_Parameters //= (suit-parameter-unpack-info | |||
| SUIT_Parameters //= (suit-parameter-image-size => uint) | => bstr .cbor SUIT_Unpack_Info) | |||
| SUIT_Parameters //= (suit-parameter-uri-list => bstr .cbor SUIT_Component_URI_List) | SUIT_Parameters //= (suit-parameter-source-component | |||
| SUIT_Parameters //= (suit-parameter-custom => int/bool/tstr/bstr) | => uint) | |||
| SUIT_Parameters //= (suit-parameter-image-digest | ||||
| => bstr .cbor SUIT_Digest) | ||||
| SUIT_Parameters //= (suit-parameter-image-size => uint) | ||||
| SUIT_Parameters //= (suit-parameter-uri-list | ||||
| => bstr .cbor SUIT_Component_URI_List) | ||||
| SUIT_Parameters //= (suit-parameter-custom | ||||
| => int/bool/tstr/bstr) | ||||
| SUIT_Component_URI_List = [ + [priority: int, uri: tstr] ] | SUIT_Component_URI_List = [ + [priority: int, uri: tstr] ] | |||
| SUIT_Encryption_Info= COSE_Encrypt_Tagged/COSE_Encrypt0_Tagged | SUIT_Encryption_Info= COSE_Encrypt_Tagged/COSE_Encrypt0_Tagged | |||
| SUIT_Compression_Info = { | SUIT_Compression_Info = { | |||
| suit-compression-algorithm => SUIT_Compression_Algorithms | suit-compression-algorithm => SUIT_Compression_Algorithms | |||
| ? suit-compression-parameters => bstr | ? suit-compression-parameters => bstr | |||
| } | } | |||
| SUIT_Compression_Algorithms /= SUIT_Compression_Algorithm_gzip | SUIT_Compression_Algorithms /= SUIT_Compression_Algorithm_gzip | |||
| SUIT_Compression_Algorithms /= SUIT_Compression_Algorithm_bzip2 | SUIT_Compression_Algorithms /= SUIT_Compression_Algorithm_bzip2 | |||
| SUIT_Compression_Algorithms /= SUIT_Compression_Algorithm_deflate | SUIT_Compression_Algorithms /= SUIT_Compression_Algorithm_deflate | |||
| SUIT_Compression_Algorithms /= SUIT_Compression_Algorithm_LZ4 | SUIT_Compression_Algorithms /= SUIT_Compression_Algorithm_LZ4 | |||
| SUIT_Compression_Algorithms /= SUIT_Compression_Algorithm_lzma | SUIT_Compression_Algorithms /= SUIT_Compression_Algorithm_lzma | |||
| SUIT_Unpack_Info = { | SUIT_Unpack_Info = { | |||
| suit-unpack-algorithm => SUIT_Unpack_Algorithms | suit-unpack-algorithm => SUIT_Unpack_Algorithms | |||
| ? suit-unpack-parameters => bstr | ? suit-unpack-parameters => bstr | |||
| } | } | |||
| SUIT_Unpack_Algorithms //= SUIT_Unpack_Algorithm_Delta | SUIT_Unpack_Algorithms //= SUIT_Unpack_Algorithm_Delta | |||
| SUIT_Unpack_Algorithms //= SUIT_Unpack_Algorithm_Hex | SUIT_Unpack_Algorithms //= SUIT_Unpack_Algorithm_Hex | |||
| SUIT_Unpack_Algorithms //= SUIT_Unpack_Algorithm_Elf | SUIT_Unpack_Algorithms //= SUIT_Unpack_Algorithm_Elf | |||
| 7.11. SUIT_Command_Sequence | 7.8. SUIT_Command_Sequence | |||
| A SUIT_Command_Sequence defines a series of actions that the | A SUIT_Command_Sequence defines a series of actions that the | |||
| recipient MUST take to accomplish a particular goal. These goals are | Recipient MUST take to accomplish a particular goal. These goals are | |||
| defined in the manifest and include: | defined in the manifest and include: | |||
| 1. Dependency Resolution | 1. Dependency Resolution | |||
| 2. Payload Fetch | 2. Payload Fetch | |||
| 3. Payload Installation | 3. Payload Installation | |||
| 4. Image Validation | 4. Image Validation | |||
| 5. Image Loading | 5. Image Loading | |||
| 6. Run or Boot | 6. Run or Boot | |||
| Each of these follows exactly the same structure to ensure that the | Each of these follows exactly the same structure to ensure that the | |||
| parser is as simple as possible. | parser is as simple as possible. | |||
| skipping to change at page 34, line 41 ¶ | skipping to change at page 36, line 4 ¶ | |||
| This introduces significant complexity in the parser, however, so the | This introduces significant complexity in the parser, however, so the | |||
| structure is flattened to make parsing simpler: | structure is flattened to make parsing simpler: | |||
| SUIT_Command_Sequence = [ + (SUIT_Condition/SUIT_Directive) ] | SUIT_Command_Sequence = [ + (SUIT_Condition/SUIT_Directive) ] | |||
| Each condition and directive is composed of: | Each condition and directive is composed of: | |||
| 1. A command code identifier | 1. A command code identifier | |||
| 2. An argument block | 2. An argument block | |||
| Argument blocks are defined for each type of command. | Argument blocks are defined for each type of command. | |||
| 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 ID tables defined at the beginning of the document. For | |||
| the purpose of setting the index, the two component ID tables are | the purpose of setting the index, the two component ID tables are | |||
| considered to be concatenated together. | considered to be concatenated together. | |||
| To facilitate optional conditions, a special directive is provided. | To facilitate optional conditions, a special directive is provided. | |||
| It runs several new lists of conditions/directives, one after | It runs several new lists of conditions/directives, one after | |||
| another, that are contained as an argument to the directive. By | another, that are contained as an argument to the directive. By | |||
| default, it assumes that a failure of a condition should not indicate | default, it assumes that a failure of a condition should not indicate | |||
| a failure of the update/boot, but a parameter is provided to override | a failure of the update/boot, but a parameter is provided to override | |||
| this behaviour. | this behavior. | |||
| 7.12. SUIT_Condition | 7.9. SUIT_Condition | |||
| Conditions are used to define mandatory properties of a system in | Conditions are used to define mandatory properties of a system in | |||
| order for an update to be applied. They can be pre-conditions or | order for an update to be applied. They can be pre-conditions or | |||
| post-conditons of any directive or series of directives, depending on | post-conditions of any directive or series of directives, depending | |||
| where they are placed in the list. Conditions include: | on where they are placed in the list. Conditions include: | |||
| +----------------+-------------------+----------------------------+ | +----------------+-------------------+----------------------------+ | |||
| | Condition Code | Condition Name | Argument Type | | | Condition Code | Condition Name | Argument Type | | |||
| +----------------+-------------------+----------------------------+ | +----------------+-------------------+----------------------------+ | |||
| | 1 | Vendor Identifier | nil | | | 1 | Vendor Identifier | nil | | |||
| | | | | | | | | | | |||
| | 2 | Class Identifier | nil | | | 2 | Class Identifier | nil | | |||
| | | | | | | | | | | |||
| | 3 | Image Match | nil | | | 3 | Image Match | nil | | |||
| | | | | | | | | | | |||
| | 4 | Use Before | Unsigned Integer timestamp | | | 4 | Use Before | Unsigned Integer timestamp | | |||
| | | | | | | | | | | |||
| | 5 | Component Offset | Unsigned Integer | | | 5 | Component Offset | Unsigned Integer | | |||
| | | | | | | | | | | |||
| | 24 | Device Identifier | nil | | | 24 | Device Identifier | nil | | |||
| | | | | | | | | | | |||
| | 25 | Image Not Match | nil | | | 25 | Image Not Match | nil | | |||
| | | | | | | | | | | |||
| | 26 | Minimum Battery | Unsigned Integer | | | 26 | Minimum Battery | Unsigned Integer | | |||
| | | | | | | | | | | |||
| | 27 | Update Authorised | Integer | | | 27 | Update Authorized | Integer | | |||
| | | | | | | | | | | |||
| | 28 | Version | List of Integers | | | 28 | Version | List of Integers | | |||
| | | | | | | | | | | |||
| | nint | Custom Condition | bstr | | | nint | Custom Condition | bstr | | |||
| +----------------+-------------------+----------------------------+ | +----------------+-------------------+----------------------------+ | |||
| Each condition MUST report a success code on completion. If a | Each condition MUST report a success code on completion. If a | |||
| condition reports failure, then the current sequence of commands MUST | condition reports failure, then the current sequence of commands MUST | |||
| terminate. If a recipient encounters an unknown Condition Code, it | terminate. If a Recipient encounters an unknown Condition Code, it | |||
| MUST report a failure. | MUST report a failure. | |||
| Positive Condition numbers are reserved for IANA registration. | Positive Condition numbers are reserved for IANA registration. | |||
| Negative numbers are reserved for proprietary, application-specific | Negative numbers are reserved for proprietary, application-specific | |||
| directives. | directives. | |||
| 7.12.1. Identifier Conditions | 7.9.1. Identifier Conditions | |||
| There are three identifier-based conditions: suit-condition-vendor- | There are three identifier-based conditions: suit-condition-vendor- | |||
| identifier, suit-condition-class-identifier, and suit-condition- | identifier, suit-condition-class-identifier, and suit-condition- | |||
| device-identifier. Each of these conditions match a RFC 4122 | device-identifier. Each of these conditions match a RFC 4122 | |||
| [RFC4122] UUID that MUST have already been set as a parameter. The | [RFC4122] UUID that MUST have already been set as a parameter. The | |||
| installing device MUST match the specified UUID in order to consider | installing device MUST match the specified UUID in order to consider | |||
| the manifest valid. These identifiers MAY be scoped by component. | the manifest valid. These identifiers MAY be scoped by component. | |||
| The recipient uses the ID parameter that has already been set using | The Recipient uses the ID parameter that has already been set using | |||
| the Set Parameters directive. If no ID has been set, this condition | the Set Parameters directive. If no ID has been set, this condition | |||
| fails. suit-condition-class-identifier and suit-condition-vendor- | fails. suit-condition-class-identifier and suit-condition-vendor- | |||
| identifier are REQUIRED to implement. suit-condition-device- | identifier are REQUIRED to implement. suit-condition-device- | |||
| identifier is OPTIONAL to implement. | identifier is OPTIONAL to implement. | |||
| 7.12.2. suit-condition-image-match | 7.9.2. suit-condition-image-match | |||
| Verify that the current component matches the digest parameter for | Verify that the current component matches the digest parameter for | |||
| the current component. The digest is verified against the digest | the current component. The digest is verified against the digest | |||
| specified in the Component's parameters list. If no digest is | specified in the Component's parameters list. If no digest is | |||
| specified, the condition fails. suit-condition-image-match is | specified, the condition fails. suit-condition-image-match is | |||
| REQUIRED to implement. | REQUIRED to implement. | |||
| 7.12.3. suit-condition-image-not-match | 7.9.3. suit-condition-image-not-match | |||
| Verify that the current component does not match the supplied digest. | Verify that the current component does not match the supplied digest. | |||
| If no digest is specified, then the digest is compared against the | If no digest is specified, then the digest is compared against the | |||
| digest specified in the Components list. If no digest is specified | digest specified in the Components list. If no digest is specified | |||
| and the component is not present in the Components list, the | and the component is not present in the Components list, the | |||
| condition fails. suit-condition-image-not-match is OPTIONAL to | condition fails. suit-condition-image-not-match is OPTIONAL to | |||
| implement. | implement. | |||
| 7.12.4. suit-condition-use-before | 7.9.4. suit-condition-use-before | |||
| Verify that the current time is BEFORE the specified time. suit- | Verify that the current time is BEFORE the specified time. suit- | |||
| condition-use-before is used to specify the last time at which an | condition-use-before is used to specify the last time at which an | |||
| update should be installed. One argument is required, encoded as a | update should be installed. One argument is required, encoded as a | |||
| POSIX timestamp, that is seconds after 1970-01-01 00:00:00. | POSIX timestamp, that is seconds after 1970-01-01 00:00:00. | |||
| Timestamp conditions MUST be evaluated in 64 bits, regardless of | Timestamp conditions MUST be evaluated in 64 bits, regardless of | |||
| encoded CBOR size. suit-condition-use-before is OPTIONAL to | encoded CBOR size. suit-condition-use-before is OPTIONAL to | |||
| implement. | implement. | |||
| 7.12.5. suit-condition-minimum-battery | 7.9.5. suit-condition-minimum-battery | |||
| suit-condition-minimum-battery provides a mechanism to test a | suit-condition-minimum-battery provides a mechanism to test a | |||
| device's battery level before installing an update. This condition | device's battery level before installing an update. This condition | |||
| is for use in primary-cell applications, where the battery is only | is for use in primary-cell applications, where the battery is only | |||
| ever discharged. For batteries that are charged, suit-directive-wait | ever discharged. For batteries that are charged, suit-directive-wait | |||
| is more appropriate, since it defines a "wait" until the battery | is more appropriate, since it defines a "wait" until the battery | |||
| level is sufficient to install the update. suit-condition-minimum- | level is sufficient to install the update. suit-condition-minimum- | |||
| battery is specified in mWh. suit-condition-minimum-battery is | battery is specified in mWh. suit-condition-minimum-battery is | |||
| OPTIONAL to implement. | OPTIONAL to implement. | |||
| 7.12.6. suit-condition-update-authorised | 7.9.6. suit-condition-update-authorized | |||
| Request Authorisation from the application and fail if not | Request Authorization from the application and fail if not | |||
| authorised. This can allow a user to decline an update. Argument is | authorized. This can allow a user to decline an update. Argument is | |||
| an integer priority level. Priorities are application defined. suit- | an integer priority level. Priorities are application defined. suit- | |||
| condition-update-authorised is OPTIONAL to implement. | condition-update-authorized is OPTIONAL to implement. | |||
| 7.12.7. suit-condition-version | 7.9.7. suit-condition-version | |||
| suit-condition-version allows comparing versions of firmware. | suit-condition-version allows comparing versions of firmware. | |||
| Verifying image digests is preferred to version checks because | Verifying image digests is preferred to version checks because | |||
| digests are more precise. The image can be compared as: | digests are more precise. The image can be compared as: | |||
| - Greater | - Greater. | |||
| - Greater or Equal | - Greater or Equal. | |||
| - Equal | - Equal. | |||
| - Lesser or Equal | - Lesser or Equal. | |||
| - Lesser | - Lesser. | |||
| Versions are encoded as a CBOR list of integers. Comparisons are | Versions are encoded as a CBOR list of integers. Comparisons are | |||
| done on each integer in sequence. Comparison stops after all | done on each integer in sequence. Comparison stops after all | |||
| integers in the list defined by the manifest have been consumed OR | integers in the list defined by the manifest have been consumed OR | |||
| after a non-equal match has occured. For example, if the manifest | after a non-equal match has occurred. For example, if the manifest | |||
| defines a comparison, "Equal [1]", then this will match all version | defines a comparison, "Equal [1]", then this will match all version | |||
| sequences starting with 1. If a manifest defines both "Greater or | sequences starting with 1. If a manifest defines both "Greater or | |||
| Equal [1,0]" and "Lesser [1,10]", then it will match versions 1.0.x | Equal [1,0]" and "Lesser [1,10]", then it will match versions 1.0.x | |||
| up to, but not including 1.10. | up to, but not including 1.10. | |||
| The following CDDL describes SUIT_Condition_Version_Argument | The following CDDL describes SUIT_Condition_Version_Argument | |||
| SUIT_Condition_Version_Argument = [ | SUIT_Condition_Version_Argument = [ | |||
| suit-condition-version-comparison: SUIT_Condition_Version_Comparison_Types, | suit-condition-version-comparison-type: | |||
| suit-condition-version-comparison: SUIT_Condition_Version_Comparison_Value | SUIT_Condition_Version_Comparison_Types, | |||
| ] | suit-condition-version-comparison-value: | |||
| SUIT_Condition_Version_Comparison_Types /= SUIT_Condition_Version_Comparison_Greater | SUIT_Condition_Version_Comparison_Value | |||
| SUIT_Condition_Version_Comparison_Types /= SUIT_Condition_Version_Comparison_Greater_Equal | ] | |||
| SUIT_Condition_Version_Comparison_Types /= SUIT_Condition_Version_Comparison_Equal | ||||
| SUIT_Condition_Version_Comparison_Types /= SUIT_Condition_Version_Comparison_Lesser_Equal | ||||
| SUIT_Condition_Version_Comparison_Types /= SUIT_Condition_Version_Comparison_Lesser | ||||
| SUIT_Condition_Version_Comparison_Greater = 1 | ||||
| SUIT_Condition_Version_Comparison_Greater_Equal = 2 | ||||
| SUIT_Condition_Version_Comparison_Equal = 3 | ||||
| SUIT_Condition_Version_Comparison_Lesser_Equal = 4 | ||||
| SUIT_Condition_Version_Comparison_Lesser = 5 | ||||
| SUIT_Condition_Version_Comparison_Value = [+int] | SUIT_Condition_Version_Comparison_Types /= | |||
| suit-condition-version-comparison-greater | ||||
| SUIT_Condition_Version_Comparison_Types /= | ||||
| suit-condition-version-comparison-greater-equal | ||||
| SUIT_Condition_Version_Comparison_Types /= | ||||
| suit-condition-version-comparison-equal | ||||
| SUIT_Condition_Version_Comparison_Types /= | ||||
| suit-condition-version-comparison-lesser-equal | ||||
| SUIT_Condition_Version_Comparison_Types /= | ||||
| suit-condition-version-comparison-lesser | ||||
| SUIT_Condition_Version_Comparison_Value = [+int] | ||||
| While the exact encoding of versions is application-defined, semantic | While the exact encoding of versions is application-defined, semantic | |||
| versions map conveniently. For example, | versions map conveniently. For example, | |||
| - 1.2.3 = [1,2,3] | - 1.2.3 = [1,2,3]. | |||
| - 1.2-rc3 = [1,2,-1,3] | - 1.2-rc3 = [1,2,-1,3]. | |||
| - 1.2-beta = [1,2,-2] | - 1.2-beta = [1,2,-2]. | |||
| - 1.2-alpha = [1,2,-3] | - 1.2-alpha = [1,2,-3]. | |||
| - 1.2-alpha4 = [1,2,-3,4] | - 1.2-alpha4 = [1,2,-3,4]. | |||
| suit-condition-version is OPTIONAL to implement. | suit-condition-version is OPTIONAL to implement. | |||
| 7.12.8. SUIT_Condition_Custom | 7.9.8. SUIT_Condition_Custom | |||
| SUIT_Condition_Custom describes any proprietary, application specific | SUIT_Condition_Custom describes any proprietary, application specific | |||
| condition. This is encoded as a negative integer, chosen by the | condition. This is encoded as a negative integer, chosen by the | |||
| firmware developer, and a bstr that encodes the parameters passed to | firmware developer, and a bstr that encodes the parameters passed to | |||
| the system that evaluates the condition matching that integer. | the system that evaluates the condition matching that integer. | |||
| SUIT_Condition_Custom is OPTIONAL to implement. | SUIT_Condition_Custom is OPTIONAL to implement. | |||
| 7.12.9. Identifiers | 7.9.9. Identifiers | |||
| Many conditions use identifiers to determine whether a manifest | Many conditions use identifiers to determine whether a manifest | |||
| matches a given recipient or not. These identifiers are defined to | matches a given Recipient or not. These identifiers are defined to | |||
| be RFC 4122 [RFC4122] UUIDs. These UUIDs are explicitly NOT human- | be RFC 4122 [RFC4122] UUIDs. These UUIDs are explicitly NOT human- | |||
| readable. They are for machine-based matching only. | readable. They are for machine-based matching only. | |||
| A device may match any number of UUIDs for vendor or class | A device may match any number of UUIDs for vendor or class | |||
| identifier. This may be relevant to physical or software modules. | identifier. This may be relevant to physical or software modules. | |||
| For example, a device that has an OS and one or more applications | For example, a device that has an OS and one or more applications | |||
| might list one Vendor ID for the OS and one or more additional Vendor | might list one Vendor ID for the OS and one or more additional Vendor | |||
| IDs for the applications. This device might also have a Class ID | IDs for the applications. This device might also have a Class ID | |||
| that must be matched for the OS and one or more Class IDs for the | that must be matched for the OS and one or more Class IDs for the | |||
| applications. | applications. | |||
| skipping to change at page 39, line 39 ¶ | skipping to change at page 41, line 21 ¶ | |||
| 4. Application | 4. Application | |||
| This allows the OS, WiFi module, and application to be updated | This allows the OS, WiFi module, and application to be updated | |||
| independently. To combat possible incompatibilities, the OS class ID | independently. To combat possible incompatibilities, the OS class ID | |||
| can be changed each time the OS has a change to its API. | can be changed each time the OS has a change to its API. | |||
| This approach allows a vendor to target, for example, all devices | This approach allows a vendor to target, for example, all devices | |||
| with a particular WiFi module with an update, which is a very | with a particular WiFi module with an update, which is a very | |||
| powerful mechanism, particularly when used for security updates. | powerful mechanism, particularly when used for security updates. | |||
| 7.12.9.1. Creating UUIDs: | 7.9.9.1. Creating UUIDs: | |||
| UUIDs MUST be created according to RFC 4122 [RFC4122]. UUIDs SHOULD | UUIDs MUST be created according to RFC 4122 [RFC4122]. UUIDs SHOULD | |||
| use versions 3, 4, or 5, as described in RFC4122. Versions 1 and 2 | use versions 3, 4, or 5, as described in RFC4122. Versions 1 and 2 | |||
| do not provide a tangible benefit over version 4 for this | do not provide a tangible benefit over version 4 for this | |||
| application. | application. | |||
| The RECOMMENDED method to create a vendor ID is: Vendor ID = | The RECOMMENDED method to create a vendor ID is: Vendor ID = | |||
| UUID5(DNS_PREFIX, vendor domain name) | UUID5(DNS_PREFIX, vendor domain name) | |||
| The RECOMMENDED method to create a class ID is: Class ID = | The RECOMMENDED method to create a class ID is: Class ID = | |||
| skipping to change at page 40, line 4 ¶ | skipping to change at page 41, line 33 ¶ | |||
| UUIDs MUST be created according to RFC 4122 [RFC4122]. UUIDs SHOULD | UUIDs MUST be created according to RFC 4122 [RFC4122]. UUIDs SHOULD | |||
| use versions 3, 4, or 5, as described in RFC4122. Versions 1 and 2 | use versions 3, 4, or 5, as described in RFC4122. Versions 1 and 2 | |||
| do not provide a tangible benefit over version 4 for this | do not provide a tangible benefit over version 4 for this | |||
| application. | application. | |||
| The RECOMMENDED method to create a vendor ID is: Vendor ID = | The RECOMMENDED method to create a vendor ID is: Vendor ID = | |||
| UUID5(DNS_PREFIX, vendor domain name) | UUID5(DNS_PREFIX, vendor domain name) | |||
| The RECOMMENDED method to create a class ID is: Class ID = | The RECOMMENDED method to create a class ID is: Class ID = | |||
| UUID5(Vendor ID, Class-Specific-Information) | UUID5(Vendor ID, Class-Specific-Information) | |||
| Class-specific information is composed of a variety of data, for | Class-specific information is composed of a variety of data, for | |||
| example: | example: | |||
| - Model number | - Model number. | |||
| - Hardware revision | - Hardware revision. | |||
| - Bootloader version (for immutable bootloaders) | - Bootloader version (for immutable bootloaders). | |||
| 7.12.10. SUIT_Condition CDDL | 7.9.10. SUIT_Condition CDDL | |||
| The following CDDL describes SUIT_Condition: | The following CDDL describes SUIT_Condition: | |||
| SUIT_Condition //= (suit-condition-vendor-identifier, nil) | SUIT_Condition //= (suit-condition-vendor-identifier, nil) | |||
| SUIT_Condition //= (suit-condition-class-identifier, nil) | SUIT_Condition //= (suit-condition-class-identifier, nil) | |||
| SUIT_Condition //= (suit-condition-device-identifier, nil) | SUIT_Condition //= (suit-condition-device-identifier, nil) | |||
| SUIT_Condition //= (suit-condition-image-match, nil) | SUIT_Condition //= (suit-condition-image-match, nil) | |||
| SUIT_Condition //= (suit-condition-image-not-match, nil) | SUIT_Condition //= (suit-condition-image-not-match, nil) | |||
| SUIT_Condition //= (suit-condition-use-before, uint) | SUIT_Condition //= (suit-condition-use-before, uint) | |||
| SUIT_Condition //= (suit-condition-minimum-battery, uint) | SUIT_Condition //= (suit-condition-minimum-battery, uint) | |||
| SUIT_Condition //= (suit-condition-update-authorised, int) | SUIT_Condition //= (suit-condition-update-authorized, int) | |||
| SUIT_Condition //= (suit-condition-version, SUIT_Condition_Version_Argument) | SUIT_Condition //= (suit-condition-version, | |||
| SUIT_Condition //= (suit-condition-component-offset, uint) | SUIT_Condition_Version_Argument) | |||
| SUIT_Condition //= (suit-condition-custom, bstr) | SUIT_Condition //= (suit-condition-component-offset, uint) | |||
| SUIT_Condition //= (suit-condition-custom, bstr) | ||||
| SUIT_Condition_Version_Argument = [ | SUIT_Condition_Version_Argument = [ | |||
| suit-condition-version-comparison: SUIT_Condition_Version_Comparison_Types, | suit-condition-version-comparison-type: | |||
| suit-condition-version-comparison: SUIT_Condition_Version_Comparison_Value | SUIT_Condition_Version_Comparison_Types, | |||
| ] | suit-condition-version-comparison-value: | |||
| SUIT_Condition_Version_Comparison_Types /= suit-condition-version-comparison-greater | SUIT_Condition_Version_Comparison_Value | |||
| SUIT_Condition_Version_Comparison_Types /= suit-condition-version-comparison-greater-equal | ] | |||
| SUIT_Condition_Version_Comparison_Types /= suit-condition-version-comparison-equal | ||||
| SUIT_Condition_Version_Comparison_Types /= suit-condition-version-comparison-lesser-equal | ||||
| SUIT_Condition_Version_Comparison_Types /= suit-condition-version-comparison-lesser | ||||
| SUIT_Condition_Version_Comparison_Value = [+int] | SUIT_Condition_Version_Comparison_Types /= | |||
| suit-condition-version-comparison-greater | ||||
| SUIT_Condition_Version_Comparison_Types /= | ||||
| suit-condition-version-comparison-greater-equal | ||||
| SUIT_Condition_Version_Comparison_Types /= | ||||
| suit-condition-version-comparison-equal | ||||
| SUIT_Condition_Version_Comparison_Types /= | ||||
| suit-condition-version-comparison-lesser-equal | ||||
| SUIT_Condition_Version_Comparison_Types /= | ||||
| suit-condition-version-comparison-lesser | ||||
| 7.13. SUIT_Directive | SUIT_Condition_Version_Comparison_Value = [+int] | |||
| Directives are used to define the behaviour of the recipient. | 7.10. SUIT_Directive | |||
| Directives are used to define the behavior of the recipient. | ||||
| Directives include: | Directives include: | |||
| +----------------+----------------------+ | +----------------+----------------------+ | |||
| | Directive Code | Directive Name | | | Directive Code | Directive Name | | |||
| +----------------+----------------------+ | +----------------+----------------------+ | |||
| | 12 | Set Component Index | | | 12 | Set Component Index | | |||
| | | | | | | | | |||
| | 13 | Set Dependency Index | | | 13 | Set Dependency Index | | |||
| | | | | | | | | |||
| | 14 | Abort | | | 14 | Abort | | |||
| skipping to change at page 41, line 45 ¶ | skipping to change at page 43, line 45 ¶ | |||
| | | | | | | | | |||
| | 31 | Run with Arguments | | | 31 | Run with Arguments | | |||
| | | | | | | | | |||
| | 32 | Swap | | | 32 | Swap | | |||
| +----------------+----------------------+ | +----------------+----------------------+ | |||
| When a Recipient executes a Directive, it MUST report a success code. | When a Recipient executes a Directive, it MUST report a success code. | |||
| If the Directive reports failure, then the current Command Sequence | If the Directive reports failure, then the current Command Sequence | |||
| MUST terminate. | MUST terminate. | |||
| 7.13.1. suit-directive-set-component-index | 7.10.1. suit-directive-set-component-index | |||
| Set Component Index defines the component to which successive | Set Component Index defines the component to which successive | |||
| directives and conditions will apply. The supplied argument MUST be | directives and conditions will apply. The supplied argument MUST be | |||
| either a boolean or an unsigned integer index into the concatenation | either a boolean or an unsigned integer index into the concatenation | |||
| of suit-components and suit-dependency-components. If the following | of suit-components and suit-dependency-components. If the following | |||
| directives apply to ALL components, then the boolean value "True" is | directives apply to ALL components, then the boolean value "True" is | |||
| used instead of an index. True does not apply to dependency | used instead of an index. True does not apply to dependency | |||
| components. If the following directives apply to NO components, then | components. If the following directives apply to NO components, then | |||
| the boolean value "False" is used. When suit-directive-set- | the boolean value "False" is used. When suit-directive-set- | |||
| dependency-index is used, suit-directive-set-component-index = False | dependency-index is used, suit-directive-set-component-index = False | |||
| is implied. When suit-directive-set-component-index is used, suit- | is implied. When suit-directive-set-component-index is used, suit- | |||
| directive-set-dependency-index = False is implied. | directive-set-dependency-index = False is implied. | |||
| The following CDDL describes the argument to suit-directive-set- | The following CDDL describes the argument to suit-directive-set- | |||
| component-index. | component-index. | |||
| SUIT_Directive_Set_Component_Index_Argument = uint/bool | SUIT_Directive_Set_Component_Index_Argument = uint/bool | |||
| 7.13.2. suit-directive-set-dependency-index | 7.10.2. suit-directive-set-dependency-index | |||
| Set Dependency Index defines the manifest to which successive | Set Dependency Index defines the manifest to which successive | |||
| directives and conditions will apply. The supplied argument MUST be | directives and conditions will apply. The supplied argument MUST be | |||
| either a boolean or an unsigned integer index into the dependencies. | either a boolean or an unsigned integer index into the dependencies. | |||
| If the following directives apply to ALL dependencies, then the | If the following directives apply to ALL dependencies, then the | |||
| boolean value "True" is used instead of an index. If the following | boolean value "True" is used instead of an index. If the following | |||
| directives apply to NO dependencies, then the boolean value "False" | directives apply to NO dependencies, then the boolean value "False" | |||
| is used. When suit-directive-set-component-index is used, suit- | is used. When suit-directive-set-component-index is used, suit- | |||
| directive-set-dependency-index = False is implied. When suit- | directive-set-dependency-index = False is implied. When suit- | |||
| directive-set-dependency-index is used, suit-directive-set-component- | directive-set-dependency-index is used, suit-directive-set-component- | |||
| skipping to change at page 42, line 37 ¶ | skipping to change at page 44, line 37 ¶ | |||
| Typical operations that require suit-directive-set-dependency-index | Typical operations that require suit-directive-set-dependency-index | |||
| include setting a source URI, invoking "Fetch," or invoking "Process | include setting a source URI, invoking "Fetch," or invoking "Process | |||
| Dependency" for an individual dependency. | Dependency" for an individual dependency. | |||
| The following CDDL describes the argument to suit-directive-set- | The following CDDL describes the argument to suit-directive-set- | |||
| dependency-index. | dependency-index. | |||
| SUIT_Directive_Set_Manifest_Index_Argument = uint/bool | SUIT_Directive_Set_Manifest_Index_Argument = uint/bool | |||
| 7.13.3. suit-directive-abort | 7.10.3. suit-directive-abort | |||
| Unconditionally fail. This operation is typically used in | Unconditionally fail. This operation is typically used in | |||
| conjunction with suit-directive-try-each. | conjunction with suit-directive-try-each. | |||
| 7.13.4. suit-directive-run-sequence | 7.10.4. suit-directive-run-sequence | |||
| To enable conditional commands, and to allow several strictly ordered | To enable conditional commands, and to allow several strictly ordered | |||
| sequences to be executed out-of-order, suit-directive-run-sequence | sequences to be executed out-of-order, suit-directive-run-sequence | |||
| allows the manifest processor to execute its argument as a | allows the manifest processor to execute its argument as a | |||
| SUIT_Command_Sequence. The argument must be wrapped in a bstr. | SUIT_Command_Sequence. The argument must be wrapped in a bstr. | |||
| When a sequence is executed, any failure of a condition causes | When a sequence is executed, any failure of a condition causes | |||
| immediate termination of the sequence. | immediate termination of the sequence. | |||
| The following CDDL describes the SUIT_Run_Sequence argument. | The following CDDL describes the SUIT_Run_Sequence argument. | |||
| skipping to change at page 43, line 18 ¶ | skipping to change at page 45, line 18 ¶ | |||
| 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. | |||
| SUIT_Parameter_Soft_Failure defaults to False when suit-directive- | SUIT_Parameter_Soft_Failure defaults to False when suit-directive- | |||
| run-sequence begins. Its value is discarded when suit-directive-run- | run-sequence begins. Its value is discarded when suit-directive-run- | |||
| sequence terminates. | sequence terminates. | |||
| 7.13.5. suit-directive-try-each | 7.10.5. suit-directive-try-each | |||
| This command runs several SUIT_Command_Sequence, one after another, | This command runs several SUIT_Command_Sequence, one after another, | |||
| in a strict order. Use this command to implement a "try/catch-try/ | in a strict order. Use this command to implement a "try/catch-try/ | |||
| catch" sequence. Manifest processors MAY implement this command. | catch" sequence. Manifest processors MAY implement this command. | |||
| SUIT_Parameter_Soft_Failure is initialised to True at the beginning | SUIT_Parameter_Soft_Failure is initialized to True at the beginning | |||
| of each sequence. If one sequence aborts due to a condition failure, | of each sequence. If one sequence aborts due to a condition failure, | |||
| the next is started. If no sequence completes without condition | the next is started. If no sequence completes without condition | |||
| failure, then suit-directive-try-each returns an error. If a | failure, then suit-directive-try-each returns an error. If a | |||
| particular application calls for all sequences to fail and still | particular application calls for all sequences to fail and still | |||
| continue, then an empty sequence (nil) can be added to the Try Each | continue, then an empty sequence (nil) can be added to the Try Each | |||
| Argument. | Argument. | |||
| The following CDDL describes the SUIT_Try_Each argument. | The following CDDL describes the SUIT_Try_Each argument. | |||
| SUIT_Directive_Try_Each_Argument = [ | SUIT_Directive_Try_Each_Argument = [ | |||
| + bstr .cbor SUIT_Command_Sequence, | + bstr .cbor SUIT_Command_Sequence, | |||
| nil / bstr .cbor SUIT_Command_Sequence | nil / bstr .cbor SUIT_Command_Sequence | |||
| ] | ] | |||
| 7.13.6. suit-directive-process-dependency | 7.10.6. suit-directive-process-dependency | |||
| Execute the commands in the common section of the current dependency, | Execute the commands in the common section of the current dependency, | |||
| followed by the commands in the equivalent section of the current | followed by the commands in the equivalent section of the current | |||
| dependency. For example, if the current section is "fetch payload," | dependency. For example, if the current section is "fetch payload," | |||
| this will execute "common" in the current dependency, then "fetch | this will execute "common" in the current dependency, then "fetch | |||
| payload" in the current dependency. Once this is complete, the | payload" in the current dependency. Once this is complete, the | |||
| command following suit-directive-process-dependency will be | command following suit-directive-process-dependency will be | |||
| processed. | processed. | |||
| If the current dependency is False, this directive has no effect. If | If the current dependency is False, this directive has no effect. If | |||
| skipping to change at page 44, line 13 ¶ | skipping to change at page 46, line 13 ¶ | |||
| MUST have no effect. | MUST have no effect. | |||
| When SUIT_Process_Dependency completes, it forwards the last status | When SUIT_Process_Dependency completes, it forwards the last status | |||
| code that occurred in the dependency. | code that occurred in the dependency. | |||
| The argument to suit-directive-process-dependency is defined in the | The argument to suit-directive-process-dependency is defined in the | |||
| following CDDL. | following CDDL. | |||
| SUIT_Directive_Process_Dependency_Argument = nil | SUIT_Directive_Process_Dependency_Argument = nil | |||
| 7.13.7. suit-directive-set-parameters | 7.10.7. suit-directive-set-parameters | |||
| suit-directive-set-parameters allows the manifest to configure | suit-directive-set-parameters allows the manifest to configure | |||
| behaviour of future directives by changing parameters that are read | behavior of future directives by changing parameters that are read by | |||
| 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 behaviour of its | parameters also allows a manifest to modify the behavior of its | |||
| dependencies. | dependencies. | |||
| Available parameters are defined in Section 7.6. | Available parameters are defined in Section 7.6. | |||
| If a parameter is already set, suit-directive-set-parameters will | If a parameter is already set, suit-directive-set-parameters will | |||
| skip setting the parameter to its argument. This provides the core | skip setting the parameter to its argument. This provides the core | |||
| of the override mechanism, allowing dependent manifests to change the | of the override mechanism, allowing dependent manifests to change the | |||
| behaviour of a manifest. | behavior of a manifest. | |||
| The argument to suit-directive-set-parameters is defined in the | The argument to suit-directive-set-parameters is defined in the | |||
| following CDDL. | following CDDL. | |||
| SUIT_Directive_Set_Parameters_Argument = {+ SUIT_Parameters} | SUIT_Directive_Set_Parameters_Argument = {+ SUIT_Parameters} | |||
| N.B.: A directive code is reserved for an optimisation: a way to set | N.B.: A directive code is reserved for an optimization: a way to set | |||
| a parameter to the contents of another parameter, optionally with | a parameter to the contents of another parameter, optionally with | |||
| another component ID. | another component ID. | |||
| 7.13.8. suit-directive-override-parameters | 7.10.8. suit-directive-override-parameters | |||
| suit-directive-override-parameters replaces any listed parameters | suit-directive-override-parameters replaces any listed parameters | |||
| that are already set with the values that are provided in its | that are already set with the values that are provided in its | |||
| argument. This allows a manifest to prevent replacement of critical | argument. This allows a manifest to prevent replacement of critical | |||
| parameters. | parameters. | |||
| Available parameters are defined in Section 7.6. | Available parameters are defined in Section 7.6. | |||
| The argument to suit-directive-override-parameters is defined in the | The argument to suit-directive-override-parameters is defined in the | |||
| following CDDL. | following CDDL. | |||
| SUIT_Directive_Override_Parameters_Argument = {+ SUIT_Parameters} | SUIT_Directive_Override_Parameters_Argument = {+ SUIT_Parameters} | |||
| 7.13.9. suit-directive-fetch | 7.10.9. suit-directive-fetch | |||
| suit-directive-fetch instructs the manifest processor to obtain one | suit-directive-fetch instructs the manifest processor to obtain one | |||
| or more manifests or payloads, as specified by the manifest index and | or more manifests or payloads, as specified by the manifest index and | |||
| component index, respectively. | component index, respectively. | |||
| suit-directive-fetch can target one or more manifests and one or more | suit-directive-fetch can target one or more manifests and one or more | |||
| payloads. suit-directive-fetch retrieves each component and each | payloads. suit-directive-fetch retrieves each component and each | |||
| manifest listed in component-index and manifest-index, respectively. | manifest listed in component-index and manifest-index, respectively. | |||
| If component-index or manifest-index is True, instead of an integer, | If component-index or manifest-index is True, instead of an integer, | |||
| then all current manifest components/manifests are fetched. The | then all current manifest components/manifests are fetched. The | |||
| current manifest's dependent-components are not automatically | current manifest's dependent-components are not automatically | |||
| fetched. In order to pre-fetch these, they MUST be specified in a | fetched. In order to pre-fetch these, they MUST be specified in a | |||
| component-index integer. | component-index integer. | |||
| suit-directive-fetch typically takes no arguments unless one is | suit-directive-fetch typically takes no arguments unless one is | |||
| needed to modify fetch behaviour. If an argument is needed, it must | needed to modify fetch behavior. If an argument is needed, it must | |||
| be wrapped in a bstr. | be wrapped in a bstr. | |||
| suit-directive-fetch reads the URI or URI List parameter to find the | suit-directive-fetch reads the URI or URI List parameter to find the | |||
| source of the fetch it performs. | source of the fetch it performs. | |||
| The behaviour 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. | |||
| The argument to suit-directive-fetch is defined in the following | The argument to suit-directive-fetch is defined in the following | |||
| CDDL. | CDDL. | |||
| SUIT_Directive_Fetch_Argument = nil/bstr | SUIT_Directive_Fetch_Argument = nil/bstr | |||
| 7.13.10. suit-directive-copy | 7.10.10. suit-directive-copy | |||
| suit-directive-copy instructs the manifest processor to obtain one or | suit-directive-copy instructs the manifest processor to obtain one or | |||
| more payloads, as specified by the component index. suit-directive- | more payloads, as specified by the component index. suit-directive- | |||
| copy retrieves each component listed in component-index, | copy retrieves each component listed in component-index, | |||
| respectively. If component-index is True, instead of an integer, | respectively. If component-index is True, instead of an integer, | |||
| then all current manifest components are copied. The current | then all current manifest components are copied. The current | |||
| manifest's dependent-components are not automatically copied. In | manifest's dependent-components are not automatically copied. In | |||
| order to copy these, they MUST be specified in a component-index | order to copy these, they MUST be specified in a component-index | |||
| integer. | integer. | |||
| The behaviour of suit-directive-copy can be modified by setting one | The behavior of suit-directive-copy can be modified by setting one or | |||
| 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. | |||
| *N.B.* Fetch and Copy are very similar. Merging them into one | *N.B.* Fetch and Copy are very similar. Merging them into one | |||
| command may be appropriate. | command may be appropriate. | |||
| suit-directive-copy reads its source from | suit-directive-copy reads its source from | |||
| SUIT_Parameter_Source_Component. | SUIT_Parameter_Source_Component. | |||
| The argument to suit-directive-copy is defined in the following CDDL. | The argument to suit-directive-copy is defined in the following CDDL. | |||
| SUIT_Directive_Copy_Argument = nil | SUIT_Directive_Copy_Argument = nil | |||
| 7.13.11. suit-directive-swap | 7.10.11. suit-directive-swap | |||
| suit-directive-swap instructs the manifest processor to move the | suit-directive-swap instructs the manifest processor to move the | |||
| source to the destination and the destination to the source | source to the destination and the destination to the source | |||
| simultaneously. Swap has nearly identical semantics to suit- | simultaneously. Swap has nearly identical semantics to suit- | |||
| directive-copy except that suit-directive-swap replaces the source | directive-copy except that suit-directive-swap replaces the source | |||
| with the current contents of the destination in an application- | with the current contents of the destination in an application- | |||
| defined way. If SUIT_Parameter_Compression_Info or | defined way. If SUIT_Parameter_Compression_Info or | |||
| SUIT_Parameter_Encryption_Info are present, they must be handled in a | SUIT_Parameter_Encryption_Info are present, they must be handled in a | |||
| symmetric way, so that the source is decompressed into the | symmetric way, so that the source is decompressed into the | |||
| destination and the destination is compressed into the source. The | destination and the destination is compressed into the source. The | |||
| source is decrypted into the destination and the destination is | source is decrypted into the destination and the destination is | |||
| encrypted into the source. suit-directive-swap is OPTIONAL to | encrypted into the source. suit-directive-swap is OPTIONAL to | |||
| implement. | implement. | |||
| 7.13.12. suit-directive-run | 7.10.12. suit-directive-run | |||
| suit-directive-run directs the manifest processor to transfer | suit-directive-run directs the manifest processor to transfer | |||
| execution to the current Component Index. When this is invoked, the | execution to the current Component Index. When this is invoked, the | |||
| manifest processor MAY be unloaded and execution continues in the | manifest processor MAY be unloaded and execution continues in the | |||
| Component Index. Arguments provided to Run are forwarded to the | Component Index. Arguments provided to Run are forwarded to the | |||
| executable code located in Component Index, in an application- | executable code located in Component Index, in an application- | |||
| specific way. For example, this could form the Linux Kernel Command | specific way. For example, this could form the Linux Kernel Command | |||
| Line if booting a linux device. | Line if booting a Linux device. | |||
| If the executable code at Component Index is constructed in such a | If the executable code at Component Index is constructed in such a | |||
| way that it does not unload the manifest processor, then the manifest | way that it does not unload the manifest processor, then the manifest | |||
| processor may resume execution after the executable completes. This | processor may resume execution after the executable completes. This | |||
| allows the manifest processor to invoke suitable helpers and to | allows the manifest processor to invoke suitable helpers and to | |||
| verify them with image conditions. | verify them with image conditions. | |||
| The argument to suit-directive-run is defined in the following CDDL. | The argument to suit-directive-run is defined in the following CDDL. | |||
| SUIT_Directive_Run_Argument = nil/bstr | SUIT_Directive_Run_Argument = nil/bstr | |||
| 7.13.13. suit-directive-wait | 7.10.13. suit-directive-wait | |||
| suit-directive-wait directs the manifest processor to pause until a | suit-directive-wait directs the manifest processor to pause until a | |||
| specified event occurs. Some possible events include: | specified event occurs. Some possible events include: | |||
| 1. Authorisation | 1. 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 | |||
| The following CDDL defines the encoding of these events. | The following CDDL defines the encoding of these events. | |||
| SUIT_Wait_Events //= (suit-wait-event-authorisation => 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_Authorisation = int ; priority | SUIT_Wait_Event_Argument_Authorization = int ; priority | |||
| SUIT_Wait_Event_Argument_Power = int ; Power Level | SUIT_Wait_Event_Argument_Power = int ; Power Level | |||
| SUIT_Wait_Event_Argument_Network = int ; Network State | SUIT_Wait_Event_Argument_Network = int ; Network State | |||
| SUIT_Wait_Event_Argument_Other_Device_Version = [ | SUIT_Wait_Event_Argument_Other_Device_Version = [ | |||
| other-device: bstr, | other-device: bstr, | |||
| other-device-version: [+int] | other-device-version: [+int] | |||
| ] | ] | |||
| SUIT_Wait_Event_Argument_Time = uint ; Timestamp | SUIT_Wait_Event_Argument_Time = uint ; Timestamp | |||
| SUIT_Wait_Event_Argument_Time_Of_Day = uint ; Time of Day (seconds since 00:00:00) | SUIT_Wait_Event_Argument_Time_Of_Day = uint ; Time of Day | |||
| SUIT_Wait_Event_Argument_Day_Of_Week = uint ; Days since Sunday | ; (seconds since 00:00:00) | |||
| 7.13.14. SUIT_Directive CDDL | SUIT_Wait_Event_Argument_Day_Of_Week = uint ; Days since Sunday | |||
| 7.10.14. SUIT_Directive CDDL | ||||
| The following CDDL describes SUIT_Directive: | The following CDDL describes SUIT_Directive: | |||
| SUIT_Directive //= (suit-directive-set-component-index, uint/bool) | SUIT_Directive //= (suit-directive-set-component-index, uint/bool) | |||
| SUIT_Directive //= (suit-directive-set-dependency-index, uint/bool) | SUIT_Directive //= (suit-directive-set-dependency-index, uint/bool) | |||
| SUIT_Directive //= (suit-directive-run-sequence, | SUIT_Directive //= (suit-directive-run-sequence, | |||
| bstr .cbor SUIT_Command_Sequence) | bstr .cbor SUIT_Command_Sequence) | |||
| SUIT_Directive //= (suit-directive-try-each, | SUIT_Directive //= (suit-directive-try-each, | |||
| SUIT_Directive_Try_Each_Argument) | SUIT_Directive_Try_Each_Argument) | |||
| SUIT_Directive //= (suit-directive-process-dependency, nil) | SUIT_Directive //= (suit-directive-process-dependency, nil) | |||
| 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, nil) | SUIT_Directive //= (suit-directive-fetch, nil) | |||
| SUIT_Directive //= (suit-directive-copy, nil) | SUIT_Directive //= (suit-directive-copy, nil) | |||
| SUIT_Directive //= (suit-directive-run, nil) | SUIT_Directive //= (suit-directive-run, nil) | |||
| SUIT_Directive //= (suit-directive-wait, | SUIT_Directive //= (suit-directive-wait, | |||
| { + SUIT_Wait_Events }) | { + SUIT_Wait_Events }) | |||
| SUIT_Directive //= (suit-directive-run-with-arguments, bstr) | SUIT_Directive //= (suit-directive-run-with-arguments, bstr) | |||
| 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_Wait_Events //= (suit-wait-event-authorisation => 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_Authorisation = int ; priority | SUIT_Wait_Event_Argument_Authorization = int ; priority | |||
| SUIT_Wait_Event_Argument_Power = int ; Power Level | SUIT_Wait_Event_Argument_Power = int ; Power Level | |||
| SUIT_Wait_Event_Argument_Network = int ; Network State | SUIT_Wait_Event_Argument_Network = int ; Network State | |||
| SUIT_Wait_Event_Argument_Other_Device_Version = [ | SUIT_Wait_Event_Argument_Other_Device_Version = [ | |||
| other-device: bstr, | other-device: bstr, | |||
| other-device-version: [+int] | other-device-version: [+int] | |||
| ] | ] | |||
| SUIT_Wait_Event_Argument_Time = uint ; Timestamp | SUIT_Wait_Event_Argument_Time = uint ; Timestamp | |||
| SUIT_Wait_Event_Argument_Time_Of_Day = uint ; Time of Day (seconds since 00:00:00) | SUIT_Wait_Event_Argument_Time_Of_Day = uint ; Time of Day | |||
| SUIT_Wait_Event_Argument_Day_Of_Week = uint ; Days since Sunday | ; (seconds since 00:00:00) | |||
| 7.14. SUIT_Text_Map | SUIT_Wait_Event_Argument_Day_Of_Week = uint ; Days since Sunday | |||
| 7.11. SUIT_Text_Map | ||||
| The SUIT_Text_Map contains all text descriptions needed for this | The SUIT_Text_Map contains all text descriptions needed for this | |||
| manifest. The text section is typically severable, allowing | manifest. 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 | |||
| require text. The meaning of each field is described below. | require text. The meaning of each field is described below. | |||
| Each section MAY be present. If present, each section MUST be as | Each section MAY be present. If present, each section MUST be as | |||
| described. Negative integer IDs are reserved for application- | described. Negative integer IDs are reserved for application- | |||
| specific text values. | specific text values. | |||
| skipping to change at page 50, line 28 ¶ | skipping to change at page 52, line 29 ¶ | |||
| | 1 | manifest-description | Free text description of the | | | 1 | manifest-description | Free text description of the | | |||
| | | | manifest | | | | | manifest | | |||
| | | | | | | | | | | |||
| | 2 | update-description | Free text description of the update | | | 2 | update-description | Free text description of the update | | |||
| | | | | | | | | | | |||
| | 3 | vendor-name | Free text vendor name | | | 3 | vendor-name | Free text vendor name | | |||
| | | | | | | | | | | |||
| | 4 | model-name | Free text model name | | | 4 | model-name | Free text model name | | |||
| | | | | | | | | | | |||
| | 5 | vendor-domain | The domain used to create the | | | 5 | vendor-domain | The domain used to create the | | |||
| | | | vendor-id (Section 7.12.9.1) | | | | | vendor-id (Section 7.9.9.1) | | |||
| | | | | | | | | | | |||
| | 6 | model-info | The information used to create the | | | 6 | model-info | The information used to create the | | |||
| | | | class-id (Section 7.12.9.1) | | | | | class-id (Section 7.9.9.1) | | |||
| | | | | | | | | | | |||
| | 7 | component-description | Free text description of each | | | 7 | component-description | Free text description of each | | |||
| | | | component in the manifest | | | | | component in the manifest | | |||
| | | | | | | | | | | |||
| | 8 | json-source | The JSON-formated document that was | | | 8 | json-source | The JSON-formatted document that was | | |||
| | | | used to create the manifest | | | | | used to create the manifest | | |||
| | | | | | | | | | | |||
| | 9 | yaml-source | The yaml-formated document that was | | | 9 | yaml-source | The yaml-formatted document that was | | |||
| | | | used to create the manifest | | | | | used to create the manifest | | |||
| | | | | | | | | | | |||
| | 10 | version-dependencies | List of component versions required | | | 10 | version-dependencies | List of component versions required | | |||
| | | | by the manifest | | | | | by the manifest | | |||
| +----+-----------------------+--------------------------------------+ | +----+-----------------------+--------------------------------------+ | |||
| 8. Access Control Lists | 8. Access Control Lists | |||
| To manage permissions in the manifest, there are three models that | To manage permissions in the manifest, there are three models that | |||
| can be used. | can be used. | |||
| skipping to change at page 52, line 29 ¶ | skipping to change at page 54, line 29 ¶ | |||
| algorithm-id-sha224 = 1 | algorithm-id-sha224 = 1 | |||
| algorithm-id-sha256 = 2 | algorithm-id-sha256 = 2 | |||
| algorithm-id-sha384 = 3 | algorithm-id-sha384 = 3 | |||
| algorithm-id-sha512 = 4 | algorithm-id-sha512 = 4 | |||
| algorithm-id-sha3-224 = 5 | algorithm-id-sha3-224 = 5 | |||
| algorithm-id-sha3-256 = 6 | algorithm-id-sha3-256 = 6 | |||
| algorithm-id-sha3-384 = 7 | algorithm-id-sha3-384 = 7 | |||
| algorithm-id-sha3-512 = 8 | algorithm-id-sha3-512 = 8 | |||
| 10. Creating conditional sequences | 10. Creating Conditional Sequences | |||
| For some use cases, it is important to provide a sequence that can | For some use cases, it is important to provide a sequence that can | |||
| fail without terminating an update. For example, a dual-image XIP | fail without terminating an update. For example, a dual-image XIP | |||
| MCU may require an update that can be placed at one of two offsets. | MCU may require an update that can be placed at one of two offsets. | |||
| This has two implications, first, the digest of each offset will be | This has two implications, first, the digest of each offset will be | |||
| different. Second, the image fetched for each offset will have a | different. Second, the image fetched for each offset will have a | |||
| different URI. Conditional sequences allow this to be resolved in a | different URI. Conditional sequences allow this to be resolved in a | |||
| simple way. | simple way. | |||
| The following JSON representation of a manifest demonstrates how this | The following JSON representation of a manifest demonstrates how this | |||
| skipping to change at page 54, line 17 ¶ | skipping to change at page 56, line 17 ¶ | |||
| ] | ] | |||
| } | } | |||
| 11. Full CDDL | 11. Full CDDL | |||
| In order to create a valid SUIT Manifest document the structure of | In order to create a valid SUIT Manifest document the structure of | |||
| the corresponding CBOR message MUST adhere to the following CDDL data | the corresponding CBOR message MUST adhere to the following CDDL data | |||
| definition. | definition. | |||
| SUIT_Outer_Wrapper = { | SUIT_Outer_Wrapper = { | |||
| suit-authentication-wrapper => bstr .cbor SUIT_Authentication_Wrapper / nil, | suit-delegation => bstr .cbor SUIT_Delegation | |||
| suit-authentication-wrapper | ||||
| => bstr .cbor SUIT_Authentication_Wrapper / nil, | ||||
| $$SUIT_Manifest_Wrapped, | $$SUIT_Manifest_Wrapped, | |||
| suit-dependency-resolution => bstr .cbor SUIT_Command_Sequence, | suit-dependency-resolution => bstr .cbor SUIT_Command_Sequence, | |||
| suit-payload-fetch => bstr .cbor SUIT_Command_Sequence, | suit-payload-fetch => bstr .cbor SUIT_Command_Sequence, | |||
| suit-install => bstr .cbor SUIT_Command_Sequence, | suit-install => bstr .cbor SUIT_Command_Sequence, | |||
| suit-text => bstr .cbor SUIT_Text_Map, | suit-text => bstr .cbor SUIT_Text_Map, | |||
| suit-coswid => bstr .cbor concise-software-identity | suit-coswid => bstr .cbor concise-software-identity | |||
| } | } | |||
| SUIT_Authentication_Wrapper = [ + ( | SUIT_Authentication_Wrapper = [ + ( | |||
| COSE_Mac_Tagged / | COSE_Mac_Tagged / | |||
| COSE_Sign_Tagged / | COSE_Sign_Tagged / | |||
| COSE_Mac0_Tagged / | COSE_Mac0_Tagged / | |||
| COSE_Sign1_Tagged) | COSE_Sign1_Tagged) | |||
| ] | ] | |||
| SUIT_Encryption_Wrapper = COSE_Encrypt_Tagged / COSE_Encrypt0_Tagged | SUIT_Encryption_Wrapper = COSE_Encrypt_Tagged / COSE_Encrypt0_Tagged | |||
| skipping to change at page 55, line 27 ¶ | skipping to change at page 57, line 30 ¶ | |||
| algorithm-id-sha512 = 4 | algorithm-id-sha512 = 4 | |||
| algorithm-id-sha3-224 = 5 | algorithm-id-sha3-224 = 5 | |||
| algorithm-id-sha3-256 = 6 | algorithm-id-sha3-256 = 6 | |||
| algorithm-id-sha3-384 = 7 | algorithm-id-sha3-384 = 7 | |||
| algorithm-id-sha3-512 = 8 | algorithm-id-sha3-512 = 8 | |||
| SUIT_Manifest = { | SUIT_Manifest = { | |||
| suit-manifest-version => 1, | suit-manifest-version => 1, | |||
| suit-manifest-sequence-number => uint, | suit-manifest-sequence-number => uint, | |||
| ? suit-common => bstr .cbor SUIT_Common, | ? suit-common => bstr .cbor SUIT_Common, | |||
| ? suit-dependency-resolution => SUIT_Digest / bstr .cbor SUIT_Command_Sequence, | ? suit-dependency-resolution | |||
| ? suit-payload-fetch => SUIT_Digest / bstr .cbor SUIT_Command_Sequence, | => SUIT_Digest / bstr .cbor SUIT_Command_Sequence, | |||
| ? suit-install => SUIT_Digest / bstr .cbor SUIT_Command_Sequence, | ? suit-payload-fetch | |||
| => SUIT_Digest / bstr .cbor SUIT_Command_Sequence, | ||||
| ? suit-install | ||||
| => SUIT_Digest / bstr .cbor SUIT_Command_Sequence, | ||||
| ? suit-validate => bstr .cbor SUIT_Command_Sequence, | ? suit-validate => bstr .cbor SUIT_Command_Sequence, | |||
| ? suit-load => bstr .cbor SUIT_Command_Sequence, | ? suit-load => bstr .cbor SUIT_Command_Sequence, | |||
| ? suit-run => bstr .cbor SUIT_Command_Sequence, | ? suit-run => bstr .cbor SUIT_Command_Sequence, | |||
| ? suit-text => SUIT_Digest, | ? suit-text => SUIT_Digest, | |||
| ? suit-coswid => SUIT_Digest / bstr .cbor concise-software-identity, | ? suit-coswid | |||
| => SUIT_Digest / bstr .cbor concise-software-identity, | ||||
| } | } | |||
| SUIT_Common = { | SUIT_Common = { | |||
| ? suit-dependencies => bstr .cbor SUIT_Dependencies, | ? suit-dependencies => bstr .cbor SUIT_Dependencies, | |||
| ? suit-components => bstr .cbor SUIT_Components, | ? suit-components => bstr .cbor SUIT_Components, | |||
| ? suit-dependency-components => bstr .cbor SUIT_Component_References, | ? suit-dependency-components | |||
| => bstr .cbor SUIT_Component_References, | ||||
| ? suit-common-sequence => bstr .cbor SUIT_Command_Sequence, | ? suit-common-sequence => bstr .cbor SUIT_Command_Sequence, | |||
| } | } | |||
| SUIT_Dependencies = [ + SUIT_Dependency ] | SUIT_Dependencies = [ + SUIT_Dependency ] | |||
| SUIT_Components = [ + SUIT_Component_Identifier ] | SUIT_Components = [ + SUIT_Component_Identifier ] | |||
| SUIT_Component_References = [ + SUIT_Component_Reference ] | SUIT_Component_References = [ + SUIT_Component_Reference ] | |||
| 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_Component_Identifier = [* bstr] | SUIT_Component_Identifier = [* bstr] | |||
| SUIT_Component_Reference = { | SUIT_Component_Reference = { | |||
| suit-component-identifier => SUIT_Component_Identifier, | suit-component-identifier => SUIT_Component_Identifier, | |||
| suit-component-dependency-index => uint | suit-component-dependency-index => uint | |||
| } | } | |||
| SUIT_Command_Sequence = [ + (SUIT_Condition // SUIT_Directive // SUIT_Command_Custom) ] | SUIT_Command_Sequence = [ + ( | |||
| SUIT_Condition // SUIT_Directive // SUIT_Command_Custom | ||||
| ) ] | ||||
| SUIT_Command_Custom = (nint, bstr) | SUIT_Command_Custom = (nint, bstr) | |||
| SUIT_Condition //= (suit-condition-vendor-identifier, nil) | SUIT_Condition //= (suit-condition-vendor-identifier, nil) | |||
| SUIT_Condition //= (suit-condition-class-identifier, nil) | SUIT_Condition //= (suit-condition-class-identifier, nil) | |||
| SUIT_Condition //= (suit-condition-device-identifier, nil) | SUIT_Condition //= (suit-condition-device-identifier, nil) | |||
| SUIT_Condition //= (suit-condition-image-match, nil) | SUIT_Condition //= (suit-condition-image-match, nil) | |||
| SUIT_Condition //= (suit-condition-image-not-match, nil) | SUIT_Condition //= (suit-condition-image-not-match, nil) | |||
| SUIT_Condition //= (suit-condition-use-before, uint) | SUIT_Condition //= (suit-condition-use-before, uint) | |||
| SUIT_Condition //= (suit-condition-minimum-battery, uint) | SUIT_Condition //= (suit-condition-minimum-battery, uint) | |||
| SUIT_Condition //= (suit-condition-update-authorised, int) | SUIT_Condition //= (suit-condition-update-authorized, int) | |||
| SUIT_Condition //= (suit-condition-version, SUIT_Condition_Version_Argument) | SUIT_Condition //= (suit-condition-version, | |||
| SUIT_Condition_Version_Argument) | ||||
| SUIT_Condition //= (suit-condition-component-offset, uint) | SUIT_Condition //= (suit-condition-component-offset, uint) | |||
| SUIT_Condition //= (suit-condition-custom, bstr) | SUIT_Condition //= (suit-condition-custom, bstr) | |||
| RFC4122_UUID = bstr .size 16 | RFC4122_UUID = bstr .size 16 | |||
| SUIT_Condition_Version_Argument = [ | SUIT_Condition_Version_Argument = [ | |||
| suit-condition-version-comparison-type: SUIT_Condition_Version_Comparison_Types, | suit-condition-version-comparison-type: | |||
| suit-condition-version-comparison-value: SUIT_Condition_Version_Comparison_Value | SUIT_Condition_Version_Comparison_Types, | |||
| suit-condition-version-comparison-value: | ||||
| SUIT_Condition_Version_Comparison_Value | ||||
| ] | ] | |||
| SUIT_Condition_Version_Comparison_Types /= suit-condition-version-comparison-greater | SUIT_Condition_Version_Comparison_Types /= | |||
| SUIT_Condition_Version_Comparison_Types /= suit-condition-version-comparison-greater-equal | suit-condition-version-comparison-greater | |||
| SUIT_Condition_Version_Comparison_Types /= suit-condition-version-comparison-equal | ||||
| SUIT_Condition_Version_Comparison_Types /= suit-condition-version-comparison-lesser-equal | SUIT_Condition_Version_Comparison_Types /= | |||
| SUIT_Condition_Version_Comparison_Types /= suit-condition-version-comparison-lesser | suit-condition-version-comparison-greater-equal | |||
| SUIT_Condition_Version_Comparison_Types /= | ||||
| suit-condition-version-comparison-equal | ||||
| SUIT_Condition_Version_Comparison_Types /= | ||||
| suit-condition-version-comparison-lesser-equal | ||||
| SUIT_Condition_Version_Comparison_Types /= | ||||
| suit-condition-version-comparison-lesser | ||||
| suit-condition-version-comparison-greater = 1 | suit-condition-version-comparison-greater = 1 | |||
| suit-condition-version-comparison-greater-equal = 2 | suit-condition-version-comparison-greater-equal = 2 | |||
| suit-condition-version-comparison-equal = 3 | suit-condition-version-comparison-equal = 3 | |||
| suit-condition-version-comparison-lesser-equal = 4 | suit-condition-version-comparison-lesser-equal = 4 | |||
| suit-condition-version-comparison-lesser = 5 | suit-condition-version-comparison-lesser = 5 | |||
| SUIT_Condition_Version_Comparison_Value = [+int] | SUIT_Condition_Version_Comparison_Value = [+int] | |||
| SUIT_Directive //= (suit-directive-set-component-index, uint/bool) | SUIT_Directive //= (suit-directive-set-component-index, uint/bool) | |||
| SUIT_Directive //= (suit-directive-set-dependency-index, uint/bool) | SUIT_Directive //= (suit-directive-set-dependency-index, uint/bool) | |||
| SUIT_Directive //= (suit-directive-run-sequence, bstr .cbor SUIT_Command_Sequence) | SUIT_Directive //= (suit-directive-run-sequence, | |||
| SUIT_Directive //= (suit-directive-try-each, SUIT_Directive_Try_Each_Argument) | bstr .cbor SUIT_Command_Sequence) | |||
| SUIT_Directive //= (suit-directive-process-dependency, nil) | SUIT_Directive //= (suit-directive-try-each, | |||
| SUIT_Directive //= (suit-directive-set-parameters, {+ SUIT_Parameters}) | SUIT_Directive_Try_Each_Argument) | |||
| SUIT_Directive //= (suit-directive-override-parameters, {+ SUIT_Parameters}) | SUIT_Directive //= (suit-directive-process-dependency, nil) | |||
| SUIT_Directive //= (suit-directive-fetch, nil) | SUIT_Directive //= (suit-directive-set-parameters, | |||
| SUIT_Directive //= (suit-directive-copy, nil) | {+ SUIT_Parameters}) | |||
| SUIT_Directive //= (suit-directive-swap, nil) | SUIT_Directive //= (suit-directive-override-parameters, | |||
| SUIT_Directive //= (suit-directive-run, nil) | {+ SUIT_Parameters}) | |||
| SUIT_Directive //= (suit-directive-wait, { + SUIT_Wait_Events }) | SUIT_Directive //= (suit-directive-fetch, nil) | |||
| SUIT_Directive //= (suit-directive-run-with-arguments, bstr) | SUIT_Directive //= (suit-directive-copy, nil) | |||
| SUIT_Directive //= (suit-directive-swap, nil) | ||||
| SUIT_Directive //= (suit-directive-run, nil) | ||||
| SUIT_Directive //= (suit-directive-wait, | ||||
| { + SUIT_Wait_Events }) | ||||
| SUIT_Directive //= (suit-directive-run-with-arguments, bstr) | ||||
| 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_Wait_Events //= (suit-wait-event-authorisation => 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_Authorisation = int ; priority | SUIT_Wait_Event_Argument_Authorization = int ; priority | |||
| SUIT_Wait_Event_Argument_Power = int ; Power Level | SUIT_Wait_Event_Argument_Power = int ; Power Level | |||
| SUIT_Wait_Event_Argument_Network = int ; Network State | SUIT_Wait_Event_Argument_Network = int ; Network State | |||
| SUIT_Wait_Event_Argument_Other_Device_Version = [ | SUIT_Wait_Event_Argument_Other_Device_Version = [ | |||
| other-device: bstr, | other-device: bstr, | |||
| other-device-version: [+int] | other-device-version: [+int] | |||
| ] | ] | |||
| SUIT_Wait_Event_Argument_Time = uint ; Timestamp | SUIT_Wait_Event_Argument_Time = uint ; Timestamp | |||
| SUIT_Wait_Event_Argument_Time_Of_Day = uint ; Time of Day (seconds since 00:00:00) | SUIT_Wait_Event_Argument_Time_Of_Day = uint ; Time of Day | |||
| ; (seconds since 00:00:00) | ||||
| SUIT_Wait_Event_Argument_Day_Of_Week = uint ; Days since Sunday | SUIT_Wait_Event_Argument_Day_Of_Week = uint ; Days since Sunday | |||
| SUIT_Parameters //= (suit-parameter-strict-order => bool) | SUIT_Parameters //= (suit-parameter-strict-order => bool) | |||
| SUIT_Parameters //= (suit-parameter-soft-failure => bool) | SUIT_Parameters //= (suit-parameter-soft-failure => bool) | |||
| SUIT_Parameters //= (suit-parameter-vendor-id => bstr) | SUIT_Parameters //= (suit-parameter-vendor-id => bstr) | |||
| SUIT_Parameters //= (suit-parameter-class-id => bstr) | SUIT_Parameters //= (suit-parameter-class-id => bstr) | |||
| SUIT_Parameters //= (suit-parameter-device-id => bstr) | SUIT_Parameters //= (suit-parameter-device-id => bstr) | |||
| SUIT_Parameters //= (suit-parameter-uri => tstr) | SUIT_Parameters //= (suit-parameter-uri => tstr) | |||
| SUIT_Parameters //= (suit-parameter-encryption-info => bstr .cbor SUIT_Encryption_Info) | SUIT_Parameters //= (suit-parameter-encryption-info | |||
| SUIT_Parameters //= (suit-parameter-compression-info => bstr .cbor SUIT_Compression_Info) | => bstr .cbor SUIT_Encryption_Info) | |||
| SUIT_Parameters //= (suit-parameter-unpack-info => bstr .cbor SUIT_Unpack_Info) | SUIT_Parameters //= (suit-parameter-compression-info | |||
| => bstr .cbor SUIT_Compression_Info) | ||||
| SUIT_Parameters //= (suit-parameter-unpack-info | ||||
| => bstr .cbor SUIT_Unpack_Info) | ||||
| SUIT_Parameters //= (suit-parameter-source-component => uint) | SUIT_Parameters //= (suit-parameter-source-component => uint) | |||
| SUIT_Parameters //= (suit-parameter-image-digest => bstr .cbor SUIT_Digest) | SUIT_Parameters //= (suit-parameter-image-digest | |||
| => bstr .cbor SUIT_Digest) | ||||
| SUIT_Parameters //= (suit-parameter-image-size => uint) | SUIT_Parameters //= (suit-parameter-image-size => uint) | |||
| SUIT_Parameters //= (suit-parameter-uri-list => bstr .cbor SUIT_Component_URI_List) | SUIT_Parameters //= (suit-parameter-uri-list | |||
| => bstr .cbor SUIT_Component_URI_List) | ||||
| SUIT_Parameters //= (suit-parameter-custom => int/bool/tstr/bstr) | SUIT_Parameters //= (suit-parameter-custom => int/bool/tstr/bstr) | |||
| SUIT_Component_URI_List = [ + [priority: int, uri: tstr] ] | SUIT_Component_URI_List = [ + [priority: int, uri: tstr] ] | |||
| SUIT_Priority_Parameter_List = [ + [priority: int, parameters: { + SUIT_Parameters }] ] | ||||
| SUIT_Encryption_Info = COSE_Encrypt_Tagged/COSE_Encrypt0_Tagged | SUIT_Encryption_Info = COSE_Encrypt_Tagged/COSE_Encrypt0_Tagged | |||
| SUIT_Compression_Info = { | SUIT_Compression_Info = { | |||
| suit-compression-algorithm => SUIT_Compression_Algorithms, | suit-compression-algorithm => SUIT_Compression_Algorithms, | |||
| ? suit-compression-parameters => bstr | ? suit-compression-parameters => bstr | |||
| } | } | |||
| SUIT_Compression_Algorithms /= SUIT_Compression_Algorithm_gzip | SUIT_Compression_Algorithms /= SUIT_Compression_Algorithm_gzip | |||
| SUIT_Compression_Algorithms /= SUIT_Compression_Algorithm_bzip2 | SUIT_Compression_Algorithms /= SUIT_Compression_Algorithm_bzip2 | |||
| SUIT_Compression_Algorithms /= SUIT_Compression_Algorithm_lz4 | SUIT_Compression_Algorithms /= SUIT_Compression_Algorithm_lz4 | |||
| skipping to change at page 59, line 23 ¶ | skipping to change at page 62, line 4 ¶ | |||
| 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-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-identifier = 1 | |||
| suit-component-dependency-index = 2 | 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-custom = 6 | suit-condition-custom = 6 | |||
| 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-authorised = 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-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 | |||
| suit-directive-wait = 29 | suit-directive-wait = 29 | |||
| suit-directive-run-sequence = 30 | suit-directive-run-sequence = 30 | |||
| suit-directive-run-with-arguments = 31 | suit-directive-run-with-arguments = 31 | |||
| suit-directive-swap = 32 | suit-directive-swap = 32 | |||
| suit-wait-event-argument-authorisation = 1 | suit-wait-event-argument-authorization = 1 | |||
| suit-wait-event-power = 2 | suit-wait-event-power = 2 | |||
| suit-wait-event-network = 3 | suit-wait-event-network = 3 | |||
| suit-wait-event-other-device-version = 4 | suit-wait-event-other-device-version = 4 | |||
| suit-wait-event-time = 5 | suit-wait-event-time = 5 | |||
| suit-wait-event-time-of-day = 6 | suit-wait-event-time-of-day = 6 | |||
| suit-wait-event-day-of-week = 7 | suit-wait-event-day-of-week = 7 | |||
| suit-wait-event-authorisation = 8 | suit-wait-event-authorization = 8 | |||
| suit-parameter-strict-order = 1 | suit-parameter-strict-order = 1 | |||
| suit-parameter-soft-failure = 2 | suit-parameter-soft-failure = 2 | |||
| suit-parameter-vendor-id = 3 | suit-parameter-vendor-id = 3 | |||
| suit-parameter-class-id = 4 | suit-parameter-class-id = 4 | |||
| suit-parameter-device-id = 5 | suit-parameter-device-id = 5 | |||
| suit-parameter-uri = 6 | suit-parameter-uri = 6 | |||
| suit-parameter-encryption-info = 7 | suit-parameter-encryption-info = 7 | |||
| suit-parameter-compression-info = 8 | suit-parameter-compression-info = 8 | |||
| suit-parameter-unpack-info = 9 | suit-parameter-unpack-info = 9 | |||
| suit-parameter-source-component = 10 | suit-parameter-source-component = 10 | |||
| suit-parameter-image-digest = 11 | suit-parameter-image-digest = 11 | |||
| suit-parameter-image-size = 12 | suit-parameter-image-size = 12 | |||
| suit-parameter-uri-list = 24 | suit-parameter-uri-list = 24 | |||
| suit-parameter-uri-list-append = 25 | suit-parameter-uri-list-append = 25 | |||
| suit-parameter-prioritised-parameters = 26 | suit-parameter-prioritized-parameters = 26 | |||
| suit-parameter-custom = nint | suit-parameter-custom = nint | |||
| suit-compression-algorithm = 1 | suit-compression-algorithm = 1 | |||
| suit-compression-parameters = 2 | suit-compression-parameters = 2 | |||
| suit-unpack-algorithm = 1 | suit-unpack-algorithm = 1 | |||
| suit-unpack-parameters = 2 | suit-unpack-parameters = 2 | |||
| suit-text-manifest-description = 1 | suit-text-manifest-description = 1 | |||
| skipping to change at page 61, line 30 ¶ | skipping to change at page 64, line 10 ¶ | |||
| 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: | |||
| -----BEGIN PUBLIC KEY----- | -----BEGIN PUBLIC KEY----- | |||
| MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEhJaBGq4LqqvSYVcYnuzaJr6qi/Eb | MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEhJaBGq4LqqvSYVcYnuzaJr6qi/Eb | |||
| bz/m4rVlnIXbwK07HypLbAmBMcCjbazR14vTgdzfsJwFLbM5kdtzOLSolg== | bz/m4rVlnIXbwK07HypLbAmBMcCjbazR14vTgdzfsJwFLbM5kdtzOLSolg== | |||
| -----END PUBLIC KEY----- | -----END PUBLIC KEY----- | |||
| 12.1. Example 0: | 12.1. Example 0: Secure Boot | |||
| Secure boot only. | ||||
| The following JSON shows the intended behaviour of the manifest. | ||||
| { | Secure boot and compatibility check. | |||
| "structure-version": 1, | ||||
| "sequence-number": 1, | ||||
| "run-image": [ | ||||
| { "directive-set-component": 0 }, | ||||
| { "condition-image": null }, | ||||
| { "directive-run": null } | ||||
| ], | ||||
| "common": { | ||||
| "common-sequence": [ | ||||
| { | ||||
| "directive-set-var": { | ||||
| "digest": "00112233445566778899aabbccddeeff" | ||||
| "0123456789abcdeffedcba9876543210", | ||||
| "size": 34768 | ||||
| } | ||||
| } | ||||
| ], | ||||
| "components": [ | ||||
| [ | ||||
| "Flash", | ||||
| 78848 | ||||
| ] | ||||
| ] | ||||
| } | ||||
| } | ||||
| Converted into the SUIT manifest, this produces: | { | |||
| / authentication-wrapper / 2:h'81d28443a10126a058248202582073054c8 | ||||
| cc42e3e76c974ad0bed685d88b0b99df40fbaf72f58cd0b97dcd03285584057bc22b81 | ||||
| 43137abb3e8dc180a74348b58905d36ac16c199443cd1d09214a68bd4acdbbde78a521 | ||||
| 7768faa00627a0a92da30f36bd2187f77ba14b16b0637c618' / [ | ||||
| 18([ | ||||
| / protected / h'a10126' / { | ||||
| / alg / 1:-7 / ES256 /, | ||||
| } /, | ||||
| / unprotected / { | ||||
| }, | ||||
| / payload / h'8202582073054c8cc42e3e76c974ad0bed685d88 | ||||
| b0b99df40fbaf72f58cd0b97dcd03285' / [ | ||||
| / algorithm-id / 2 / sha256 /, | ||||
| / digest-bytes / | ||||
| h'73054c8cc42e3e76c974ad0bed685d88b0b99df40fbaf72f58cd0b97dcd03285' | ||||
| ] /, | ||||
| / signature / h'57bc22b8143137abb3e8dc180a74348b58905d | ||||
| 36ac16c199443cd1d09214a68bd4acdbbde78a5217768faa00627a0a92da30f36bd218 | ||||
| 7f77ba14b16b0637c618' | ||||
| ]) | ||||
| ] /, | ||||
| / manifest / 3:h'a50101020103585aa2024481814100045850860150fa6b4a5 | ||||
| 3d5ad5fdfbe9de663e4d41ffe02501492af1425695e48bf429b2d51f2ab4514a20b820 | ||||
| 2582000112233445566778899aabbccddeeff0123456789abcdeffedcba98765432100 | ||||
| c1987d00a438203f60c438217f6' / { | ||||
| / manifest-version / 1:1, | ||||
| / manifest-sequence-number / 2:1, | ||||
| / common / 3:h'a2024481814100045850860150fa6b4a53d5ad5fdfbe9de | ||||
| 663e4d41ffe02501492af1425695e48bf429b2d51f2ab4514a20b82025820001122334 | ||||
| 45566778899aabbccddeeff0123456789abcdeffedcba98765432100c1987d0' / { | ||||
| / components / 2:h'81814100' / [ | ||||
| [h'00'] | ||||
| ] /, | ||||
| / common-sequence / 4:h'860150fa6b4a53d5ad5fdfbe9de663e4d4 | ||||
| 1ffe02501492af1425695e48bf429b2d51f2ab4514a20b820258200011223344556677 | ||||
| 8899aabbccddeeff0123456789abcdeffedcba98765432100c1987d0' / [ | ||||
| / condition-vendor-identifier / | ||||
| 1,h'fa6b4a53d5ad5fdfbe9de663e4d41ffe' / fa6b4a53-d5ad-5fdf- | ||||
| be9d-e663e4d41ffe / , | ||||
| / condition-class-identifier / | ||||
| 2,h'1492af1425695e48bf429b2d51f2ab45' / | ||||
| 1492af14-2569-5e48-bf42-9b2d51f2ab45 / , | ||||
| / directive-override-parameters / 20,{ | ||||
| / image-digest / 11:[ | ||||
| / algorithm-id / 2 / sha256 /, | ||||
| / digest-bytes / | ||||
| h'00112233445566778899aabbccddeeff0123456789abcdeffedcba9876543210' | ||||
| ], | ||||
| / image-size / 12:34768, | ||||
| } | ||||
| ] /, | ||||
| } /, | ||||
| / validate / 10:h'8203f6' / [ | ||||
| / condition-image-match / 3,F6 / nil / | ||||
| ] /, | ||||
| / run / 12:h'8217f6' / [ | ||||
| / directive-run / 23,None | ||||
| ] /, | ||||
| } /, | ||||
| } | ||||
| { | Total size of manifest without COSE authentication object: 112 | |||
| / auth object / 1 : h'd28443a10126a1044874657374206b6579f65840ebec' | ||||
| h'b66cbecb19dcedacf8459c1a22a1453781ba98d8ffb9' | ||||
| h'd4e2912f29d23bac5ae3d51f1ff0c1b1df05e207ca17' | ||||
| h'483a57ede914cf826b73599137881c8364c8', | ||||
| / manifest / 2 : h'a401010201035840a2024c818245466c6173684300340104' | ||||
| h'582e8213a20b58248202582000112233445566778899aabb' | ||||
| h'ccddeeff0123456789abcdeffedcba98765432100c1987d0' | ||||
| h'0c47860c0003f617f6' \ | ||||
| { | ||||
| / structure-version / 1 : 1, | ||||
| / sequence-number / 2 : 1, | ||||
| / common / 3 : h'a2024c818245466c6173684300340104582e8213a20b58' | ||||
| h'248202582000112233445566778899aabbccddeeff0123' | ||||
| h'456789abcdeffedcba98765432100c1987d0' \ { | ||||
| / components / 2 : h'818245466c61736843003401' \ | ||||
| [ | ||||
| [h'466c617368', h'003401'], | ||||
| ], | ||||
| / common-sequence / 4 : h'8213a20b582482025820001122334455' | ||||
| h'66778899aabbccddeeff0123456789ab' | ||||
| h'cdeffedcba98765432100c1987d0' \ [ | ||||
| / set-vars / 19, { | ||||
| / digest / 11 : h'8202582000112233445566778899aabb' | ||||
| h'ccddeeff0123456789abcdeffedcba98' | ||||
| h'76543210' \ | ||||
| [ 2, h'00112233445566778899aabbccddeeff01234567' | ||||
| h'89abcdeffedcba9876543210' ], | ||||
| / size / 12 : 34768, | ||||
| }, | ||||
| ], | ||||
| }, | ||||
| / run-image / 12 : h'860c0003f617f6' \ [ | ||||
| / set-component-index / 12, 0, | ||||
| / condition-image / 3, None, | ||||
| / run / 23, None, | ||||
| ], | ||||
| } | ||||
| } | ||||
| Total size of outer wrapper without COSE authentication object: 87 | Manifest: | |||
| Outer: | a103586ca50101020103585aa2024481814100045850860150fa6b4a53d5 | |||
| ad5fdfbe9de663e4d41ffe02501492af1425695e48bf429b2d51f2ab4514 | ||||
| a20b8202582000112233445566778899aabbccddeeff0123456789abcdef | ||||
| fedcba98765432100c1987d00a438203f60c438217f6 | ||||
| a201f6025851a401010201035840a2024c818245466c6173684300340104582e8213a20b | Total size of manifest with COSE authentication object: 227 | |||
| 58248202582000112233445566778899aabbccddeeff0123456789abcdeffedcba987654 | ||||
| 32100c1987d00c47860c0003f617f6 | ||||
| Total size of outer wrapper with COSE authentication object: 172 | ||||
| Signed Outer: | Manifest with COSE authentication object: | |||
| a2015854d28443a10126a1044874657374206b6579f65840ebecb66cbecb19dcedacf845 | a202587081d28443a10126a058248202582073054c8cc42e3e76c974ad0b | |||
| 9c1a22a1453781ba98d8ffb9d4e2912f29d23bac5ae3d51f1ff0c1b1df05e207ca17483a | ed685d88b0b99df40fbaf72f58cd0b97dcd03285584057bc22b8143137ab | |||
| 57ede914cf826b73599137881c8364c8025851a401010201035840a2024c818245466c61 | b3e8dc180a74348b58905d36ac16c199443cd1d09214a68bd4acdbbde78a | |||
| 73684300340104582e8213a20b58248202582000112233445566778899aabbccddeeff01 | 5217768faa00627a0a92da30f36bd2187f77ba14b16b0637c61803586ca5 | |||
| 23456789abcdeffedcba98765432100c1987d00c47860c0003f617f6 | 0101020103585aa2024481814100045850860150fa6b4a53d5ad5fdfbe9d | |||
| e663e4d41ffe02501492af1425695e48bf429b2d51f2ab4514a20b820258 | ||||
| 2000112233445566778899aabbccddeeff0123456789abcdeffedcba9876 | ||||
| 5432100c1987d00a438203f60c438217f6 | ||||
| 12.2. Example 1: | 12.2. Example 1: Simultaneous Download and Installation of Payload | |||
| Simultaneous download and installation of payload. | Simultaneous download and installation of payload. | |||
| The following JSON shows the intended behaviour of the manifest. | { | |||
| / authentication-wrapper / 2:h'81d28443a10126a0582482025820be9d3da | ||||
| { | 5d45b780bcaeb84a909b54913302a358d9d7dc6b94c7fbb1f56dbf5f95840d89fb4194 | |||
| "structure-version": 1, | 4231adb3920bdae14a4965699771b50e062c28ffef93400a9b63150902bc65929e8066 | |||
| "sequence-number": 2, | e1a0eb45be50ee96db0435e5c141ae8fb94cbf2b37205ba6b' / [ | |||
| "apply-image": [ | 18([ | |||
| { "directive-set-component": 0 }, | / protected / h'a10126' / { | |||
| { | / alg / 1:-7 / ES256 /, | |||
| "directive-set-var": { | } /, | |||
| "uri": "http://example.com/file.bin" | / unprotected / { | |||
| } | }, | |||
| }, | / payload / h'82025820be9d3da5d45b780bcaeb84a909b54913 | |||
| { "directive-fetch": null } | 302a358d9d7dc6b94c7fbb1f56dbf5f9' / [ | |||
| ], | / algorithm-id / 2 / sha256 /, | |||
| "common": { | / digest-bytes / | |||
| "common-sequence": [ | h'be9d3da5d45b780bcaeb84a909b54913302a358d9d7dc6b94c7fbb1f56dbf5f9' | |||
| { | ] /, | |||
| "directive-set-var": { | / signature / h'd89fb41944231adb3920bdae14a4965699771b | |||
| "digest": "00112233445566778899aabbccddeeff" | 50e062c28ffef93400a9b63150902bc65929e8066e1a0eb45be50ee96db0435e5c141a | |||
| "0123456789abcdeffedcba9876543210", | e8fb94cbf2b37205ba6b' | |||
| "size": 34768 | ]) | |||
| } | ] /, | |||
| } | / manifest / 3:h'a40101020203585aa2024481814100045850860150fa6b4a5 | |||
| ], | 3d5ad5fdfbe9de663e4d41ffe02501492af1425695e48bf429b2d51f2ab4514a20b820 | |||
| "components": [ | 2582000112233445566778899aabbccddeeff0123456789abcdeffedcba98765432100 | |||
| [ | c1987d00958258613a106781b687474703a2f2f6578616d706c652e636f6d2f66696c6 | |||
| "Flash", | 52e62696e15f603f6' / { | |||
| 78848 | / manifest-version / 1:1, | |||
| ] | / manifest-sequence-number / 2:2, | |||
| ] | / common / 3:h'a2024481814100045850860150fa6b4a53d5ad5fdfbe9de | |||
| } | 663e4d41ffe02501492af1425695e48bf429b2d51f2ab4514a20b82025820001122334 | |||
| } | 45566778899aabbccddeeff0123456789abcdeffedcba98765432100c1987d0' / { | |||
| / components / 2:h'81814100' / [ | ||||
| Converted into the SUIT manifest, this produces: | [h'00'] | |||
| ] /, | ||||
| { | / common-sequence / 4:h'860150fa6b4a53d5ad5fdfbe9de663e4d4 | |||
| / auth object / 1 : h'd28443a10126a1044874657374206b6579f65840b531' | 1ffe02501492af1425695e48bf429b2d51f2ab4514a20b820258200011223344556677 | |||
| h'42132ebddbf0c523378d16fc904badc56553e41c6713' | 8899aabbccddeeff0123456789abcdeffedcba98765432100c1987d0' / [ | |||
| h'b758dbd39f47effec5e7a583c418129f456d0aaaa3c4' | / condition-vendor-identifier / | |||
| h'3fe06dd30d664b709edf0ad05b70dad38bc2', | 1,h'fa6b4a53d5ad5fdfbe9de663e4d41ffe' / fa6b4a53-d5ad-5fdf- | |||
| / manifest / 2 : h'a401010202035840a2024c818245466c6173684300340104' | be9d-e663e4d41ffe / , | |||
| h'582e8213a20b58248202582000112233445566778899aabb' | / condition-class-identifier / | |||
| h'ccddeeff0123456789abcdeffedcba98765432100c1987d0' | 2,h'1492af1425695e48bf429b2d51f2ab45' / | |||
| h'095825860c0013a106781b687474703a2f2f6578616d706c' | 1492af14-2569-5e48-bf42-9b2d51f2ab45 / , | |||
| h'652e636f6d2f66696c652e62696e15f6' \ | / directive-override-parameters / 20,{ | |||
| { | / image-digest / 11:[ | |||
| / structure-version / 1 : 1, | / algorithm-id / 2 / sha256 /, | |||
| / sequence-number / 2 : 2, | / digest-bytes / | |||
| / common / 3 : h'a2024c818245466c6173684300340104582e8213a20b58' | h'00112233445566778899aabbccddeeff0123456789abcdeffedcba9876543210' | |||
| h'248202582000112233445566778899aabbccddeeff0123' | ], | |||
| h'456789abcdeffedcba98765432100c1987d0' \ { | / image-size / 12:34768, | |||
| / components / 2 : h'818245466c61736843003401' \ | } | |||
| [ | ] /, | |||
| [h'466c617368', h'003401'], | } /, | |||
| ], | / install / 9:h'8613a106781b687474703a2f2f6578616d706c652e636f | |||
| / common-sequence / 4 : h'8213a20b582482025820001122334455' | 6d2f66696c652e62696e15f603f6' / [ | |||
| h'66778899aabbccddeeff0123456789ab' | / directive-set-parameters / 19,{ | |||
| h'cdeffedcba98765432100c1987d0' \ [ | / uri / 6:'http://example.com/file.bin', | |||
| / set-vars / 19, { | } , | |||
| / digest / 11 : h'8202582000112233445566778899aabb' | / directive-fetch / 21,F6 / nil / , | |||
| h'ccddeeff0123456789abcdeffedcba98' | / condition-image-match / 3,F6 / nil / | |||
| h'76543210' \ | ] /, | |||
| [ 2, h'00112233445566778899aabbccddeeff01234567' | } /, | |||
| h'89abcdeffedcba9876543210' ], | } | |||
| / size / 12 : 34768, | ||||
| }, | ||||
| ], | ||||
| }, | ||||
| / apply-image / 9 : h'860c0013a106781b687474703a2f2f6578616d70' | ||||
| h'6c652e636f6d2f66696c652e62696e15f6' \ [ | ||||
| / set-component-index / 12, 0, | ||||
| / set-vars / 19, { | ||||
| / uri / 6 : http://example.com/file.bin, | ||||
| }, | ||||
| / fetch / 21, None, | ||||
| ], | ||||
| } | ||||
| } | ||||
| Total size of outer wrapper without COSE authentication object: 118 | Total size of manifest without COSE authentication object: 142 | |||
| Outer: | Manifest: | |||
| a201f6025870a401010202035840a2024c818245466c6173684300340104582e8213a20b | a103588aa40101020203585aa2024481814100045850860150fa6b4a53d5 | |||
| 58248202582000112233445566778899aabbccddeeff0123456789abcdeffedcba987654 | ad5fdfbe9de663e4d41ffe02501492af1425695e48bf429b2d51f2ab4514 | |||
| 32100c1987d0095825860c0013a106781b687474703a2f2f6578616d706c652e636f6d2f | a20b8202582000112233445566778899aabbccddeeff0123456789abcdef | |||
| 66696c652e62696e15f6 | fedcba98765432100c1987d00958258613a106781b687474703a2f2f6578 | |||
| 616d706c652e636f6d2f66696c652e62696e15f603f6 | ||||
| Total size of outer wrapper with COSE authentication object: 203 | Total size of manifest with COSE authentication object: 257 | |||
| Signed Outer: | Manifest with COSE authentication object: | |||
| a2015854d28443a10126a1044874657374206b6579f65840b53142132ebddbf0c523378d | a202587081d28443a10126a0582482025820be9d3da5d45b780bcaeb84a9 | |||
| 16fc904badc56553e41c6713b758dbd39f47effec5e7a583c418129f456d0aaaa3c43fe0 | 09b54913302a358d9d7dc6b94c7fbb1f56dbf5f95840d89fb41944231adb | |||
| 6dd30d664b709edf0ad05b70dad38bc2025870a401010202035840a2024c818245466c61 | 3920bdae14a4965699771b50e062c28ffef93400a9b63150902bc65929e8 | |||
| 73684300340104582e8213a20b58248202582000112233445566778899aabbccddeeff01 | 066e1a0eb45be50ee96db0435e5c141ae8fb94cbf2b37205ba6b03588aa4 | |||
| 23456789abcdeffedcba98765432100c1987d0095825860c0013a106781b687474703a2f | 0101020203585aa2024481814100045850860150fa6b4a53d5ad5fdfbe9d | |||
| 2f6578616d706c652e636f6d2f66696c652e62696e15f6 | e663e4d41ffe02501492af1425695e48bf429b2d51f2ab4514a20b820258 | |||
| 2000112233445566778899aabbccddeeff0123456789abcdeffedcba9876 | ||||
| 5432100c1987d00958258613a106781b687474703a2f2f6578616d706c65 | ||||
| 2e636f6d2f66696c652e62696e15f603f6 | ||||
| 12.3. Example 2: | 12.3. Example 2: Simultaneous Download, Installation, and Secure Boot | |||
| Compatibility test, simultaneous download and installation, and | Compatibility test, simultaneous download and installation, and | |||
| secure boot. | secure boot. ~~~ { / authentication-wrapper / | |||
| 2:h'81d28443a10126a058248202582070cf2a4 fed640658ada6ff33b59af192ca22 | ||||
| The following JSON shows the intended behaviour of the manifest. | b4142e9ae9d8d9b05f2b5a118cf35840f6c95681e f4298dc1288e11004a4b72be80a | |||
| 374be13efccf5ec94fa1ad2ca7d5510d5ff43ceac60 | ||||
| { | e7dd32d3614bd0350768f985eff8ba9933625d206286cf983' / [ 18([ / | |||
| "structure-version": 1, | protected / h'a10126' / { / alg / 1:-7 / ES256 /, } /, / unprotected | |||
| "sequence-number": 3, | / { }, / payload / h'8202582070cf2a4fed640658ada6ff33b59af192 | |||
| "common": { | ca22b4142e9ae9d8d9b05f2b5a118cf3' / [ / algorithm-id / 2 / sha256 /, | |||
| "common-sequence": [ | / digest-bytes / | |||
| { | h'70cf2a4fed640658ada6ff33b59af192ca22b4142e9ae9d8d9b05f2b5a118cf3' ] | |||
| "directive-set-var": { | /, / signature / h'f6c95681ef4298dc1288e11004a4b72be80a37 4be13efccf5 | |||
| "vendor-id": "fa6b4a53-d5ad-5fdf-be9d-e663e4d41ffe", | ec94fa1ad2ca7d5510d5ff43ceac60e7dd32d3614bd0350768f985eff8b | |||
| "class-id": "1492af14-2569-5e48-bf42-9b2d51f2ab45", | a9933625d206286cf983' ]) ] /, / manifest / | |||
| "digest": "00112233445566778899aabbccddeeff" | 3:h'a60101020303585aa2024481814100045850860150fa6b4a5 3d5ad5fdfbe9de6 | |||
| "0123456789abcdeffedcba9876543210", | 63e4d41ffe02501492af1425695e48bf429b2d51f2ab4514a20b820 2582000112233 | |||
| "size": 34768 | 445566778899aabbccddeeff0123456789abcdeffedcba98765432100 c1987d00958 | |||
| } | 258613a106781b687474703a2f2f6578616d706c652e636f6d2f66696c6 | |||
| }, | 52e62696e15f603f60a438203f60c438217f6' / { / manifest-version / 1:1, | |||
| { "condition-vendor-id": null }, | / manifest-sequence-number / 2:3, / common / | |||
| { "condition-class-id": null } | 3:h'a2024481814100045850860150fa6b4a53d5ad5fdfbe9de 663e4d41ffe025014 | |||
| ], | 92af1425695e48bf429b2d51f2ab4514a20b82025820001122334 | |||
| "components": [ | 45566778899aabbccddeeff0123456789abcdeffedcba98765432100c1987d0' / { | |||
| [ | / components / 2:h'81814100' / [ [h'00'] ] /, / common-sequence / | |||
| "Flash", | 4:h'860150fa6b4a53d5ad5fdfbe9de663e4d4 1ffe02501492af1425695e48bf429b | |||
| 78848 | 2d51f2ab4514a20b820258200011223344556677 | |||
| ] | 8899aabbccddeeff0123456789abcdeffedcba98765432100c1987d0' / [ / | |||
| ] | condition-vendor-identifier / 1,h'fa6b4a53d5ad5fdfbe9de663e4d41ffe' / | |||
| }, | fa6b4a53-d5ad-5fdf- be9d-e663e4d41ffe / , / condition-class- | |||
| "apply-image": [ | identifier / 2,h'1492af1425695e48bf429b2d51f2ab45' / | |||
| { "directive-set-component": 0 }, | 1492af14-2569-5e48-bf42-9b2d51f2ab45 / , / directive-override- | |||
| { | parameters / 20,{ / image-digest / 11:[ / algorithm-id / 2 / sha256 | |||
| "directive-set-var": { | /, / digest-bytes / | |||
| "uri": "http://example.com/file.bin" | h'00112233445566778899aabbccddeeff0123456789abcdeffedcba9876543210' | |||
| } | ], / image-size / 12:34768, } ] /, } /, / install / | |||
| }, | 9:h'8613a106781b687474703a2f2f6578616d706c652e636f | |||
| { "directive-fetch": null } | 6d2f66696c652e62696e15f603f6' / [ / directive-set-parameters / 19,{ / | |||
| ], | uri / 6:'http://example.com/file.bin', } , / directive-fetch / 21,F6 | |||
| "run-image": [ | / nil / , / condition-image-match / 3,F6 / nil / ] /, / validate / | |||
| { "directive-set-component": 0 }, | 10:h'8203f6' / [ / condition-image-match / 3,F6 / nil / ] /, / run / | |||
| { "condition-image": null }, | 12:h'8217f6' / [ / directive-run / 23,None ] /, } /, } ~~~ | |||
| { "directive-run": null } | ||||
| ] | ||||
| } | ||||
| Converted into the SUIT manifest, this produces: | ||||
| { | ||||
| / auth object / 1 : h'd28443a10126a1044874657374206b6579f658400014' | ||||
| h'750c013f7e1cdbec6f14b99b49195e081d1030508a6b' | ||||
| h'8d271bd99dfb382a7767dc45f20c9943ed22a1eaac9d' | ||||
| h'07a041ec1acfc10ad7e45e6424629ff3e3e5', | ||||
| / manifest / 2 : h'a501010203035868a2024c818245466c6173684300340104' | ||||
| h'58568613a40350fa6b4a53d5ad5fdfbe9de663e4d41ffe04' | ||||
| h'501492af1425695e48bf429b2d51f2ab450b582482025820' | ||||
| h'00112233445566778899aabbccddeeff0123456789abcdef' | ||||
| h'fedcba98765432100c1987d001f602f6095825860c0013a1' | ||||
| h'06781b687474703a2f2f6578616d706c652e636f6d2f6669' | ||||
| h'6c652e62696e15f60c47860c0003f617f6' \ | ||||
| { | ||||
| / structure-version / 1 : 1, | ||||
| / sequence-number / 2 : 3, | ||||
| / common / 3 : h'a2024c818245466c617368430034010458568613a40350' | ||||
| h'fa6b4a53d5ad5fdfbe9de663e4d41ffe04501492af1425' | ||||
| h'695e48bf429b2d51f2ab450b5824820258200011223344' | ||||
| h'5566778899aabbccddeeff0123456789abcdeffedcba98' | ||||
| h'765432100c1987d001f602f6' \ { | ||||
| / components / 2 : h'818245466c61736843003401' \ | ||||
| [ | ||||
| [h'466c617368', h'003401'], | ||||
| ], | ||||
| / common-sequence / 4 : h'8613a40350fa6b4a53d5ad5fdfbe9de6' | ||||
| h'63e4d41ffe04501492af1425695e48bf' | ||||
| h'429b2d51f2ab450b5824820258200011' | ||||
| h'2233445566778899aabbccddeeff0123' | ||||
| h'456789abcdeffedcba98765432100c19' | ||||
| h'87d001f602f6' \ [ | ||||
| / set-vars / 19, { | ||||
| / vendor-id / 3 : h'fa6b4a53d5ad5fdfbe9de663e4d41f' | ||||
| h'fe', | ||||
| / class-id / 4 : h'1492af1425695e48bf429b2d51f2ab45', | ||||
| / digest / 11 : h'8202582000112233445566778899aabb' | ||||
| h'ccddeeff0123456789abcdeffedcba98' | ||||
| h'76543210' \ | ||||
| [ 2, h'00112233445566778899aabbccddeeff01234567' | ||||
| h'89abcdeffedcba9876543210' ], | ||||
| / size / 12 : 34768, | ||||
| }, | ||||
| / condition-vendor-id / 1, None, | ||||
| / condition-class-id / 2, None, | ||||
| ], | ||||
| }, | ||||
| / apply-image / 9 : h'860c0013a106781b687474703a2f2f6578616d70' | ||||
| h'6c652e636f6d2f66696c652e62696e15f6' \ [ | ||||
| / set-component-index / 12, 0, | ||||
| / set-vars / 19, { | ||||
| / uri / 6 : http://example.com/file.bin, | ||||
| }, | ||||
| / fetch / 21, None, | ||||
| ], | ||||
| / run-image / 12 : h'860c0003f617f6' \ [ | ||||
| / set-component-index / 12, 0, | ||||
| / condition-image / 3, None, | ||||
| / run / 23, None, | ||||
| ], | ||||
| } | ||||
| } | ||||
| Total size of outer wrapper without COSE authentication object: 167 | Total size of manifest without COSE authentication object: 152 | |||
| Outer: | Manifest: | |||
| a201f60258a1a501010203035868a2024c818245466c617368430034010458568613a403 | a1035894a60101020303585aa2024481814100045850860150fa6b4a53d5 | |||
| 50fa6b4a53d5ad5fdfbe9de663e4d41ffe04501492af1425695e48bf429b2d51f2ab450b | ad5fdfbe9de663e4d41ffe02501492af1425695e48bf429b2d51f2ab4514 | |||
| 58248202582000112233445566778899aabbccddeeff0123456789abcdeffedcba987654 | a20b8202582000112233445566778899aabbccddeeff0123456789abcdef | |||
| 32100c1987d001f602f6095825860c0013a106781b687474703a2f2f6578616d706c652e | fedcba98765432100c1987d00958258613a106781b687474703a2f2f6578 | |||
| 636f6d2f66696c652e62696e15f60c47860c0003f617f6 | 616d706c652e636f6d2f66696c652e62696e15f603f60a438203f60c4382 | |||
| 17f6 | ||||
| Total size of outer wrapper with COSE authentication object: 252 | Total size of manifest with COSE authentication object: 267 | |||
| Signed Outer: | Manifest with COSE authentication object: | |||
| a2015854d28443a10126a1044874657374206b6579f658400014750c013f7e1cdbec6f14 | a202587081d28443a10126a058248202582070cf2a4fed640658ada6ff33 | |||
| b99b49195e081d1030508a6b8d271bd99dfb382a7767dc45f20c9943ed22a1eaac9d07a0 | b59af192ca22b4142e9ae9d8d9b05f2b5a118cf35840f6c95681ef4298dc | |||
| 41ec1acfc10ad7e45e6424629ff3e3e50258a1a501010203035868a2024c818245466c61 | 1288e11004a4b72be80a374be13efccf5ec94fa1ad2ca7d5510d5ff43cea | |||
| 7368430034010458568613a40350fa6b4a53d5ad5fdfbe9de663e4d41ffe04501492af14 | c60e7dd32d3614bd0350768f985eff8ba9933625d206286cf983035894a6 | |||
| 25695e48bf429b2d51f2ab450b58248202582000112233445566778899aabbccddeeff01 | 0101020303585aa2024481814100045850860150fa6b4a53d5ad5fdfbe9d | |||
| 23456789abcdeffedcba98765432100c1987d001f602f6095825860c0013a106781b6874 | e663e4d41ffe02501492af1425695e48bf429b2d51f2ab4514a20b820258 | |||
| 74703a2f2f6578616d706c652e636f6d2f66696c652e62696e15f60c47860c0003f617f6 | 2000112233445566778899aabbccddeeff0123456789abcdeffedcba9876 | |||
| 5432100c1987d00958258613a106781b687474703a2f2f6578616d706c65 | ||||
| 2e636f6d2f66696c652e62696e15f603f60a438203f60c438217f6 | ||||
| 12.4. Example 3: | 12.4. Example 3: Load from External Storage | |||
| Compatibility test, simultaneous download and installation, load from | Compatibility test, simultaneous download and installation, load from | |||
| external storage, and secure boot. | external storage, and secure boot. | |||
| The following JSON shows the intended behaviour of the manifest. | { | |||
| / authentication-wrapper / 2:h'81d28443a10126a0582482025820bb008f5 | ||||
| { | 7fd1babff8cc432d18c4c9cfc69d7e8ab76b07cc910c6d03ec598baab58409e98c58fc | |||
| "structure-version": 1, | d82668443a0249fa5eab10474a099572dfb31c0d2adf750f57c4987d484badf8524a20 | |||
| "sequence-number": 4, | a9e92c4599698eb696254d4c0f77947c8af353b544600ea11' / [ | |||
| "common": { | 18([ | |||
| "common-sequence": [ | / protected / h'a10126' / { | |||
| { | / alg / 1:-7 / ES256 /, | |||
| "directive-set-var": { | } /, | |||
| "vendor-id": "fa6b4a53-d5ad-5fdf-be9d-e663e4d41ffe", | / unprotected / { | |||
| "class-id": "1492af14-2569-5e48-bf42-9b2d51f2ab45" | }, | |||
| } | / payload / h'82025820bb008f57fd1babff8cc432d18c4c9cfc | |||
| }, | 69d7e8ab76b07cc910c6d03ec598baab' / [ | |||
| { "directive-set-component": 0 }, | / algorithm-id / 2 / sha256 /, | |||
| { | / digest-bytes / | |||
| "directive-set-var": { | h'bb008f57fd1babff8cc432d18c4c9cfc69d7e8ab76b07cc910c6d03ec598baab' | |||
| "digest": "00112233445566778899aabbccddeeff" | ] /, | |||
| "0123456789abcdeffedcba9876543210", | / signature / h'9e98c58fcd82668443a0249fa5eab10474a099 | |||
| "size": 34768 | 572dfb31c0d2adf750f57c4987d484badf8524a20a9e92c4599698eb696254d4c0f779 | |||
| } | 47c8af353b544600ea11' | |||
| }, | ]) | |||
| { "directive-set-component": 1 }, | ] /, | |||
| { | / manifest / 3:h'a70101020403585fa2024782814100814101045852880c000 | |||
| "directive-set-var": { | 150fa6b4a53d5ad5fdfbe9de663e4d41ffe02501492af1425695e48bf429b2d51f2ab4 | |||
| "digest": "00112233445566778899aabbccddeeff" | 514a20b8202582000112233445566778899aabbccddeeff0123456789abcdeffedcba9 | |||
| "0123456789abcdeffedcba9876543210", | 8765432100c1987d0095827880c0013a106781b687474703a2f2f6578616d706c652e6 | |||
| "size": 34768 | 36f6d2f66696c652e62696e15f603f60a45840c0003f60b5834880c0114a30a000b820 | |||
| } | 2582000112233445566778899aabbccddeeff0123456789abcdeffedcba98765432100 | |||
| }, | c1987d016f603f60c45840c0117f6' / { | |||
| { "condition-vendor-id": null }, | / manifest-version / 1:1, | |||
| { "condition-class-id": null } | / manifest-sequence-number / 2:4, | |||
| ], | / common / 3:h'a2024782814100814101045852880c000150fa6b4a53d5a | |||
| "components": [ | d5fdfbe9de663e4d41ffe02501492af1425695e48bf429b2d51f2ab4514a20b8202582 | |||
| [ | 000112233445566778899aabbccddeeff0123456789abcdeffedcba98765432100c198 | |||
| "Flash", | 7d0' / { | |||
| 78848 | / components / 2:h'82814100814101' / [ | |||
| ], | [h'00'] , | |||
| [ | [h'01'] | |||
| "RAM", | ] /, | |||
| 1024 | / common-sequence / 4:h'880c000150fa6b4a53d5ad5fdfbe9de663 | |||
| ] | e4d41ffe02501492af1425695e48bf429b2d51f2ab4514a20b82025820001122334455 | |||
| ] | 66778899aabbccddeeff0123456789abcdeffedcba98765432100c1987d0' / [ | |||
| }, | / directive-set-component-index / 12,0 , | |||
| "apply-image": [ | / condition-vendor-identifier / | |||
| { "directive-set-component": 0 }, | 1,h'fa6b4a53d5ad5fdfbe9de663e4d41ffe' / fa6b4a53-d5ad-5fdf- | |||
| { | be9d-e663e4d41ffe / , | |||
| "directive-set-var": { | / condition-class-identifier / | |||
| "uri": "http://example.com/file.bin" | 2,h'1492af1425695e48bf429b2d51f2ab45' / | |||
| } | 1492af14-2569-5e48-bf42-9b2d51f2ab45 / , | |||
| }, | / directive-override-parameters / 20,{ | |||
| { "directive-fetch": null } | / image-digest / 11:[ | |||
| ], | / algorithm-id / 2 / sha256 /, | |||
| "run-image": [ | / digest-bytes / | |||
| { "directive-set-component": 0 }, | h'00112233445566778899aabbccddeeff0123456789abcdeffedcba9876543210' | |||
| { "condition-image": null }, | ], | |||
| { "directive-set-component": 1 }, | / image-size / 12:34768, | |||
| { | } | |||
| "directive-set-var": { | ] /, | |||
| "source-index": 0 | } /, | |||
| } | / install / 9:h'880c0013a106781b687474703a2f2f6578616d706c652e | |||
| }, | 636f6d2f66696c652e62696e15f603f6' / [ | |||
| { "directive-fetch": null }, | / directive-set-component-index / 12,0 , | |||
| { "condition-image": null }, | / directive-set-parameters / 19,{ | |||
| { "directive-run": null } | / uri / 6:'http://example.com/file.bin', | |||
| ] | } , | |||
| } | / directive-fetch / 21,F6 / nil / , | |||
| / condition-image-match / 3,F6 / nil / | ||||
| Converted into the SUIT manifest, this produces: | ] /, | |||
| / validate / 10:h'840c0003f6' / [ | ||||
| { | / directive-set-component-index / 12,0 , | |||
| / auth object / 1 : h'd28443a10126a1044874657374206b6579f6584070eb' | / condition-image-match / 3,F6 / nil / | |||
| h'70f2552533fc954e934f50f42bdd9b6f7d4fd7e11463' | ] /, | |||
| h'6b9cdbef2a065f9640243a7857f66c4389aea906c4f3' | / load / 11:h'880c0114a30a000b8202582000112233445566778899aabb | |||
| h'b45150c8e55461e9bfda945904033fc70a84', | ccddeeff0123456789abcdeffedcba98765432100c1987d016f603f6' / [ | |||
| / manifest / 2 : h'a5010102040358a3a20254828245466c6173684300340182' | / directive-set-component-index / 12,1 , | |||
| h'4352414d4200040458898e13a20350fa6b4a53d5ad5fdfbe' | / directive-override-parameters / 20,{ | |||
| h'9de663e4d41ffe04501492af1425695e48bf429b2d51f2ab' | / image-digest / 11:[ | |||
| h'450c0013a20b58248202582000112233445566778899aabb' | / algorithm-id / 2 / sha256 /, | |||
| h'ccddeeff0123456789abcdeffedcba98765432100c1987d0' | / digest-bytes / | |||
| h'0c0113a20b58248202582000112233445566778899aabbcc' | h'00112233445566778899aabbccddeeff0123456789abcdeffedcba9876543210' | |||
| h'ddeeff0123456789abcdeffedcba98765432100c1987d001' | ], | |||
| h'f602f6095825860c0013a106781b687474703a2f2f657861' | / image-size / 12:34768, | |||
| h'6d706c652e636f6d2f66696c652e62696e15f60c518e0c00' | / source-component / 10:0 / [h'00'] /, | |||
| h'03f60c0113a10a0015f603f617f6' \ | } , | |||
| { | / directive-copy / 22,None , | |||
| / structure-version / 1 : 1, | / condition-image-match / 3,F6 / nil / | |||
| / sequence-number / 2 : 4, | ] /, | |||
| / common / 3 : h'a20254828245466c61736843003401824352414d420004' | / run / 12:h'840c0117f6' / [ | |||
| h'0458898e13a20350fa6b4a53d5ad5fdfbe9de663e4d41f' | / directive-set-component-index / 12,1 , | |||
| h'fe04501492af1425695e48bf429b2d51f2ab450c0013a2' | / directive-run / 23,None | |||
| h'0b58248202582000112233445566778899aabbccddeeff' | ] /, | |||
| h'0123456789abcdeffedcba98765432100c1987d00c0113' | } /, | |||
| h'a20b58248202582000112233445566778899aabbccddee' | } | |||
| h'ff0123456789abcdeffedcba98765432100c1987d001f6' | ||||
| h'02f6' \ { | ||||
| / components / 2 : h'828245466c61736843003401824352414d4200' | ||||
| h'04' \ | ||||
| [ | ||||
| [h'466c617368', h'003401'], | ||||
| [h'52414d', h'0004'], | ||||
| ], | ||||
| / common-sequence / 4 : h'8e13a20350fa6b4a53d5ad5fdfbe9de6' | ||||
| h'63e4d41ffe04501492af1425695e48bf' | ||||
| h'429b2d51f2ab450c0013a20b58248202' | ||||
| h'582000112233445566778899aabbccdd' | ||||
| h'eeff0123456789abcdeffedcba987654' | ||||
| h'32100c1987d00c0113a20b5824820258' | ||||
| h'2000112233445566778899aabbccddee' | ||||
| h'ff0123456789abcdeffedcba98765432' | ||||
| h'100c1987d001f602f6' \ [ | ||||
| / set-vars / 19, { | Total size of manifest without COSE authentication object: 218 | |||
| / vendor-id / 3 : h'fa6b4a53d5ad5fdfbe9de663e4d41f' | ||||
| h'fe', | ||||
| / class-id / 4 : h'1492af1425695e48bf429b2d51f2ab45', | ||||
| }, | ||||
| / set-component-index / 12, 0, | ||||
| / set-vars / 19, { | ||||
| / digest / 11 : h'8202582000112233445566778899aabb' | ||||
| h'ccddeeff0123456789abcdeffedcba98' | ||||
| h'76543210' \ | ||||
| [ 2, h'00112233445566778899aabbccddeeff01234567' | ||||
| h'89abcdeffedcba9876543210' ], | ||||
| / size / 12 : 34768, | ||||
| }, | ||||
| / set-component-index / 12, 1, | ||||
| / set-vars / 19, { | ||||
| / digest / 11 : h'8202582000112233445566778899aabb' | ||||
| h'ccddeeff0123456789abcdeffedcba98' | ||||
| h'76543210' \ | ||||
| [ 2, h'00112233445566778899aabbccddeeff01234567' | ||||
| h'89abcdeffedcba9876543210' ], | ||||
| / size / 12 : 34768, | ||||
| }, | ||||
| / condition-vendor-id / 1, None, | ||||
| / condition-class-id / 2, None, | ||||
| ], | ||||
| }, | ||||
| / apply-image / 9 : h'860c0013a106781b687474703a2f2f6578616d70' | ||||
| h'6c652e636f6d2f66696c652e62696e15f6' \ [ | ||||
| / set-component-index / 12, 0, | ||||
| / set-vars / 19, { | ||||
| / uri / 6 : http://example.com/file.bin, | ||||
| }, | ||||
| / fetch / 21, None, | ||||
| ], | ||||
| / run-image / 12 : h'8e0c0003f60c0113a10a0015f603f617f6' \ [ | ||||
| / set-component-index / 12, 0, | ||||
| / condition-image / 3, None, | ||||
| / set-component-index / 12, 1, | ||||
| / set-vars / 19, { | ||||
| / source-component / 10 : 0, | ||||
| }, | ||||
| / fetch / 21, None, | ||||
| / condition-image / 3, None, | ||||
| / run / 23, None, | ||||
| ], | ||||
| } | ||||
| } | ||||
| Total size of outer wrapper without COSE authentication object: 236 | ||||
| Outer: | Manifest: | |||
| a201f60258e6a5010102040358a3a20254828245466c61736843003401824352414d4200 | a10358d6a70101020403585fa2024782814100814101045852880c000150 | |||
| 040458898e13a20350fa6b4a53d5ad5fdfbe9de663e4d41ffe04501492af1425695e48bf | fa6b4a53d5ad5fdfbe9de663e4d41ffe02501492af1425695e48bf429b2d | |||
| 429b2d51f2ab450c0013a20b58248202582000112233445566778899aabbccddeeff0123 | 51f2ab4514a20b8202582000112233445566778899aabbccddeeff012345 | |||
| 456789abcdeffedcba98765432100c1987d00c0113a20b58248202582000112233445566 | 6789abcdeffedcba98765432100c1987d0095827880c0013a106781b6874 | |||
| 778899aabbccddeeff0123456789abcdeffedcba98765432100c1987d001f602f6095825 | 74703a2f2f6578616d706c652e636f6d2f66696c652e62696e15f603f60a | |||
| 860c0013a106781b687474703a2f2f6578616d706c652e636f6d2f66696c652e62696e15 | 45840c0003f60b5834880c0114a30a000b82025820001122334455667788 | |||
| f60c518e0c0003f60c0113a10a0015f603f617f6 | 99aabbccddeeff0123456789abcdeffedcba98765432100c1987d016f603 | |||
| f60c45840c0117f6 | ||||
| Total size of outer wrapper with COSE authentication object: 321 | Total size of manifest with COSE authentication object: 333 | |||
| Signed Outer: | Manifest with COSE authentication object: | |||
| a2015854d28443a10126a1044874657374206b6579f6584070eb70f2552533fc954e934f | a202587081d28443a10126a0582482025820bb008f57fd1babff8cc432d1 | |||
| 50f42bdd9b6f7d4fd7e114636b9cdbef2a065f9640243a7857f66c4389aea906c4f3b451 | 8c4c9cfc69d7e8ab76b07cc910c6d03ec598baab58409e98c58fcd826684 | |||
| 50c8e55461e9bfda945904033fc70a840258e6a5010102040358a3a20254828245466c61 | 43a0249fa5eab10474a099572dfb31c0d2adf750f57c4987d484badf8524 | |||
| 736843003401824352414d4200040458898e13a20350fa6b4a53d5ad5fdfbe9de663e4d4 | a20a9e92c4599698eb696254d4c0f77947c8af353b544600ea110358d6a7 | |||
| 1ffe04501492af1425695e48bf429b2d51f2ab450c0013a20b5824820258200011223344 | 0101020403585fa2024782814100814101045852880c000150fa6b4a53d5 | |||
| 5566778899aabbccddeeff0123456789abcdeffedcba98765432100c1987d00c0113a20b | ad5fdfbe9de663e4d41ffe02501492af1425695e48bf429b2d51f2ab4514 | |||
| 58248202582000112233445566778899aabbccddeeff0123456789abcdeffedcba987654 | a20b8202582000112233445566778899aabbccddeeff0123456789abcdef | |||
| 32100c1987d001f602f6095825860c0013a106781b687474703a2f2f6578616d706c652e | fedcba98765432100c1987d0095827880c0013a106781b687474703a2f2f | |||
| 636f6d2f66696c652e62696e15f60c518e0c0003f60c0113a10a0015f603f617f6 | 6578616d706c652e636f6d2f66696c652e62696e15f603f60a45840c0003 | |||
| f60b5834880c0114a30a000b8202582000112233445566778899aabbccdd | ||||
| eeff0123456789abcdeffedcba98765432100c1987d016f603f60c45840c | ||||
| 0117f6 | ||||
| 12.5. Example 4: | 12.5. Example 4: Load and Decompress from External Storage | |||
| Compatibility test, simultaneous download and installation, load and | Compatibility test, simultaneous download and installation, load and | |||
| decompress from external storage, and secure boot. | decompress from external storage, and secure boot. | |||
| The following JSON shows the intended behaviour of the manifest. | { | |||
| / authentication-wrapper / 2:h'81d28443a10126a0582482025820b973e24 | ||||
| { | 24d03de20c59cb702607a83796dd465674115ae84b3c2c472794dbb8c5840be0ae3d36 | |||
| "structure-version": 1, | 0e46dd07f02547ff19e4a1557b7bfce401718ade8200918f191a50dca84148704f76d9 | |||
| "sequence-number": 5, | 7a8c239615114eab0617e9fc9d4faeac1572e7cae61e660c1' / [ | |||
| "common": { | 18([ | |||
| "common-sequence": [ | / protected / h'a10126' / { | |||
| { | / alg / 1:-7 / ES256 /, | |||
| "directive-set-var": { | } /, | |||
| "vendor-id": "fa6b4a53-d5ad-5fdf-be9d-e663e4d41ffe", | / unprotected / { | |||
| "class-id": "1492af14-2569-5e48-bf42-9b2d51f2ab45" | }, | |||
| } | / payload / h'82025820b973e2424d03de20c59cb702607a8379 | |||
| }, | 6dd465674115ae84b3c2c472794dbb8c' / [ | |||
| { "directive-set-component": 0 }, | / algorithm-id / 2 / sha256 /, | |||
| { | / digest-bytes / | |||
| "directive-set-var": { | h'b973e2424d03de20c59cb702607a83796dd465674115ae84b3c2c472794dbb8c' | |||
| "digest": "00112233445566778899aabbccddeeff" | ] /, | |||
| "0123456789abcdeffedcba9876543210", | / signature / h'be0ae3d360e46dd07f02547ff19e4a1557b7bf | |||
| "size": 34768 | ce401718ade8200918f191a50dca84148704f76d97a8c239615114eab0617e9fc9d4fa | |||
| } | eac1572e7cae61e660c1' | |||
| }, | ]) | |||
| { "directive-set-component": 1 }, | ] /, | |||
| { | / manifest / 3:h'a70101020503585fa2024782814100814101045852880c000 | |||
| "directive-set-var": { | 150fa6b4a53d5ad5fdfbe9de663e4d41ffe02501492af1425695e48bf429b2d51f2ab4 | |||
| "digest": "0123456789abcdeffedcba9876543210" | 514a20b8202582000112233445566778899aabbccddeeff0123456789abcdeffedcba9 | |||
| "00112233445566778899aabbccddeeff", | 8765432100c1987d0095827880c0013a106781b687474703a2f2f6578616d706c652e6 | |||
| "size": 34768 | 36f6d2f66696c652e62696e15f603f60a45840c0003f60b5836880c0114a408010a000 | |||
| } | b8202582000112233445566778899aabbccddeeff0123456789abcdeffedcba9876543 | |||
| }, | 2100c1987d016f603f60c45840c0117f6' / { | |||
| { "condition-vendor-id": null }, | / manifest-version / 1:1, | |||
| { "condition-class-id": null } | / manifest-sequence-number / 2:5, | |||
| ], | / common / 3:h'a2024782814100814101045852880c000150fa6b4a53d5a | |||
| "components": [ | d5fdfbe9de663e4d41ffe02501492af1425695e48bf429b2d51f2ab4514a20b8202582 | |||
| [ | 000112233445566778899aabbccddeeff0123456789abcdeffedcba98765432100c198 | |||
| "Flash", | 7d0' / { | |||
| 78848 | / components / 2:h'82814100814101' / [ | |||
| ], | [h'00'] , | |||
| [ | [h'01'] | |||
| "RAM", | ] /, | |||
| 1024 | / common-sequence / 4:h'880c000150fa6b4a53d5ad5fdfbe9de663 | |||
| ] | e4d41ffe02501492af1425695e48bf429b2d51f2ab4514a20b82025820001122334455 | |||
| ] | 66778899aabbccddeeff0123456789abcdeffedcba98765432100c1987d0' / [ | |||
| }, | / directive-set-component-index / 12,0 , | |||
| "apply-image": [ | / condition-vendor-identifier / | |||
| { "directive-set-component": 0 }, | 1,h'fa6b4a53d5ad5fdfbe9de663e4d41ffe' / fa6b4a53-d5ad-5fdf- | |||
| { | be9d-e663e4d41ffe / , | |||
| "directive-set-var": { | / condition-class-identifier / | |||
| "uri": "http://example.com/file.bin" | 2,h'1492af1425695e48bf429b2d51f2ab45' / | |||
| } | 1492af14-2569-5e48-bf42-9b2d51f2ab45 / , | |||
| }, | / directive-override-parameters / 20,{ | |||
| { "directive-fetch": null } | / image-digest / 11:[ | |||
| ], | / algorithm-id / 2 / sha256 /, | |||
| "load-image": [ | / digest-bytes / | |||
| { "directive-set-component": 0 }, | h'00112233445566778899aabbccddeeff0123456789abcdeffedcba9876543210' | |||
| { "condition-image": null }, | ], | |||
| { "directive-set-component": 1 }, | / image-size / 12:34768, | |||
| { | } | |||
| "directive-set-var": { | ] /, | |||
| "source-index": 0, | } /, | |||
| "compression-info": { | / install / 9:h'880c0013a106781b687474703a2f2f6578616d706c652e | |||
| "algorithm": "gzip" | 636f6d2f66696c652e62696e15f603f6' / [ | |||
| } | / directive-set-component-index / 12,0 , | |||
| } | / directive-set-parameters / 19,{ | |||
| }, | / uri / 6:'http://example.com/file.bin', | |||
| { "directive-copy": null } | } , | |||
| / directive-fetch / 21,F6 / nil / , | ||||
| ], | / condition-image-match / 3,F6 / nil / | |||
| "run-image": [ | ] /, | |||
| { "condition-image": null }, | / validate / 10:h'840c0003f6' / [ | |||
| { "directive-run": null } | / directive-set-component-index / 12,0 , | |||
| ] | / condition-image-match / 3,F6 / nil / | |||
| } | ] /, | |||
| / load / 11:h'880c0114a408010a000b8202582000112233445566778899 | ||||
| Converted into the SUIT manifest, this produces: | aabbccddeeff0123456789abcdeffedcba98765432100c1987d016f603f6' / [ | |||
| / directive-set-component-index / 12,1 , | ||||
| { | / directive-override-parameters / 20,{ | |||
| / auth object / 1 : h'd28443a10126a1044874657374206b6579f658403491' | / image-digest / 11:[ | |||
| h'5619c1ef02b4a7ffbbb69083e8b3fb82febd9ecd6feb' | / algorithm-id / 2 / sha256 /, | |||
| h'f666d700fb981b208ec6d3df8735f36fd4a0a84e0189' | / digest-bytes / | |||
| h'43ef80e25f57fc130a43e57c6634f337b7fa', | h'00112233445566778899aabbccddeeff0123456789abcdeffedcba9876543210' | |||
| / manifest / 2 : h'a6010102050358a3a20254828245466c6173684300340182' | ], | |||
| h'4352414d4200040458898e13a20350fa6b4a53d5ad5fdfbe' | / image-size / 12:34768, | |||
| h'9de663e4d41ffe04501492af1425695e48bf429b2d51f2ab' | / source-component / 10:0 / [h'00'] /, | |||
| h'450c0013a20b58248202582000112233445566778899aabb' | / compression-info / 8:1 / gzip /, | |||
| h'ccddeeff0123456789abcdeffedcba98765432100c1987d0' | } , | |||
| h'0c0113a20b5824820258200123456789abcdeffedcba9876' | / directive-copy / 22,None , | |||
| h'54321000112233445566778899aabbccddeeff0c1987d001' | / condition-image-match / 3,F6 / nil / | |||
| h'f602f6095825860c0013a106781b687474703a2f2f657861' | ] /, | |||
| h'6d706c652e636f6d2f66696c652e62696e15f60b528a0c00' | / run / 12:h'840c0117f6' / [ | |||
| h'03f60c0113a20843a101010a0016f60c458403f617f6' \ | / directive-set-component-index / 12,1 , | |||
| { | / directive-run / 23,None | |||
| / structure-version / 1 : 1, | ] /, | |||
| / sequence-number / 2 : 5, | } /, | |||
| / common / 3 : h'a20254828245466c61736843003401824352414d420004' | } | |||
| h'0458898e13a20350fa6b4a53d5ad5fdfbe9de663e4d41f' | ||||
| h'fe04501492af1425695e48bf429b2d51f2ab450c0013a2' | ||||
| h'0b58248202582000112233445566778899aabbccddeeff' | ||||
| h'0123456789abcdeffedcba98765432100c1987d00c0113' | ||||
| h'a20b5824820258200123456789abcdeffedcba98765432' | ||||
| h'1000112233445566778899aabbccddeeff0c1987d001f6' | ||||
| h'02f6' \ { | ||||
| / components / 2 : h'828245466c61736843003401824352414d4200' | ||||
| h'04' \ | ||||
| [ | ||||
| [h'466c617368', h'003401'], | ||||
| [h'52414d', h'0004'], | ||||
| ], | ||||
| / common-sequence / 4 : h'8e13a20350fa6b4a53d5ad5fdfbe9de6' | ||||
| h'63e4d41ffe04501492af1425695e48bf' | ||||
| h'429b2d51f2ab450c0013a20b58248202' | ||||
| h'582000112233445566778899aabbccdd' | ||||
| h'eeff0123456789abcdeffedcba987654' | ||||
| h'32100c1987d00c0113a20b5824820258' | ||||
| h'200123456789abcdeffedcba98765432' | ||||
| h'1000112233445566778899aabbccddee' | ||||
| h'ff0c1987d001f602f6' \ [ | ||||
| / set-vars / 19, { | ||||
| / vendor-id / 3 : h'fa6b4a53d5ad5fdfbe9de663e4d41f' | ||||
| h'fe', | ||||
| / class-id / 4 : h'1492af1425695e48bf429b2d51f2ab45', | ||||
| }, | ||||
| / set-component-index / 12, 0, | ||||
| / set-vars / 19, { | ||||
| / digest / 11 : h'8202582000112233445566778899aabb' | ||||
| h'ccddeeff0123456789abcdeffedcba98' | ||||
| h'76543210' \ | ||||
| [ 2, h'00112233445566778899aabbccddeeff01234567' | ||||
| h'89abcdeffedcba9876543210' ], | ||||
| / size / 12 : 34768, | ||||
| }, | ||||
| / set-component-index / 12, 1, | ||||
| / set-vars / 19, { | ||||
| / digest / 11 : h'820258200123456789abcdeffedcba98' | ||||
| h'7654321000112233445566778899aabb' | ||||
| h'ccddeeff' \ | ||||
| [ 2, h'0123456789abcdeffedcba987654321000112233' | ||||
| h'445566778899aabbccddeeff' ], | ||||
| / size / 12 : 34768, | ||||
| }, | ||||
| / condition-vendor-id / 1, None, | ||||
| / condition-class-id / 2, None, | ||||
| ], | ||||
| }, | ||||
| / apply-image / 9 : h'860c0013a106781b687474703a2f2f6578616d70' | ||||
| h'6c652e636f6d2f66696c652e62696e15f6' \ [ | ||||
| / set-component-index / 12, 0, | ||||
| / set-vars / 19, { | ||||
| / uri / 6 : http://example.com/file.bin, | ||||
| }, | ||||
| / fetch / 21, None, | ||||
| ], | ||||
| / load-image / 11 : h'8a0c0003f60c0113a20843a101010a0016f6' \ [ | ||||
| / set-component-index / 12, 0, | ||||
| / condition-image / 3, None, | ||||
| / set-component-index / 12, 1, | ||||
| / set-vars / 19, { | ||||
| / compression-info / 8 : h'a10101', | ||||
| / source-component / 10 : 0, | ||||
| }, | ||||
| / copy / 22, None, | ||||
| ], | ||||
| / run-image / 12 : h'8403f617f6' \ [ | ||||
| / condition-image / 3, None, | ||||
| / run / 23, None, | ||||
| ], | ||||
| } | ||||
| } | ||||
| Total size of outer wrapper without COSE authentication object: 244 | Total size of manifest without COSE authentication object: 220 | |||
| Outer: | Manifest: | |||
| a201f60258eea6010102050358a3a20254828245466c61736843003401824352414d4200 | a10358d8a70101020503585fa2024782814100814101045852880c000150 | |||
| 040458898e13a20350fa6b4a53d5ad5fdfbe9de663e4d41ffe04501492af1425695e48bf | fa6b4a53d5ad5fdfbe9de663e4d41ffe02501492af1425695e48bf429b2d | |||
| 429b2d51f2ab450c0013a20b58248202582000112233445566778899aabbccddeeff0123 | 51f2ab4514a20b8202582000112233445566778899aabbccddeeff012345 | |||
| 456789abcdeffedcba98765432100c1987d00c0113a20b5824820258200123456789abcd | 6789abcdeffedcba98765432100c1987d0095827880c0013a106781b6874 | |||
| effedcba987654321000112233445566778899aabbccddeeff0c1987d001f602f6095825 | 74703a2f2f6578616d706c652e636f6d2f66696c652e62696e15f603f60a | |||
| 860c0013a106781b687474703a2f2f6578616d706c652e636f6d2f66696c652e62696e15 | 45840c0003f60b5836880c0114a408010a000b8202582000112233445566 | |||
| f60b528a0c0003f60c0113a20843a101010a0016f60c458403f617f6 | 778899aabbccddeeff0123456789abcdeffedcba98765432100c1987d016 | |||
| f603f60c45840c0117f6 | ||||
| Total size of outer wrapper with COSE authentication object: 329 | Total size of manifest with COSE authentication object: 335 | |||
| Signed Outer: | Manifest with COSE authentication object: | |||
| a2015854d28443a10126a1044874657374206b6579f6584034915619c1ef02b4a7ffbbb6 | a202587081d28443a10126a0582482025820b973e2424d03de20c59cb702 | |||
| 9083e8b3fb82febd9ecd6febf666d700fb981b208ec6d3df8735f36fd4a0a84e018943ef | 607a83796dd465674115ae84b3c2c472794dbb8c5840be0ae3d360e46dd0 | |||
| 80e25f57fc130a43e57c6634f337b7fa0258eea6010102050358a3a20254828245466c61 | 7f02547ff19e4a1557b7bfce401718ade8200918f191a50dca84148704f7 | |||
| 736843003401824352414d4200040458898e13a20350fa6b4a53d5ad5fdfbe9de663e4d4 | 6d97a8c239615114eab0617e9fc9d4faeac1572e7cae61e660c10358d8a7 | |||
| 1ffe04501492af1425695e48bf429b2d51f2ab450c0013a20b5824820258200011223344 | 0101020503585fa2024782814100814101045852880c000150fa6b4a53d5 | |||
| 5566778899aabbccddeeff0123456789abcdeffedcba98765432100c1987d00c0113a20b | ad5fdfbe9de663e4d41ffe02501492af1425695e48bf429b2d51f2ab4514 | |||
| 5824820258200123456789abcdeffedcba987654321000112233445566778899aabbccdd | a20b8202582000112233445566778899aabbccddeeff0123456789abcdef | |||
| eeff0c1987d001f602f6095825860c0013a106781b687474703a2f2f6578616d706c652e | fedcba98765432100c1987d0095827880c0013a106781b687474703a2f2f | |||
| 636f6d2f66696c652e62696e15f60b528a0c0003f60c0113a20843a101010a0016f60c45 | 6578616d706c652e636f6d2f66696c652e62696e15f603f60a45840c0003 | |||
| 8403f617f6 | f60b5836880c0114a408010a000b8202582000112233445566778899aabb | |||
| ccddeeff0123456789abcdeffedcba98765432100c1987d016f603f60c45 | ||||
| 840c0117f6 | ||||
| 12.6. Example 5: | 12.6. Example 5: Compatibility Test, Download, Installation, and Secure | |||
| Boot | ||||
| Compatibility test, download, installation, and secure boot. | Compatibility test, download, installation, and secure boot. | |||
| The following JSON shows the intended behaviour of the manifest. | { | |||
| / authentication-wrapper / 2:h'81d28443a10126a05824820258207f35fdc | ||||
| { | e6a55bed88d04497d38b7c2b4ffd1ddb74a83d9acd252d2077637de7058407bec97551 | |||
| "structure-version": 1, | 827d684ac07b77c3f663f4f9436aff0b79fdfd89061bfe9bddb73919c88d32dc52fd9e | |||
| "sequence-number": 6, | b1d1ea34172eef5c222e7d897778c6b0254e20c7e87942ae1' / [ | |||
| "common": { | 18([ | |||
| "common-sequence": [ | / protected / h'a10126' / { | |||
| { | / alg / 1:-7 / ES256 /, | |||
| "directive-set-var": { | } /, | |||
| "vendor-id": "fa6b4a53-d5ad-5fdf-be9d-e663e4d41ffe", | / unprotected / { | |||
| "class-id": "1492af14-2569-5e48-bf42-9b2d51f2ab45" | }, | |||
| / payload / h'820258207f35fdce6a55bed88d04497d38b7c2b4 | ||||
| } | ffd1ddb74a83d9acd252d2077637de70' / [ | |||
| }, | / algorithm-id / 2 / sha256 /, | |||
| { "directive-set-component": 0 }, | / digest-bytes / | |||
| { | h'7f35fdce6a55bed88d04497d38b7c2b4ffd1ddb74a83d9acd252d2077637de70' | |||
| "directive-set-var": { | ] /, | |||
| "digest": "00112233445566778899aabbccddeeff" | / signature / h'7bec97551827d684ac07b77c3f663f4f9436af | |||
| "0123456789abcdeffedcba9876543210", | f0b79fdfd89061bfe9bddb73919c88d32dc52fd9eb1d1ea34172eef5c222e7d897778c | |||
| "size": 34768 | 6b0254e20c7e87942ae1' | |||
| } | ]) | |||
| }, | ] /, | |||
| { "directive-set-component": 1 }, | / manifest / 3:h'a70101020503585fa2024782814100814101045852880c000 | |||
| { | 150fa6b4a53d5ad5fdfbe9de663e4d41ffe02501492af1425695e48bf429b2d51f2ab4 | |||
| "directive-set-var": { | 514a20b8202582000112233445566778899aabbccddeeff0123456789abcdeffedcba9 | |||
| "digest": "0123456789abcdeffedcba9876543210" | 8765432100c1987d008584c880c0113a206781b687474703a2f2f6578616d706c652e6 | |||
| "00112233445566778899aabbccddeeff", | 36f6d2f66696c652e62696e0b8202582000112233445566778899aabbccddeeff01234 | |||
| "size": 34768 | 56789abcdeffedcba987654321015f603f6094d8a0c0013a10a0116f60c0103f60a458 | |||
| } | 40c0003f60c45840c0017f6' / { | |||
| }, | / manifest-version / 1:1, | |||
| { "condition-vendor-id": null }, | / manifest-sequence-number / 2:5, | |||
| { "condition-class-id": null } | / common / 3:h'a2024782814100814101045852880c000150fa6b4a53d5a | |||
| ], | d5fdfbe9de663e4d41ffe02501492af1425695e48bf429b2d51f2ab4514a20b8202582 | |||
| "components": [ | 000112233445566778899aabbccddeeff0123456789abcdeffedcba98765432100c198 | |||
| [ | 7d0' / { | |||
| "ext-Flash", | / components / 2:h'82814100814101' / [ | |||
| 78848 | [h'00'] , | |||
| ], | [h'01'] | |||
| [ | ] /, | |||
| "Flash", | / common-sequence / 4:h'880c000150fa6b4a53d5ad5fdfbe9de663 | |||
| 1024 | e4d41ffe02501492af1425695e48bf429b2d51f2ab4514a20b82025820001122334455 | |||
| ] | 66778899aabbccddeeff0123456789abcdeffedcba98765432100c1987d0' / [ | |||
| ] | / directive-set-component-index / 12,0 , | |||
| }, | / condition-vendor-identifier / | |||
| "apply-image": [ | 1,h'fa6b4a53d5ad5fdfbe9de663e4d41ffe' / fa6b4a53-d5ad-5fdf- | |||
| { "directive-set-component": 0 }, | be9d-e663e4d41ffe / , | |||
| { | / condition-class-identifier / | |||
| "directive-set-var": { | 2,h'1492af1425695e48bf429b2d51f2ab45' / | |||
| "uri": "http://example.com/file.bin" | 1492af14-2569-5e48-bf42-9b2d51f2ab45 / , | |||
| } | / directive-override-parameters / 20,{ | |||
| }, | / image-digest / 11:[ | |||
| { "directive-fetch": null } | / algorithm-id / 2 / sha256 /, | |||
| ], | / digest-bytes / | |||
| "load-image": [ | h'00112233445566778899aabbccddeeff0123456789abcdeffedcba9876543210' | |||
| { "directive-set-component": 1 }, | ], | |||
| { "condition-not-image": null }, | / image-size / 12:34768, | |||
| { "directive-set-component": 0 }, | } | |||
| { "condition-image": null }, | ] /, | |||
| { "directive-set-component": 1 }, | } /, | |||
| { | / payload-fetch / 8:h'880c0113a206781b687474703a2f2f6578616d70 | |||
| "directive-set-var": { | 6c652e636f6d2f66696c652e62696e0b8202582000112233445566778899aabbccddee | |||
| "source-index": 0 | ff0123456789abcdeffedcba987654321015f603f6' / [ | |||
| } | / directive-set-component-index / 12,1 , | |||
| }, | / directive-set-parameters / 19,{ | |||
| { "directive-fetch": null } | / image-digest / 11:[ | |||
| ], | / algorithm-id / 2 / sha256 /, | |||
| "run-image": [ | / digest-bytes / | |||
| { "directive-set-component": 1 }, | h'00112233445566778899aabbccddeeff0123456789abcdeffedcba9876543210' | |||
| { "condition-image": null }, | ], | |||
| { "directive-run": null } | / uri / 6:'http://example.com/file.bin', | |||
| ] | } , | |||
| } | / directive-fetch / 21,F6 / nil / , | |||
| / condition-image-match / 3,F6 / nil / | ||||
| Converted into the SUIT manifest, this produces: | ] /, | |||
| / install / 9:h'8a0c0013a10a0116f60c0103f6' / [ | ||||
| / directive-set-component-index / 12,0 , | ||||
| / directive-set-parameters / 19,{ | ||||
| / source-component / 10:1 / [h'01'] /, | ||||
| } , | ||||
| / directive-copy / 22,None , | ||||
| / directive-set-component-index / 12,1 , | ||||
| / condition-image-match / 3,F6 / nil / | ||||
| ] /, | ||||
| / validate / 10:h'840c0003f6' / [ | ||||
| / directive-set-component-index / 12,0 , | ||||
| / condition-image-match / 3,F6 / nil / | ||||
| ] /, | ||||
| / run / 12:h'840c0017f6' / [ | ||||
| / directive-set-component-index / 12,0 , | ||||
| / directive-run / 23,None | ||||
| ] /, | ||||
| { | } /, | |||
| / auth object / 1 : h'd28443a10126a1044874657374206b6579f65840a516' | } | |||
| h'466c62602aa017422f23d1469339e40c5cf06f9090da' | ||||
| h'09bd9939ecfc4c1ffe3e6ce50e0620fe9948f76552da' | ||||
| h'703a4c0bf2532d073be2d1f215ec83483f46', | ||||
| / manifest / 2 : h'a6010102060358a6a202578282467b1b4595ab2143003401' | ||||
| h'8245466c6173684200040458898e13a20350fa6b4a53d5ad' | ||||
| h'5fdfbe9de663e4d41ffe04501492af1425695e48bf429b2d' | ||||
| h'51f2ab450c0013a20b582482025820001122334455667788' | ||||
| h'99aabbccddeeff0123456789abcdeffedcba98765432100c' | ||||
| h'1987d00c0113a20b5824820258200123456789abcdeffedc' | ||||
| h'ba987654321000112233445566778899aabbccddeeff0c19' | ||||
| h'87d001f602f6095825860c0013a106781b687474703a2f2f' | ||||
| h'6578616d706c652e636f6d2f66696c652e62696e15f60b52' | ||||
| h'8e0c011819f60c0003f60c0113a10a0015f60c47860c0103' | ||||
| h'f617f6' \ | ||||
| { | ||||
| / structure-version / 1 : 1, | ||||
| / sequence-number / 2 : 6, | ||||
| / common / 3 : h'a202578282467b1b4595ab21430034018245466c617368' | ||||
| h'4200040458898e13a20350fa6b4a53d5ad5fdfbe9de663' | ||||
| h'e4d41ffe04501492af1425695e48bf429b2d51f2ab450c' | ||||
| h'0013a20b58248202582000112233445566778899aabbcc' | ||||
| h'ddeeff0123456789abcdeffedcba98765432100c1987d0' | ||||
| h'0c0113a20b5824820258200123456789abcdeffedcba98' | ||||
| h'7654321000112233445566778899aabbccddeeff0c1987' | ||||
| h'd001f602f6' \ { | ||||
| / components / 2 : h'8282467b1b4595ab21430034018245466c6173' | ||||
| h'68420004' \ | ||||
| [ | ||||
| [h'7b1b4595ab21', h'003401'], | ||||
| [h'466c617368', h'0004'], | ||||
| ], | ||||
| / common-sequence / 4 : h'8e13a20350fa6b4a53d5ad5fdfbe9de6' | ||||
| h'63e4d41ffe04501492af1425695e48bf' | ||||
| h'429b2d51f2ab450c0013a20b58248202' | ||||
| h'582000112233445566778899aabbccdd' | ||||
| h'eeff0123456789abcdeffedcba987654' | ||||
| h'32100c1987d00c0113a20b5824820258' | ||||
| h'200123456789abcdeffedcba98765432' | ||||
| h'1000112233445566778899aabbccddee' | ||||
| h'ff0c1987d001f602f6' \ [ | ||||
| / set-vars / 19, { | ||||
| / vendor-id / 3 : h'fa6b4a53d5ad5fdfbe9de663e4d41f' | ||||
| h'fe', | ||||
| / class-id / 4 : h'1492af1425695e48bf429b2d51f2ab45', | ||||
| }, | ||||
| / set-component-index / 12, 0, | ||||
| / set-vars / 19, { | ||||
| / digest / 11 : h'8202582000112233445566778899aabb' | ||||
| h'ccddeeff0123456789abcdeffedcba98' | ||||
| h'76543210' \ | ||||
| [ 2, h'00112233445566778899aabbccddeeff01234567' | ||||
| h'89abcdeffedcba9876543210' ], | ||||
| / size / 12 : 34768, | ||||
| }, | ||||
| / set-component-index / 12, 1, | ||||
| / set-vars / 19, { | ||||
| / digest / 11 : h'820258200123456789abcdeffedcba98' | ||||
| h'7654321000112233445566778899aabb' | ||||
| h'ccddeeff' \ | ||||
| [ 2, h'0123456789abcdeffedcba987654321000112233' | ||||
| h'445566778899aabbccddeeff' ], | ||||
| / size / 12 : 34768, | ||||
| }, | ||||
| / condition-vendor-id / 1, None, | ||||
| / condition-class-id / 2, None, | ||||
| ], | ||||
| }, | ||||
| / apply-image / 9 : h'860c0013a106781b687474703a2f2f6578616d70' | ||||
| h'6c652e636f6d2f66696c652e62696e15f6' \ [ | ||||
| / set-component-index / 12, 0, | ||||
| / set-vars / 19, { | ||||
| / uri / 6 : http://example.com/file.bin, | ||||
| }, | ||||
| / fetch / 21, None, | ||||
| ], | ||||
| / load-image / 11 : h'8e0c011819f60c0003f60c0113a10a0015f6' \ [ | ||||
| / set-component-index / 12, 1, | ||||
| / condition-not-image / 25, None, | ||||
| / set-component-index / 12, 0, | ||||
| / condition-image / 3, None, | ||||
| / set-component-index / 12, 1, | ||||
| / set-vars / 19, { | ||||
| / source-component / 10 : 0, | ||||
| }, | ||||
| / fetch / 21, None, | ||||
| ], | ||||
| / run-image / 12 : h'860c0103f617f6' \ [ | ||||
| / set-component-index / 12, 1, | ||||
| / condition-image / 3, None, | ||||
| / run / 23, None, | ||||
| ], | ||||
| } | ||||
| } | ||||
| Total size of outer wrapper without COSE authentication object: 249 | Total size of manifest without COSE authentication object: 215 | |||
| Outer: | Manifest: | |||
| a201f60258f3a6010102060358a6a202578282467b1b4595ab21430034018245466c6173 | a10358d3a70101020503585fa2024782814100814101045852880c000150 | |||
| 684200040458898e13a20350fa6b4a53d5ad5fdfbe9de663e4d41ffe04501492af142569 | fa6b4a53d5ad5fdfbe9de663e4d41ffe02501492af1425695e48bf429b2d | |||
| 5e48bf429b2d51f2ab450c0013a20b58248202582000112233445566778899aabbccddee | 51f2ab4514a20b8202582000112233445566778899aabbccddeeff012345 | |||
| ff0123456789abcdeffedcba98765432100c1987d00c0113a20b58248202582001234567 | 6789abcdeffedcba98765432100c1987d008584c880c0113a206781b6874 | |||
| 89abcdeffedcba987654321000112233445566778899aabbccddeeff0c1987d001f602f6 | 74703a2f2f6578616d706c652e636f6d2f66696c652e62696e0b82025820 | |||
| 095825860c0013a106781b687474703a2f2f6578616d706c652e636f6d2f66696c652e62 | 00112233445566778899aabbccddeeff0123456789abcdeffedcba987654 | |||
| 696e15f60b528e0c011819f60c0003f60c0113a10a0015f60c47860c0103f617f6 | 321015f603f6094d8a0c0013a10a0116f60c0103f60a45840c0003f60c45 | |||
| 840c0017f6 | ||||
| Total size of outer wrapper with COSE authentication object: 334 | Total size of manifest with COSE authentication object: 330 | |||
| Signed Outer: | Manifest with COSE authentication object: | |||
| a2015854d28443a10126a1044874657374206b6579f65840a516466c62602aa017422f23 | a202587081d28443a10126a05824820258207f35fdce6a55bed88d04497d | |||
| d1469339e40c5cf06f9090da09bd9939ecfc4c1ffe3e6ce50e0620fe9948f76552da703a | 38b7c2b4ffd1ddb74a83d9acd252d2077637de7058407bec97551827d684 | |||
| 4c0bf2532d073be2d1f215ec83483f460258f3a6010102060358a6a202578282467b1b45 | ac07b77c3f663f4f9436aff0b79fdfd89061bfe9bddb73919c88d32dc52f | |||
| 95ab21430034018245466c6173684200040458898e13a20350fa6b4a53d5ad5fdfbe9de6 | d9eb1d1ea34172eef5c222e7d897778c6b0254e20c7e87942ae10358d3a7 | |||
| 63e4d41ffe04501492af1425695e48bf429b2d51f2ab450c0013a20b5824820258200011 | 0101020503585fa2024782814100814101045852880c000150fa6b4a53d5 | |||
| 2233445566778899aabbccddeeff0123456789abcdeffedcba98765432100c1987d00c01 | ad5fdfbe9de663e4d41ffe02501492af1425695e48bf429b2d51f2ab4514 | |||
| 13a20b5824820258200123456789abcdeffedcba987654321000112233445566778899aa | a20b8202582000112233445566778899aabbccddeeff0123456789abcdef | |||
| bbccddeeff0c1987d001f602f6095825860c0013a106781b687474703a2f2f6578616d70 | fedcba98765432100c1987d008584c880c0113a206781b687474703a2f2f | |||
| 6c652e636f6d2f66696c652e62696e15f60b528e0c011819f60c0003f60c0113a10a0015 | 6578616d706c652e636f6d2f66696c652e62696e0b820258200011223344 | |||
| f60c47860c0103f617f6 | 5566778899aabbccddeeff0123456789abcdeffedcba987654321015f603 | |||
| f6094d8a0c0013a10a0116f60c0103f60a45840c0003f60c45840c0017f6 | ||||
| 12.7. Example 6: | 12.7. Example 6: Two Images | |||
| Compatibility test, 2 images, simultaneous download and installation, | Compatibility test, 2 images, simultaneous download and installation, | |||
| and secure boot. | and secure boot. | |||
| The following JSON shows the intended behaviour of the manifest. | { | |||
| / authentication-wrapper / 2:h'81d28443a10126a058248202582007954f5 | ||||
| { | 19cdd8101156768fbe12f23eb5ca73481e91ca4801bf94dc82f52b0ea5840a76e7f712 | |||
| "structure-version": 1, | b8d3ed6bcf79eaef8f15ee76f8da15aa16b220431f528d5cc237f95688748a156c8ee8 | |||
| "sequence-number": 7, | 47c517b0c660328a7877be52b1902f50e7acecc4bbd6c439f' / [ | |||
| "common": { | 18([ | |||
| "common-sequence": [ | / protected / h'a10126' / { | |||
| { | / alg / 1:-7 / ES256 /, | |||
| "directive-set-var": { | } /, | |||
| "vendor-id": "fa6b4a53-d5ad-5fdf-be9d-e663e4d41ffe", | / unprotected / { | |||
| "class-id": "1492af14-2569-5e48-bf42-9b2d51f2ab45" | }, | |||
| } | / payload / h'8202582007954f519cdd8101156768fbe12f23eb | |||
| }, | 5ca73481e91ca4801bf94dc82f52b0ea' / [ | |||
| { "directive-set-component": 0 }, | / algorithm-id / 2 / sha256 /, | |||
| { | / digest-bytes / | |||
| "directive-set-var": { | h'07954f519cdd8101156768fbe12f23eb5ca73481e91ca4801bf94dc82f52b0ea' | |||
| "digest": "00112233445566778899aabbccddeeff" | ] /, | |||
| "0123456789abcdeffedcba9876543210", | / signature / h'a76e7f712b8d3ed6bcf79eaef8f15ee76f8da1 | |||
| "size": 34768 | 5aa16b220431f528d5cc237f95688748a156c8ee847c517b0c660328a7877be52b1902 | |||
| } | f50e7acecc4bbd6c439f' | |||
| }, | ]) | |||
| { "directive-set-component": 1 }, | ] /, | |||
| { | / manifest / 3:h'a60101020303588ea20247828141008141010458818c0c000 | |||
| "directive-set-var": { | 150fa6b4a53d5ad5fdfbe9de663e4d41ffe02501492af1425695e48bf429b2d51f2ab4 | |||
| "digest": "0123456789abcdeffedcba9876543210" | 514a20b8202582000112233445566778899aabbccddeeff0123456789abcdeffedcba9 | |||
| "00112233445566778899aabbccddeeff", | 8765432100c1987d00c0114a20b820258200123456789abcdeffedcba9876543210001 | |||
| "size": 76834 | 12233445566778899aabbccddeeff0c1a00012c2209584f900c0013a106781c6874747 | |||
| } | 03a2f2f6578616d706c652e636f6d2f66696c65312e62696e15f603f60c0113a106781 | |||
| }, | c687474703a2f2f6578616d706c652e636f6d2f66696c65322e62696e15f603f60a498 | |||
| { "condition-vendor-id": null }, | 80c0003f60c0103f60c45840c0017f6' / { | |||
| { "condition-class-id": null } | / manifest-version / 1:1, | |||
| ], | / manifest-sequence-number / 2:3, | |||
| "components": [ | / common / 3:h'a20247828141008141010458818c0c000150fa6b4a53d5a | |||
| [ | d5fdfbe9de663e4d41ffe02501492af1425695e48bf429b2d51f2ab4514a20b8202582 | |||
| "Flash", | 000112233445566778899aabbccddeeff0123456789abcdeffedcba98765432100c198 | |||
| 78848 | 7d00c0114a20b820258200123456789abcdeffedcba987654321000112233445566778 | |||
| ], | 899aabbccddeeff0c1a00012c22' / { | |||
| [ | / components / 2:h'82814100814101' / [ | |||
| "Flash", | [h'00'] , | |||
| 132096 | [h'01'] | |||
| ] | ] /, | |||
| ] | / common-sequence / 4:h'8c0c000150fa6b4a53d5ad5fdfbe9de663 | |||
| }, | e4d41ffe02501492af1425695e48bf429b2d51f2ab4514a20b82025820001122334455 | |||
| "apply-image": [ | 66778899aabbccddeeff0123456789abcdeffedcba98765432100c1987d00c0114a20b | |||
| { "directive-set-component": 0 }, | 820258200123456789abcdeffedcba987654321000112233445566778899aabbccddee | |||
| { | ff0c1a00012c22' / [ | |||
| "directive-set-var": { | / directive-set-component-index / 12,0 , | |||
| "uri": "http://example.com/file1.bin" | / condition-vendor-identifier / | |||
| } | 1,h'fa6b4a53d5ad5fdfbe9de663e4d41ffe' / fa6b4a53-d5ad-5fdf- | |||
| }, | be9d-e663e4d41ffe / , | |||
| { "directive-set-component": 1 }, | / condition-class-identifier / | |||
| { | 2,h'1492af1425695e48bf429b2d51f2ab45' / | |||
| "directive-set-var": { | 1492af14-2569-5e48-bf42-9b2d51f2ab45 / , | |||
| "uri": "http://example.com/file2.bin" | / directive-override-parameters / 20,{ | |||
| } | / image-digest / 11:[ | |||
| }, | / algorithm-id / 2 / sha256 /, | |||
| { "directive-set-component": true }, | / digest-bytes / | |||
| { "directive-fetch": null } | h'00112233445566778899aabbccddeeff0123456789abcdeffedcba9876543210' | |||
| ], | ], | |||
| "run-image": [ | / image-size / 12:34768, | |||
| { "directive-set-component": true }, | } , | |||
| { "condition-image": null }, | / directive-set-component-index / 12,1 , | |||
| { "directive-set-component": 0 }, | / directive-override-parameters / 20,{ | |||
| { "directive-run": null } | / image-digest / 11:[ | |||
| ] | / algorithm-id / 2 / sha256 /, | |||
| } | / digest-bytes / | |||
| h'0123456789abcdeffedcba987654321000112233445566778899aabbccddeeff' | ||||
| Converted into the SUIT manifest, this produces: | ], | |||
| / image-size / 12:76834, | ||||
| { | } | |||
| / auth object / 1 : h'd28443a10126a1044874657374206b6579f658400d44' | ] /, | |||
| h'c766566a88c5bbe61b544edd14effa7d53c9a6d43221' | } /, | |||
| h'99c6285490460b910c8e96c6a1065cc1be9cfa438f7b' | / install / 9:h'900c0013a106781c687474703a2f2f6578616d706c652e | |||
| h'eeaffa9922e2ae440d6c8d0b9cb26bed2ffe', | 636f6d2f66696c65312e62696e15f603f60c0113a106781c687474703a2f2f6578616d | |||
| / manifest / 2 : h'a5010102070358a8a20257828245466c6173684300340182' | 706c652e636f6d2f66696c65322e62696e15f603f6' / [ | |||
| h'45466c6173684300040204588b8e13a20350fa6b4a53d5ad' | / directive-set-component-index / 12,0 , | |||
| h'5fdfbe9de663e4d41ffe04501492af1425695e48bf429b2d' | / directive-set-parameters / 19,{ | |||
| h'51f2ab450c0013a20b582482025820001122334455667788' | / uri / 6:'http://example.com/file1.bin', | |||
| h'99aabbccddeeff0123456789abcdeffedcba98765432100c' | } , | |||
| h'1987d00c0113a20b5824820258200123456789abcdeffedc' | / directive-fetch / 21,F6 / nil / , | |||
| h'ba987654321000112233445566778899aabbccddeeff0c1a' | / condition-image-match / 3,F6 / nil / , | |||
| h'00012c2201f602f609584b8c0c0013a106781c687474703a' | / directive-set-component-index / 12,1 , | |||
| h'2f2f6578616d706c652e636f6d2f66696c65312e62696e0c' | / directive-set-parameters / 19,{ | |||
| h'0113a106781c687474703a2f2f6578616d706c652e636f6d' | / uri / 6:'http://example.com/file2.bin', | |||
| h'2f66696c65322e62696e0cf515f60c49880cf503f60c0017' | } , | |||
| h'f6' \ | / directive-fetch / 21,F6 / nil / , | |||
| { | / condition-image-match / 3,F6 / nil / | |||
| / structure-version / 1 : 1, | ] /, | |||
| / sequence-number / 2 : 7, | / validate / 10:h'880c0003f60c0103f6' / [ | |||
| / common / 3 : h'a20257828245466c617368430034018245466c61736843' | / directive-set-component-index / 12,0 , | |||
| h'00040204588b8e13a20350fa6b4a53d5ad5fdfbe9de663' | / condition-image-match / 3,F6 / nil / , | |||
| h'e4d41ffe04501492af1425695e48bf429b2d51f2ab450c' | / directive-set-component-index / 12,1 , | |||
| h'0013a20b58248202582000112233445566778899aabbcc' | / condition-image-match / 3,F6 / nil / | |||
| h'ddeeff0123456789abcdeffedcba98765432100c1987d0' | ] /, | |||
| h'0c0113a20b5824820258200123456789abcdeffedcba98' | / run / 12:h'840c0017f6' / [ | |||
| h'7654321000112233445566778899aabbccddeeff0c1a00' | / directive-set-component-index / 12,0 , | |||
| h'012c2201f602f6' \ { | / directive-run / 23,None | |||
| / components / 2 : h'828245466c617368430034018245466c617368' | ] /, | |||
| h'43000402' \ | } /, | |||
| [ | } | |||
| [h'466c617368', h'003401'], | ||||
| [h'466c617368', h'000402'], | ||||
| ], | ||||
| / common-sequence / 4 : h'8e13a20350fa6b4a53d5ad5fdfbe9de6' | ||||
| h'63e4d41ffe04501492af1425695e48bf' | ||||
| h'429b2d51f2ab450c0013a20b58248202' | ||||
| h'582000112233445566778899aabbccdd' | ||||
| h'eeff0123456789abcdeffedcba987654' | ||||
| h'32100c1987d00c0113a20b5824820258' | ||||
| h'200123456789abcdeffedcba98765432' | ||||
| h'1000112233445566778899aabbccddee' | ||||
| h'ff0c1a00012c2201f602f6' \ [ | ||||
| / set-vars / 19, { | ||||
| / vendor-id / 3 : h'fa6b4a53d5ad5fdfbe9de663e4d41f' | ||||
| h'fe', | ||||
| / class-id / 4 : h'1492af1425695e48bf429b2d51f2ab45', | ||||
| }, | ||||
| / set-component-index / 12, 0, | ||||
| / set-vars / 19, { | ||||
| / digest / 11 : h'8202582000112233445566778899aabb' | ||||
| h'ccddeeff0123456789abcdeffedcba98' | ||||
| h'76543210' \ | ||||
| [ 2, h'00112233445566778899aabbccddeeff01234567' | ||||
| h'89abcdeffedcba9876543210' ], | ||||
| / size / 12 : 34768, | ||||
| }, | ||||
| / set-component-index / 12, 1, | ||||
| / set-vars / 19, { | ||||
| / digest / 11 : h'820258200123456789abcdeffedcba98' | ||||
| h'7654321000112233445566778899aabb' | ||||
| h'ccddeeff' \ | ||||
| [ 2, h'0123456789abcdeffedcba987654321000112233' | ||||
| h'445566778899aabbccddeeff' ], | ||||
| / size / 12 : 76834, | ||||
| }, | ||||
| / condition-vendor-id / 1, None, | ||||
| / condition-class-id / 2, None, | ||||
| ], | ||||
| }, | ||||
| / apply-image / 9 : h'8c0c0013a106781c687474703a2f2f6578616d70' | ||||
| h'6c652e636f6d2f66696c65312e62696e0c0113a1' | ||||
| h'06781c687474703a2f2f6578616d706c652e636f' | ||||
| h'6d2f66696c65322e62696e0cf515f6' \ [ | ||||
| / set-component-index / 12, 0, | ||||
| / set-vars / 19, { | ||||
| / uri / 6 : http://example.com/file1.bin, | ||||
| }, | Total size of manifest without COSE authentication object: 254 | |||
| / set-component-index / 12, 1, | ||||
| / set-vars / 19, { | ||||
| / uri / 6 : http://example.com/file2.bin, | ||||
| }, | ||||
| / set-component-index / 12, True, | ||||
| / fetch / 21, None, | ||||
| ], | ||||
| / run-image / 12 : h'880cf503f60c0017f6' \ [ | ||||
| / set-component-index / 12, True, | ||||
| / condition-image / 3, None, | ||||
| / set-component-index / 12, 0, | ||||
| / run / 23, None, | ||||
| ], | ||||
| } | ||||
| } | ||||
| Total size of outer wrapper without COSE authentication object: 272 | Manifest: | |||
| Outer: | a10358faa60101020303588ea20247828141008141010458818c0c000150 | |||
| fa6b4a53d5ad5fdfbe9de663e4d41ffe02501492af1425695e48bf429b2d | ||||
| 51f2ab4514a20b8202582000112233445566778899aabbccddeeff012345 | ||||
| 6789abcdeffedcba98765432100c1987d00c0114a20b8202582001234567 | ||||
| 89abcdeffedcba987654321000112233445566778899aabbccddeeff0c1a | ||||
| 00012c2209584f900c0013a106781c687474703a2f2f6578616d706c652e | ||||
| 636f6d2f66696c65312e62696e15f603f60c0113a106781c687474703a2f | ||||
| 2f6578616d706c652e636f6d2f66696c65322e62696e15f603f60a49880c | ||||
| 0003f60c0103f60c45840c0017f6 | ||||
| a201f602590109a5010102070358a8a20257828245466c617368430034018245466c6173 | Total size of manifest with COSE authentication object: 369 | |||
| 684300040204588b8e13a20350fa6b4a53d5ad5fdfbe9de663e4d41ffe04501492af1425 | ||||
| 695e48bf429b2d51f2ab450c0013a20b58248202582000112233445566778899aabbccdd | ||||
| eeff0123456789abcdeffedcba98765432100c1987d00c0113a20b582482025820012345 | ||||
| 6789abcdeffedcba987654321000112233445566778899aabbccddeeff0c1a00012c2201 | ||||
| f602f609584b8c0c0013a106781c687474703a2f2f6578616d706c652e636f6d2f66696c | ||||
| 65312e62696e0c0113a106781c687474703a2f2f6578616d706c652e636f6d2f66696c65 | ||||
| 322e62696e0cf515f60c49880cf503f60c0017f6 | ||||
| Total size of outer wrapper with COSE authentication object: 357 | Manifest with COSE authentication object: | |||
| Signed Outer: | a202587081d28443a10126a058248202582007954f519cdd8101156768fb | |||
| e12f23eb5ca73481e91ca4801bf94dc82f52b0ea5840a76e7f712b8d3ed6 | ||||
| bcf79eaef8f15ee76f8da15aa16b220431f528d5cc237f95688748a156c8 | ||||
| ee847c517b0c660328a7877be52b1902f50e7acecc4bbd6c439f0358faa6 | ||||
| 0101020303588ea20247828141008141010458818c0c000150fa6b4a53d5 | ||||
| ad5fdfbe9de663e4d41ffe02501492af1425695e48bf429b2d51f2ab4514 | ||||
| a20b8202582000112233445566778899aabbccddeeff0123456789abcdef | ||||
| fedcba98765432100c1987d00c0114a20b820258200123456789abcdeffe | ||||
| dcba987654321000112233445566778899aabbccddeeff0c1a00012c2209 | ||||
| 584f900c0013a106781c687474703a2f2f6578616d706c652e636f6d2f66 | ||||
| 696c65312e62696e15f603f60c0113a106781c687474703a2f2f6578616d | ||||
| 706c652e636f6d2f66696c65322e62696e15f603f60a49880c0003f60c01 | ||||
| 03f60c45840c0017f6 | ||||
| a2015854d28443a10126a1044874657374206b6579f658400d44c766566a88c5bbe61b54 | ||||
| 4edd14effa7d53c9a6d4322199c6285490460b910c8e96c6a1065cc1be9cfa438f7beeaf | ||||
| fa9922e2ae440d6c8d0b9cb26bed2ffe02590109a5010102070358a8a20257828245466c | ||||
| 617368430034018245466c6173684300040204588b8e13a20350fa6b4a53d5ad5fdfbe9d | ||||
| e663e4d41ffe04501492af1425695e48bf429b2d51f2ab450c0013a20b58248202582000 | ||||
| 112233445566778899aabbccddeeff0123456789abcdeffedcba98765432100c1987d00c | ||||
| 0113a20b5824820258200123456789abcdeffedcba987654321000112233445566778899 | ||||
| aabbccddeeff0c1a00012c2201f602f609584b8c0c0013a106781c687474703a2f2f6578 | ||||
| 616d706c652e636f6d2f66696c65312e62696e0c0113a106781c687474703a2f2f657861 | ||||
| 6d706c652e636f6d2f66696c65322e62696e0cf515f60c49880cf503f60c0017f6 | ||||
| 13. IANA Considerations | 13. IANA Considerations | |||
| Several registries will be required for: | Several registries will be required for: | |||
| - standard Commands | - standard Commands. | |||
| - standard Parameters | - standard Parameters. | |||
| - standard Algorithm identifiers | - standard Algorithm identifiers. | |||
| - standard text values | - standard text values. | |||
| 14. Security Considerations | 14. Security Considerations | |||
| This document is about a manifest format describing and protecting | This document is about a manifest format describing and protecting | |||
| firmware images and as such it is part of a larger solution for | firmware images and as such it is part of a larger solution for | |||
| offering a standardized way of delivering firmware updates to IoT | offering a standardized way of delivering firmware updates to IoT | |||
| devices. A more detailed discussion about security can be found in | devices. A more detailed discussion about security can be found in | |||
| the architecture document [I-D.ietf-suit-architecture] and in | the architecture document [I-D.ietf-suit-architecture] and in | |||
| [I-D.ietf-suit-information-model]. | [I-D.ietf-suit-information-model]. | |||
| skipping to change at page 87, line 43 ¶ | skipping to change at page 82, line 26 ¶ | |||
| RFC 8152, DOI 10.17487/RFC8152, July 2017, | RFC 8152, DOI 10.17487/RFC8152, July 2017, | |||
| <https://www.rfc-editor.org/info/rfc8152>. | <https://www.rfc-editor.org/info/rfc8152>. | |||
| [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC | [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC | |||
| 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, | 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, | |||
| May 2017, <https://www.rfc-editor.org/info/rfc8174>. | May 2017, <https://www.rfc-editor.org/info/rfc8174>. | |||
| 17.2. Informative References | 17.2. Informative References | |||
| [I-D.ietf-suit-architecture] | [I-D.ietf-suit-architecture] | |||
| Moran, B., Meriac, M., Tschofenig, H., and D. Brown, "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", | |||
| Devices", draft-ietf-suit-architecture-07 (work in | draft-ietf-suit-architecture-08 (work in progress), | |||
| progress), October 2019. | November 2019. | |||
| [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-04 (work in progress), | draft-ietf-suit-information-model-05 (work in progress), | |||
| October 2019. | January 2020. | |||
| 17.3. URIs | 17.3. URIs | |||
| [1] mailto:suit@ietf.org | [1] mailto:suit@ietf.org | |||
| [2] https://www1.ietf.org/mailman/listinfo/suit | [2] https://www1.ietf.org/mailman/listinfo/suit | |||
| [3] https://www.ietf.org/mail-archive/web/suit/current/index.html | [3] https://www.ietf.org/mail-archive/web/suit/current/index.html | |||
| Authors' Addresses | Authors' Addresses | |||
| End of changes. 351 change blocks. | ||||
| 1571 lines changed or deleted | 1313 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/ | ||||