| < draft-ietf-suit-manifest-04.txt | draft-ietf-suit-manifest-05.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: September 10, 2020 H. Birkholz | Expires: November 28, 2020 H. Birkholz | |||
| Fraunhofer SIT | Fraunhofer SIT | |||
| K. Zandberg | K. Zandberg | |||
| Inria | Inria | |||
| March 09, 2020 | May 27, 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-04 | draft-ietf-suit-manifest-05 | |||
| 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. Firmware updates and trusted | information protecting the manifest. Firmware updates and secure | |||
| boot both tend to use sequences of common operations, so the manifest | boot both tend to use sequences of common operations, so the manifest | |||
| encodes those sequences of operations, rather than declaring the | encodes those sequences of operations, rather than declaring the | |||
| metadata. | metadata. The manifest also serves as a building block for secure | |||
| boot. | ||||
| Status of This Memo | Status of This Memo | |||
| This Internet-Draft is submitted in full conformance with the | This Internet-Draft is submitted in full conformance with the | |||
| provisions of BCP 78 and BCP 79. | provisions of BCP 78 and BCP 79. | |||
| Internet-Drafts are working documents of the Internet Engineering | Internet-Drafts are working documents of the Internet Engineering | |||
| Task Force (IETF). Note that other groups may also distribute | Task Force (IETF). Note that other groups may also distribute | |||
| working documents as Internet-Drafts. The list of current Internet- | working documents as Internet-Drafts. The list of current Internet- | |||
| Drafts is at https://datatracker.ietf.org/drafts/current/. | Drafts is at https://datatracker.ietf.org/drafts/current/. | |||
| Internet-Drafts are draft documents valid for a maximum of six months | Internet-Drafts are draft documents valid for a maximum of six months | |||
| and may be updated, replaced, or obsoleted by other documents at any | and may be updated, replaced, or obsoleted by other documents at any | |||
| time. It is inappropriate to use Internet-Drafts as reference | time. It is inappropriate to use Internet-Drafts as reference | |||
| material or to cite them other than as "work in progress." | material or to cite them other than as "work in progress." | |||
| This Internet-Draft will expire on September 10, 2020. | This Internet-Draft will expire on November 28, 2020. | |||
| Copyright Notice | Copyright Notice | |||
| Copyright (c) 2020 IETF Trust and the persons identified as the | Copyright (c) 2020 IETF Trust and the persons identified as the | |||
| document authors. All rights reserved. | document authors. All rights reserved. | |||
| This document is subject to BCP 78 and the IETF Trust's Legal | This document is subject to BCP 78 and the IETF Trust's Legal | |||
| Provisions Relating to IETF Documents | Provisions Relating to IETF Documents | |||
| (https://trustee.ietf.org/license-info) in effect on the date of | (https://trustee.ietf.org/license-info) in effect on the date of | |||
| publication of this document. Please review these documents | publication of this document. Please review these documents | |||
| skipping to change at page 2, line 27 ¶ | skipping to change at page 2, line 30 ¶ | |||
| Without obtaining an adequate license from the person(s) controlling | Without obtaining an adequate license from the person(s) controlling | |||
| the copyright in such materials, this document may not be modified | the copyright in such materials, this document may not be modified | |||
| outside the IETF Standards Process, and derivative works of it may | outside the IETF Standards Process, and derivative works of it may | |||
| not be created outside the IETF Standards Process, except to format | not be created outside the IETF Standards Process, except to format | |||
| it for publication as an RFC or to translate it into languages other | it for publication as an RFC or to translate it into languages other | |||
| than English. | than English. | |||
| Table of Contents | Table of Contents | |||
| 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 4 | 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 4 | |||
| 2. Conventions and Terminology . . . . . . . . . . . . . . . . . 5 | 2. Conventions and Terminology . . . . . . . . . . . . . . . . . 6 | |||
| 3. How to use this Document . . . . . . . . . . . . . . . . . . 6 | 3. How to use this Document . . . . . . . . . . . . . . . . . . 8 | |||
| 4. Background . . . . . . . . . . . . . . . . . . . . . . . . . 6 | 4. Background . . . . . . . . . . . . . . . . . . . . . . . . . 8 | |||
| 4.1. IoT Firmware Update Constraints . . . . . . . . . . . . . 7 | 4.1. IoT Firmware Update Constraints . . . . . . . . . . . . . 8 | |||
| 4.2. Update Workflow Model . . . . . . . . . . . . . . . . . . 7 | 4.2. Update Workflow Model . . . . . . . . . . . . . . . . . . 9 | |||
| 4.2.1. Pre-Authentication Compatibility Checks . . . . . . . 9 | 5. Severed Fields . . . . . . . . . . . . . . . . . . . . . . . 10 | |||
| 4.3. SUIT Manifest Goals . . . . . . . . . . . . . . . . . . . 9 | 6. Interpreter Behavior . . . . . . . . . . . . . . . . . . . . 11 | |||
| 4.4. SUIT Manifest Design Summary . . . . . . . . . . . . . . 10 | 6.1. Interpreter Setup . . . . . . . . . . . . . . . . . . . . 11 | |||
| 5. Interpreter Behavior . . . . . . . . . . . . . . . . . . . . 11 | 6.2. Required Checks . . . . . . . . . . . . . . . . . . . . . 12 | |||
| 5.1. Interpreter Setup . . . . . . . . . . . . . . . . . . . . 11 | 6.3. Interpreter Fundamental Properties . . . . . . . . . . . 13 | |||
| 5.2. Required Checks . . . . . . . . . . . . . . . . . . . . . 12 | 6.4. Abstract Machine Description . . . . . . . . . . . . . . 13 | |||
| 5.3. Interpreter Fundamental Properties . . . . . . . . . . . 13 | 6.5. Serialized Processing Interpreter . . . . . . . . . . . . 15 | |||
| 5.4. Abstract Machine Description . . . . . . . . . . . . . . 13 | 6.6. Parallel Processing Interpreter . . . . . . . . . . . . . 15 | |||
| 5.4.1. Parameters . . . . . . . . . . . . . . . . . . . . . 14 | 6.7. Processing Dependencies . . . . . . . . . . . . . . . . . 16 | |||
| 5.4.2. Commands . . . . . . . . . . . . . . . . . . . . . . 15 | 7. Creating Manifests . . . . . . . . . . . . . . . . . . . . . 16 | |||
| 5.4.3. Command Behavior . . . . . . . . . . . . . . . . . . 16 | 7.1. Compatibility Check Template . . . . . . . . . . . . . . 17 | |||
| 5.5. Serialized Processing Interpreter . . . . . . . . . . . . 17 | 7.2. Secure Boot Template . . . . . . . . . . . . . . . . . . 17 | |||
| 5.6. Parallel Processing Interpreter . . . . . . . . . . . . . 17 | 7.3. Firmware Download Template . . . . . . . . . . . . . . . 18 | |||
| 5.7. Processing Dependencies . . . . . . . . . . . . . . . . . 18 | 7.4. Load from External Storage Template . . . . . . . . . . . 18 | |||
| 6. Creating Manifests . . . . . . . . . . . . . . . . . . . . . 18 | 7.5. Load & Decompress from External Storage Template . . . . 19 | |||
| 6.1. Manifest Source Material . . . . . . . . . . . . . . . . 19 | 7.6. Dependency Template . . . . . . . . . . . . . . . . . . . 19 | |||
| 6.2. Required Template: Compatibility Check . . . . . . . . . 19 | 8. Envelope . . . . . . . . . . . . . . . . . . . . . . . . . . 19 | |||
| 6.3. Use Case Template: XIP Secure Boot . . . . . . . . . . . 20 | 8.1. Authenticated Manifests . . . . . . . . . . . . . . . . . 20 | |||
| 6.4. Use Case Template: Firmware Download . . . . . . . . . . 21 | 8.2. Encrypted Manifests . . . . . . . . . . . . . . . . . . . 21 | |||
| 6.5. Use Case Template: Load from External Storage . . . . . . 21 | 8.3. Delegation Info . . . . . . . . . . . . . . . . . . . . . 21 | |||
| 6.6. Use Case Template Load & Decompress from External Storage 21 | 8.4. Severable Fields . . . . . . . . . . . . . . . . . . . . 21 | |||
| 6.7. Use Case Template: Dependency . . . . . . . . . . . . . . 22 | 8.5. Human-Readable Text . . . . . . . . . . . . . . . . . . . 21 | |||
| 7. Manifest Structure . . . . . . . . . . . . . . . . . . . . . 22 | 8.6. COSWID . . . . . . . . . . . . . . . . . . . . . . . . . 21 | |||
| 7.1. Severable Elements . . . . . . . . . . . . . . . . . . . 24 | 8.7. Encoding Considerations . . . . . . . . . . . . . . . . . 21 | |||
| 7.2. Envelope . . . . . . . . . . . . . . . . . . . . . . . . 25 | 8.8. SUIT_Envelope CDDL . . . . . . . . . . . . . . . . . . . 22 | |||
| 7.3. Manifest . . . . . . . . . . . . . . . . . . . . . . . . 27 | 9. Manifest . . . . . . . . . . . . . . . . . . . . . . . . . . 23 | |||
| 7.4. SUIT_Dependency . . . . . . . . . . . . . . . . . . . . . 32 | 9.1. suit-manifest-version . . . . . . . . . . . . . . . . . . 24 | |||
| 7.5. SUIT_Component_Reference . . . . . . . . . . . . . . . . 32 | 9.2. suit-manifest-sequence-number . . . . . . . . . . . . . . 24 | |||
| 7.6. Manifest Parameters . . . . . . . . . . . . . . . . . . . 33 | 9.3. suit-common . . . . . . . . . . . . . . . . . . . . . . . 24 | |||
| 7.6.1. SUIT_Parameter_Strict_Order . . . . . . . . . . . . . 35 | 9.4. suit-reference-uri . . . . . . . . . . . . . . . . . . . 25 | |||
| 7.6.2. SUIT_Parameter_Soft_Failure . . . . . . . . . . . . . 35 | 9.5. SUIT_Command_Sequence . . . . . . . . . . . . . . . . . . 25 | |||
| 7.7. SUIT_Parameter_Encryption_Info . . . . . . . . . . . . . 35 | 9.6. suit-text . . . . . . . . . . . . . . . . . . . . . . . . 26 | |||
| 7.7.1. SUIT_Parameter_Compression_Info . . . . . . . . . . . 35 | 9.7. suit-coswid . . . . . . . . . . . . . . . . . . . . . . . 26 | |||
| 7.7.2. SUIT_Parameter_Unpack_Info . . . . . . . . . . . . . 36 | 9.8. SUIT_Manifest CDDL . . . . . . . . . . . . . . . . . . . 26 | |||
| 7.7.3. SUIT_Parameters CDDL . . . . . . . . . . . . . . . . 36 | 9.9. Dependencies . . . . . . . . . . . . . . . . . . . . . . 27 | |||
| 7.8. SUIT_Command_Sequence . . . . . . . . . . . . . . . . . . 38 | 9.10. SUIT_Component_Reference . . . . . . . . . . . . . . . . 28 | |||
| 7.9. SUIT_Condition . . . . . . . . . . . . . . . . . . . . . 39 | 9.11. Parameters . . . . . . . . . . . . . . . . . . . . . . . 28 | |||
| 7.9.1. Identifier Conditions . . . . . . . . . . . . . . . . 40 | 9.11.1. suit-parameter-vendor-identifier . . . . . . . . . . 30 | |||
| 7.9.2. suit-condition-image-match . . . . . . . . . . . . . 41 | 9.11.2. suit-parameter-class-identifier . . . . . . . . . . 30 | |||
| 7.9.3. suit-condition-image-not-match . . . . . . . . . . . 41 | 9.11.3. suit-parameter-image-digest . . . . . . . . . . . . 30 | |||
| 7.9.4. suit-condition-use-before . . . . . . . . . . . . . . 41 | 9.11.4. suit-parameter-image-size . . . . . . . . . . . . . 30 | |||
| 7.9.5. suit-condition-minimum-battery . . . . . . . . . . . 41 | 9.11.5. suit-parameter-use-before . . . . . . . . . . . . . 30 | |||
| 7.9.6. suit-condition-update-authorized . . . . . . . . . . 42 | 9.11.6. suit-parameter-component-offset . . . . . . . . . . 31 | |||
| 7.9.7. suit-condition-version . . . . . . . . . . . . . . . 42 | 9.11.7. suit-parameter-encryption-info . . . . . . . . . . . 31 | |||
| 7.9.8. SUIT_Condition_Custom . . . . . . . . . . . . . . . . 43 | 9.11.8. suit-parameter-compression-info . . . . . . . . . . 31 | |||
| 7.9.9. Identifiers . . . . . . . . . . . . . . . . . . . . . 44 | 9.11.9. suit-parameter-unpack-info . . . . . . . . . . . . . 31 | |||
| 7.9.10. SUIT_Condition CDDL . . . . . . . . . . . . . . . . . 45 | 9.11.10. suit-parameter-uri . . . . . . . . . . . . . . . . . 31 | |||
| 7.10. SUIT_Directive . . . . . . . . . . . . . . . . . . . . . 45 | 9.11.11. suit-parameter-source-component . . . . . . . . . . 31 | |||
| 7.10.1. suit-directive-set-component-index . . . . . . . . . 46 | 9.11.12. suit-parameter-run-args . . . . . . . . . . . . . . 31 | |||
| 7.10.2. suit-directive-set-dependency-index . . . . . . . . 47 | 9.11.13. suit-parameter-device-identifier . . . . . . . . . . 32 | |||
| 7.10.3. suit-directive-abort . . . . . . . . . . . . . . . . 47 | 9.11.14. suit-parameter-minimum-battery . . . . . . . . . . . 32 | |||
| 7.10.4. suit-directive-run-sequence . . . . . . . . . . . . 47 | 9.11.15. suit-parameter-update-priority . . . . . . . . . . . 32 | |||
| 7.10.5. suit-directive-try-each . . . . . . . . . . . . . . 48 | 9.11.16. suit-parameter-version . . . . . . . . . . . . . . . 32 | |||
| 7.10.6. suit-directive-process-dependency . . . . . . . . . 48 | 9.11.17. suit-parameter-wait-info . . . . . . . . . . . . . . 32 | |||
| 7.10.7. suit-directive-set-parameters . . . . . . . . . . . 49 | 9.11.18. suit-parameter-uri-list . . . . . . . . . . . . . . 32 | |||
| 7.10.8. suit-directive-override-parameters . . . . . . . . . 49 | 9.11.19. suit-parameter-strict-order . . . . . . . . . . . . 32 | |||
| 7.10.9. suit-directive-fetch . . . . . . . . . . . . . . . . 50 | 9.11.20. suit-parameter-soft-failure . . . . . . . . . . . . 32 | |||
| 7.10.10. suit-directive-copy . . . . . . . . . . . . . . . . 50 | 9.11.21. suit-parameter-custom . . . . . . . . . . . . . . . 33 | |||
| 7.10.11. suit-directive-swap . . . . . . . . . . . . . . . . 51 | 9.11.22. SUIT_Parameters CDDL . . . . . . . . . . . . . . . . 33 | |||
| 7.10.12. suit-directive-run . . . . . . . . . . . . . . . . . 51 | 9.12. SUIT_Command_Sequence . . . . . . . . . . . . . . . . . . 34 | |||
| 7.10.13. suit-directive-wait . . . . . . . . . . . . . . . . 52 | 9.12.1. SUIT_Condition . . . . . . . . . . . . . . . . . . . 35 | |||
| 7.10.14. SUIT_Directive CDDL . . . . . . . . . . . . . . . . 53 | 9.12.2. SUIT_Directive . . . . . . . . . . . . . . . . . . . 41 | |||
| 7.11. SUIT_Text_Map . . . . . . . . . . . . . . . . . . . . . . 55 | 9.12.3. suit-directive-set-component-index . . . . . . . . . 43 | |||
| 8. Access Control Lists . . . . . . . . . . . . . . . . . . . . 55 | 9.12.4. suit-directive-set-dependency-index . . . . . . . . 43 | |||
| 9. SUIT digest container . . . . . . . . . . . . . . . . . . . . 56 | 9.12.5. suit-directive-abort . . . . . . . . . . . . . . . . 43 | |||
| 10. Creating Conditional Sequences . . . . . . . . . . . . . . . 57 | 9.12.6. suit-directive-try-each . . . . . . . . . . . . . . 44 | |||
| 11. Full CDDL . . . . . . . . . . . . . . . . . . . . . . . . . . 59 | 9.12.7. suit-directive-process-dependency . . . . . . . . . 44 | |||
| 12. Examples . . . . . . . . . . . . . . . . . . . . . . . . . . 67 | 9.12.8. suit-directive-set-parameters . . . . . . . . . . . 45 | |||
| 12.1. Example 0: Secure Boot . . . . . . . . . . . . . . . . . 68 | 9.12.9. suit-directive-override-parameters . . . . . . . . . 45 | |||
| 12.2. Example 1: Simultaneous Download and Installation of | 9.12.10. suit-directive-fetch . . . . . . . . . . . . . . . . 45 | |||
| Payload . . . . . . . . . . . . . . . . . . . . . . . . 69 | 9.12.11. suit-directive-copy . . . . . . . . . . . . . . . . 46 | |||
| 12.3. Example 2: Simultaneous Download, Installation, and | 9.12.12. suit-directive-run . . . . . . . . . . . . . . . . . 47 | |||
| Secure Boot . . . . . . . . . . . . . . . . . . . . . . 72 | 9.12.13. suit-directive-wait . . . . . . . . . . . . . . . . 47 | |||
| 12.4. Example 3: Load from External Storage . . . . . . . . . 74 | 9.12.14. suit-directive-run-sequence . . . . . . . . . . . . 48 | |||
| 12.5. Example 4: Load and Decompress from External Storage . . 76 | 9.12.15. suit-directive-swap . . . . . . . . . . . . . . . . 49 | |||
| 12.6. Example 5: Compatibility Test, Download, Installation, | 9.13. SUIT_Text_Map . . . . . . . . . . . . . . . . . . . . . . 51 | |||
| and Secure Boot . . . . . . . . . . . . . . . . . . . . 79 | 10. Access Control Lists . . . . . . . . . . . . . . . . . . . . 52 | |||
| 12.7. Example 6: Two Images . . . . . . . . . . . . . . . . . 81 | 11. SUIT Digest Container . . . . . . . . . . . . . . . . . . . . 52 | |||
| 13. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 84 | 12. Creating Conditional Sequences . . . . . . . . . . . . . . . 53 | |||
| 14. Security Considerations . . . . . . . . . . . . . . . . . . . 85 | 13. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 55 | |||
| 15. Mailing List Information . . . . . . . . . . . . . . . . . . 85 | 13.1. SUIT Directives . . . . . . . . . . . . . . . . . . . . 55 | |||
| 16. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . 85 | 13.2. SUIT Conditions . . . . . . . . . . . . . . . . . . . . 56 | |||
| 17. References . . . . . . . . . . . . . . . . . . . . . . . . . 86 | 13.3. SUIT Parameters . . . . . . . . . . . . . . . . . . . . 57 | |||
| 17.1. Normative References . . . . . . . . . . . . . . . . . . 86 | 13.4. SUIT Text Values . . . . . . . . . . . . . . . . . . . . 59 | |||
| 17.2. Informative References . . . . . . . . . . . . . . . . . 86 | 13.5. SUIT Algorithm Identifiers . . . . . . . . . . . . . . . 59 | |||
| 17.3. URIs . . . . . . . . . . . . . . . . . . . . . . . . . . 87 | 14. Security Considerations . . . . . . . . . . . . . . . . . . . 59 | |||
| Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 87 | 15. Mailing List Information . . . . . . . . . . . . . . . . . . 59 | |||
| 16. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . 60 | ||||
| 17. References . . . . . . . . . . . . . . . . . . . . . . . . . 60 | ||||
| 17.1. Normative References . . . . . . . . . . . . . . . . . . 60 | ||||
| 17.2. Informative References . . . . . . . . . . . . . . . . . 61 | ||||
| 17.3. URIs . . . . . . . . . . . . . . . . . . . . . . . . . . 62 | ||||
| A. Full CDDL . . . . . . . . . . . . . . . . . . . . . . . . . . 63 | ||||
| B. Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 | ||||
| B.1. Example 0: Secure Boot . . . . . . . . . . . . . . . . . 71 | ||||
| B.2. Example 1: Simultaneous Download and Installation of | ||||
| Payload . . . . . . . . . . . . . . . . . . . . . . . . . 73 | ||||
| B.3. Example 2: Simultaneous Download, Installation, and | ||||
| Secure Boot . . . . . . . . . . . . . . . . . . . . . . . 76 | ||||
| B.4. Example 3: Load from External Storage . . . . . . . . . . 78 | ||||
| B.5. Example 4: Load and Decompress from External Storage . . 81 | ||||
| B.6. Example 5: Compatibility Test, Download, Installation, | ||||
| and Secure Boot . . . . . . . . . . . . . . . . . . . . . 83 | ||||
| B.7. Example 6: Two Images . . . . . . . . . . . . . . . . . . 86 | ||||
| C. Design Rational . . . . . . . . . . . . . . . . . . . . . . . 89 | ||||
| D. Implementation Confirmance Matrix . . . . . . . . . . . . . . 90 | ||||
| Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 94 | ||||
| 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. Equally important is the | |||
| Machine-to-Machine (LwM2M) protocol offering device management of IoT | inclusion of metadata about the conveyed firmware image (in the form | |||
| devices. Equally important is the inclusion of meta-data about the | of a manifest) and the use of a security wrapper to provide end-to- | |||
| conveyed firmware image (in the form of a manifest) and the use of | end security protection to detect modifications and (optionally) to | |||
| end-to-end security protection to detect modifications and | make reverse engineering more difficult. End-to-end security allows | |||
| (optionally) to make reverse engineering more difficult. End-to-end | the author, who builds the firmware image, to be sure that no other | |||
| security allows the author, who builds the firmware image, to be sure | party (including potential adversaries) can install firmware updates | |||
| that no other party (including potential adversaries) can install | on IoT devices without adequate privileges. For confidentiality | |||
| firmware updates on IoT devices without adequate privileges. This | protected firmware images it is additionally required to encrypt the | |||
| authorization process is ensured by the use of dedicated symmetric or | firmware image. Starting security protection at the author is a risk | |||
| asymmetric keys installed on the IoT device: for use cases where only | mitigation technique so firmware images and manifests can be stored | |||
| integrity protection is required it is sufficient to install a trust | on untrusted repositories; it also reduces the scope of a compromise | |||
| anchor on the IoT device. For confidentiality protected firmware | of any repository or intermediate system to be no worse than a denial | |||
| images it is additionally required to install either one or multiple | of service. | |||
| symmetric or asymmetric keys on the IoT device. Starting security | ||||
| protection at the author is a risk mitigation technique so firmware | A manifest is a bundle of metadata about the firmware for an IoT | |||
| images and manifests can be stored on untrusted repositories; it also | device, where to find the firmware, the devices to which it applies, | |||
| reduces the scope of a compromise of any repository or intermediate | and cryptographic information protecting the manifest. | |||
| system to be no worse than a denial of service. | ||||
| This specification defines the SUIT manifest format and it is | ||||
| intended to meet several goals: | ||||
| - Meet the requirements defined in | ||||
| [I-D.ietf-suit-information-model]. | ||||
| - Simple to parse on a constrained node | ||||
| - Simple to process on a constrained node | ||||
| - Compact encoding | ||||
| - Comprehensible by an intermediate system | ||||
| - Expressive enough to enable advanced use cases on advanced nodes | ||||
| - Extensible | ||||
| The SUIT manifest can be used for a variety of purposes throughout | ||||
| its lifecycle, such as: | ||||
| - the Firmware Author to reason about releasing a firmware. | ||||
| - the Network Operator to reason about compatibility of a firmware. | ||||
| - the Device Operator to reason about the impact of a firmware. | ||||
| - the Device Operator to manage distribution of firmware to devices. | ||||
| - the Plant Manager to reason about timing and acceptance of | ||||
| firmware updates. | ||||
| - the device to reason about the authority & authenticity of a | ||||
| firmware prior to installation. | ||||
| - the device to reason about the applicability of a firmware. | ||||
| - the device to reason about the installation of a firmware. | ||||
| - the device to reason about the authenticity & encoding of a | ||||
| firmware at boot. | ||||
| Each of these uses happens at a different stage of the manifest | ||||
| lifecycle, so each has different requirements. | ||||
| It is assumed that the reader is familiar with the high-level | It is assumed that the reader is familiar with the high-level | |||
| firmware update architecture [I-D.ietf-suit-architecture]. | firmware update architecture [I-D.ietf-suit-architecture] and the | |||
| threats, requirements, and user stories in | ||||
| [I-D.ietf-suit-information-model]. | ||||
| Most Update and Trusted Execution operations are composed of the same | A core concept of the SUIT manifest specification are commands. | |||
| small set of fundamental operations, such as copying a firmware image | Commands are either conditions or directives used to define the | |||
| from one place to another, checking that a firmware image is correct, | required behavior. Conceptually, a sequence of commands is like a | |||
| verifying that the specified firmware is the correct firmware for the | script but the used language is tailored to software updates and | |||
| device, or unpacking a firmware. By using these fundamental | secure boot. | |||
| operations in different orders and changing the parameters they use, | ||||
| a great many use cases can be supported by the same encoding. The | The available commands support simple steps, such as copying a | |||
| SUIT manifest uses this observation to heavily optimize update | firmware image from one place to another, checking that a firmware | |||
| metadata for consumption by constrained devices. | image is correct, verifying that the specified firmware is the | |||
| correct firmware for the device, or unpacking a firmware. By using | ||||
| these steps in different orders and changing the parameters they use, | ||||
| a broad range of use cases can be supported. The SUIT manifest uses | ||||
| this observation to heavily optimize metadata for consumption by | ||||
| constrained devices. | ||||
| While the SUIT manifest is informed by and optimized for firmware | While the SUIT manifest is informed by and optimized for firmware | |||
| update use cases, there is nothing in the | update and secure boot 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 | those use cases. Other use cases include the management of trusted | |||
| can equally be managed by SUIT-based metadata. | applications in a Trusted Execution Environment (TEE), see | |||
| [I-D.ietf-teep-architecture]. | ||||
| 2. Conventions and Terminology | 2. Conventions and Terminology | |||
| The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | |||
| "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | |||
| "OPTIONAL" in this document are to be interpreted as described in | "OPTIONAL" in this document are to be interpreted as described in | |||
| BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all | BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all | |||
| capitals, as shown here. | capitals, as shown here. | |||
| The following terminology is used throughout this document. | The following terminology is used throughout this document: | |||
| - SUIT: Software Update for the Internet of Things, the IETF working | - 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 manifest is a bundle of metadata about the firmware | |||
| payloads, one or more resources, and the processors needed to | for an IoT device, where to find the firmware, the devices to | |||
| transform resources into payloads. | which it applies, and cryptographic information protecting the | |||
| manifest. | ||||
| - Envelope: A container with the manifest, an authentication | ||||
| wrapper, authorization information, and severed fields. | ||||
| - Update: One or more manifests that describe one or more payloads. | - Update: One or more manifests that describe one or more payloads. | |||
| - Update Authority: The owner of a cryptographic key used to sign | - Update Authority: The owner of a cryptographic key used to sign | |||
| updates, trusted by Recipients. | updates, trusted by Recipients. | |||
| - Recipient: The system, typically an IoT device, that receives a | - Recipient: The system, typically an IoT device, that receives a | |||
| manifest. | manifest. | |||
| - Command: A Condition or a Directive. | ||||
| - Condition: A test for a property of the Recipient or its | - Condition: A test for a property of the Recipient or its | |||
| components. | components. | |||
| - Directive: An action for the Recipient to perform. | - Directive: An action for the Recipient to perform. | |||
| - Command: A Condition or a Directive. | ||||
| - Trusted Execution: A process by which a system ensures that only | - Trusted Execution: A process by which a system ensures that only | |||
| trusted code is executed, for example secure boot. | trusted code is executed, for example secure boot. | |||
| - 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). | |||
| 3. How to use this Document | 3. How to use this Document | |||
| This specification covers four aspects of firmware update: the | This specification covers four aspects of firmware update: | |||
| background that has informed this specification, the behavior of a | ||||
| device consuming a manifest, the process of creating a manifest, and | ||||
| the structure of the manifest itself. | ||||
| - Section 4 describes the device constraints, use cases, and design | - Section 4 describes the device constraints, use cases, and design | |||
| principles that informed the structure of the manifest. | principles that informed the structure of the manifest. | |||
| - Section 5 describes what actions a manifest processor should take. | - Section 6 describes what actions a manifest processor should take. | |||
| - Section 6 describes the process of creating a manifest. | - Section 7 describes the process of creating a manifest. | |||
| - Section 7 specifies the content of the manifest. | - Section 9 specifies the content of the manifest and the envelope. | |||
| For information about firmware update in general and the background | To implement an updatable device, see Section 6 and Section 9. To | |||
| of the suit manifest, see Section 4. To implement an updatable | implement a tool that generates updates, see Section 7 and Section 9. | |||
| device, see Section 5 and Section 7. To implement a tool that | ||||
| generates updates, see Section 6 and Section 7. | ||||
| 4. Background | The IANA consideration section, see Section 13, provides instructions | |||
| to IANA to create several registries. This section also provides the | ||||
| CBOR labels for the structures defined in this document. | ||||
| This section describes the logistical challenges, device constraints, | The complete CDDL description is provided in Appendix A, examples are | |||
| use cases, and design principles that informed the structure of the | given in Appendix B and a design rational is offered in Appendix C. | |||
| manifest. For the security considerations of the manifest, see | Finally, Appendix D gives a summarize of the mandatory-to-implement | |||
| [I-D.ietf-suit-information-model]. | features of this specification. | |||
| 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 | |||
| have a broad set of constraints, requiring different metadata to make | have a broad set of constraints, requiring different metadata to make | |||
| appropriate decisions. There may be many actors in production IoT | appropriate decisions. There may be many actors in production IoT | |||
| systems, each of whom has some authority. Distributing firmware in | systems, each of whom has some authority. Distributing firmware in | |||
| such a multi-party environment presents additional challenges. Each | such a multi-party environment presents additional challenges. Each | |||
| party requires a different subset of data. Some data may not be | party requires a different subset of data. Some data may not be | |||
| accessible to all parties. Multiple signatures may be required from | accessible to all parties. Multiple signatures may be required from | |||
| parties with different authorities. This topic is covered in more | parties with different authorities. This topic is covered in more | |||
| depth in [I-D.ietf-suit-architecture]. | depth in [I-D.ietf-suit-architecture]. The security aspects are | |||
| described in [I-D.ietf-suit-information-model]. | ||||
| 4.1. IoT Firmware Update Constraints | 4.1. IoT Firmware Update Constraints | |||
| The various constraints on IoT devices create a broad set of use-case | The various constraints of IoT devices and the range of use cases | |||
| requirements. For example, devices with: | that need to be supported create a broad set of urequirements. For | |||
| example, devices with: | ||||
| - limited processing power and storage may require a simple | - limited processing power and storage may require a simple | |||
| representation of metadata. | representation of metadata. | |||
| - bandwidth constraints may require firmware compression or partial | - bandwidth constraints may require firmware compression or partial | |||
| update support. | update support. | |||
| - bootloader complexity constraints may require simple selection | - bootloader complexity constraints may require simple selection | |||
| between two bootable images. | between two bootable images. | |||
| - small internal storage may require external storage support. | - small internal storage may require external storage support. | |||
| - multiple processors may require coordinated update of all | - multiple microcontrollers may require coordinated update of all | |||
| applications. | applications. | |||
| - large storage and complex functionality may require parallel | - large storage and complex functionality may require parallel | |||
| update of many software components. | update of many software components. | |||
| - mesh networks may require multicast distribution. | - extra information may need to be conveyed in the manifest in the | |||
| earlier stages of the device lifecycle before those data items are | ||||
| stripped when the manifest is delivery to a constrained device. | ||||
| Supporting the requirements introduced by the constraints on IoT | Supporting the requirements introduced by the constraints on IoT | |||
| devices requires the flexibility to represent a diverse set of | devices requires the flexibility to represent a diverse set of | |||
| possible metadata, but also requires that the encoding is kept | possible metadata, but also requires that the encoding is kept | |||
| simple. | simple. | |||
| 4.2. 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: | |||
| skipping to change at page 8, line 18 ¶ | skipping to change at page 10, line 8 ¶ | |||
| - 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 five steps: | |||
| 1. Verify the signature of the manifest. | 1. Verify the signature of the manifest. | |||
| 2. Verify the applicability of the manifest. | 2. Verify the applicability of the manifest. | |||
| 3. Resolve dependencies. | 3. Resolve dependencies. | |||
| 4. Fetch payload(s). | 4. Fetch payload(s). | |||
| 5. Install payload(s). | 5. Install payload(s). | |||
| When installation is complete, similar information can be used for | When installation is complete, similar information can be used for | |||
| validating and running images in a further 3 steps: | validating and running images in a further three 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 a bootloader, then the | If verification and running is implemented in a bootloader, then the | |||
| bootloader MUST also verify the signature of the manifest and the | bootloader must also verify the signature of the manifest and the | |||
| applicability of the manifest in order to implement secure boot | applicability of the manifest in order to implement secure boot | |||
| workflows. The bootloader MAY add its own authentication, e.g. a | workflows. The bootloader may add its own authentication, e.g. a | |||
| MAC, to the manifest in order to prevent further verifications. | MAC, to the manifest in order to prevent further verifications. | |||
| When multiple manifests are used for an update, each manifest's steps | When multiple manifests are used for an update, each manifest's steps | |||
| occur in a lockstep fashion; all manifests have dependency resolution | occur in a lockstep fashion; all manifests have dependency resolution | |||
| performed before any manifest performs a payload fetch, etc. | performed before any manifest performs a payload fetch, etc. | |||
| 4.2.1. Pre-Authentication Compatibility Checks | 5. Severed Fields | |||
| The RECOMMENDED process is to verify the signature of the manifest | ||||
| prior to parsing/executing any section of the manifest. This guards | ||||
| the parser against arbitrary input by unauthenticated third parties, | ||||
| but it costs extra energy when a device receives an incompatible | ||||
| manifest. | ||||
| If a device: | ||||
| 1. expects to receive many incompatible manifests. | ||||
| 2. expects to receive few manifests with failing signatures-for | ||||
| example if it is behind a gateway that checks signatures. | ||||
| 3. has a power budget that makes signature verification undesirable. | ||||
| Then, the device MAY choose to parse and execute only the SUIT_Common | ||||
| section of the manifest prior to signature verification. The | ||||
| guidelines in Creating Manifests (Section 6) require that the common | ||||
| section contain the applicability checks, so this section is | ||||
| sufficient for applicability verification. The manifest parser MUST | ||||
| NOT execute any command with side-effects outside the parser (for | ||||
| example, Run, Copy, Swap, or Fetch commands) prior to authentication | ||||
| and any such command MUST result in an error. | ||||
| 4.3. SUIT Manifest Goals | ||||
| The manifest described in this document is intended to meet several | ||||
| goals, as described below. | ||||
| - Meet the requirements defined in | ||||
| [I-D.ietf-suit-information-model]. | ||||
| - Simple to parse on a constrained node | ||||
| - Simple to process on a constrained node | ||||
| - Compact encoding | ||||
| - Comprehensible by an intermediate system | ||||
| - Expressive enough to enable advanced use cases on advanced nodes | ||||
| - Extensible | ||||
| The SUIT manifest can be used for a variety of purposes throughout | ||||
| its lifecycle. The manifest allows: | ||||
| - the Firmware Author to reason about releasing a firmware. | ||||
| - the Network Operator to reason about compatibility of a firmware. | ||||
| - the Device Operator to reason about the impact of a firmware. | ||||
| - the Device Operator to manage distribution of firmware to devices. | ||||
| - the Plant Manager to reason about timing and acceptance of | ||||
| firmware updates. | ||||
| - the device to reason about the authority & authenticity of a | ||||
| firmware prior to installation. | ||||
| - the device to reason about the applicability of a firmware. | ||||
| - the device to reason about the installation of a firmware. | ||||
| - the device to reason about the authenticity & encoding of a | ||||
| firmware at boot. | ||||
| Each of these uses happens at a different stage of the manifest | ||||
| lifecycle, so each has different requirements. | ||||
| 4.4. SUIT Manifest Design Summary | ||||
| In order to provide flexible behavior to constrained devices, while | ||||
| still allowing more powerful devices to use their full capabilities, | ||||
| the SUIT manifest encodes the required behavior of a Recipient | ||||
| device. Behavior is encoded as a specialized byte code, contained in | ||||
| a CBOR list. This promotes a flat encoding, which simplifies the | ||||
| parser. The information encoded by this byte code closely matches | ||||
| the operations that a device will perform, which promotes ease of | ||||
| processing. The core operations used by most update and trusted | ||||
| execution operations are represented in the byte code. The byte code | ||||
| can be extended by registering new operations. | ||||
| The specialized byte code approach gives benefits equivalent to those | ||||
| provided by a scripting language or conventional byte code, with two | ||||
| substantial differences. First, the language is extremely high | ||||
| level, consisting of only the operations that a device may perform | ||||
| during update and trusted execution of a firmware image. Second, the | ||||
| language specifies linear behavior, without reverse branches. | ||||
| Conditional processing is supported, and parallel and out-of-order | ||||
| processing may be performed by sufficiently capable devices. | ||||
| By structuring the data in this way, the manifest processor becomes a | ||||
| very simple engine that uses a pull parser to interpret the manifest. | ||||
| This pull parser invokes a series of command handlers that evaluate a | ||||
| Condition or execute a Directive. Most data is structured in a | ||||
| highly regular pattern, which simplifies the parser. | ||||
| The results of this allow a Recipient to implement a very small | ||||
| parser for constrained applications. If needed, such a parser also | ||||
| allows the Recipient to perform complex updates with reduced | ||||
| overhead. Conditional execution of commands allows a simple device | ||||
| to perform important decisions at validation-time. | ||||
| Dependency handling is vastly simplified as well. Dependencies | ||||
| function like subroutines of the language. When a manifest has a | ||||
| dependency, it can invoke that dependency's commands and modify their | ||||
| behavior by setting parameters. Because some parameters come with | ||||
| security implications, the dependencies also have a mechanism to | ||||
| reject modifications to parameters on a fine-grained level. | ||||
| Developing a robust permissions system works in this model too. The | Because the manifest can be used by different actors at different | |||
| Recipient can use a simple ACL that is a table of Identities and | times, some parts of the manifest can be removed without affecting | |||
| Component Identifier permissions to ensure that operations on | later stages of the lifecycle. This is called "Severing." Severing | |||
| components fail unless they are permitted by the ACL. This table can | of information is achieved by separating that information from the | |||
| be further refined with individual parameters and commands. | signed container so that removing it does not affect the signature. | |||
| This means that ensuring authenticity of severable parts of the | ||||
| manifest is a requirement for the signed portion of the manifest. | ||||
| Severing some parts makes it possible to discard parts of the | ||||
| manifest that are no longer necessary. This is important because it | ||||
| allows the storage used by the manifest to be greatly reduced. For | ||||
| example, no text size limits are needed if text is removed from the | ||||
| manifest prior to delivery to a constrained device. | ||||
| Capability reporting is similarly simplified. A Recipient can report | Elements are made severable by removing them from the manifest, | |||
| the Commands, Parameters, Algorithms, and Component Identifiers that | encoding them in a bstr, and placing a SUIT_Digest of the bstr in the | |||
| it supports. This is sufficiently precise for a manifest author to | manifest so that they can still be authenticated. The SUIT_Digest | |||
| create a manifest that the Recipient can accept. | typically consumes 4 bytes more than the size of the raw digest, | |||
| therefore elements smaller than (Digest Bits)/8 + 4 should never be | ||||
| severable. Elements larger than (Digest Bits)/8 + 4 may be | ||||
| severable, while elements that are much larger than (Digest Bits)/8 + | ||||
| 4 should be severable. | ||||
| The simplicity of design in the Recipient due to all of these | Because of this, all command sequences in the manifest are encoded in | |||
| benefits allows even a highly constrained platform to use advanced | a bstr so that there is a single code path needed for all command | |||
| update capabilities. | sequences. | |||
| 5. Interpreter Behavior | 6. Interpreter Behavior | |||
| This section describes the behavior of the manifest interpreter. | This section describes the behavior of the manifest interpreter and | |||
| This section focuses primarily on interpreting commands in the | focuses primarily on interpreting commands in the manifest. However, | |||
| manifest. However, there are several other important behaviors of | there are several other important behaviors of the interpreter: | |||
| the interpreter: encoding version detection , rollback protection, | encoding version detection, rollback protection, and authenticity | |||
| and authenticity verification are chief among these (see | verification are chief among these. | |||
| Section 5.1). | ||||
| 5.1. Interpreter Setup | 6.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 | |||
| of rollback protection may vary by application, but it has the | of rollback protection may vary by application, but it has the | |||
| following properties: | following properties: | |||
| - Whenever the interpreter can choose between several manifests, it | - Whenever the interpreter can choose between several manifests, it | |||
| MUST select the latest valid manifest, authentic manifest. | MUST select the latest valid, authentic manifest. | |||
| - If the latest valid, authentic manifest fails, it MAY select the | - If the latest valid, authentic manifest fails, it MAY select the | |||
| next latest valid, authentic manifest. | next latest valid, authentic manifest. | |||
| 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. | |||
| - Dependency not available (update interpreter). | - Dependency not available. | |||
| - Application crashed when executed (bootloader interpreter). | - Application crashed when executed. | |||
| - Watchdog timeout occurred (bootloader interpreter). | - Watchdog timeout occurred. | |||
| - Dependency or Payload verification failed (bootloader | - Dependency or Payload verification failed. | |||
| 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 | 6.2. Required Checks | |||
| The RECOMMENDED process is to verify the signature of the manifest | ||||
| prior to parsing/executing any section of the manifest. This guards | ||||
| the parser against arbitrary input by unauthenticated third parties, | ||||
| but it costs extra energy when a device receives an incompatible | ||||
| manifest. | ||||
| A device MAY choose to parse and execute only the SUIT_Common section | ||||
| of the manifest prior to signature verification, if - it expects to | ||||
| receive many incompatible manifests, and - it has power budget that | ||||
| makes signature verification undesirable. | ||||
| The guidelines in Creating Manifests (Section 7) require that the | ||||
| common section contains the applicability checks, so this section is | ||||
| sufficient for applicability verification. The manifest parser MUST | ||||
| NOT execute any command with side-effects outside the parser (for | ||||
| example, Run, Copy, Swap, or Fetch commands) prior to authentication | ||||
| and any such command MUST result in an error. | ||||
| Once a valid, authentic manifest has been selected, the interpreter | Once a valid, authentic manifest has been selected, the interpreter | |||
| MUST examine the component list and verify that its maximum number of | MUST examine the component list and verify that its maximum number of | |||
| components is not exceeded and that each listed component ID is | components is not exceeded and that each listed component ID is | |||
| supported. | supported. | |||
| For each listed component, the interpreter MUST provide storage for | For each listed component, the interpreter MUST provide storage for | |||
| the supported parameters (Section 5.4.1). If the interpreter does | the supported parameters. If the interpreter does not have | |||
| not have sufficient temporary storage to process the parameters for | sufficient temporary storage to process the parameters for all | |||
| all components, it MAY process components serially for each command | components, it MAY process components serially for each command | |||
| sequence. See Section 5.5 for more details. | sequence. See Section 6.5 for more details. | |||
| The interpreter SHOULD check that the common section contains at | The interpreter SHOULD check that the common section contains at | |||
| least one vendor ID check and at least one class ID check. | least one vendor ID check and at least one class ID check. | |||
| If the manifest contains more than one component, each command | If the manifest contains more than one component, each command | |||
| sequence MUST begin with a Set Current Component command. | sequence MUST begin with a Set Current Component command. | |||
| If a dependency is specified, then the interpreter MUST perform the | If a dependency is specified, then the interpreter MUST perform the | |||
| following checks: | following checks: | |||
| 1. At the beginning of each section in the dependent: all previous | 1. At the beginning of each section in the dependent: all previous | |||
| sections of each dependency have been executed. | sections of each dependency have been executed. | |||
| 2. At the end of each section in the dependent: The corresponding | 2. At the end of each section in the dependent: The corresponding | |||
| section in each dependency has been executed. | section in each dependency has been executed. | |||
| If the interpreter does not support dependencies and a manifest | If the interpreter does not support dependencies and a manifest | |||
| specifies a dependency, then the interpreter MUST reject the | specifies a dependency, then the interpreter MUST reject the | |||
| manifest. | manifest. | |||
| 5.3. Interpreter Fundamental Properties | 6.3. Interpreter Fundamental Properties | |||
| The interpreter has a small set of design goals: | The interpreter has a small set of design goals: | |||
| 1. Executing an update MUST either result in an error, or a | 1. Executing an update MUST either result in an error, or a | |||
| verifiably correct system state. | verifiably correct system state. | |||
| 2. Executing a secure boot MUST either result in an error, or a | 2. Executing a 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 | 6.4. Abstract Machine Description | |||
| The byte code that forms the bulk of the manifest is processed by an | ||||
| interpreter. This interpreter can be modeled as a simple abstract | ||||
| machine. This machine consists of several data storage locations | ||||
| that are modified by commands. Certain commands also affect the | ||||
| machine's behavior. | ||||
| Every command that modifies system state targets a specific | ||||
| component. Components are units of code or data that can be targeted | ||||
| by an update. They are identified by Component identifiers, arrays | ||||
| of binary-strings-effectively a binary path. Each component has a | ||||
| corresponding set of configuration, Parameters. Parameters are used | ||||
| as the inputs to commands. | ||||
| 5.4.1. Parameters | ||||
| Some parameters are REQUIRED to implement. These parameters allow a | ||||
| device to perform core functions. | ||||
| - Vendor ID. | ||||
| - Class ID. | ||||
| - Image Digest. | ||||
| Some parameters are RECOMMENDED to implement. These parameters are | ||||
| needed for most use-cases. | ||||
| - Image Size. | ||||
| - URI. | ||||
| Other parameters are OPTIONAL to implement. These parameters allow a | ||||
| device to implement specific use-cases. | ||||
| - Strict Order. | ||||
| - Soft Failure. | ||||
| - Device ID. | ||||
| - Encryption Info. | ||||
| - Unpack Info. | ||||
| - Source Component. | ||||
| - URI List. | ||||
| - Custom Parameters. | ||||
| 5.4.2. Commands | ||||
| Commands define the behavior of a device. The commands are divided | ||||
| into two groups: those that modify state (directives) and those that | ||||
| perform tests (conditions). There are also several Control Flow | ||||
| operations. | ||||
| Some commands are REQUIRED to implement. These commands allow a | ||||
| device to perform core functions | ||||
| - Check Vendor Identifier (cvid). | ||||
| - Check Class Identifier (ccid). | ||||
| - Verify Image (cimg). | ||||
| - Set Current Component (setc). | ||||
| - Override Parameters (ovrp). | ||||
| NOTE: on systems that support only a single component, Set Current | ||||
| Component has no effect. | ||||
| Some commands are RECOMMENDED to implement. These commands are | ||||
| needed for most use-cases | ||||
| - Set Current Dependency (setd). | ||||
| - Set Parameters (setp). | ||||
| - Process Dependency (pdep). | ||||
| - Run (run). | ||||
| - Fetch (getc). | ||||
| Other commands are OPTIONAL to implement. These commands allow a | ||||
| device to implement specific use-cases. | ||||
| - Use Before (ubf). | ||||
| - Check Component Offset (cco). | ||||
| - Check Device Identifier (cdid). | ||||
| - Check Image Not Match (nimg). | ||||
| - Check Minimum Battery (minb). | ||||
| - Check Update Authorized (auth). | ||||
| - Check Version (cver). | ||||
| - Abort (abrt). | ||||
| - Try Each (try). | ||||
| - Copy (copy). | ||||
| - Swap (swap). | ||||
| - Wait For Event (wfe). | ||||
| - Run Sequence (srun) mandatory component set. | ||||
| - Run with Arguments (arun). | The heart of the manifest is the list of commands, which are | |||
| processed by an interpreter. This interpreter can be modeled as a | ||||
| simple abstract machine. This machine consists of several data | ||||
| storage locations that are modified by commands. | ||||
| 5.4.3. Command Behavior | There are two types of commands, namely those that modify state | |||
| (directives) and those that perform tests (conditions). Parameters | ||||
| are used as the inputs to commands. Some directives offer control | ||||
| flow operations. Directives target a specific component. A | ||||
| component is a unit of code or data that can be targeted by an | ||||
| update. Components are identified by a Component Index, i.e. arrays | ||||
| of binary strings. | ||||
| The following table describes the behavior of each command. "params" | The following table describes the behavior of each command. "params" | |||
| represents the parameters for the current component or dependency. | represents the parameters for the current component or dependency. | |||
| +------+------------------------------------------------------------+ | +--------------------+----------------------------------------------+ | |||
| | Code | Operation | | | Command Name | Semantic of the Operation | | |||
| +------+------------------------------------------------------------+ | +--------------------+----------------------------------------------+ | |||
| | cvid | binary-match(component, params[vendor-id]) | | | Check Vendor | binary-match(component, params[vendor-id]) | | |||
| | | | | | Identifier | | | |||
| | ccid | binary-match(component, params[class-id]) | | | | | | |||
| | | | | | Check Class | binary-match(component, params[class-id]) | | |||
| | cimg | binary-match(digest(component), params[digest]) | | | Identifier | | | |||
| | | | | | | | | |||
| | setc | component := components[arg] | | | Verify Image | binary-match(digest(component), | | |||
| | | | | | | params[digest]) | | |||
| | ovrp | params[k] := v for k,v in arg | | | | | | |||
| | | | | | Set Component | component := components[arg] | | |||
| | setd | dependency := dependencies[arg] | | | Index | | | |||
| | | | | | | | | |||
| | setp | params[k] := v if not k in params for k,v in arg | | | Override | params[k] := v for k,v in arg | | |||
| | | | | | Parameters | | | |||
| | pdep | exec(dependency[common]); exec(dependency[current- | | | | | | |||
| | | segment]) | | | Set Dependency | dependency := dependencies[arg] | | |||
| | | | | | Index | | | |||
| | run | run(component) | | | | | | |||
| | | | | | Set Parameters | params[k] := v if not k in params for k,v in | | |||
| | getc | store(component, fetch(params[uri])) | | | | arg | | |||
| | | | | | | | | |||
| | ubf | assert(now() < arg) | | | Process Dependency | exec(dependency[common]); exec(dependency | | |||
| | | | | | | [current-segment]) | | |||
| | cco | assert(offsetof(component) == arg) | | | | | | |||
| | | | | | Run | run(component) | | |||
| | cdid | binary-match(component, params[device-id]) | | | | | | |||
| | | | | | Fetch | store(component, fetch(params[uri])) | | |||
| | nimg | not binary-match(digest(component), params[digest]) | | | | | | |||
| | | | | | Use Before | assert(now() < arg) | | |||
| | minb | assert(battery >= arg) | | | | | | |||
| | | | | | Check Component | assert(offsetof(component) == arg) | | |||
| | auth | assert(isAuthorized()) | | | Offset | | | |||
| | | | | | | | | |||
| | cver | assert(version_check(component, arg)) | | | Check Device | binary-match(component, params[device-id]) | | |||
| | | | | | Identifier | | | |||
| | abrt | assert(0) | | | | | | |||
| | | | | | Check Image Not | not binary-match(digest(component), | | |||
| | try | break if exec(seq) is not error for seq in arg | | | Match | params[digest]) | | |||
| | | | | | | | | |||
| | copy | store(component, params[src-component]) | | | Check Minimum | assert(battery >= arg) | | |||
| | | | | | Battery | | | |||
| | swap | swap(component, params[src-component]) | | | | | | |||
| | | | | | Check Update | assert(isAuthorized()) | | |||
| | wfe | until event(arg), wait | | | Authorized | | | |||
| | | | | | | | | |||
| | srun | exec(arg) | | | Check Version | assert(version_check(component, arg)) | | |||
| | | | | | | | | |||
| | arun | run(component, arg) | | | Abort | assert(0) | | |||
| +------+------------------------------------------------------------+ | | | | | |||
| | Try Each | break if exec(seq) is not error for seq in | | ||||
| | | arg | | ||||
| | | | | ||||
| | Copy | store(component, params[src-component]) | | ||||
| | | | | ||||
| | Swap | swap(component, params[src-component]) | | ||||
| | | | | ||||
| | Wait For Event | until event(arg), wait | | ||||
| | | | | ||||
| | Run Sequence | exec(arg) | | ||||
| | | | | ||||
| | Run with Arguments | run(component, arg) | | ||||
| +--------------------+----------------------------------------------+ | ||||
| 5.5. Serialized Processing Interpreter | 6.5. Serialized Processing Interpreter | |||
| Because each manifest has a list of components and a list of | Because each manifest has a list of components and a list of | |||
| components defined by its dependencies, it is possible for the | components defined by its dependencies, it is possible for the | |||
| manifest processor to handle one component at a time, traversing the | manifest processor to handle one component at a time, traversing the | |||
| manifest tree once for each listed component. In this mode, the | manifest tree once for each listed component. In this mode, the | |||
| interpreter ignores any commands executed while the component index | interpreter ignores any commands executed while the component index | |||
| is not the current component. This reduces the overall volatile | is not the current component. This reduces the overall volatile | |||
| storage required to process the update so that the only limit on | storage required to process the update so that the only limit on | |||
| number of components is the size of the manifest. However, this | number of components is the size of the manifest. However, this | |||
| approach requires additional processing power. | approach requires additional processing power. | |||
| 5.6. Parallel Processing Interpreter | 6.6. Parallel Processing Interpreter | |||
| Advanced devices may make use of the Strict Order parameter and | Advanced devices may make use of the Strict Order parameter and | |||
| enable parallel processing of some segments, or it may reorder some | enable parallel processing of some segments, or it may reorder some | |||
| segments. To perform parallel processing, once the Strict Order | segments. To perform parallel processing, once the Strict Order | |||
| parameter is set to False, the device may fork a process for each | parameter is set to False, the device may fork a process for each | |||
| command until the Strict Order parameter is returned to True or the | command 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 | |||
| skipping to change at page 18, line 29 ¶ | skipping to change at page 16, line 28 ¶ | |||
| - Set Component 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 | 6.7. Processing Dependencies | |||
| As described in Section 5.2, each manifest must invoke each of its | As described in Section 6.2, each manifest must invoke each of its | |||
| dependencies sections from the corresponding section of the | dependencies sections from the corresponding section of the | |||
| dependent. Any changes made to parameters by the dependency persist | dependent. Any changes made to parameters by the dependency persist | |||
| in the dependent. | in the dependent. | |||
| When a Process Dependency command is encountered, the interpreter | When a Process Dependency command is encountered, the interpreter | |||
| loads the dependency identified by the Current Dependency Index. The | loads the dependency identified by the Current Dependency Index. The | |||
| interpreter first executes the common-sequence section of the | interpreter first executes the common-sequence section of the | |||
| identified dependency, then it executes the section of the dependency | identified dependency, then it executes the section of the dependency | |||
| that corresponds to the currently executing section of the dependent. | that corresponds to the currently executing section of the dependent. | |||
| The interpreter also performs the checks described in Section 5.2 to | The interpreter also performs the checks described in Section 6.2 to | |||
| ensure that the dependent is processing the dependency correctly. | ensure that the dependent is processing the dependency correctly. | |||
| 6. Creating Manifests | 7. Creating Manifests | |||
| Manifests are created using tools for constructing COSE structures, | Manifests are created using tools for constructing COSE structures, | |||
| calculating cryptographic values and compiling desired system state | calculating cryptographic values and compiling desired system state | |||
| into a sequence of operations required to achieve that state. The | into a sequence of operations required to achieve that state. The | |||
| process of constructing COSE structures is covered in [RFC8152] and | process of constructing COSE structures and the calculation of | |||
| the calculation of cryptographic values is beyond the scope of this | cryptographic values is covered in [RFC8152]. | |||
| 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. Several templates are provided below to | |||
| here to cover common use-cases. Many of these templates can be | cover common use-cases. These templates can be combined to produce | |||
| aggregated to produce more complex behavior. | 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: A 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 | 7.1. Compatibility Check Template | |||
| When a manifest is constructed from a descriptive document, the | ||||
| descriptive document SHOULD be included in the severable text | ||||
| section. This section MAY be pruned from the manifest prior to | ||||
| distribution to a device. The inclusion of text source material | ||||
| enables several use-cases on unconstrained intermediate systems, | ||||
| where small manifest size, low parser complexity, and pull parsing | ||||
| are not required. | ||||
| An unconstrained system that makes decisions based on the manifest | ||||
| can use the source material instead so that it does not need to | ||||
| execute the manifest. | ||||
| An unconstrained system that presents data to a user can do so | ||||
| according to typical usage patterns without first executing the | ||||
| manifest, and can trust that information with the same level of | ||||
| confidence as the manifest itself. | ||||
| A verifier can be constructed to emulate execution the manifest and | ||||
| compare the results of that execution to the source material, | ||||
| providing a check that the manifest performs its stated objectives | ||||
| and that the manifest does not exceed the capabilities of the target | ||||
| device. | ||||
| 6.2. Required Template: Compatibility Check | ||||
| The compatibility check ensures that devices only install compatible | The compatibility check ensures that devices only install compatible | |||
| images. | images. In this template all information is contained in the common | |||
| block and the following sequence of operations are used: | ||||
| Common: Set Current Component Check Vendor Identifier Check Class | ||||
| Identifier | ||||
| All manifests MUST contain the compatibility check template, except | ||||
| as outlined below. | ||||
| If a device class has a unique trust anchor, and every element in its | ||||
| trust chain is unique-different from every element in any other | ||||
| device class, then it MAY include the compatibility check. | ||||
| If a manifest includes a dependency that performs a compatibility | ||||
| check, then the dependent manifest MAY include the compatibility | ||||
| check. | ||||
| The compatibility check template contains a data dependency: Vendor | ||||
| Identifier and Class Identifier MUST be set prior to executing the | ||||
| template. One example of the full template is included below, | ||||
| however Parameters may be set within a Try-Each block as well. They | ||||
| may also be inherited from a dependent manifest. | ||||
| - Common: | ||||
| o Set Current Component. | ||||
| o Set Parameters: | ||||
| * Vendor ID. | ||||
| * Class ID. | ||||
| o Check Vendor Identifier. | ||||
| o Check Class Identifier. | - Set Component Index directive (see Section 9.12.3) | |||
| 6.3. Use Case Template: XIP Secure Boot | - Set Parameters directive (see Section 9.12.8) for Vendor ID and | |||
| Class ID (see Section 9.11) | ||||
| - Common: | - Check Vendor Identifier condition (see Section 9.12.1.1) | |||
| o Set Current Component. | - Check Class Identifier condication (see Section 9.12.1.1) | |||
| o Override Parameters: | 7.2. Secure Boot Template | |||
| * Digest. | This template performs a secure boot operation. | |||
| * Size. | The following operations are placed into the common block: | |||
| - Run: | - Set Component Index directive (see Section 9.12.3) | |||
| o Set Current Component. | - Override Parameters directive (see Section 9.12.9) for Image | |||
| Digest and Image Size (see Section 9.11) | ||||
| o Check Image Match. | Then, the run block contains the following operations: | |||
| o Directive Run. | - Set Component Index directive (see Section 9.12.3) | |||
| 6.4. Use Case Template: Firmware Download | - Check Image Match condition (see Section 9.12.1.2) | |||
| - Common: | - Run directive (see Section 9.12.14) | |||
| o Set Current Component. | According to Section 6.4, the Run directive applies to the component | |||
| referenced by the current Component Index. Hence, the Set Component | ||||
| Index directive has to be used to target a specific component. | ||||
| o Override Parameters: | 7.3. Firmware Download Template | |||
| * Digest. | This template triggers the download of firmware. | |||
| * Size. | The following operations are placed into the common block: | |||
| - Install: | - Set Component Index directive (see Section 9.12.3) | |||
| o Set Current Component. | - Override Parameters directive (see Section 9.12.9) for Image | |||
| Digest and Image Size (see Section 9.11) | ||||
| o Set Parameters: | Then, the install block contains the following operations: | |||
| * URI. | - Set Component Index directive (see Section 9.12.3) | |||
| o Fetch. | - Set Parameters directive (see Section 9.12.8) for URI (see | |||
| Section 9.11) | ||||
| 6.5. Use Case Template: Load from External Storage | - Fetch directive (see Section 9.12.10) | |||
| - Load: | The Fetch directive needs the URI parameter to be set to determine | |||
| where the image is retrieved from. Additionally, the destination of | ||||
| where the component shall be stored has to be configured. The URI is | ||||
| configured via the Set Parameters directive while the destination is | ||||
| configured via the Set Component Index directive. | ||||
| o Set Current Component. | 7.4. Load from External Storage Template | |||
| o Set Parameters: | This directive loads an firmware image from external storage. | |||
| * Source Index. | The following operations are placed into the load block: | |||
| o Copy. | - Set Component Index directive (see Section 9.12.3) | |||
| 6.6. Use Case Template Load & Decompress from External Storage | - Set Parameters directive (see Section 9.12.8) for Component Index | |||
| (see Section 9.11) | ||||
| - Load: | - Copy directive (see Section 9.12.11) | |||
| o Set Current Component. | As outlined in Section 6.4, the Copy directive needs a source and a | |||
| destination to be configured. The source is configured via Component | ||||
| Index (with the Set Parameters directive) and the destination is | ||||
| configured via the Set Component Index directive. | ||||
| o Set Parameters: | 7.5. Load & Decompress from External Storage Template | |||
| * Source Index. | The following operations are placed into the load block: | |||
| * Compression Info. | - Set Component Index directive (see Section 9.12.3) | |||
| o Copy. | - Set Parameters directive (see Section 9.12.8) for Component Index | |||
| and Compression Info (see Section 9.11) | ||||
| 6.7. Use Case Template: Dependency | - Copy directive (see Section 9.12.11) | |||
| - Dependency Resolution: | This example is similar to the previous case but additionally | |||
| performs decompression. Hence, the only difference is in setting the | ||||
| Compression Info parameter. | ||||
| o Set Current Dependency. | 7.6. Dependency Template | |||
| o Set Parameters: | The following operations are placed into the dependency resolution | |||
| block: | ||||
| * URI. | - Set Dependency Index directive (see Section 9.12.4) | |||
| o Fetch. | - Set Parameters directive (see Section 9.12.8) for URI (see | |||
| Section 9.11) | ||||
| o Check Image Match. | - Fetch directive (see Section 9.12.10) | |||
| o Process Dependency. | - Check Image Match condition (see Section 9.12.1.2) | |||
| - Validate: | - Process Dependency directive (see Section 9.12.7) | |||
| o Set Current Dependency. | Then, the validate block contains the following operations: | |||
| o Check Image Match. | - Set Dependency Index directive (see Section 9.12.4) | |||
| o Process Dependency. | - Check Image Match condition (see Section 9.12.1.2) | |||
| For any other section that the dependency has, the dependent MUST | - Process Dependency directive (see Section 9.12.7) | |||
| 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 | 8. Envelope | |||
| The manifest is enveloped in a CBOR map containing: | ||||
| 1. Authentication delegation chain(s) | ||||
| 2. The authentication wrapper (a list of COSE sign/MAC objects) | ||||
| 3. The manifest (a map) | ||||
| 1. Critical Information | ||||
| 2. Information shared by all command sequences | ||||
| 1. List of dependencies | The diagram below shows high-level structure of the SUIT manifest | |||
| 2. List of payloads | embedded in the envelope, the top-level structure. | |||
| 3. List of payloads in dependencies | +------------------------+ | |||
| | Envelope | | ||||
| +------------------------+ | ||||
| | Delegation Info | | ||||
| | Authentication Wrapper | | ||||
| | Plaintext or -+---------> +----------------------------+ | ||||
| | Encrypted Manifest-+ | | Manifest | | ||||
| | Severable Fields | +----------------------------+ | ||||
| | Human-Readable Text | | Version | | ||||
| | COSWID | | Sequence Number | | ||||
| +------------------------+ +----- Common Structure | | ||||
| | +--- Commands | | ||||
| | | | Digest of Enveloped Fields | | ||||
| +-----------------------+ | | | Reference to Full Manifest | | ||||
| | Common Structure | <-+ | +----------------------------+ | ||||
| +-----------------------+ | | ||||
| | Dependencies | +->+-----------------------+ | ||||
| | Components IDs | +->| Commands | | ||||
| | Component References | | +-----------------------+ | ||||
| | Common Commands ------------+ | List of ( pairs of ( | | ||||
| +-----------------------+ | * command code | | ||||
| | * argument | | ||||
| | )) | | ||||
| +----------------------- | ||||
| 4. Common list of conditions, directives | 8.1. Authenticated Manifests | |||
| 3. Reference URI | The suit-authentication-wrapper contains a list of 1 or more | |||
| cryptographic authentication wrappers for the core part of the | ||||
| manifest. These are implemented as COSE_Mac_Tagged or | ||||
| COSE_Sign_Tagged blocks. Each of these blocks contains a SUIT_Digest | ||||
| of the manifest. This enables modular processing of the manifest. | ||||
| The COSE_Mac_Tagged and COSE_Sign_Tagged blocks are described in RFC | ||||
| 8152 [RFC8152]. The suit-authentication-wrapper MUST come before any | ||||
| element in the SUIT_Envelope, except for the OPTIONAL suit- | ||||
| delegation, regardless of canonical encoding of CBOR. All validators | ||||
| MUST reject any SUIT_Envelope that begins with any element other than | ||||
| a suit-authentication-wrapper or suit-delegation. | ||||
| 4. Dependency resolution Reference or conditions/directives | A SUIT_Envelope that has not had authentication information added | |||
| MUST still contain the suit-authentication-wrapper element, but the | ||||
| content MUST be nil. | ||||
| 5. Payload fetch Reference or conditions/directives | For manifests that are only authenticated the envelope MUST contain | |||
| the plaintext manifest in SUIT_Manifest structure. | ||||
| 6. Installation Reference or conditions/directives | 8.2. Encrypted Manifests | |||
| 7. Verification conditions/directives | For encrypted manifest both a SUIT_Encryption_Wrapper and the | |||
| ciphertext of a manifest is included in the envelope. | ||||
| 8. Load conditions/directives | When the envelope contains the SUIT_Encryption_Wrapper, the suit- | |||
| authentication-wrapper MUST authenticate the plaintext of suit- | ||||
| manifest-encrypted. This ensures that the manifest can be stored | ||||
| decrypted and that a recipient MAY convert the suit-manifest- | ||||
| encrypted element to a suit-manifest element. | ||||
| 9. Run conditions/directives | The SUIT_Manifest structure describes the payload(s) to be installed | |||
| and any dependencies on other manifests. | ||||
| 10. Text / Reference | The suit-manifest-encryption-info structure contains information | |||
| required to decrypt a ciphertext manifest and the suit-manifest- | ||||
| encrypted structure contains the ciphertext. | ||||
| 11. COSWID / Reference | 8.3. Delegation Info | |||
| 4. Dependency resolution conditions/directives | The suit-delegation field may carry one or multiple CBOR Web Tokens | |||
| (CWTs). They can be used to perform enhanced authorization | ||||
| decisions. | ||||
| 5. Payload fetch conditions/directives | 8.4. Severable Fields | |||
| 6. Installation conditions/directives | Each of suit-dependency-resolution, suit-payload-fetch, and suit- | |||
| payload-installation contain the severable contents of the | ||||
| identically named portions of the manifest, described in Section 9. | ||||
| 7. Text | 8.5. Human-Readable Text | |||
| 8. COSWID | suit-text contains all the human-readable information that describes | |||
| any and all parts of the manifest, its payload(s) and its | ||||
| resource(s). | ||||
| 9. Inline Payload(s) | 8.6. COSWID | |||
| All elements in the outer map are wrapped in bstr. | suit-coswid contains a Concise Software Identifier. This may be | |||
| discarded by the Recipient if not needed. | ||||
| +--------------------+ | 8.7. Encoding Considerations | |||
| | Manifest Envelope | | ||||
| +--------------------+ | ||||
| | Delegation CWTs | | ||||
| | COSE Envelopes | | ||||
| | Manifest --------------------> +-----------------------+ | ||||
| | Severable Elements | | Manifest (bstr) | | ||||
| +--------------------+ +-----------------------+ | ||||
| | Structure Version | | ||||
| | Sequence Number | | ||||
| +-----------------------+ <------- Common Info | | ||||
| | Common Info (bstr) | | Reference URI | | ||||
| +-----------------------+ | Installation Commands ---+ | ||||
| | Dependencies | | Invocation Commands -----+ | ||||
| | Components IDs | | Protected Elements | | | ||||
| | Component References | +-----------------------+ | | ||||
| | Common Commands --------+ | | ||||
| +-----------------------+ | | | ||||
| +-> +-----------------------+ <---+ | ||||
| | Commands (bstr) | | ||||
| +-----------------------+ | ||||
| | List of ( pairs of ( | | ||||
| | * command ID code | | ||||
| | * argument | | ||||
| | )) | | ||||
| +-----------------------+ | ||||
| The map indices in this encoding are reset to 1 for each map within | The map indices in the envelope encoding are reset to 1 for each map | |||
| the structure. This is to keep the indices as small as possible. | within the structure. This is to keep the indices as small as | |||
| The goal is to keep the index objects to single bytes (CBOR positive | possible. The goal is to keep the index objects to single bytes | |||
| integers 1-23). | (CBOR positive integers 1-23). | |||
| Wherever enumerations are used, they are started at 1. This allows | Wherever enumerations are used, they are started at 1. This allows | |||
| detection of several common software errors that are caused by | detection of several common software errors that are caused by | |||
| uninitialised variables. Positive numbers in enumerations are | 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 | All elements of the envelope must be wrapped in a bstr to minimize | |||
| adopted in COSE [RFC8152]: SUIT_Structure_Name. | the complexity of the code that evaluates the cryptographic integrity | |||
| of the element and to ensure correct serialization for integrity and | ||||
| 7.1. Severable Elements | authenticity checks. | |||
| Because the manifest can be used by different actors at different | ||||
| times, some parts of the manifest can be removed without affecting | ||||
| later stages of the lifecycle. This is called "Severing." Severing | ||||
| of information is achieved by separating that information from the | ||||
| signed container so that removing it does not affect the signature. | ||||
| This means that ensuring authenticity of severable parts of the | ||||
| manifest is a requirement for the signed portion of the manifest. | ||||
| Severing some parts makes it possible to discard parts of the | ||||
| manifest that are no longer necessary. This is important because it | ||||
| allows the storage used by the manifest to be greatly reduced. For | ||||
| example, no text size limits are needed if text is removed from the | ||||
| manifest prior to delivery to a constrained device. | ||||
| Elements are made severable by removing them from the manifest, | ||||
| encoding them in a bstr, and placing a SUIT_Digest of the bstr in the | ||||
| manifest so that they can still be authenticated. The SUIT_Digest | ||||
| typically consumes 4 bytes more than the size of the raw digest, | ||||
| therefore elements smaller than (Digest Bits)/8 + 4 SHOULD never be | ||||
| severable. Elements larger than (Digest Bits)/8 + 4 MAY be | ||||
| severable, while elements that are much larger than (Digest Bits)/8 + | ||||
| 4 SHOULD be severable. | ||||
| Because of this, all command sequences in the manifest are encoded in | ||||
| a bstr so that there is a single code path needed for all command | ||||
| sequences | ||||
| 7.2. Envelope | 8.8. SUIT_Envelope CDDL | |||
| This object is a container for the other pieces of the manifest to | CDDL names are hyphenated and CDDL structures follow the convention | |||
| provide a common mechanism to find each of the parts. All elements | adopted in COSE [RFC8152]: SUIT_Structure_Name. | |||
| of the envelope are contained in bstr objects. Wherever the manifest | ||||
| references an object in the envelope, the bstr is included in the | ||||
| digest calculation. | ||||
| The CDDL that describes the envelope is below | The CDDL that describes the envelope is below. | |||
| SUIT_Envelope = { | SUIT_Envelope = { | |||
| suit-delegation => bstr .cbor SUIT_Delegation | suit-delegation => bstr .cbor SUIT_Delegation | |||
| suit-authentication-wrapper | suit-authentication-wrapper | |||
| => bstr .cbor SUIT_Authentication_Wrapper / nil, | => bstr .cbor SUIT_Authentication_Wrapper / nil, | |||
| $$SUIT_Manifest_Wrapped, | $$SUIT_Manifest_Wrapped, | |||
| * $$SUIT_Severed_Fields, | * $$SUIT_Severed_Fields, | |||
| } | } | |||
| SUIT_Delegation = [ + [ + CWT ] ] | SUIT_Delegation = [ + [ + CWT ] ] | |||
| skipping to change at page 26, line 41 ¶ | skipping to change at page 23, line 41 ¶ | |||
| bstr .cbor SUIT_Command_Sequence) | bstr .cbor SUIT_Command_Sequence) | |||
| $$SUIT_Severed_Fields //= (suit-payload-fetch => | $$SUIT_Severed_Fields //= (suit-payload-fetch => | |||
| bstr .cbor SUIT_Command_Sequence) | bstr .cbor SUIT_Command_Sequence) | |||
| $$SUIT_Severed_Fields //= (suit-install => | $$SUIT_Severed_Fields //= (suit-install => | |||
| bstr .cbor SUIT_Command_Sequence) | bstr .cbor SUIT_Command_Sequence) | |||
| $$SUIT_Severed_Fields //= (suit-text => | $$SUIT_Severed_Fields //= (suit-text => | |||
| bstr .cbor SUIT_Text_Map) | bstr .cbor SUIT_Text_Map) | |||
| $$SUIT_Severed_Fields //= (suit-coswid => | $$SUIT_Severed_Fields //= (suit-coswid => | |||
| bstr .cbor concise-software-identity) | bstr .cbor concise-software-identity) | |||
| All elements of the envelope must be wrapped in a bstr to minimize | 9. Manifest | |||
| the complexity of the code that evaluates the cryptographic integrity | ||||
| of the element and to ensure correct serialization for integrity and | ||||
| authenticity checks. | ||||
| The suit-authentication-wrapper contains a list of 1 or more | ||||
| cryptographic authentication wrappers for the core part of the | ||||
| manifest. These are implemented as COSE_Mac_Tagged or | ||||
| COSE_Sign_Tagged blocks. Each of these blocks contains a SUIT_Digest | ||||
| of the manifest. This enables modular processing of the manifest. | ||||
| The COSE_Mac_Tagged and COSE_Sign_Tagged blocks are described in RFC | ||||
| 8152 [RFC8152] and are beyond the scope of this document. The suit- | ||||
| authentication-wrapper MUST come before any element in the | ||||
| SUIT_Envelope, except for the OPTIONAL suit-delegation, regardless of | ||||
| canonical encoding of CBOR. All validators MUST reject any | ||||
| SUIT_Envelope that begins with any element other than a suit- | ||||
| authentication-wrapper or suit-delegation. | ||||
| A SUIT_Envelope that has not had authentication information added | ||||
| MUST still contain the suit-authentication-wrapper element, but the | ||||
| content MUST be nil. | ||||
| The envelope MUST contain only one of | ||||
| - a plaintext manifest: SUIT_Manifest. | ||||
| - an encrypted manifest: both a SUIT_Encryption_Wrapper and the | ||||
| ciphertext of a manifest. | ||||
| When the envelope contains SUIT_Encryption_Wrapper, the suit- | ||||
| authentication-wrapper MUST authenticate the plaintext of suit- | ||||
| manifest-encrypted. This ensures that the manifest can be stored | ||||
| decrypted and that a recipient MAY convert the suit-manifest- | ||||
| encrypted element to a suit-manifest element. | ||||
| suit-manifest contains a SUIT_Manifest structure, which describes the | ||||
| payload(s) to be installed and any dependencies on other manifests. | ||||
| suit-manifest-encryption-info contains a SUIT_Encryption_Wrapper, a | ||||
| COSE object that describes the information required to decrypt a | ||||
| ciphertext manifest. | ||||
| suit-manifest-encrypted contains a ciphertext manifest. | ||||
| Each of suit-dependency-resolution, suit-payload-fetch, and suit- | ||||
| payload-installation contain the severable contents of the | ||||
| identically named portions of the manifest, described in Section 7.3. | ||||
| suit-text contains all the human-readable information that describes | ||||
| any and all parts of the manifest, its payload(s) and its | ||||
| resource(s). | ||||
| suit-coswid contains a Concise Software Identifier. This may be | ||||
| discarded by the Recipient if not needed. | ||||
| 7.3. Manifest | ||||
| The manifest describes the critical metadata for the referenced | ||||
| payload(s). In addition, it contains: | ||||
| 1. a version number for the manifest structure itself | ||||
| 2. a sequence number | ||||
| 3. a list of dependencies | ||||
| 4. a list of components affected | ||||
| 5. a list of components affected by dependencies | ||||
| 6. a reference for each of the severable blocks. | ||||
| 7. a list of actions that the Recipient should perform. | The manifest contains: | |||
| The following CDDL fragment defines the manifest. | - a version number (see Section 9.1) | |||
| SUIT_Manifest = { | - a sequence number (see Section 9.2) | |||
| suit-manifest-version => 1, | ||||
| suit-manifest-sequence-number => uint, | ||||
| suit-common => bstr .cbor SUIT_Common, | ||||
| ? suit-reference-uri => #6.32(tstr), | ||||
| * $$SUIT_Severable_Command_Sequences, | ||||
| * $$SUIT_Command_Sequences, | ||||
| * $$SUIT_Protected_Elements, | ||||
| } | ||||
| $$SUIT_Severable_Command_Sequences //= (suit-dependency-resolution => | - a common structure with information that is shared between command | |||
| SUIT_Severable_Command_Segment) | sequences (see Section 9.3) | |||
| $$SUIT_Severable_Command_Segments //= (suit-payload-fetch => | ||||
| SUIT_Severable_Command_Sequence) | ||||
| $$SUIT_Severable_Command_Segments //= (suit-install => | ||||
| SUIT_Severable_Command_Sequence) | ||||
| SUIT_Severable_Command_Sequence = | - a list of commands that the Recipient should perform (see | |||
| SUIT_Digest / bstr .cbor SUIT_Command_Sequence | Section 9.5) | |||
| $$SUIT_Command_Sequences //= ( suit-validate => | - a reference to the full manifest (see Section 9.4) | |||
| bstr .cbor SUIT_Command_Sequence ) | ||||
| $$SUIT_Command_Sequences //= ( suit-load => | ||||
| bstr .cbor SUIT_Command_Sequence ) | ||||
| $$SUIT_Command_Sequences //= ( suit-run => | ||||
| bstr .cbor SUIT_Command_Sequence ) | ||||
| $$SUIT_Protected_Elements //= ( suit-text => SUIT_Digest ) | - a digest of human-readable text describing the manifest found in | |||
| $$SUIT_Protected_Elements //= ( suit-coswid => SUIT_Digest ) | the SUIT_Envelope (see Section 9.6) | |||
| SUIT_Common = { | - a digest of the Concise Software Identifier found in the | |||
| ? suit-dependencies => bstr .cbor SUIT_Dependencies, | SUIT_Envelope (see Section 9.7) | |||
| ? suit-components => bstr .cbor SUIT_Components, | ||||
| ? suit-dependency-components | ||||
| => bstr .cbor SUIT_Component_References, | ||||
| ? 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, the human-readable text SHOULD be severable, since most | |||
| occupy more space than a SUIT_Digest, but are not needed by the | useful text elements occupy more space than a SUIT_Digest, but are | |||
| Recipient. Because SUIT_Digest is a CBOR Array and each severable | not needed by the Recipient. Because SUIT_Digest is a CBOR Array and | |||
| element is a CBOR bstr, it is straight-forward for a Recipient to | each severable element is a CBOR bstr, it is straight-forward for a | |||
| determine whether an element is been severable. The key used for a | Recipient to determine whether an element has been severed. The key | |||
| severable element is the same in the SUIT_Manifest and in the | used for a severable element is the same in the SUIT_Manifest and in | |||
| SUIT_Envelope so that a Recipient can easily identify the correct | the SUIT_Envelope so that a Recipient can easily identify the correct | |||
| data in the envelope. | data in the envelope. | |||
| 9.1. suit-manifest-version | ||||
| The suit-manifest-version indicates the version of serialization 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 to implement. | |||
| 9.2. suit-manifest-sequence-number | ||||
| The suit-manifest-sequence-number is a monotonically increasing anti- | The suit-manifest-sequence-number is a monotonically increasing anti- | |||
| rollback counter. It also helps 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 to implement. | |||
| 9.3. suit-common | ||||
| suit-common encodes all the information that is shared between each | suit-common encodes all the information that is shared between each | |||
| of the command sequences, including: suit-dependencies, suit- | of the command sequences, including: suit-dependencies, suit- | |||
| components, 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 | |||
| manifests that must be present before the current manifest can be | manifests that must be present before the current manifest can be | |||
| processed. suit-dependencies is OPTIONAL to implement. | processed. suit-dependencies is OPTIONAL to implement. | |||
| In order to distinguish between components that are affected by the | In order to distinguish between components that are affected by the | |||
| current manifest and components that are affected by a dependency, | current manifest and components that are affected by a dependency, | |||
| they are kept in separate lists. Components affected by the current | they are kept in separate lists. Components affected by the current | |||
| manifest only list the component identifier. Components affected by | manifest only list the component identifier. Components affected by | |||
| a dependency include the component identifier and the index of the | a dependency include the component identifier and the index of the | |||
| dependency that defines the component. | dependency that defines the component. | |||
| suit-components is a list of SUIT_Component blocks that specify the | suit-components is a list of SUIT_Component blocks that specify the | |||
| component identifiers that will be affected by the content of the | component identifiers that will be affected by the content of the | |||
| current manifest. suit-components is OPTIONAL, but at least one | current manifest. suit-components is OPTIONAL to implement, but at | |||
| manifest MUST contain a suit-components block. | least one manifest MUST contain a suit-components block. | |||
| suit-dependency-components is a list of SUIT_Component_Reference | suit-dependency-components is a list of SUIT_Component_Reference | |||
| blocks that specify component identifiers that will be affected by | blocks that specify component identifiers that will be affected by | |||
| the content of a dependency of the current manifest. suit-dependency- | the content of a dependency of the current manifest. suit-dependency- | |||
| components is OPTIONAL. | components is OPTIONAL to implement. | |||
| suit-common-sequence is a SUIT_Command_Sequence to execute prior to | suit-common-sequence is a SUIT_Command_Sequence to execute prior to | |||
| executing any other command sequence. Typical actions in suit- | executing any other command sequence. Typical actions in suit- | |||
| common-sequence include setting expected device identity and image | common-sequence include setting expected device identity and image | |||
| digests when they are conditional (see Section 10 for more | digests when they are conditional (see Section 12 for more | |||
| information on conditional sequences). suit-common-sequence is | information on conditional sequences). suit-common-sequence is | |||
| RECOMMENDED. | RECOMMENDED to implement. | |||
| 9.4. suit-reference-uri | ||||
| suit-reference-uri is a text string that encodes a URI where a full | suit-reference-uri is a text string that encodes a URI where a full | |||
| version of this manifest can be found. This is convenient for | version of this manifest can be found. This is convenient for | |||
| allowing management systems to show the severed elements of a | allowing management systems to show the severed elements of a | |||
| manifest when this URI is reported by a device after installation. | manifest when this URI is reported by a device after installation. | |||
| 9.5. SUIT_Command_Sequence | ||||
| suit-dependency-resolution is a SUIT_Command_Sequence to execute in | suit-dependency-resolution is a SUIT_Command_Sequence to execute in | |||
| order to perform dependency resolution. Typical actions include | order to perform dependency resolution. Typical actions include | |||
| configuring URIs of dependency manifests, fetching dependency | configuring URIs of dependency manifests, fetching dependency | |||
| manifests, and validating dependency manifests' contents. suit- | manifests, and validating dependency manifests' contents. suit- | |||
| dependency-resolution is REQUIRED when suit-dependencies is present. | dependency-resolution is REQUIRED to implement and to use when suit- | |||
| dependencies is present. | ||||
| suit-payload-fetch is a SUIT_Command_Sequence to execute in order to | suit-payload-fetch is a SUIT_Command_Sequence to execute in order to | |||
| obtain a payload. Some manifests may include these actions in the | obtain a payload. Some manifests may include these actions in the | |||
| suit-install section instead if they operate in a streaming | suit-install section instead if they operate in a streaming | |||
| installation mode. This is particularly relevant for constrained | installation mode. This is particularly relevant for constrained | |||
| devices without any temporary storage for staging the update. suit- | devices without any temporary storage for staging the update. suit- | |||
| payload-fetch is OPTIONAL. | payload-fetch is OPTIONAL to implement. | |||
| suit-install is a SUIT_Command_Sequence to execute in order to | suit-install is a SUIT_Command_Sequence to execute in order to | |||
| install a payload. Typical actions include verifying a payload | install a payload. Typical actions include verifying a payload | |||
| stored in temporary storage, copying a staged payload from temporary | stored in temporary storage, copying a staged payload from temporary | |||
| storage, and unpacking a payload. suit-install is OPTIONAL. | storage, and unpacking a payload. suit-install is OPTIONAL to | |||
| implement. | ||||
| suit-validate is a SUIT_Command_Sequence to execute in order to | suit-validate is a SUIT_Command_Sequence to execute in order to | |||
| validate that the result of applying the update is correct. Typical | validate that the result of applying the update is correct. Typical | |||
| actions involve image validation and manifest validation. suit- | actions involve image validation and manifest validation. suit- | |||
| validate is REQUIRED. If the manifest contains dependencies, one | validate is REQUIRED to implement. If the manifest contains | |||
| process-dependency invocation per dependency or one process- | dependencies, one process-dependency invocation per dependency or one | |||
| dependency invocation targeting all dependencies SHOULD be present in | process-dependency invocation targeting all dependencies SHOULD be | |||
| validate. | present in validate. | |||
| suit-load is a SUIT_Command_Sequence to execute in order to prepare a | suit-load is a SUIT_Command_Sequence to execute in order to prepare a | |||
| payload for execution. Typical actions include copying an image from | payload for execution. Typical actions include copying an image from | |||
| permanent storage into RAM, optionally including actions such as | permanent storage into RAM, optionally including actions such as | |||
| decryption or decompression. suit-load is OPTIONAL. | decryption or decompression. suit-load is OPTIONAL to implement. | |||
| suit-run is a SUIT_Command_Sequence to execute in order to run an | suit-run is a SUIT_Command_Sequence to execute in order to run an | |||
| image. suit-run typically contains a single instruction: either the | image. suit-run typically contains a single instruction: either the | |||
| "run" directive for the bootable manifest or the "process | "run" directive for the bootable manifest or the "process | |||
| dependencies" directive for any dependents of the bootable manifest. | dependencies" directive for any dependents of the bootable manifest. | |||
| suit-run is OPTIONAL. Only one manifest in an update may contain the | suit-run is OPTIONAL to implement. Only one manifest in an update | |||
| "run" directive. | may contain the "run" directive. | |||
| 9.6. suit-text | ||||
| suit-text is a digest that uniquely identifies the content of the | suit-text is a digest that uniquely identifies the content of the | |||
| Text that is packaged in the SUIT_Envelope. text is OPTIONAL. | Text that is packaged in the SUIT_Envelope. suit-text is OPTIONAL to | |||
| implement. | ||||
| 9.7. suit-coswid | ||||
| suit-coswid is a digest that uniquely identifies the content of the | suit-coswid is a digest that uniquely identifies the content of the | |||
| concise-software-identifier that is packaged in the SUIT_Envelope. | concise-software-identifier that is packaged in the SUIT_Envelope. | |||
| coswid is OPTIONAL. | suit-coswid is OPTIONAL to implement. | |||
| 7.4. SUIT_Dependency | 9.8. SUIT_Manifest CDDL | |||
| The following CDDL fragment defines the manifest. | ||||
| SUIT_Manifest = { | ||||
| suit-manifest-version => 1, | ||||
| suit-manifest-sequence-number => uint, | ||||
| suit-common => bstr .cbor SUIT_Common, | ||||
| ? suit-reference-uri => #6.32(tstr), | ||||
| * $$SUIT_Severable_Command_Sequences, | ||||
| * $$SUIT_Command_Sequences, | ||||
| * $$SUIT_Protected_Elements, | ||||
| } | ||||
| $$SUIT_Severable_Command_Sequences //= (suit-dependency-resolution => | ||||
| SUIT_Severable_Command_Segment) | ||||
| $$SUIT_Severable_Command_Segments //= (suit-payload-fetch => | ||||
| SUIT_Severable_Command_Sequence) | ||||
| $$SUIT_Severable_Command_Segments //= (suit-install => | ||||
| SUIT_Severable_Command_Sequence) | ||||
| SUIT_Severable_Command_Sequence = | ||||
| SUIT_Digest / bstr .cbor SUIT_Command_Sequence | ||||
| $$SUIT_Command_Sequences //= ( suit-validate => | ||||
| bstr .cbor SUIT_Command_Sequence ) | ||||
| $$SUIT_Command_Sequences //= ( suit-load => | ||||
| bstr .cbor SUIT_Command_Sequence ) | ||||
| $$SUIT_Command_Sequences //= ( suit-run => | ||||
| bstr .cbor SUIT_Command_Sequence ) | ||||
| $$SUIT_Protected_Elements //= ( suit-text => SUIT_Digest ) | ||||
| $$SUIT_Protected_Elements //= ( suit-coswid => SUIT_Digest ) | ||||
| SUIT_Common = { | ||||
| ? suit-dependencies => bstr .cbor SUIT_Dependencies, | ||||
| ? suit-components => bstr .cbor SUIT_Components, | ||||
| ? suit-dependency-components | ||||
| => bstr .cbor SUIT_Component_References, | ||||
| ? suit-common-sequence => bstr .cbor SUIT_Command_Sequence, | ||||
| } | ||||
| 9.9. Dependencies | ||||
| SUIT_Dependency specifies a manifest that describes a dependency of | SUIT_Dependency specifies a manifest that describes a dependency of | |||
| the current manifest. | the current manifest. | |||
| The following CDDL describes the SUIT_Dependency structure. | The following CDDL describes the SUIT_Dependency structure. | |||
| SUIT_Dependency = { | SUIT_Dependency = { | |||
| suit-dependency-digest => SUIT_Digest, | suit-dependency-digest => SUIT_Digest, | |||
| ? suit-dependency-prefix => SUIT_Component_Identifier, | ? suit-dependency-prefix => SUIT_Component_Identifier, | |||
| } | } | |||
| skipping to change at page 32, line 40 ¶ | skipping to change at page 28, line 29 ¶ | |||
| different algorithm, or trading COSE_Sign for COSE_Mac. | different algorithm, or trading COSE_Sign for COSE_Mac. | |||
| The suit-dependency-prefix element contains a | The suit-dependency-prefix element contains a | |||
| SUIT_Component_Identifier. This specifies the scope at which the | SUIT_Component_Identifier. This specifies the scope at which the | |||
| dependency operates. This allows the dependency to be forwarded on | dependency operates. This allows the dependency to be forwarded on | |||
| to a component that is capable of parsing its own manifests. It also | to a component that is capable of parsing its own manifests. It also | |||
| allows one manifest to be deployed to multiple dependent devices | allows one manifest to be deployed to multiple dependent devices | |||
| without those devices needing consistent component hierarchy. This | without those devices needing consistent component hierarchy. This | |||
| element is OPTIONAL. | element is OPTIONAL. | |||
| 7.5. SUIT_Component_Reference | 9.10. 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 behavior 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 | |||
| } | } | |||
| 7.6. Manifest Parameters | 9.11. Parameters | |||
| Many conditions and directives require additional information. That | Many conditions and directives require additional information. That | |||
| information is contained within parameters that can be set in a | information is contained within parameters that can be set in a | |||
| consistent way. This allows reduction of manifest size and | consistent way. This allows reduction of manifest size and | |||
| replacement of parameters from one manifest to the next. | replacement of parameters from one manifest to the next. | |||
| The defined manifest parameters are described below. | The defined manifest parameters are described below. | |||
| +------+---------+------------+-------------+-----------------------+ | +----------------+----------------------------------+---------------+ | |||
| | ID | CBOR | Scope | Name | Description | | | Name | CDDL Structure | Reference | | |||
| | | Type | | | | | +----------------+----------------------------------+---------------+ | |||
| +------+---------+------------+-------------+-----------------------+ | | Vendor ID | suit-parameter-vendor-identifier | Section | | |||
| | 1 | bstr | Component | Vendor ID | A RFC4122 UUID | | | | | 9.11.1 | | |||
| | | | / Global | | representing the | | | | | | | |||
| | | | | | vendor of the device | | | Class ID | suit-parameter-class-identifier | Section | | |||
| | | | | | or component | | | | | 9.11.2 | | |||
| | | | | | | | | | | | | |||
| | 2 | bstr | Component | Class ID | A RFC4122 UUID | | | Image Digest | suit-parameter-image-digest | Section | | |||
| | | | / Global | | representing the | | | | | 9.11.3 | | |||
| | | | | | class of the device | | | | | | | |||
| | | | | | or component | | | Image Size | suit-parameter-image-size | Section | | |||
| | | | | | | | | | | 9.11.4 | | |||
| | 3 | bstr | Component | Image | A SUIT_Digest | | | | | | | |||
| | | | / | Digest | | | | Use Before | suit-parameter-use-before | Section | | |||
| | | | Dependency | | | | | | | 9.11.5 | | |||
| | | | | | | | | | | | | |||
| | 4 | uint | Component | Use Before | POSIX timestamp | | | Component | suit-parameter-component-offset | Section | | |||
| | | | / Global | | | | | Offset | | 9.11.6 | | |||
| | | | | | | | | | | | | |||
| | 5 | uint | Component | Component | Offset of the | | | Encryption | suit-parameter-encryption-info | Section | | |||
| | | | | Offset | component | | | Info | | 9.11.7 | | |||
| | | | | | | | | | | | | |||
| | 12 | boolean | Global | Strict | Requires that the | | | Compression | suit-parameter-compression-info | Section | | |||
| | | | | Order | manifest is processed | | | Info | | 9.11.8 | | |||
| | | | | | in a strictly linear | | | | | | | |||
| | | | | | fashion. Set to 0 to | | | Unpack Info | suit-parameter-unpack-info | Section | | |||
| | | | | | enable parallel | | | | | 9.11.9 | | |||
| | | | | | handling of manifest | | | | | | | |||
| | | | | | directives. | | | URI | suit-parameter-uri | Section | | |||
| | | | | | | | | | | 9.11.10 | | |||
| | 13 | boolean | Command | Soft | Condition failures | | | | | | | |||
| | | | Segment | Failure | only terminate the | | | Source | suit-parameter-source-component | Section | | |||
| | | | | | current command | | | Component | | 9.11.11 | | |||
| | | | | | segment. | | | | | | | |||
| | | | | | | | | Run Args | suit-parameter-run-args | Section | | |||
| | 14 | uint | Component | Image Size | Integer size | | | | | 9.11.12 | | |||
| | | | / | | | | | | | | | |||
| | | | Dependency | | | | | Device ID | suit-parameter-device-identifier | Section | | |||
| | | | | | | | | | | 9.11.13 | | |||
| | 18 | bstr | Component | Encryption | A COSE object | | | | | | | |||
| | | | / | Info | defining the | | | Minimum | suit-parameter-minimum-battery | Section | | |||
| | | | Dependency | | encryption mode of a | | | Battery | | 9.11.14 | | |||
| | | | | | resource | | | | | | | |||
| | | | | | | | | Update | suit-parameter-update-priority | Section | | |||
| | 19 | bstr | Component | Compression | The information | | | Priority | | 9.11.15 | | |||
| | | | | Info | required to | | | | | | | |||
| | | | | | decompress the image | | | Version | suit-parameter-version | Section | | |||
| | | | | | | | | | | 9.11.16 | | |||
| | 20 | bstr | Component | Unpack Info | The information | | | | | | | |||
| | | | | | required to unpack | | | Wait Info | suit-parameter-wait-info | Section | | |||
| | | | | | the image | | | | | 9.11.17 | | |||
| | | | | | | | | | | | | |||
| | 21 | tstr | Component | URI | A URI from which to | | | URI List | suit-parameter-uri-list | Section | | |||
| | | | / | | fetch a resource | | | | | 9.11.18 | | |||
| | | | Dependency | | | | | | | | | |||
| | | | | | | | | Strict Order | suit-parameter-strict-order | Section | | |||
| | 22 | uint | Component | Source | A Component Index | | | | | 9.11.19 | | |||
| | | | | Component | | | | | | | | |||
| | | | | | | | | Soft Failure | suit-parameter-soft-failure | Section | | |||
| | 23 | bstr / | Component | Run | An encoded set of | | | | | 9.11.20 | | |||
| | | nil | | Arguments | arguments for Run | | | | | | | |||
| | | | | | | | | Custom | suit-parameter-custom | Section | | |||
| | 24 | bstr | Component | Device ID | A RFC4122 UUID | | | | | 9.11.21 | | |||
| | | | / Global | | representing the | | +----------------+----------------------------------+---------------+ | |||
| | | | | | device or component | | ||||
| | | | | | | | ||||
| | 25 | uint | Global | Minimum | A minimum battery | | ||||
| | | | | Battery | level in mWh | | ||||
| | | | | | | | ||||
| | 26 | int | Component | Priority | The priority of the | | ||||
| | | | / Global | | update | | ||||
| | | | | | | | ||||
| | nint | int / | Custom | Custom | Application-defined | | ||||
| | | bstr / | | Parameter | parameter | | ||||
| | | tstr | | | | | ||||
| +------+---------+------------+-------------+-----------------------+ | ||||
| CBOR-encoded object parameters are still wrapped in a bstr. This is | CBOR-encoded object parameters are still wrapped in a bstr. This is | |||
| because it allows a parser that is aggregating parameters to | because it allows a parser that is aggregating parameters to | |||
| reference the object with a single pointer and traverse it without | reference the object with a single pointer and traverse it without | |||
| understanding the contents. This is important for modularization and | understanding the contents. This is important for modularization and | |||
| division of responsibility within a pull parser. The same | division of responsibility within a pull parser. The same | |||
| consideration does not apply to Directives because those elements are | consideration does not apply to Directives because those elements are | |||
| invoked with their arguments immediately | invoked with their arguments immediately | |||
| 7.6.1. SUIT_Parameter_Strict_Order | 9.11.1. suit-parameter-vendor-identifier | |||
| A RFC 4122 UUID representing the vendor of the device or component. | ||||
| 9.11.2. suit-parameter-class-identifier | ||||
| A RFC 4122 UUID representing the class of the device or component | ||||
| 9.11.3. suit-parameter-image-digest | ||||
| A fingerprint computed over the image itself encoded in the | ||||
| SUIT_Digest structure. | ||||
| 9.11.4. suit-parameter-image-size | ||||
| The size of the firmware image in bytes. | ||||
| 9.11.5. suit-parameter-use-before | ||||
| An expire date for the use of the manifest encoded as a POSIX | ||||
| timestamp. | ||||
| 9.11.6. suit-parameter-component-offset | ||||
| Offset of the component | ||||
| 9.11.7. suit-parameter-encryption-info | ||||
| Encryption Info defines the mechanism that Fetch or Copy should use | ||||
| to decrypt the data they transfer. SUIT_Parameter_Encryption_Info is | ||||
| encoded as a COSE_Encrypt_Tagged or a COSE_Encrypt0_Tagged, wrapped | ||||
| in a bstr. | ||||
| 9.11.8. suit-parameter-compression-info | ||||
| Compression Info defines any information that is required for a | ||||
| device to perform decompression operations. Typically, this includes | ||||
| the algorithm identifier. This document defines the use of ZLIB | ||||
| [RFC1950], Brotli [RFC7932], and ZSTD [I-D.kucherawy-rfc8478bis]. | ||||
| Additional compression formats can be registered through the IANA- | ||||
| maintained registry. | ||||
| 9.11.9. suit-parameter-unpack-info | ||||
| SUIT_Unpack_Info defines the information required for a device to | ||||
| interpret a packed format. This document defines the use of the | ||||
| following binary encodings: Intel HEX [HEX], Motorola S-record | ||||
| [SREC], Executable and Linkable Format (ELF) [ELF], and Common Object | ||||
| File Format (COFF) [COFF]. | ||||
| Additional packing formats can be registered through the IANA- | ||||
| maintained registry. | ||||
| 9.11.10. suit-parameter-uri | ||||
| A URI from which to fetch a resource | ||||
| 9.11.11. suit-parameter-source-component | ||||
| A Component Index | ||||
| 9.11.12. suit-parameter-run-args | ||||
| An encoded set of arguments for Run | ||||
| 9.11.13. suit-parameter-device-identifier | ||||
| A RFC4122 UUID representing the device or component | ||||
| 9.11.14. suit-parameter-minimum-battery | ||||
| A minimum battery level in mWh | ||||
| 9.11.15. suit-parameter-update-priority | ||||
| The priority of the update | ||||
| 9.11.16. suit-parameter-version | ||||
| TBD. | ||||
| 9.11.17. suit-parameter-wait-info | ||||
| TBD. | ||||
| 9.11.18. suit-parameter-uri-list | ||||
| TBD. | ||||
| 9.11.19. suit-parameter-strict-order | ||||
| The Strict Order Parameter allows a manifest to govern when | The Strict Order Parameter allows a manifest to govern when | |||
| directives can be executed out-of-order. This allows for systems | directives can be executed out-of-order. This allows for systems | |||
| that have a sensitivity to order of updates to choose the order in | that have a sensitivity to order of updates to choose the order in | |||
| which they are executed. It also allows for more advanced systems to | which they are executed. It also allows for more advanced systems to | |||
| parallelize their handling of updates. Strict Order defaults to | parallelize their handling of updates. Strict Order defaults to | |||
| True. It MAY be set to False when the order of operations does not | True. It MAY be set to False when the order of operations does not | |||
| matter. When arriving at the end of a command sequence, ALL commands | matter. When arriving at the end of a command sequence, ALL commands | |||
| MUST have completed, regardless of the state of | MUST have completed, regardless of the state of | |||
| SUIT_Parameter_Strict_Order. If SUIT_Parameter_Strict_Order is | SUIT_Parameter_Strict_Order. 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 | 9.11.20. 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 | |||
| a condition failure occurs, the manifest processor aborts the | a condition failure occurs, the manifest processor aborts the | |||
| sequence. If Soft Failure is True, it returns Success. Otherwise, | sequence. If Soft Failure is True, it returns Success. Otherwise, | |||
| it returns the original condition failure. | it returns the original condition failure. | |||
| SUIT_Parameter_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 | 9.11.21. suit-parameter-custom | |||
| Encryption Info defines the mechanism that Fetch or Copy should use | ||||
| to decrypt the data they transfer. SUIT_Parameter_Encryption_Info is | ||||
| encoded as a COSE_Encrypt_Tagged or a COSE_Encrypt0_Tagged, wrapped | ||||
| in a bstr. | ||||
| 7.7.1. SUIT_Parameter_Compression_Info | ||||
| Compression Info defines any information that is required for a | ||||
| device to perform decompression operations. Typically, this includes | ||||
| the algorithm identifier. | ||||
| SUIT_Parameter_Compression_Info is defined by the following CDDL: | ||||
| SUIT_Compression_Info = { | ||||
| suit-compression-algorithm => SUIT_Compression_Algorithms | ||||
| ? suit-compression-parameters => bstr | ||||
| } | ||||
| SUIT_Compression_Algorithms /= SUIT_Compression_Algorithm_gzip | ||||
| SUIT_Compression_Algorithms /= SUIT_Compression_Algorithm_bzip2 | ||||
| SUIT_Compression_Algorithms /= SUIT_Compression_Algorithm_deflate | ||||
| SUIT_Compression_Algorithms /= SUIT_Compression_Algorithm_LZ4 | ||||
| SUIT_Compression_Algorithms /= SUIT_Compression_Algorithm_lzma | ||||
| 7.7.2. SUIT_Parameter_Unpack_Info | ||||
| SUIT_Unpack_Info defines the information required for a device to | ||||
| interpret a packed format, such as elf, hex, or binary diff. | ||||
| SUIT_Unpack_Info is defined by the following CDDL: | ||||
| SUIT_Unpack_Info = { | ||||
| suit-unpack-algorithm => SUIT_Unpack_Algorithms | ||||
| ? suit-unpack-parameters => bstr | ||||
| } | ||||
| SUIT_Unpack_Algorithms //= SUIT_Unpack_Algorithm_Delta | TBD. | |||
| SUIT_Unpack_Algorithms //= SUIT_Unpack_Algorithm_Hex | ||||
| SUIT_Unpack_Algorithms //= SUIT_Unpack_Algorithm_Elf | ||||
| 7.7.3. SUIT_Parameters CDDL | 9.11.22. SUIT_Parameters CDDL | |||
| The following CDDL describes all SUIT_Parameters. | The following CDDL describes all SUIT_Parameters. | |||
| SUIT_Parameters //= (suit-parameter-vendor-identifier => RFC4122_UUID) | SUIT_Parameters //= (suit-parameter-vendor-identifier => RFC4122_UUID) | |||
| SUIT_Parameters //= (suit-parameter-class-identifier => RFC4122_UUID) | SUIT_Parameters //= (suit-parameter-class-identifier => RFC4122_UUID) | |||
| SUIT_Parameters //= (suit-parameter-image-digest | SUIT_Parameters //= (suit-parameter-image-digest | |||
| => bstr .cbor SUIT_Digest) | => bstr .cbor SUIT_Digest) | |||
| SUIT_Parameters //= (suit-parameter-image-size => uint) | SUIT_Parameters //= (suit-parameter-image-size => uint) | |||
| SUIT_Parameters //= (suit-parameter-use-before => uint) | SUIT_Parameters //= (suit-parameter-use-before => uint) | |||
| SUIT_Parameters //= (suit-parameter-component-offset => uint) | SUIT_Parameters //= (suit-parameter-component-offset => uint) | |||
| skipping to change at page 37, line 34 ¶ | skipping to change at page 34, line 9 ¶ | |||
| RFC4122_UUID = bstr .size 16 | RFC4122_UUID = bstr .size 16 | |||
| SUIT_Condition_Version_Comparison_Value = [+int] | SUIT_Condition_Version_Comparison_Value = [+int] | |||
| 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_zlib | |||
| SUIT_Compression_Algorithms /= SUIT_Compression_Algorithm_bzip2 | SUIT_Compression_Algorithms /= SUIT_Compression_Algorithm_brotli | |||
| SUIT_Compression_Algorithms /= SUIT_Compression_Algorithm_lz4 | SUIT_Compression_Algorithms /= SUIT_Compression_Algorithm_zstd | |||
| 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_Hex | SUIT_Unpack_Algorithms /= SUIT_Unpack_Algorithm_Hex | |||
| SUIT_Unpack_Algorithms /= SUIT_Unpack_Algorithm_Elf | SUIT_Unpack_Algorithms /= SUIT_Unpack_Algorithm_Elf | |||
| SUIT_Unpack_Algorithms /= SUIT_Unpack_Algorithm_Coff | ||||
| SUIT_Unpack_Algorithms /= SUIT_Unpack_Algorithm_Srec | ||||
| 7.8. SUIT_Command_Sequence | 9.12. SUIT_Command_Sequence | |||
| A SUIT_Command_Sequence defines a series of actions that the | A SUIT_Command_Sequence defines a series of actions that the | |||
| Recipient MUST take to accomplish a particular goal. These goals are | Recipient MUST take to accomplish a particular goal. These goals are | |||
| defined in the manifest and include: | defined in the manifest and include: | |||
| 1. Dependency Resolution | 1. Dependency Resolution | |||
| 2. Payload Fetch | 2. Payload Fetch | |||
| 3. Payload Installation | 3. Payload Installation | |||
| skipping to change at page 39, line 4 ¶ | skipping to change at page 35, line 25 ¶ | |||
| 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 is a command code identifier, followed by Nil. Each | Each condition is a command code identifier, followed by Nil. Each | |||
| directive is composed of: | directive is composed of: | |||
| 1. A command code identifier | 1. A command code identifier | |||
| 2. An argument block or Nil | 2. An argument block or Nil | |||
| Argument blocks are defined for each type of directive. | Argument blocks are defined for each type of directive. | |||
| 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 behavior. | this behavior. | |||
| 7.9. SUIT_Condition | 9.12.1. SUIT_Condition | |||
| Conditions are used to define mandatory properties of a system in | Conditions are used to define mandatory properties of a system in | |||
| order for an update to be applied. They can be pre-conditions or | order for an update to be applied. They can be pre-conditions or | |||
| post-conditions of any directive or series of directives, depending | post-conditions of any directive or series of directives, depending | |||
| on where they are placed in the list. Conditions never take | on where they are placed in the list. Conditions never take | |||
| arguments; conditions should test using parameters instead. | arguments; conditions should test using parameters instead. | |||
| Conditions include: | Conditions include: | |||
| +----------------+-------------------+----------------+ | +----------------+----------------------------------+---------------+ | |||
| | Condition Code | Condition Name | Implementation | | | Name | CDDL Structure | Reference | | |||
| +----------------+-------------------+----------------+ | +----------------+----------------------------------+---------------+ | |||
| | 1 | Vendor Identifier | REQUIRED | | | Vendor | suit-condition-vendor-identifier | Section | | |||
| | | | | | | Identifier | | 9.12.1.1 | | |||
| | 2 | Class Identifier | REQUIRED | | | | | | | |||
| | | | | | | Class | suit-condition-class-identifier | Section | | |||
| | 3 | Image Match | REQUIRED | | | Identifier | | 9.12.1.1 | | |||
| | | | | | | | | | | |||
| | 4 | Use Before | OPTIONAL | | | Device | suit-condition-device-identifier | Section | | |||
| | | | | | | Identifier | | 9.12.1.1 | | |||
| | 5 | Component Offset | OPTIONAL | | | | | | | |||
| | | | | | | Image Match | suit-condition-image-match | Section | | |||
| | 24 | Device Identifier | OPTIONAL | | | | | 9.12.1.2 | | |||
| | | | | | | | | | | |||
| | 25 | Image Not Match | OPTIONAL | | | Image Not | suit-condition-image-not-match | Section | | |||
| | | | | | | Match | | 9.12.1.3 | | |||
| | 26 | Minimum Battery | OPTIONAL | | | | | | | |||
| | | | | | | Use Before | suit-condition-use-before | Section | | |||
| | 27 | Update Authorized | OPTIONAL | | | | | 9.12.1.4 | | |||
| | | | | | | | | | | |||
| | 28 | Version | OPTIONAL | | | Component | suit-condition-component-offset | Section | | |||
| | | | | | | Offset | | 9.12.1.5 | | |||
| | nint | Custom Condition | OPTIONAL | | | | | | | |||
| +----------------+-------------------+----------------+ | | Minimum | suit-condition-minimum-battery | Section | | |||
| | Battery | | 9.12.1.6 | | ||||
| | | | | | ||||
| | Update | suit-condition-update-authorized | Section | | ||||
| | Authorized | | 9.12.1.7 | | ||||
| | | | | | ||||
| | Version | suit-condition-version | Section | | ||||
| | | | 9.12.1.8 | | ||||
| | | | | | ||||
| | Custom | SUIT_Condition_Custom | Section | | ||||
| | Condition | | 9.12.1.9 | | ||||
| +----------------+----------------------------------+---------------+ | ||||
| Each condition MUST report a success code on completion. If a | Each condition MUST report a result code on completion. If a | |||
| condition reports failure, then the current sequence of commands MUST | condition reports failure, then the current sequence of commands MUST | |||
| terminate. If a condition requires additional information, this MUST | terminate. If a condition requires additional information, this MUST | |||
| be specified in one or more parameters before the condition is | be specified in one or more parameters before the condition is | |||
| executed. If a Recipient attempts to process a condition that | executed. If a Recipient attempts to process a condition that | |||
| expects additional information and that information has not been set, | expects additional information and that information has not been set, | |||
| it MUST report a failure. If a Recipient encounters an unknown | it MUST report a failure. If a Recipient encounters an unknown | |||
| Condition Code, it MUST report a failure. | condition, it MUST report a failure. | |||
| Positive Condition numbers are reserved for IANA registration. | Condition labels in the positive number range are reserved for IANA | |||
| Negative numbers are reserved for proprietary, application-specific | registration while those in the negative range are custom conditions | |||
| directives. | reserved for proprietary use. | |||
| 7.9.1. Identifier Conditions | Several conditions use identifiers to determine whether a manifest | |||
| matches a given Recipient or not. These identifiers are defined to | ||||
| be RFC 4122 [RFC4122] UUIDs. These UUIDs are not human-readable and | ||||
| are therefore used for machine-based processing only. | ||||
| A device may match any number of UUIDs for vendor or class | ||||
| identifier. This may be relevant to physical or software modules. | ||||
| 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 | ||||
| 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 | ||||
| applications. | ||||
| A more complete example: Imagine a device has the following physical | ||||
| components: 1. A host MCU 2. A WiFi module | ||||
| This same device has three software modules: 1. An operating system | ||||
| 2. A WiFi module interface driver 3. An application | ||||
| Suppose that the WiFi module's firmware has a proprietary update | ||||
| mechanism and doesn't support manifest processing. This device can | ||||
| report four class IDs: | ||||
| 1. hardware model/revision | ||||
| 2. OS | ||||
| 3. WiFi module model/revision | ||||
| 4. Application | ||||
| This allows the OS, WiFi module, and application to be updated | ||||
| independently. To combat possible incompatibilities, the OS class ID | ||||
| can be changed each time the OS has a change to its API. | ||||
| This approach allows a vendor to target, for example, all devices | ||||
| with a particular WiFi module with an update, which is a very | ||||
| powerful mechanism, particularly when used for security updates. | ||||
| 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 | ||||
| do not provide a tangible benefit over version 4 for this | ||||
| application. | ||||
| The RECOMMENDED method to create a vendor ID is: Vendor ID = | ||||
| UUID5(DNS_PREFIX, vendor domain name) | ||||
| The RECOMMENDED method to create a class ID is: Class ID = | ||||
| UUID5(Vendor ID, Class-Specific-Information) | ||||
| Class-specific information is composed of a variety of data, for | ||||
| example: | ||||
| - Model number. | ||||
| - Hardware revision. | ||||
| - Bootloader version (for immutable bootloaders). | ||||
| 9.12.1.1. suit-condition-vendor-identifier, suit-condition-class- | ||||
| identifier, and suit-condition-device-identifier | ||||
| There are three identifier-based conditions: suit-condition-vendor- | There are three identifier-based conditions: suit-condition-vendor- | |||
| identifier, suit-condition-class-identifier, and suit-condition- | identifier, suit-condition-class-identifier, and suit-condition- | |||
| device-identifier. Each of these conditions match a RFC 4122 | device-identifier. Each of these conditions match a RFC 4122 | |||
| [RFC4122] UUID that MUST have already been set as a parameter. The | [RFC4122] UUID that MUST have already been set as a parameter. The | |||
| installing 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.9.2. suit-condition-image-match | 9.12.1.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.9.3. suit-condition-image-not-match | 9.12.1.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 Component's parameters list. If no digest is | digest specified in the Component's parameters list. If no digest is | |||
| specified, the condition fails. suit-condition-image-not-match is | specified, the condition fails. suit-condition-image-not-match is | |||
| OPTIONAL to implement. | OPTIONAL to implement. | |||
| 7.9.4. suit-condition-use-before | 9.12.1.4. suit-condition-use-before | |||
| Verify that the current time is BEFORE the specified time. suit- | Verify that the current time is BEFORE the specified time. suit- | |||
| condition-use-before is used to specify the last time at which an | condition-use-before is used to specify the last time at which an | |||
| update should be installed. The recipient evaluates the current time | update should be installed. The recipient evaluates the current time | |||
| against the suit-parameter-use-before parameter, which must have | against the suit-parameter-use-before parameter, which must have | |||
| already been set as a parameter, encoded as a POSIX timestamp, that | already been set as a parameter, encoded as a POSIX timestamp, that | |||
| is seconds after 1970-01-01 00:00:00. Timestamp conditions MUST be | is seconds after 1970-01-01 00:00:00. Timestamp conditions MUST be | |||
| evaluated in 64 bits, regardless of encoded CBOR size. suit- | evaluated in 64 bits, regardless of encoded CBOR size. suit- | |||
| condition-use-before is OPTIONAL to implement. | condition-use-before is OPTIONAL to implement. | |||
| 7.9.5. suit-condition-minimum-battery | 9.12.1.5. suit-condition-component-offset | |||
| TBD. | ||||
| 9.12.1.6. suit-condition-minimum-battery | ||||
| suit-condition-minimum-battery provides a mechanism to test a | suit-condition-minimum-battery provides a mechanism to test a | |||
| 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.9.6. suit-condition-update-authorized | 9.12.1.7. suit-condition-update-authorized | |||
| Request Authorization from the application and fail if not | Request Authorization from the application and fail if not | |||
| authorized. This can allow a user to decline an update. 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-authorized is OPTIONAL to implement. | condition-update-authorized is OPTIONAL to implement. | |||
| 7.9.7. suit-condition-version | 9.12.1.8. suit-condition-version | |||
| suit-condition-version allows comparing versions of firmware. | suit-condition-version allows comparing versions of firmware. | |||
| Verifying image digests is preferred to version checks because | Verifying image digests is preferred to version checks because | |||
| digests are more precise. The image can be compared as: | digests are more precise. The image can be compared as: | |||
| - Greater. | - Greater. | |||
| - Greater or Equal. | - Greater or Equal. | |||
| - Equal. | - Equal. | |||
| skipping to change at page 43, line 39 ¶ | skipping to change at page 41, line 5 ¶ | |||
| - 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.9.8. SUIT_Condition_Custom | 9.12.1.9. 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. If additional information must be provided to | firmware developer. If additional information must be provided to | |||
| the condition, it should be encoded in a custom parameter (a nint) as | the condition, it should be encoded in a custom parameter (a nint) as | |||
| described in Section 7.6. SUIT_Condition_Custom is OPTIONAL to | described in Section 9.11. SUIT_Condition_Custom is OPTIONAL to | |||
| implement. | implement. | |||
| 7.9.9. Identifiers | 9.12.1.10. SUIT_Condition CDDL | |||
| Many conditions use identifiers to determine whether a manifest | ||||
| matches a given Recipient or not. These identifiers are defined to | ||||
| be RFC 4122 [RFC4122] UUIDs. These UUIDs are explicitly NOT human- | ||||
| readable. They are for machine-based matching only. | ||||
| A device may match any number of UUIDs for vendor or class | ||||
| identifier. This may be relevant to physical or software modules. | ||||
| 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 | ||||
| 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 | ||||
| applications. | ||||
| A more complete example: A device has the following physical | ||||
| components: 1. A host MCU 2. A WiFi module | ||||
| This same device has three software modules: 1. An operating system | ||||
| 2. A WiFi module interface driver 3. An application | ||||
| Suppose that the WiFi module's firmware has a proprietary update | ||||
| mechanism and doesn't support manifest processing. This device can | ||||
| report four class IDs: | ||||
| 1. hardware model/revision | ||||
| 2. OS | ||||
| 3. WiFi module model/revision | ||||
| 4. Application | ||||
| This allows the OS, WiFi module, and application to be updated | ||||
| independently. To combat possible incompatibilities, the OS class ID | ||||
| can be changed each time the OS has a change to its API. | ||||
| This approach allows a vendor to target, for example, all devices | ||||
| with a particular WiFi module with an update, which is a very | ||||
| powerful mechanism, particularly when used for security updates. | ||||
| 7.9.9.1. Creating UUIDs: | ||||
| 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 | ||||
| do not provide a tangible benefit over version 4 for this | ||||
| application. | ||||
| The RECOMMENDED method to create a vendor ID is: Vendor ID = | ||||
| UUID5(DNS_PREFIX, vendor domain name) | ||||
| The RECOMMENDED method to create a class ID is: Class ID = | ||||
| UUID5(Vendor ID, Class-Specific-Information) | ||||
| Class-specific information is composed of a variety of data, for | ||||
| example: | ||||
| - Model number. | ||||
| - Hardware revision. | ||||
| - Bootloader version (for immutable bootloaders). | ||||
| 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, nil) | SUIT_Condition //= (suit-condition-use-before, nil) | |||
| SUIT_Condition //= (suit-condition-component-offset, nil) | ||||
| SUIT_Condition //= (suit-condition-minimum-battery, nil) | SUIT_Condition //= (suit-condition-minimum-battery, nil) | |||
| SUIT_Condition //= (suit-condition-update-authorized, nil) | SUIT_Condition //= (suit-condition-update-authorized, nil) | |||
| SUIT_Condition //= (suit-condition-version, nil) | SUIT_Condition //= (suit-condition-version, nil) | |||
| SUIT_Condition //= (suit-condition-component-offset, nil) | SUIT_Condition //= (suit-condition-component-offset, nil) | |||
| 7.10. SUIT_Directive | 9.12.2. SUIT_Directive | |||
| Directives are used to define the behavior of the recipient. | Directives are used to define the behavior of the recipient. | |||
| Directives include: | Directives include: | |||
| +--------------+--------------------+-------------------------------+ | +---------------+-------------------------------------+-------------+ | |||
| | Directive | Directive Name | Implementation | | | Name | CDDL Structure | Reference | | |||
| | Code | | | | +---------------+-------------------------------------+-------------+ | |||
| +--------------+--------------------+-------------------------------+ | | Set Component | suit-directive-set-component-index | Section | | |||
| | 12 | Set Component | REQUIRED if more than one | | | Index | | 9.12.3 | | |||
| | | Index | component | | | | | | | |||
| | | | | | | Set | suit-directive-set-dependency-index | Section | | |||
| | 13 | Set Dependency | REQUIRED if dependencies used | | | Dependency | | 9.12.4 | | |||
| | | Index | | | | Index | | | | |||
| | | | | | | | | | | |||
| | 14 | Abort | OPTIONAL | | | Abort | suit-directive-abort | Section | | |||
| | | | | | | | | 9.12.5 | | |||
| | 15 | Try Each | OPTIONAL | | | | | | | |||
| | | | | | | Try Each | suit-directive-try-each | Section | | |||
| | 16 | Reserved | N/A | | | | | 9.12.6 | | |||
| | | | | | | | | | | |||
| | 17 | Reserved | N/A | | | Process | suit-directive-process-dependency | Section | | |||
| | | | | | | Dependency | | 9.12.7 | | |||
| | 18 | Process Dependency | OPTIONAL | | | | | | | |||
| | | | | | | Set | suit-directive-set-parameters | Section | | |||
| | 19 | Set Parameters | OPTIONAL | | | Parameters | | 9.12.8 | | |||
| | | | | | | | | | | |||
| | 20 | Override | REQUIRED | | | Override | suit-directive-override-parameters | Section | | |||
| | | Parameters | | | | Parameters | | 9.12.9 | | |||
| | | | | | | | | | | |||
| | 21 | Fetch | REQUIRED for Updater | | | Fetch | suit-directive-fetch | Section | | |||
| | | | | | | | | 9.12.10 | | |||
| | 22 | Copy | OPTIONAL | | | | | | | |||
| | | | | | | Copy | suit-directive-copy | Section | | |||
| | 23 | Run | REQUIRED for Bootloader | | | | | 9.12.11 | | |||
| | | | | | | | | | | |||
| | 29 | Wait | OPTIONAL | | | Run | suit-directive-run | Section | | |||
| | | | | | | | | 9.12.12 | | |||
| | 30 | Run Sequence | OPTIONAL | | | | | | | |||
| | | | | | | Wait For | suit-directive-wait | Section | | |||
| | 32 | Swap | OPTIONAL | | | Event | | 9.12.13 | | |||
| +--------------+--------------------+-------------------------------+ | | | | | | |||
| | Run Sequence | suit-directive-run-sequence | Section | | ||||
| | | | 9.12.14 | | ||||
| | | | | | ||||
| | Swap | suit-directive-swap | Section | | ||||
| | | | 9.12.15 | | ||||
| +---------------+-------------------------------------+-------------+ | ||||
| When a Recipient executes a Directive, it MUST report a success code. | When a Recipient executes a Directive, it MUST report a result code. | |||
| If the Directive reports failure, then the current Command Sequence | If the Directive reports failure, then the current Command Sequence | |||
| MUST terminate. | MUST terminate. | |||
| 7.10.1. suit-directive-set-component-index | 9.12.3. 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.10.2. suit-directive-set-dependency-index | 9.12.4. 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 47, line 39 ¶ | skipping to change at page 43, line 46 ¶ | |||
| 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.10.3. suit-directive-abort | 9.12.5. 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.10.4. suit-directive-run-sequence | 9.12.6. suit-directive-try-each | |||
| To enable conditional commands, and to allow several strictly ordered | ||||
| sequences to be executed out-of-order, suit-directive-run-sequence | ||||
| allows the manifest processor to execute its argument as a | ||||
| SUIT_Command_Sequence. The argument must be wrapped in a bstr. | ||||
| When a sequence is executed, any failure of a condition causes | ||||
| immediate termination of the sequence. | ||||
| The following CDDL describes the SUIT_Run_Sequence argument. | ||||
| SUIT_Directive_Run_Sequence_Argument = bstr .cbor SUIT_Command_Sequence | ||||
| When suit-directive-run-sequence completes, it forwards the last | ||||
| status code that occurred in the sequence. If the Soft Failure | ||||
| parameter is true, then suit-directive-run-sequence only fails when a | ||||
| directive in the argument sequence fails. | ||||
| SUIT_Parameter_Soft_Failure defaults to False when suit-directive- | ||||
| run-sequence begins. Its value is discarded when suit-directive-run- | ||||
| sequence terminates. | ||||
| 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 initialized 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.10.6. suit-directive-process-dependency | 9.12.7. 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 49, line 18 ¶ | skipping to change at page 45, line 5 ¶ | |||
| 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.10.7. suit-directive-set-parameters | 9.12.8. suit-directive-set-parameters | |||
| suit-directive-set-parameters allows the manifest to configure | suit-directive-set-parameters allows the manifest to configure | |||
| behavior of future directives by changing parameters that are read by | behavior of future directives by changing parameters that are read by | |||
| those directives. When dependencies are used, suit-directive-set- | those directives. When dependencies are used, suit-directive-set- | |||
| parameters also allows a manifest to modify the behavior of its | parameters also allows a manifest to modify the behavior of its | |||
| dependencies. | dependencies. | |||
| Available parameters are defined in Section 7.6. | Available parameters are defined in Section 9.11. | |||
| If a parameter is already set, suit-directive-set-parameters will | If a parameter is already set, suit-directive-set-parameters will | |||
| skip setting the parameter to its argument. This provides the core | skip setting the parameter to its argument. This provides the core | |||
| of the override mechanism, allowing dependent manifests to change the | of the override mechanism, allowing dependent manifests to change the | |||
| behavior of a manifest. | behavior of a manifest. | |||
| 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 optimization: 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.10.8. suit-directive-override-parameters | 9.12.9. 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 9.11. | |||
| 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.10.9. suit-directive-fetch | 9.12.10. suit-directive-fetch | |||
| suit-directive-fetch instructs the manifest processor to obtain one | suit-directive-fetch instructs the manifest processor to obtain one | |||
| or more manifests or payloads, as specified by the manifest index and | or more manifests or payloads, as specified by the manifest index and | |||
| component index, respectively. | component index, respectively. | |||
| suit-directive-fetch can target one or more manifests and one or more | suit-directive-fetch can target one or more manifests and one or more | |||
| payloads. suit-directive-fetch retrieves each component and each | payloads. suit-directive-fetch retrieves each component and each | |||
| manifest listed in component-index and manifest-index, respectively. | manifest listed in component-index and manifest-index, respectively. | |||
| If component-index or manifest-index is True, instead of an integer, | If component-index or manifest-index is True, instead of an integer, | |||
| then all current manifest components/manifests are fetched. The | then all current manifest components/manifests are fetched. The | |||
| skipping to change at page 50, line 41 ¶ | skipping to change at page 46, line 28 ¶ | |||
| 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.10.10. suit-directive-copy | 9.12.11. suit-directive-copy | |||
| suit-directive-copy instructs the manifest processor to obtain one or | suit-directive-copy instructs the manifest processor to obtain one or | |||
| more payloads, as specified by the component index. suit-directive- | more payloads, as specified by the component index. suit-directive- | |||
| copy retrieves each component listed in component-index, | copy retrieves each component listed in component-index, | |||
| respectively. If component-index is True, instead of an integer, | respectively. If component-index is True, instead of an integer, | |||
| then all current manifest components are copied. The current | then all current manifest components are copied. The current | |||
| manifest's dependent-components are not automatically copied. In | manifest's dependent-components are not automatically copied. In | |||
| order to copy these, they MUST be specified in a component-index | order to copy these, they MUST be specified in a component-index | |||
| integer. | integer. | |||
| skipping to change at page 51, line 22 ¶ | skipping to change at page 47, line 9 ¶ | |||
| *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.10.11. suit-directive-swap | 9.12.12. suit-directive-run | |||
| suit-directive-swap instructs the manifest processor to move the | ||||
| source to the destination and the destination to the source | ||||
| simultaneously. Swap has nearly identical semantics to suit- | ||||
| directive-copy except that suit-directive-swap replaces the source | ||||
| with the current contents of the destination in an application- | ||||
| defined way. If SUIT_Parameter_Compression_Info or | ||||
| SUIT_Parameter_Encryption_Info are present, they must be handled in a | ||||
| symmetric way, so that the source is decompressed into the | ||||
| destination and the destination is compressed into the source. The | ||||
| source is decrypted into the destination and the destination is | ||||
| encrypted into the source. suit-directive-swap is OPTIONAL to | ||||
| implement. | ||||
| 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.10.13. suit-directive-wait | 9.12.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. Authorization | 1. Authorization | |||
| 2. External Power | 2. External Power | |||
| 3. Network availability | 3. Network availability | |||
| skipping to change at page 53, line 28 ¶ | skipping to change at page 48, line 28 ¶ | |||
| 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 | SUIT_Wait_Event_Argument_Time_Of_Day = uint ; Time of Day | |||
| ; (seconds since 00:00:00) | ; (seconds since 00:00:00) | |||
| SUIT_Wait_Event_Argument_Day_Of_Week = uint ; Days since Sunday | SUIT_Wait_Event_Argument_Day_Of_Week = uint ; Days since Sunday | |||
| 7.10.14. SUIT_Directive CDDL | 9.12.14. suit-directive-run-sequence | |||
| To enable conditional commands, and to allow several strictly ordered | ||||
| sequences to be executed out-of-order, suit-directive-run-sequence | ||||
| allows the manifest processor to execute its argument as a | ||||
| SUIT_Command_Sequence. The argument must be wrapped in a bstr. | ||||
| When a sequence is executed, any failure of a condition causes | ||||
| immediate termination of the sequence. | ||||
| The following CDDL describes the SUIT_Run_Sequence argument. | ||||
| SUIT_Directive_Run_Sequence_Argument = bstr .cbor SUIT_Command_Sequence | ||||
| When suit-directive-run-sequence completes, it forwards the last | ||||
| status code that occurred in the sequence. If the Soft Failure | ||||
| parameter is true, then suit-directive-run-sequence only fails when a | ||||
| directive in the argument sequence fails. | ||||
| SUIT_Parameter_Soft_Failure defaults to False when suit-directive- | ||||
| run-sequence begins. Its value is discarded when suit-directive-run- | ||||
| sequence terminates. | ||||
| 9.12.15. suit-directive-swap | ||||
| suit-directive-swap instructs the manifest processor to move the | ||||
| source to the destination and the destination to the source | ||||
| simultaneously. Swap has nearly identical semantics to suit- | ||||
| directive-copy except that suit-directive-swap replaces the source | ||||
| with the current contents of the destination in an application- | ||||
| defined way. If SUIT_Parameter_Compression_Info or | ||||
| SUIT_Parameter_Encryption_Info are present, they must be handled in a | ||||
| symmetric way, so that the source is decompressed into the | ||||
| destination and the destination is compressed into the source. The | ||||
| source is decrypted into the destination and the destination is | ||||
| encrypted into the source. suit-directive-swap is OPTIONAL to | ||||
| implement. | ||||
| 9.12.15.1. SUIT_Directive CDDL | ||||
| The following CDDL describes SUIT_Directive: | The following CDDL describes SUIT_Directive: | |||
| SUIT_Directive //= (suit-directive-set-component-index, uint/bool) | SUIT_Directive //= (suit-directive-set-component-index, uint/bool) | |||
| SUIT_Directive //= (suit-directive-set-dependency-index, uint/bool) | SUIT_Directive //= (suit-directive-set-dependency-index, uint/bool) | |||
| SUIT_Directive //= (suit-directive-run-sequence, | SUIT_Directive //= (suit-directive-run-sequence, | |||
| bstr .cbor SUIT_Command_Sequence) | bstr .cbor SUIT_Command_Sequence) | |||
| SUIT_Directive //= (suit-directive-try-each, | SUIT_Directive //= (suit-directive-try-each, | |||
| SUIT_Directive_Try_Each_Argument) | SUIT_Directive_Try_Each_Argument) | |||
| SUIT_Directive //= (suit-directive-process-dependency, nil) | SUIT_Directive //= (suit-directive-process-dependency, nil) | |||
| skipping to change at page 55, line 5 ¶ | skipping to change at page 51, line 5 ¶ | |||
| 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 | SUIT_Wait_Event_Argument_Time_Of_Day = uint ; Time of Day | |||
| ; (seconds since 00:00:00) | ; (seconds since 00:00:00) | |||
| SUIT_Wait_Event_Argument_Day_Of_Week = uint ; Days since Sunday | SUIT_Wait_Event_Argument_Day_Of_Week = uint ; Days since Sunday | |||
| 7.11. SUIT_Text_Map | 9.13. 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. | |||
| +----+-----------------------+--------------------------------------+ | +---------------------------------+---------------------------------+ | |||
| | ID | Name | Summary | | | CDDL Structure | Description | | |||
| +----+-----------------------+--------------------------------------+ | +---------------------------------+---------------------------------+ | |||
| | 1 | manifest-description | Free text description of the | | | suit-text-manifest-description | Free text description of the | | |||
| | | | manifest | | | | manifest | | |||
| | | | | | | | | | |||
| | 2 | update-description | Free text description of the update | | | suit-text-update-description | Free text description of the | | |||
| | | | | | | | update | | |||
| | 3 | vendor-name | Free text vendor name | | | | | | |||
| | | | | | | suit-text-vendor-name | Free text vendor name | | |||
| | 4 | model-name | Free text model name | | | | | | |||
| | | | | | | suit-text-model-name | Free text model name | | |||
| | 5 | vendor-domain | The domain used to create the | | | | | | |||
| | | | vendor-id (Section 7.9.9.1) | | | suit-text-vendor-domain | The domain used to create the | | |||
| | | | | | | | vendor-id condition | | |||
| | 6 | model-info | The information used to create the | | | | | | |||
| | | | class-id (Section 7.9.9.1) | | | suit-text-model-info | The information used to create | | |||
| | | | | | | | the class-id condition | | |||
| | 7 | component-description | Free text description of each | | | | | | |||
| | | | component in the manifest | | | suit-text-component-description | Free text description of each | | |||
| | | | | | | | component in the manifest | | |||
| | 8 | json-source | The JSON-formatted document that was | | | | | | |||
| | | | used to create the manifest | | | suit-text-manifest-json-source | The JSON-formatted document | | |||
| | | | | | | | that was used to create the | | |||
| | 9 | yaml-source | The yaml-formatted document that was | | | | manifest | | |||
| | | | used to create the manifest | | | | | | |||
| | | | | | | suit-text-manifest-yaml-source | The yaml-formatted document | | |||
| | 10 | version-dependencies | List of component versions required | | | | that was used to create the | | |||
| | | | by the manifest | | | | manifest | | |||
| +----+-----------------------+--------------------------------------+ | | | | | |||
| | suit-text-version-dependencies | List of component versions | | ||||
| | | required by the manifest | | ||||
| +---------------------------------+---------------------------------+ | ||||
| 8. Access Control Lists | 10. Access Control Lists | |||
| To manage permissions in the manifest, there are three models that | To manage permissions in the manifest, there are three models that | |||
| can be used. | can be used. | |||
| First, the simplest model requires that all manifests are | First, the simplest model requires that all manifests are | |||
| authenticated by a single trusted key. This mode has the advantage | authenticated by a single trusted key. This mode has the advantage | |||
| that only a root manifest needs to be authenticated, since all of its | that only a root manifest needs to be authenticated, since all of its | |||
| dependencies have digests included in the root manifest. | dependencies have digests included in the root manifest. | |||
| This simplest model can be extended by adding key delegation without | This simplest model can be extended by adding key delegation without | |||
| skipping to change at page 56, line 25 ¶ | skipping to change at page 52, line 30 ¶ | |||
| grants access rights for specific component IDs or component ID | grants access rights for specific component IDs or component ID | |||
| prefixes to the listed identities or identity groups. Any identity | prefixes to the listed identities or identity groups. Any identity | |||
| may verify an image digest, but fetching into or fetching from a | may verify an image digest, but fetching into or fetching from a | |||
| component ID requires approval from the ACL. | component ID requires approval from the ACL. | |||
| A third model allows a device to provide even more fine-grained | A third model allows a device to provide even more fine-grained | |||
| controls: The ACL lists the component ID or component ID prefix that | controls: The ACL lists the component ID or component ID prefix that | |||
| an identity may use, and also lists the commands that the identity | an identity may use, and also lists the commands that the identity | |||
| may use in combination with that component ID. | may use in combination with that component ID. | |||
| 9. SUIT digest container | 11. SUIT Digest Container | |||
| RFC 8152 [RFC8152] provides containers for signature, MAC, and | RFC 8152 [RFC8152] provides containers for signature, MAC, and | |||
| encryption, but no basic digest container. The container needed for | encryption, but no basic digest container. The container needed for | |||
| a digest requires a type identifier and a container for the raw | a digest requires a type identifier and a container for the raw | |||
| digest data. Some forms of digest may require additional parameters. | digest data. Some forms of digest may require additional parameters. | |||
| These can be added following the digest. This structure is described | These can be added following the digest. This structure is described | |||
| by the following CDDL. | by the following CDDL. | |||
| The algorithms listed are sufficient for verifying integrity of | The algorithms listed are sufficient for verifying integrity of | |||
| Firmware Updates as of this writing, however this may change over | Firmware Updates as of this writing, however this may change over | |||
| skipping to change at page 57, line 29 ¶ | skipping to change at page 53, 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 | 12. 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 59, line 10 ¶ | skipping to change at page 55, line 10 ¶ | |||
| } | } | |||
| ], | ], | |||
| [{ "directive-abort" : null }] | [{ "directive-abort" : null }] | |||
| ] | ] | |||
| }, | }, | |||
| "fetch" : null | "fetch" : null | |||
| ] | ] | |||
| } | } | |||
| 11. Full CDDL | 13. IANA Considerations | |||
| IANA is requested to setup a registry for SUIT manifests. Several | ||||
| registries defined in the subsections below need to be created. | ||||
| For each registry, values 0-23 are Standards Action, 24-255 are IETF | ||||
| Review, 256-65535 are Expert Review, and 65536 or greater are First | ||||
| Come First Served. | ||||
| Negative values -23 to 0 are Experimental Use, -24 and lower are | ||||
| Private Use. | ||||
| 13.1. SUIT Directives | ||||
| +-------+----------------------+ | ||||
| | Label | Name | | ||||
| +-------+----------------------+ | ||||
| | 12 | Set Component Index | | ||||
| | | | | ||||
| | 13 | Set Dependency Index | | ||||
| | | | | ||||
| | 14 | Abort | | ||||
| | | | | ||||
| | 15 | Try Each | | ||||
| | | | | ||||
| | 16 | Reserved | | ||||
| | | | | ||||
| | 17 | Reserved | | ||||
| | | | | ||||
| | 18 | Process Dependency | | ||||
| | | | | ||||
| | 19 | Set Parameters | | ||||
| | | | | ||||
| | 20 | Override Parameters | | ||||
| | | | | ||||
| | 21 | Fetch | | ||||
| | | | | ||||
| | 22 | Copy | | ||||
| | | | | ||||
| | 23 | Run | | ||||
| | | | | ||||
| | 29 | Wait For Event | | ||||
| | | | | ||||
| | 30 | Run Sequence | | ||||
| | | | | ||||
| | 32 | Swap | | ||||
| +-------+----------------------+ | ||||
| 13.2. SUIT Conditions | ||||
| +-------+-------------------+ | ||||
| | Label | Name | | ||||
| +-------+-------------------+ | ||||
| | 1 | Vendor Identifier | | ||||
| | | | | ||||
| | 2 | Class Identifier | | ||||
| | | | | ||||
| | 24 | Device Identifier | | ||||
| | | | | ||||
| | 3 | Image Match | | ||||
| | | | | ||||
| | 25 | Image Not Match | | ||||
| | | | | ||||
| | 4 | Use Before | | ||||
| | | | | ||||
| | 5 | Component Offset | | ||||
| | | | | ||||
| | 26 | Minimum Battery | | ||||
| | | | | ||||
| | 27 | Update Authorized | | ||||
| | | | | ||||
| | 28 | Version | | ||||
| | | | | ||||
| | nint | Custom Condition | | ||||
| +-------+-------------------+ | ||||
| 13.3. SUIT Parameters | ||||
| +-------+------------------+--------------------+ | ||||
| | Label | Name | | | ||||
| +-------+------------------+--------------------+ | ||||
| | 1 | Vendor ID | | | ||||
| | | | | | ||||
| | 2 | Class ID | | | ||||
| | | | | | ||||
| | 3 | Image Digest | | | ||||
| | | | | | ||||
| | 4 | Use Before | | | ||||
| | | | | | ||||
| | 5 | Component Offset | | | ||||
| | | | | | ||||
| | 12 | Strict Order | | | ||||
| | | | | | ||||
| | 13 | Soft Failure | | | ||||
| | | | | | ||||
| | 14 | Image Size | | | ||||
| | | | | | ||||
| | 18 | Encryption Info | | | ||||
| | | | | | ||||
| | 19 | Compression Info | | | ||||
| | | | | | ||||
| | 20 | Unpack Info | | | ||||
| | | | | | ||||
| | 21 | URI | suit-parameter-uri | | ||||
| | | | | | ||||
| | 22 | Source Component | | | ||||
| | | | | | ||||
| | 23 | Run Args | | | ||||
| | | | | | ||||
| | 24 | Device ID | | | ||||
| | | | | | ||||
| | 26 | Minimum Battery | | | ||||
| | | | | | ||||
| | 27 | Update Priority | | | ||||
| | | | | | ||||
| | 28 | Version | | | ||||
| | | | | | ||||
| | 29 | Wait Info | | | ||||
| | | | | | ||||
| | 30 | URI List | | | ||||
| | | | | | ||||
| | nint | Custom | | | ||||
| +-------+------------------+--------------------+ | ||||
| 13.4. SUIT Text Values | ||||
| +-------+--------------------------------+ | ||||
| | Label | Name | | ||||
| +-------+--------------------------------+ | ||||
| | 1 | Manifest Description | | ||||
| | | | | ||||
| | 2 | Update Description | | ||||
| | | | | ||||
| | 3 | Vendor Name | | ||||
| | | | | ||||
| | 4 | Model Name | | ||||
| | | | | ||||
| | 5 | Vendor Domain | | ||||
| | | | | ||||
| | 6 | Model Info | | ||||
| | | | | ||||
| | 7 | Component Description | | ||||
| | | | | ||||
| | 8 | Manifest JSON Source | | ||||
| | | | | ||||
| | 9 | Manifest YAML Source | | ||||
| | | | | ||||
| | 10 | Component Version Dependencies | | ||||
| +-------+--------------------------------+ | ||||
| 13.5. SUIT Algorithm Identifiers | ||||
| TBD. | ||||
| 14. Security Considerations | ||||
| This document is about a manifest format describing and protecting | ||||
| firmware images and as such it is part of a larger solution for | ||||
| offering a standardized way of delivering firmware updates to IoT | ||||
| devices. A detailed discussion about security can be found in the | ||||
| architecture document [I-D.ietf-suit-architecture] and in | ||||
| [I-D.ietf-suit-information-model]. | ||||
| 15. Mailing List Information | ||||
| RFC EDITOR: PLEASE REMOVE THIS SECTION | ||||
| The discussion list for this document is located at the e-mail | ||||
| address suit@ietf.org [1]. Information on the group and information | ||||
| on how to subscribe to the list is at | ||||
| https://www1.ietf.org/mailman/listinfo/suit [2] | ||||
| Archives of the list can be found at: https://www.ietf.org/mail- | ||||
| archive/web/suit/current/index.html [3] | ||||
| 16. Acknowledgements | ||||
| We would like to thank the following persons for their support in | ||||
| designing this mechanism: | ||||
| - Milosch Meriac | ||||
| - Geraint Luff | ||||
| - Dan Ros | ||||
| - John-Paul Stanford | ||||
| - Hugo Vincent | ||||
| - Carsten Bormann | ||||
| - Oeyvind Roenningstad | ||||
| - Frank Audun Kvamtroe | ||||
| - Krzysztof Chruściński | ||||
| - Andrzej Puzdrowski | ||||
| - Michael Richardson | ||||
| - David Brown | ||||
| - Emmanuel Baccelli | ||||
| 17. References | ||||
| 17.1. Normative References | ||||
| [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | ||||
| Requirement Levels", BCP 14, RFC 2119, | ||||
| DOI 10.17487/RFC2119, March 1997, | ||||
| <https://www.rfc-editor.org/info/rfc2119>. | ||||
| [RFC4122] Leach, P., Mealling, M., and R. Salz, "A Universally | ||||
| Unique IDentifier (UUID) URN Namespace", RFC 4122, | ||||
| DOI 10.17487/RFC4122, July 2005, | ||||
| <https://www.rfc-editor.org/info/rfc4122>. | ||||
| [RFC8152] Schaad, J., "CBOR Object Signing and Encryption (COSE)", | ||||
| RFC 8152, DOI 10.17487/RFC8152, July 2017, | ||||
| <https://www.rfc-editor.org/info/rfc8152>. | ||||
| [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC | ||||
| 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, | ||||
| May 2017, <https://www.rfc-editor.org/info/rfc8174>. | ||||
| 17.2. Informative References | ||||
| [COFF] Wikipedia, ., "Common Object File Format (COFF)", 2020, | ||||
| <https://en.wikipedia.org/wiki/COFF>. | ||||
| [ELF] Wikipedia, ., "Executable and Linkable Format (ELF)", | ||||
| 2020, <https://en.wikipedia.org/wiki/ | ||||
| Executable_and_Linkable_Format>. | ||||
| [HEX] Wikipedia, ., "Intel HEX", 2020, | ||||
| <https://en.wikipedia.org/wiki/Intel_HEX>. | ||||
| [I-D.ietf-suit-architecture] | ||||
| Moran, B., Tschofenig, H., Brown, D., and M. Meriac, "A | ||||
| Firmware Update Architecture for Internet of Things", | ||||
| draft-ietf-suit-architecture-09 (work in progress), May | ||||
| 2020. | ||||
| [I-D.ietf-suit-information-model] | ||||
| Moran, B., Tschofenig, H., and H. Birkholz, "An | ||||
| Information Model for Firmware Updates in IoT Devices", | ||||
| draft-ietf-suit-information-model-05 (work in progress), | ||||
| January 2020. | ||||
| [I-D.ietf-teep-architecture] | ||||
| Pei, M., Tschofenig, H., Thaler, D., and D. Wheeler, | ||||
| "Trusted Execution Environment Provisioning (TEEP) | ||||
| Architecture", draft-ietf-teep-architecture-08 (work in | ||||
| progress), April 2020. | ||||
| [I-D.kucherawy-rfc8478bis] | ||||
| Collet, Y. and M. Kucherawy, "Zstandard Compression and | ||||
| the application/zstd Media Type", draft-kucherawy- | ||||
| rfc8478bis-05 (work in progress), April 2020. | ||||
| [RFC1950] Deutsch, P. and J-L. Gailly, "ZLIB Compressed Data Format | ||||
| Specification version 3.3", RFC 1950, | ||||
| DOI 10.17487/RFC1950, May 1996, | ||||
| <https://www.rfc-editor.org/info/rfc1950>. | ||||
| [RFC7932] Alakuijala, J. and Z. Szabadka, "Brotli Compressed Data | ||||
| Format", RFC 7932, DOI 10.17487/RFC7932, July 2016, | ||||
| <https://www.rfc-editor.org/info/rfc7932>. | ||||
| [SREC] Wikipedia, ., "SREC (file format)", 2020, | ||||
| <https://en.wikipedia.org/wiki/SREC_(file_format)>. | ||||
| 17.3. URIs | ||||
| [1] mailto:suit@ietf.org | ||||
| [2] https://www1.ietf.org/mailman/listinfo/suit | ||||
| [3] https://www.ietf.org/mail-archive/web/suit/current/index.html | ||||
| A. Full CDDL | ||||
| In order to create a valid SUIT Manifest document the structure of | In order to create a valid SUIT Manifest document the structure of | |||
| the corresponding CBOR message MUST adhere to the following CDDL data | the corresponding CBOR message MUST adhere to the following CDDL data | |||
| definition. | definition. | |||
| SUIT_Envelope = { | SUIT_Envelope = { | |||
| suit-delegation => bstr .cbor SUIT_Delegation | ? suit-delegation => bstr .cbor SUIT_Delegation | |||
| suit-authentication-wrapper | ? suit-authentication-wrapper | |||
| => bstr .cbor SUIT_Authentication_Wrapper / nil, | => bstr .cbor SUIT_Authentication_Wrapper / nil, | |||
| $$SUIT_Manifest_Wrapped, | $$SUIT_Manifest_Wrapped, | |||
| * $$SUIT_Severed_Fields, | * $$SUIT_Severed_Fields, | |||
| } | } | |||
| SUIT_Delegation = [ + [ + CWT ] ] | SUIT_Delegation = [ + [ + CWT ] ] | |||
| CWT = SUIT_Authentication_Block | CWT = SUIT_Authentication_Block | |||
| SUIT_Authentication_Wrapper = [ + bstr .cbor SUIT_Authentication_Block ] | SUIT_Authentication_Wrapper = [ + bstr .cbor SUIT_Authentication_Block ] | |||
| skipping to change at page 64, line 4 ¶ | skipping to change at page 67, line 50 ¶ | |||
| SUIT_Condition_Version_Comparison_Value | SUIT_Condition_Version_Comparison_Value | |||
| ] | ] | |||
| SUIT_Condition_Version_Comparison_Types /= | SUIT_Condition_Version_Comparison_Types /= | |||
| suit-condition-version-comparison-greater | 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-equal | |||
| SUIT_Condition_Version_Comparison_Types /= | SUIT_Condition_Version_Comparison_Types /= | |||
| suit-condition-version-comparison-equal | suit-condition-version-comparison-equal | |||
| SUIT_Condition_Version_Comparison_Types /= | SUIT_Condition_Version_Comparison_Types /= | |||
| suit-condition-version-comparison-lesser-equal | 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-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_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_zlib | |||
| SUIT_Compression_Algorithms /= SUIT_Compression_Algorithm_bzip2 | SUIT_Compression_Algorithms /= SUIT_Compression_Algorithm_brotli | |||
| SUIT_Compression_Algorithms /= SUIT_Compression_Algorithm_deflate | SUIT_Compression_Algorithms /= SUIT_Compression_Algorithm_zstd | |||
| SUIT_Compression_Algorithms /= SUIT_Compression_Algorithm_lz4 | ||||
| SUIT_Compression_Algorithms /= SUIT_Compression_Algorithm_lzma | ||||
| SUIT_Compression_Algorithm_gzip = 1 | SUIT_Compression_Algorithm_zlib = 1 | |||
| SUIT_Compression_Algorithm_bzip2 = 2 | SUIT_Compression_Algorithm_brotli = 2 | |||
| SUIT_Compression_Algorithm_deflate = 3 | SUIT_Compression_Algorithm_zstd = 3 | |||
| SUIT_Compression_Algorithm_lz4 = 4 | ||||
| SUIT_Compression_Algorithm_lzma = 7 | ||||
| SUIT_Unpack_Info = { | SUIT_Unpack_Info = { | |||
| suit-unpack-algorithm => SUIT_Unpack_Algorithms, | suit-unpack-algorithm => SUIT_Unpack_Algorithms, | |||
| ? suit-unpack-parameters => bstr | ? suit-unpack-parameters => bstr | |||
| } | } | |||
| SUIT_Unpack_Algorithms /= SUIT_Unpack_Algorithm_Delta | ||||
| SUIT_Unpack_Algorithms /= SUIT_Unpack_Algorithm_Hex | SUIT_Unpack_Algorithms /= SUIT_Unpack_Algorithm_Hex | |||
| SUIT_Unpack_Algorithms /= SUIT_Unpack_Algorithm_Elf | SUIT_Unpack_Algorithms /= SUIT_Unpack_Algorithm_Elf | |||
| SUIT_Unpack_Algorithms /= SUIT_Unpack_Algorithm_Coff | ||||
| SUIT_Unpack_Algorithms /= SUIT_Unpack_Algorithm_Srec | ||||
| SUIT_Unpack_Algorithm_Delta = 1 | SUIT_Unpack_Algorithm_Hex = 1 | |||
| SUIT_Unpack_Algorithm_Hex = 2 | SUIT_Unpack_Algorithm_Elf = 2 | |||
| SUIT_Unpack_Algorithm_Elf = 3 | SUIT_Unpack_Algorithm_Coff = 3 | |||
| SUIT_Unpack_Algorithm_Srec = 4 | ||||
| SUIT_Text_Map = {SUIT_Text_Keys => tstr} | SUIT_Text_Map = {SUIT_Text_Keys => tstr} | |||
| SUIT_Text_Keys /= suit-text-manifest-description | SUIT_Text_Keys /= suit-text-manifest-description | |||
| SUIT_Text_Keys /= suit-text-update-description | SUIT_Text_Keys /= suit-text-update-description | |||
| SUIT_Text_Keys /= suit-text-vendor-name | SUIT_Text_Keys /= suit-text-vendor-name | |||
| SUIT_Text_Keys /= suit-text-model-name | SUIT_Text_Keys /= suit-text-model-name | |||
| SUIT_Text_Keys /= suit-text-vendor-domain | SUIT_Text_Keys /= suit-text-vendor-domain | |||
| SUIT_Text_Keys /= suit-text-model-info | SUIT_Text_Keys /= suit-text-model-info | |||
| SUIT_Text_Keys /= suit-text-component-description | SUIT_Text_Keys /= suit-text-component-description | |||
| skipping to change at page 67, line 7 ¶ | skipping to change at page 70, line 50 ¶ | |||
| suit-parameter-unpack-info = 20 | suit-parameter-unpack-info = 20 | |||
| suit-parameter-uri = 21 | suit-parameter-uri = 21 | |||
| suit-parameter-source-component = 22 | suit-parameter-source-component = 22 | |||
| suit-parameter-run-args = 23 | suit-parameter-run-args = 23 | |||
| suit-parameter-device-identifier = 24 | suit-parameter-device-identifier = 24 | |||
| suit-parameter-minimum-battery = 26 | suit-parameter-minimum-battery = 26 | |||
| suit-parameter-update-priority = 27 | suit-parameter-update-priority = 27 | |||
| suit-parameter-version = 28 | suit-parameter-version = 28 | |||
| suit-parameter-wait-info = 29 | suit-parameter-wait-info = 29 | |||
| suit-parameter-uri-list = 30 | ||||
| suit-parameter-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 | |||
| suit-text-update-description = 2 | suit-text-update-description = 2 | |||
| suit-text-vendor-name = 3 | suit-text-vendor-name = 3 | |||
| suit-text-model-name = 4 | suit-text-model-name = 4 | |||
| suit-text-vendor-domain = 5 | suit-text-vendor-domain = 5 | |||
| suit-text-model-info = 6 | suit-text-model-info = 6 | |||
| suit-text-component-description = 7 | suit-text-component-description = 7 | |||
| suit-text-manifest-json-source = 8 | suit-text-manifest-json-source = 8 | |||
| suit-text-manifest-yaml-source = 9 | suit-text-manifest-yaml-source = 9 | |||
| suit-text-version-dependencies = 10 | suit-text-version-dependencies = 10 | |||
| 12. Examples | B. Examples | |||
| The following examples demonstrate a small subset of the | The following examples demonstrate a small subset of the | |||
| functionality of the manifest. However, despite this, even a simple | functionality of the manifest. However, despite this, even a simple | |||
| manifest processor can execute most of these manifests. | manifest processor can execute most of these manifests. | |||
| The examples are signed using the following ECDSA secp256r1 key: | The examples are signed using the following ECDSA secp256r1 key: | |||
| -----BEGIN PRIVATE KEY----- | -----BEGIN PRIVATE KEY----- | |||
| MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgApZYjZCUGLM50VBC | MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgApZYjZCUGLM50VBC | |||
| CjYStX+09jGmnyJPrpDLTz/hiXOhRANCAASEloEarguqq9JhVxie7NomvqqL8Rtv | CjYStX+09jGmnyJPrpDLTz/hiXOhRANCAASEloEarguqq9JhVxie7NomvqqL8Rtv | |||
| skipping to change at page 68, line 5 ¶ | skipping to change at page 71, line 46 ¶ | |||
| 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----- | |||
| Each example uses SHA256 as the digest function. | Each example uses SHA256 as the digest function. | |||
| 12.1. Example 0: Secure Boot | B.1. Example 0: Secure Boot | |||
| Secure boot and compatibility check. | Secure boot and compatibility check. | |||
| { | { | |||
| / authentication-wrapper / 2:h'81d28443a10126a058248202582064d8094 | / authentication-wrapper / 2:h'81586fd28443a10126a0582482025820655 | |||
| da3ef71c5971b7b84e7f4be1f56452c32fdde7bc1c70889112f1d5d9958407d637397e | ||||
| 12abdd41bc026a8e8a22f0f902a5b972e7786d570a37ac43c370b64a6946b0311f059c | f1230fd3833ca828c18200498fd1cd90656a9a2620c6989921c06623703515840a0416 | |||
| a01d40f74d88d6fd7193baa36f5cf20aa57c46a0411a6b704' / [ | 20607b7765a51fe0566e5d8fed95491ee6df622132524fdbe67607bf7f2794d7a71dad | |||
| 18([ | 7230d3cab86c5091a226d00061b0a74a01b3d371e07d5b3eca3d4' / [ | |||
| h'd28443a10126a0582482025820655f1230fd3833ca828c18200498fd1cd9 | ||||
| 0656a9a2620c6989921c06623703515840a041620607b7765a51fe0566e5d8fed95491 | ||||
| ee6df622132524fdbe67607bf7f2794d7a71dad7230d3cab86c5091a226d00061b0a74 | ||||
| a01b3d371e07d5b3eca3d4' / 18([ | ||||
| / protected / h'a10126' / { | / protected / h'a10126' / { | |||
| / alg / 1:-7 / ES256 /, | / alg / 1:-7 / "ES256" /, | |||
| } /, | } /, | |||
| / unprotected / { | / unprotected / { | |||
| }, | }, | |||
| / payload / h'8202582064d8094da3ef71c5971b7b84e7f4be1f | / payload / h'82025820655f1230fd3833ca828c18200498fd1c | |||
| 56452c32fdde7bc1c70889112f1d5d99' / [ | d90656a9a2620c6989921c0662370351' / [ | |||
| / algorithm-id / 2 / sha256 /, | / algorithm-id / 2 / "sha256" /, | |||
| / digest-bytes / | / digest-bytes / | |||
| h'64d8094da3ef71c5971b7b84e7f4be1f56452c32fdde7bc1c70889112f1d5d99' | h'"655f1230fd3833ca828c18200498fd1cd90656a9a2620c6989921c0662370351"' | |||
| ] /, | ] /, | |||
| / signature / h'7d637397e12abdd41bc026a8e8a22f0f902a5b | / signature / h'"a041620607b7765a51fe0566e5d8fed95491e | |||
| 972e7786d570a37ac43c370b64a6946b0311f059ca01d40f74d88d6fd7193baa36f5cf | e6df622132524fdbe67607bf7f2794d7a71dad7230d3cab86c5091a226d00061b0a74a | |||
| 20aa57c46a0411a6b704' | 01b3d371e07d5b3eca3d4"' | |||
| ]) | ]) / | |||
| ] /, | ] /, | |||
| / manifest / 3:h'a50101020103585ea20244818141000458548614a40150fa6 | / manifest / 3:h'a501010201035860a20244818141000458568614a40150fa6 | |||
| b4a53d5ad5fdfbe9de663e4d41ffe02501492af1425695e48bf429b2d51f2ab4503820 | b4a53d5ad5fdfbe9de663e4d41ffe02501492af1425695e48bf429b2d51f2ab4503582 | |||
| 2582000112233445566778899aabbccddeeff0123456789abcdeffedcba98765432100 | 48202582000112233445566778899aabbccddeeff0123456789abcdeffedcba9876543 | |||
| e1987d001f602f60a438203f60c438217f6' / { | 2100e1987d001f602f60a438203f60c438217f6' / { | |||
| / manifest-version / 1:1, | / manifest-version / 1:1, | |||
| / manifest-sequence-number / 2:1, | / manifest-sequence-number / 2:1, | |||
| / common / 3:h'a20244818141000458548614a40150fa6b4a53d5ad5fdfb | / common / 3:h'a20244818141000458568614a40150fa6b4a53d5ad5fdfb | |||
| e9de663e4d41ffe02501492af1425695e48bf429b2d51f2ab450382025820001122334 | e9de663e4d41ffe02501492af1425695e48bf429b2d51f2ab450358248202582000112 | |||
| 45566778899aabbccddeeff0123456789abcdeffedcba98765432100e1987d001f602f | 233445566778899aabbccddeeff0123456789abcdeffedcba98765432100e1987d001f | |||
| 6' / { | 602f6' / { | |||
| / components / 2:h'81814100' / [ | / components / 2:h'81814100' / [ | |||
| [h'00'] | [h'"00"'] | |||
| ] /, | ] /, | |||
| / common-sequence / 4:h'8614a40150fa6b4a53d5ad5fdfbe9de663 | / common-sequence / 4:h'8614a40150fa6b4a53d5ad5fdfbe9de663 | |||
| e4d41ffe02501492af1425695e48bf429b2d51f2ab4503820258200011223344556677 | e4d41ffe02501492af1425695e48bf429b2d51f2ab4503582482025820001122334455 | |||
| 8899aabbccddeeff0123456789abcdeffedcba98765432100e1987d001f602f6' / [ | 66778899aabbccddeeff0123456789abcdeffedcba98765432100e1987d001f602f6' | |||
| / [ | ||||
| / directive-override-parameters / 20,{ | / directive-override-parameters / 20,{ | |||
| / vendor-id / | / vendor-id / | |||
| 1:h'fa6b4a53d5ad5fdfbe9de663e4d41ffe' / fa6b4a53-d5ad-5fdf- | 1:h'"fa6b4a53d5ad5fdfbe9de663e4d41ffe"' / fa6b4a53-d5ad-5fdf- | |||
| be9d-e663e4d41ffe /, | be9d-e663e4d41ffe /, | |||
| / class-id / 2:h'1492af1425695e48bf429b2d51f2ab45' | / class-id / | |||
| / 1492af14-2569-5e48-bf42-9b2d51f2ab45 /, | 2:h'"1492af1425695e48bf429b2d51f2ab45"' / | |||
| / image-digest / 3:[ | 1492af14-2569-5e48-bf42-9b2d51f2ab45 /, | |||
| / algorithm-id / 2 / sha256 /, | / image-digest / 3:h'8202582000112233445566778899a | |||
| abbccddeeff0123456789abcdeffedcba9876543210' / [ | ||||
| / algorithm-id / 2 / "sha256" /, | ||||
| / digest-bytes / | / digest-bytes / | |||
| h'00112233445566778899aabbccddeeff0123456789abcdeffedcba9876543210' | h'"00112233445566778899aabbccddeeff0123456789abcdeffedcba9876543210"' | |||
| ], | ] /, | |||
| / image-size / 14:34768, | / image-size / 14:34768, | |||
| } , | } , | |||
| / condition-vendor-identifier / 1,F6 / nil / , | / condition-vendor-identifier / 1,F6 / nil / , | |||
| / condition-class-identifier / 2,F6 / nil / | / condition-class-identifier / 2,F6 / nil / | |||
| ] /, | ] /, | |||
| } /, | } /, | |||
| / validate / 10:h'8203f6' / [ | / validate / 10:h'8203f6' / [ | |||
| / condition-image-match / 3,F6 / nil / | / condition-image-match / 3,F6 / nil / | |||
| ] /, | ] /, | |||
| / run / 12:h'8217f6' / [ | / run / 12:h'8217f6' / [ | |||
| / directive-run / 23,F6 / nil / | / directive-run / 23,F6 / nil / | |||
| ] /, | ] /, | |||
| } /, | } /, | |||
| } | } | |||
| Total size of manifest without COSE authentication object: 116 | Total size of manifest without COSE authentication object: 118 | |||
| Manifest: | Manifest: | |||
| a1035870a50101020103585ea20244818141000458548614a40150fa6b4a | a1035872a501010201035860a20244818141000458568614a40150fa6b4a | |||
| 53d5ad5fdfbe9de663e4d41ffe02501492af1425695e48bf429b2d51f2ab | 53d5ad5fdfbe9de663e4d41ffe02501492af1425695e48bf429b2d51f2ab | |||
| 45038202582000112233445566778899aabbccddeeff0123456789abcdef | 450358248202582000112233445566778899aabbccddeeff0123456789ab | |||
| fedcba98765432100e1987d001f602f60a438203f60c438217f6 | cdeffedcba98765432100e1987d001f602f60a438203f60c438217f6 | |||
| Total size of manifest with COSE authentication object: 231 | Total size of manifest with COSE authentication object: 235 | |||
| Manifest with COSE authentication object: | Manifest with COSE authentication object: | |||
| a202587081d28443a10126a058248202582064d8094da3ef71c5971b7b84 | a202587281586fd28443a10126a0582482025820655f1230fd3833ca828c | |||
| e7f4be1f56452c32fdde7bc1c70889112f1d5d9958407d637397e12abdd4 | 18200498fd1cd90656a9a2620c6989921c06623703515840a041620607b7 | |||
| 1bc026a8e8a22f0f902a5b972e7786d570a37ac43c370b64a6946b0311f0 | 765a51fe0566e5d8fed95491ee6df622132524fdbe67607bf7f2794d7a71 | |||
| 59ca01d40f74d88d6fd7193baa36f5cf20aa57c46a0411a6b704035870a5 | dad7230d3cab86c5091a226d00061b0a74a01b3d371e07d5b3eca3d40358 | |||
| 0101020103585ea20244818141000458548614a40150fa6b4a53d5ad5fdf | 72a501010201035860a20244818141000458568614a40150fa6b4a53d5ad | |||
| be9de663e4d41ffe02501492af1425695e48bf429b2d51f2ab4503820258 | 5fdfbe9de663e4d41ffe02501492af1425695e48bf429b2d51f2ab450358 | |||
| 2000112233445566778899aabbccddeeff0123456789abcdeffedcba9876 | 248202582000112233445566778899aabbccddeeff0123456789abcdeffe | |||
| 5432100e1987d001f602f60a438203f60c438217f6 | dcba98765432100e1987d001f602f60a438203f60c438217f6 | |||
| 12.2. Example 1: Simultaneous Download and Installation of Payload | B.2. Example 1: Simultaneous Download and Installation of Payload | |||
| Simultaneous download and installation of payload. | Simultaneous download and installation of payload. | |||
| { | { | |||
| / authentication-wrapper / 2:h'81d28443a10126a0582482025820666b83f | / authentication-wrapper / 2:h'81586fd28443a10126a0582482025820815 | |||
| f51628190387170489535aa9441656d8a24401de6458595c42cb0165d58405cb310acb | 32771898e4ebcccf12c607420eba62b5086192cac4c99692835b58ee62f7b584081592 | |||
| 34f7ebb42acfffce430dbda94faa412900ce8e76650445e2c37e4cc132d8bb5f30ecf5 | 1e5148e9b81e79d8be570de6bb42ba2e903c8549f0e13dee4d0ee420d90dd9f8537ebe | |||
| f8130270bbf8d159f6d36e1cdf97b64229910fdb447538af1' / [ | ad3f92b37df703539879129183b0beaf3ba75cacd8a91e075a24e' / [ | |||
| 18([ | h'd28443a10126a058248202582081532771898e4ebcccf12c607420eba62b | |||
| 5086192cac4c99692835b58ee62f7b5840815921e5148e9b81e79d8be570de6bb42ba2 | ||||
| e903c8549f0e13dee4d0ee420d90dd9f8537ebead3f92b37df703539879129183b0bea | ||||
| f3ba75cacd8a91e075a24e' / 18([ | ||||
| / protected / h'a10126' / { | / protected / h'a10126' / { | |||
| / alg / 1:-7 / ES256 /, | / alg / 1:-7 / "ES256" /, | |||
| } /, | } /, | |||
| / unprotected / { | / unprotected / { | |||
| }, | }, | |||
| / payload / h'82025820666b83ff51628190387170489535aa94 | / payload / h'8202582081532771898e4ebcccf12c607420eba6 | |||
| 41656d8a24401de6458595c42cb0165d' / [ | 2b5086192cac4c99692835b58ee62f7b' / [ | |||
| / algorithm-id / 2 / sha256 /, | / algorithm-id / 2 / "sha256" /, | |||
| / digest-bytes / | / digest-bytes / | |||
| h'666b83ff51628190387170489535aa9441656d8a24401de6458595c42cb0165d' | h'"81532771898e4ebcccf12c607420eba62b5086192cac4c99692835b58ee62f7b"' | |||
| ] /, | ] /, | |||
| / signature / h'5cb310acb34f7ebb42acfffce430dbda94faa4 | / signature / h'"815921e5148e9b81e79d8be570de6bb42ba2e | |||
| 12900ce8e76650445e2c37e4cc132d8bb5f30ecf5f8130270bbf8d159f6d36e1cdf97b | 903c8549f0e13dee4d0ee420d90dd9f8537ebead3f92b37df703539879129183b0beaf | |||
| 64229910fdb447538af1' | 3ba75cacd8a91e075a24e"' | |||
| ]) | ]) / | |||
| ] /, | ] /, | |||
| / manifest / 3:h'a50101020203585ea20244818141000458548614a40150fa6 | / manifest / 3:h'a501010202035860a20244818141000458568614a40150fa6 | |||
| b4a53d5ad5fdfbe9de663e4d41ffe02501492af1425695e48bf429b2d51f2ab4503820 | b4a53d5ad5fdfbe9de663e4d41ffe02501492af1425695e48bf429b2d51f2ab4503582 | |||
| 2582000112233445566778899aabbccddeeff0123456789abcdeffedcba98765432100 | 48202582000112233445566778899aabbccddeeff0123456789abcdeffedcba9876543 | |||
| e1987d001f602f60958258613a115781b687474703a2f2f6578616d706c652e636f6d2 | 2100e1987d001f602f60958258613a115781b687474703a2f2f6578616d706c652e636 | |||
| f66696c652e62696e15f603f60a438203f6' / { | f6d2f66696c652e62696e15f603f60a438203f6' / { | |||
| / manifest-version / 1:1, | / manifest-version / 1:1, | |||
| / manifest-sequence-number / 2:2, | / manifest-sequence-number / 2:2, | |||
| / common / 3:h'a20244818141000458548614a40150fa6b4a53d5ad5fdfb | / common / 3:h'a20244818141000458568614a40150fa6b4a53d5ad5fdfb | |||
| e9de663e4d41ffe02501492af1425695e48bf429b2d51f2ab450382025820001122334 | e9de663e4d41ffe02501492af1425695e48bf429b2d51f2ab450358248202582000112 | |||
| 45566778899aabbccddeeff0123456789abcdeffedcba98765432100e1987d001f602f | 233445566778899aabbccddeeff0123456789abcdeffedcba98765432100e1987d001f | |||
| 6' / { | 602f6' / { | |||
| / components / 2:h'81814100' / [ | / components / 2:h'81814100' / [ | |||
| [h'00'] | [h'"00"'] | |||
| ] /, | ] /, | |||
| / common-sequence / 4:h'8614a40150fa6b4a53d5ad5fdfbe9de663 | / common-sequence / 4:h'8614a40150fa6b4a53d5ad5fdfbe9de663 | |||
| e4d41ffe02501492af1425695e48bf429b2d51f2ab4503820258200011223344556677 | e4d41ffe02501492af1425695e48bf429b2d51f2ab4503582482025820001122334455 | |||
| 8899aabbccddeeff0123456789abcdeffedcba98765432100e1987d001f602f6' / [ | 66778899aabbccddeeff0123456789abcdeffedcba98765432100e1987d001f602f6' | |||
| / [ | ||||
| / directive-override-parameters / 20,{ | / directive-override-parameters / 20,{ | |||
| / vendor-id / | / vendor-id / | |||
| 1:h'fa6b4a53d5ad5fdfbe9de663e4d41ffe' / fa6b4a53-d5ad-5fdf- | 1:h'"fa6b4a53d5ad5fdfbe9de663e4d41ffe"' / fa6b4a53-d5ad-5fdf- | |||
| be9d-e663e4d41ffe /, | be9d-e663e4d41ffe /, | |||
| / class-id / 2:h'1492af1425695e48bf429b2d51f2ab45' | / class-id / | |||
| / 1492af14-2569-5e48-bf42-9b2d51f2ab45 /, | 2:h'"1492af1425695e48bf429b2d51f2ab45"' / | |||
| / image-digest / 3:[ | 1492af14-2569-5e48-bf42-9b2d51f2ab45 /, | |||
| / algorithm-id / 2 / sha256 /, | / image-digest / 3:h'8202582000112233445566778899a | |||
| abbccddeeff0123456789abcdeffedcba9876543210' / [ | ||||
| / algorithm-id / 2 / "sha256" /, | ||||
| / digest-bytes / | / digest-bytes / | |||
| h'00112233445566778899aabbccddeeff0123456789abcdeffedcba9876543210' | h'"00112233445566778899aabbccddeeff0123456789abcdeffedcba9876543210"' | |||
| ], | ] /, | |||
| / image-size / 14:34768, | / image-size / 14:34768, | |||
| } , | } , | |||
| / condition-vendor-identifier / 1,F6 / nil / , | / condition-vendor-identifier / 1,F6 / nil / , | |||
| / condition-class-identifier / 2,F6 / nil / | / condition-class-identifier / 2,F6 / nil / | |||
| ] /, | ] /, | |||
| } /, | } /, | |||
| / install / 9:h'8613a115781b687474703a2f2f6578616d706c652e636f | / install / 9:h'8613a115781b687474703a2f2f6578616d706c652e636f | |||
| 6d2f66696c652e62696e15f603f6' / [ | 6d2f66696c652e62696e15f603f6' / [ | |||
| / directive-set-parameters / 19,{ | / directive-set-parameters / 19,{ | |||
| / uri / 21:'http://example.com/file.bin', | / uri / 21:'http://example.com/file.bin', | |||
| } , | } , | |||
| / directive-fetch / 21,F6 / nil / , | / directive-fetch / 21,F6 / nil / , | |||
| / condition-image-match / 3,F6 / nil / | / condition-image-match / 3,F6 / nil / | |||
| ] /, | ] /, | |||
| / validate / 10:h'8203f6' / [ | / validate / 10:h'8203f6' / [ | |||
| / condition-image-match / 3,F6 / nil / | / condition-image-match / 3,F6 / nil / | |||
| ] /, | ] /, | |||
| } /, | } /, | |||
| } | } | |||
| Total size of manifest without COSE authentication object: 151 | Total size of manifest without COSE authentication object: 153 | |||
| Manifest: | Manifest: | |||
| a1035893a50101020203585ea20244818141000458548614a40150fa6b4a | a1035895a501010202035860a20244818141000458568614a40150fa6b4a | |||
| 53d5ad5fdfbe9de663e4d41ffe02501492af1425695e48bf429b2d51f2ab | 53d5ad5fdfbe9de663e4d41ffe02501492af1425695e48bf429b2d51f2ab | |||
| 45038202582000112233445566778899aabbccddeeff0123456789abcdef | 450358248202582000112233445566778899aabbccddeeff0123456789ab | |||
| fedcba98765432100e1987d001f602f60958258613a115781b687474703a | cdeffedcba98765432100e1987d001f602f60958258613a115781b687474 | |||
| 2f2f6578616d706c652e636f6d2f66696c652e62696e15f603f60a438203 | 703a2f2f6578616d706c652e636f6d2f66696c652e62696e15f603f60a43 | |||
| f6 | 8203f6 | |||
| Total size of manifest with COSE authentication object: 266 | Total size of manifest with COSE authentication object: 270 | |||
| Manifest with COSE authentication object: | Manifest with COSE authentication object: | |||
| a202587081d28443a10126a0582482025820666b83ff5162819038717048 | a202587281586fd28443a10126a058248202582081532771898e4ebcccf1 | |||
| 9535aa9441656d8a24401de6458595c42cb0165d58405cb310acb34f7ebb | 2c607420eba62b5086192cac4c99692835b58ee62f7b5840815921e5148e | |||
| 42acfffce430dbda94faa412900ce8e76650445e2c37e4cc132d8bb5f30e | 9b81e79d8be570de6bb42ba2e903c8549f0e13dee4d0ee420d90dd9f8537 | |||
| cf5f8130270bbf8d159f6d36e1cdf97b64229910fdb447538af1035893a5 | ebead3f92b37df703539879129183b0beaf3ba75cacd8a91e075a24e0358 | |||
| 0101020203585ea20244818141000458548614a40150fa6b4a53d5ad5fdf | 95a501010202035860a20244818141000458568614a40150fa6b4a53d5ad | |||
| be9de663e4d41ffe02501492af1425695e48bf429b2d51f2ab4503820258 | 5fdfbe9de663e4d41ffe02501492af1425695e48bf429b2d51f2ab450358 | |||
| 2000112233445566778899aabbccddeeff0123456789abcdeffedcba9876 | 248202582000112233445566778899aabbccddeeff0123456789abcdeffe | |||
| 5432100e1987d001f602f60958258613a115781b687474703a2f2f657861 | dcba98765432100e1987d001f602f60958258613a115781b687474703a2f | |||
| 6d706c652e636f6d2f66696c652e62696e15f603f60a438203f6 | 2f6578616d706c652e636f6d2f66696c652e62696e15f603f60a438203f6 | |||
| 12.3. Example 2: Simultaneous Download, Installation, and Secure Boot | B.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'81d28443a10126a058248202582038df852 | / authentication-wrapper / 2:h'81586fd28443a10126a0582482025820883 | |||
| c98928fae9694fce5b6b51addd631bfde473eceb20c8b929ae6ec2d6c584050bba3dd9 | 90f8988639d8a2cfb6da969fce488333ac5ba77aaf0d66b5623009bbf341158401929f | |||
| b0ad6da91265cff1ec69c3a9e2e42ffd97e780e37c78ac7889140620439874108ec527 | fd488c455ab40eaf1aa96a7df4a9c16c658221055c3a113232fb81c5751a23a74b5efc | |||
| 1f3325988f2774f17339fcd61a5c08a3d15fb7fcdeef9294e' / [ | 06c459eb47a07028ef3c6a0d9051185dd78899c654249f9070dea' / [ | |||
| 18([ | h'd28443a10126a058248202582088390f8988639d8a2cfb6da969fce48833 | |||
| 3ac5ba77aaf0d66b5623009bbf341158401929ffd488c455ab40eaf1aa96a7df4a9c16 | ||||
| c658221055c3a113232fb81c5751a23a74b5efc06c459eb47a07028ef3c6a0d9051185 | ||||
| dd78899c654249f9070dea' / 18([ | ||||
| / protected / h'a10126' / { | / protected / h'a10126' / { | |||
| / alg / 1:-7 / ES256 /, | / alg / 1:-7 / "ES256" /, | |||
| } /, | } /, | |||
| / unprotected / { | / unprotected / { | |||
| }, | }, | |||
| / payload / h'8202582038df852c98928fae9694fce5b6b51add | / payload / h'8202582088390f8988639d8a2cfb6da969fce488 | |||
| d631bfde473eceb20c8b929ae6ec2d6c' / [ | 333ac5ba77aaf0d66b5623009bbf3411' / [ | |||
| / algorithm-id / 2 / sha256 /, | / algorithm-id / 2 / "sha256" /, | |||
| / digest-bytes / | / digest-bytes / | |||
| h'38df852c98928fae9694fce5b6b51addd631bfde473eceb20c8b929ae6ec2d6c' | h'"88390f8988639d8a2cfb6da969fce488333ac5ba77aaf0d66b5623009bbf3411"' | |||
| ] /, | ] /, | |||
| / signature / h'50bba3dd9b0ad6da91265cff1ec69c3a9e2e42 | / signature / h'"1929ffd488c455ab40eaf1aa96a7df4a9c16c | |||
| ffd97e780e37c78ac7889140620439874108ec5271f3325988f2774f17339fcd61a5c0 | 658221055c3a113232fb81c5751a23a74b5efc06c459eb47a07028ef3c6a0d9051185d | |||
| 8a3d15fb7fcdeef9294e' | d78899c654249f9070dea"' | |||
| ]) | ]) / | |||
| ] /, | ] /, | |||
| / manifest / 3:h'a60101020303585ea20244818141000458548614a40150fa6 | / manifest / 3:h'a601010203035860a20244818141000458568614a40150fa6 | |||
| b4a53d5ad5fdfbe9de663e4d41ffe02501492af1425695e48bf429b2d51f2ab4503820 | b4a53d5ad5fdfbe9de663e4d41ffe02501492af1425695e48bf429b2d51f2ab4503582 | |||
| 2582000112233445566778899aabbccddeeff0123456789abcdeffedcba98765432100 | 48202582000112233445566778899aabbccddeeff0123456789abcdeffedcba9876543 | |||
| e1987d001f602f60958258613a115781b687474703a2f2f6578616d706c652e636f6d2 | 2100e1987d001f602f60958258613a115781b687474703a2f2f6578616d706c652e636 | |||
| f66696c652e62696e15f603f60a438203f60c438217f6' / { | f6d2f66696c652e62696e15f603f60a438203f60c438217f6' / { | |||
| / manifest-version / 1:1, | / manifest-version / 1:1, | |||
| / manifest-sequence-number / 2:3, | / manifest-sequence-number / 2:3, | |||
| / common / 3:h'a20244818141000458548614a40150fa6b4a53d5ad5fdfb | / common / 3:h'a20244818141000458568614a40150fa6b4a53d5ad5fdfb | |||
| e9de663e4d41ffe02501492af1425695e48bf429b2d51f2ab450382025820001122334 | ||||
| 45566778899aabbccddeeff0123456789abcdeffedcba98765432100e1987d001f602f | e9de663e4d41ffe02501492af1425695e48bf429b2d51f2ab450358248202582000112 | |||
| 6' / { | 233445566778899aabbccddeeff0123456789abcdeffedcba98765432100e1987d001f | |||
| 602f6' / { | ||||
| / components / 2:h'81814100' / [ | / components / 2:h'81814100' / [ | |||
| [h'00'] | [h'"00"'] | |||
| ] /, | ] /, | |||
| / common-sequence / 4:h'8614a40150fa6b4a53d5ad5fdfbe9de663 | / common-sequence / 4:h'8614a40150fa6b4a53d5ad5fdfbe9de663 | |||
| e4d41ffe02501492af1425695e48bf429b2d51f2ab4503820258200011223344556677 | e4d41ffe02501492af1425695e48bf429b2d51f2ab4503582482025820001122334455 | |||
| 8899aabbccddeeff0123456789abcdeffedcba98765432100e1987d001f602f6' / [ | 66778899aabbccddeeff0123456789abcdeffedcba98765432100e1987d001f602f6' | |||
| / [ | ||||
| / directive-override-parameters / 20,{ | / directive-override-parameters / 20,{ | |||
| / vendor-id / | / vendor-id / | |||
| 1:h'fa6b4a53d5ad5fdfbe9de663e4d41ffe' / fa6b4a53-d5ad-5fdf- | 1:h'"fa6b4a53d5ad5fdfbe9de663e4d41ffe"' / fa6b4a53-d5ad-5fdf- | |||
| be9d-e663e4d41ffe /, | be9d-e663e4d41ffe /, | |||
| / class-id / 2:h'1492af1425695e48bf429b2d51f2ab45' | / class-id / | |||
| / 1492af14-2569-5e48-bf42-9b2d51f2ab45 /, | 2:h'"1492af1425695e48bf429b2d51f2ab45"' / | |||
| / image-digest / 3:[ | 1492af14-2569-5e48-bf42-9b2d51f2ab45 /, | |||
| / algorithm-id / 2 / sha256 /, | / image-digest / 3:h'8202582000112233445566778899a | |||
| abbccddeeff0123456789abcdeffedcba9876543210' / [ | ||||
| / algorithm-id / 2 / "sha256" /, | ||||
| / digest-bytes / | / digest-bytes / | |||
| h'00112233445566778899aabbccddeeff0123456789abcdeffedcba9876543210' | h'"00112233445566778899aabbccddeeff0123456789abcdeffedcba9876543210"' | |||
| ], | ] /, | |||
| / image-size / 14:34768, | / image-size / 14:34768, | |||
| } , | } , | |||
| / condition-vendor-identifier / 1,F6 / nil / , | / condition-vendor-identifier / 1,F6 / nil / , | |||
| / condition-class-identifier / 2,F6 / nil / | / condition-class-identifier / 2,F6 / nil / | |||
| ] /, | ] /, | |||
| } /, | } /, | |||
| / install / 9:h'8613a115781b687474703a2f2f6578616d706c652e636f | / install / 9:h'8613a115781b687474703a2f2f6578616d706c652e636f | |||
| 6d2f66696c652e62696e15f603f6' / [ | 6d2f66696c652e62696e15f603f6' / [ | |||
| / directive-set-parameters / 19,{ | / directive-set-parameters / 19,{ | |||
| / uri / 21:'http://example.com/file.bin', | / uri / 21:'http://example.com/file.bin', | |||
| skipping to change at page 73, line 34 ¶ | skipping to change at page 77, line 51 ¶ | |||
| ] /, | ] /, | |||
| / validate / 10:h'8203f6' / [ | / validate / 10:h'8203f6' / [ | |||
| / condition-image-match / 3,F6 / nil / | / condition-image-match / 3,F6 / nil / | |||
| ] /, | ] /, | |||
| / run / 12:h'8217f6' / [ | / run / 12:h'8217f6' / [ | |||
| / directive-run / 23,F6 / nil / | / directive-run / 23,F6 / nil / | |||
| ] /, | ] /, | |||
| } /, | } /, | |||
| } | } | |||
| Total size of manifest without COSE authentication object: 156 | Total size of manifest without COSE authentication object: 158 | |||
| Manifest: | Manifest: | |||
| a1035898a60101020303585ea20244818141000458548614a40150fa6b4a | a103589aa601010203035860a20244818141000458568614a40150fa6b4a | |||
| 53d5ad5fdfbe9de663e4d41ffe02501492af1425695e48bf429b2d51f2ab | 53d5ad5fdfbe9de663e4d41ffe02501492af1425695e48bf429b2d51f2ab | |||
| 45038202582000112233445566778899aabbccddeeff0123456789abcdef | 450358248202582000112233445566778899aabbccddeeff0123456789ab | |||
| fedcba98765432100e1987d001f602f60958258613a115781b687474703a | cdeffedcba98765432100e1987d001f602f60958258613a115781b687474 | |||
| 2f2f6578616d706c652e636f6d2f66696c652e62696e15f603f60a438203 | 703a2f2f6578616d706c652e636f6d2f66696c652e62696e15f603f60a43 | |||
| f60c438217f6 | 8203f60c438217f6 | |||
| Total size of manifest with COSE authentication object: 271 | Total size of manifest with COSE authentication object: 275 | |||
| Manifest with COSE authentication object: | Manifest with COSE authentication object: | |||
| a202587081d28443a10126a058248202582038df852c98928fae9694fce5 | a202587281586fd28443a10126a058248202582088390f8988639d8a2cfb | |||
| b6b51addd631bfde473eceb20c8b929ae6ec2d6c584050bba3dd9b0ad6da | 6da969fce488333ac5ba77aaf0d66b5623009bbf341158401929ffd488c4 | |||
| 91265cff1ec69c3a9e2e42ffd97e780e37c78ac7889140620439874108ec | 55ab40eaf1aa96a7df4a9c16c658221055c3a113232fb81c5751a23a74b5 | |||
| 5271f3325988f2774f17339fcd61a5c08a3d15fb7fcdeef9294e035898a6 | efc06c459eb47a07028ef3c6a0d9051185dd78899c654249f9070dea0358 | |||
| 0101020303585ea20244818141000458548614a40150fa6b4a53d5ad5fdf | 9aa601010203035860a20244818141000458568614a40150fa6b4a53d5ad | |||
| be9de663e4d41ffe02501492af1425695e48bf429b2d51f2ab4503820258 | 5fdfbe9de663e4d41ffe02501492af1425695e48bf429b2d51f2ab450358 | |||
| 2000112233445566778899aabbccddeeff0123456789abcdeffedcba9876 | 248202582000112233445566778899aabbccddeeff0123456789abcdeffe | |||
| 5432100e1987d001f602f60958258613a115781b687474703a2f2f657861 | dcba98765432100e1987d001f602f60958258613a115781b687474703a2f | |||
| 6d706c652e636f6d2f66696c652e62696e15f603f60a438203f60c438217 | 2f6578616d706c652e636f6d2f66696c652e62696e15f603f60a438203f6 | |||
| f6 | 0c438217f6 | |||
| 12.4. Example 3: Load from External Storage | B.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. | |||
| { | { | |||
| / authentication-wrapper / 2:h'81d28443a10126a05824820258208ae1d4d | / authentication-wrapper / 2:h'81586fd28443a10126a0582482025820568 | |||
| 1846e82975dd5d7555ef0c3836e7e653a8bb1214466457781c0d2f2aa58401ef2d0ca6 | 56a72f9ac0ee73b4ea3a866cf2e5c990e8ed8c6056608bc221efd42172b2758402a9d7 | |||
| aabf259feb880a1a4deb4e345cda314b2facf9983766da3744af825b3f98c74afdfa85 | 573ef6dcf5653b39027fdf87b81adeb0f03122bef0ecf5af9c7d77323c32827230f660 | |||
| aed406b10315e0cc6c44ee19321681c69f911bc90bf8d22c0' / [ | 8342b7bf5c125f17148bd67880420ab0d03e235e6ca1d15127499' / [ | |||
| 18([ | h'd28443a10126a058248202582056856a72f9ac0ee73b4ea3a866cf2e5c99 | |||
| 0e8ed8c6056608bc221efd42172b2758402a9d7573ef6dcf5653b39027fdf87b81adeb | ||||
| 0f03122bef0ecf5af9c7d77323c32827230f6608342b7bf5c125f17148bd67880420ab | ||||
| 0d03e235e6ca1d15127499' / 18([ | ||||
| / protected / h'a10126' / { | / protected / h'a10126' / { | |||
| / alg / 1:-7 / ES256 /, | / alg / 1:-7 / "ES256" /, | |||
| } /, | } /, | |||
| / unprotected / { | / unprotected / { | |||
| }, | }, | |||
| / payload / h'820258208ae1d4d1846e82975dd5d7555ef0c383 | / payload / h'8202582056856a72f9ac0ee73b4ea3a866cf2e5c | |||
| 6e7e653a8bb1214466457781c0d2f2aa' / [ | 990e8ed8c6056608bc221efd42172b27' / [ | |||
| / algorithm-id / 2 / sha256 /, | / algorithm-id / 2 / "sha256" /, | |||
| / digest-bytes / | / digest-bytes / | |||
| h'8ae1d4d1846e82975dd5d7555ef0c3836e7e653a8bb1214466457781c0d2f2aa' | h'"56856a72f9ac0ee73b4ea3a866cf2e5c990e8ed8c6056608bc221efd42172b27"' | |||
| ] /, | ] /, | |||
| / signature / h'1ef2d0ca6aabf259feb880a1a4deb4e345cda3 | / signature / h'"2a9d7573ef6dcf5653b39027fdf87b81adeb0 | |||
| 14b2facf9983766da3744af825b3f98c74afdfa85aed406b10315e0cc6c44ee1932168 | f03122bef0ecf5af9c7d77323c32827230f6608342b7bf5c125f17148bd67880420ab0 | |||
| 1c69f911bc90bf8d22c0' | d03e235e6ca1d15127499"' | |||
| ]) | ]) / | |||
| ] /, | ] /, | |||
| / manifest / 3:h'a701010204035863a2024782814100814101045856880c001 | / manifest / 3:h'a701010204035865a2024782814100814101045858880c001 | |||
| 4a40150fa6b4a53d5ad5fdfbe9de663e4d41ffe02501492af1425695e48bf429b2d51f | 4a40150fa6b4a53d5ad5fdfbe9de663e4d41ffe02501492af1425695e48bf429b2d51f | |||
| 2ab45038202582000112233445566778899aabbccddeeff0123456789abcdeffedcba9 | 2ab450358248202582000112233445566778899aabbccddeeff0123456789abcdeffed | |||
| 8765432100e1987d001f602f6095827880c0013a115781b687474703a2f2f6578616d7 | cba98765432100e1987d001f602f6095827880c0013a115781b687474703a2f2f65786 | |||
| 06c652e636f6d2f66696c652e62696e15f603f60a45840c0003f60b4b880c0113a1160 | 16d706c652e636f6d2f66696c652e62696e15f603f60a45840c0003f60b4b880c0113a | |||
| 016f603f60c45840c0117f6' / { | 1160016f603f60c45840c0117f6' / { | |||
| / manifest-version / 1:1, | / manifest-version / 1:1, | |||
| / manifest-sequence-number / 2:4, | / manifest-sequence-number / 2:4, | |||
| / common / 3:h'a2024782814100814101045856880c0014a40150fa6b4a5 | / common / 3:h'a2024782814100814101045858880c0014a40150fa6b4a5 | |||
| 3d5ad5fdfbe9de663e4d41ffe02501492af1425695e48bf429b2d51f2ab45038202582 | 3d5ad5fdfbe9de663e4d41ffe02501492af1425695e48bf429b2d51f2ab45035824820 | |||
| 000112233445566778899aabbccddeeff0123456789abcdeffedcba98765432100e198 | 2582000112233445566778899aabbccddeeff0123456789abcdeffedcba98765432100 | |||
| 7d001f602f6' / { | e1987d001f602f6' / { | |||
| / components / 2:h'82814100814101' / [ | / components / 2:h'82814100814101' / [ | |||
| [h'00'] , | [h'"00"'] , | |||
| [h'01'] | [h'"01"'] | |||
| ] /, | ] /, | |||
| / common-sequence / 4:h'880c0014a40150fa6b4a53d5ad5fdfbe9d | / common-sequence / 4:h'880c0014a40150fa6b4a53d5ad5fdfbe9d | |||
| e663e4d41ffe02501492af1425695e48bf429b2d51f2ab450382025820001122334455 | e663e4d41ffe02501492af1425695e48bf429b2d51f2ab450358248202582000112233 | |||
| 66778899aabbccddeeff0123456789abcdeffedcba98765432100e1987d001f602f6' | 445566778899aabbccddeeff0123456789abcdeffedcba98765432100e1987d001f602 | |||
| / [ | f6' / [ | |||
| / directive-set-component-index / 12,0 , | / directive-set-component-index / 12,0 , | |||
| / directive-override-parameters / 20,{ | / directive-override-parameters / 20,{ | |||
| / vendor-id / | / vendor-id / | |||
| 1:h'fa6b4a53d5ad5fdfbe9de663e4d41ffe' / fa6b4a53-d5ad-5fdf- | 1:h'"fa6b4a53d5ad5fdfbe9de663e4d41ffe"' / fa6b4a53-d5ad-5fdf- | |||
| be9d-e663e4d41ffe /, | be9d-e663e4d41ffe /, | |||
| / class-id / 2:h'1492af1425695e48bf429b2d51f2ab45' | / class-id / | |||
| / 1492af14-2569-5e48-bf42-9b2d51f2ab45 /, | 2:h'"1492af1425695e48bf429b2d51f2ab45"' / | |||
| / image-digest / 3:[ | 1492af14-2569-5e48-bf42-9b2d51f2ab45 /, | |||
| / algorithm-id / 2 / sha256 /, | / image-digest / 3:h'8202582000112233445566778899a | |||
| abbccddeeff0123456789abcdeffedcba9876543210' / [ | ||||
| / algorithm-id / 2 / "sha256" /, | ||||
| / digest-bytes / | / digest-bytes / | |||
| h'00112233445566778899aabbccddeeff0123456789abcdeffedcba9876543210' | h'"00112233445566778899aabbccddeeff0123456789abcdeffedcba9876543210"' | |||
| ], | ] /, | |||
| / image-size / 14:34768, | / image-size / 14:34768, | |||
| } , | } , | |||
| / condition-vendor-identifier / 1,F6 / nil / , | / condition-vendor-identifier / 1,F6 / nil / , | |||
| / condition-class-identifier / 2,F6 / nil / | / condition-class-identifier / 2,F6 / nil / | |||
| ] /, | ] /, | |||
| } /, | } /, | |||
| / install / 9:h'880c0013a115781b687474703a2f2f6578616d706c652e | / install / 9:h'880c0013a115781b687474703a2f2f6578616d706c652e | |||
| 636f6d2f66696c652e62696e15f603f6' / [ | 636f6d2f66696c652e62696e15f603f6' / [ | |||
| / directive-set-component-index / 12,0 , | / directive-set-component-index / 12,0 , | |||
| / directive-set-parameters / 19,{ | / directive-set-parameters / 19,{ | |||
| skipping to change at page 75, line 48 ¶ | skipping to change at page 80, line 18 ¶ | |||
| / directive-fetch / 21,F6 / nil / , | / directive-fetch / 21,F6 / nil / , | |||
| / condition-image-match / 3,F6 / nil / | / condition-image-match / 3,F6 / nil / | |||
| ] /, | ] /, | |||
| / validate / 10:h'840c0003f6' / [ | / validate / 10:h'840c0003f6' / [ | |||
| / directive-set-component-index / 12,0 , | / directive-set-component-index / 12,0 , | |||
| / condition-image-match / 3,F6 / nil / | / condition-image-match / 3,F6 / nil / | |||
| ] /, | ] /, | |||
| / load / 11:h'880c0113a1160016f603f6' / [ | / load / 11:h'880c0113a1160016f603f6' / [ | |||
| / directive-set-component-index / 12,1 , | / directive-set-component-index / 12,1 , | |||
| / directive-set-parameters / 19,{ | / directive-set-parameters / 19,{ | |||
| / source-component / 22:0 / [h'00'] /, | / source-component / 22:0 / [h'"00"'] /, | |||
| } , | } , | |||
| / directive-copy / 22,F6 / nil / , | / directive-copy / 22,F6 / nil / , | |||
| / condition-image-match / 3,F6 / nil / | / condition-image-match / 3,F6 / nil / | |||
| ] /, | ] /, | |||
| / run / 12:h'840c0117f6' / [ | / run / 12:h'840c0117f6' / [ | |||
| / directive-set-component-index / 12,1 , | / directive-set-component-index / 12,1 , | |||
| / directive-run / 23,F6 / nil / | / directive-run / 23,F6 / nil / | |||
| ] /, | ] /, | |||
| } /, | } /, | |||
| } | } | |||
| Total size of manifest without COSE authentication object: 180 | Total size of manifest without COSE authentication object: 182 | |||
| Manifest: | Manifest: | |||
| a10358b0a701010204035863a2024782814100814101045856880c0014a4 | a10358b2a701010204035865a2024782814100814101045858880c0014a4 | |||
| 0150fa6b4a53d5ad5fdfbe9de663e4d41ffe02501492af1425695e48bf42 | 0150fa6b4a53d5ad5fdfbe9de663e4d41ffe02501492af1425695e48bf42 | |||
| 9b2d51f2ab45038202582000112233445566778899aabbccddeeff012345 | 9b2d51f2ab450358248202582000112233445566778899aabbccddeeff01 | |||
| 6789abcdeffedcba98765432100e1987d001f602f6095827880c0013a115 | 23456789abcdeffedcba98765432100e1987d001f602f6095827880c0013 | |||
| 781b687474703a2f2f6578616d706c652e636f6d2f66696c652e62696e15 | a115781b687474703a2f2f6578616d706c652e636f6d2f66696c652e6269 | |||
| f603f60a45840c0003f60b4b880c0113a1160016f603f60c45840c0117f6 | 6e15f603f60a45840c0003f60b4b880c0113a1160016f603f60c45840c01 | |||
| 17f6 | ||||
| Total size of manifest with COSE authentication object: 295 | Total size of manifest with COSE authentication object: 299 | |||
| Manifest with COSE authentication object: | Manifest with COSE authentication object: | |||
| a202587081d28443a10126a05824820258208ae1d4d1846e82975dd5d755 | a202587281586fd28443a10126a058248202582056856a72f9ac0ee73b4e | |||
| 5ef0c3836e7e653a8bb1214466457781c0d2f2aa58401ef2d0ca6aabf259 | a3a866cf2e5c990e8ed8c6056608bc221efd42172b2758402a9d7573ef6d | |||
| feb880a1a4deb4e345cda314b2facf9983766da3744af825b3f98c74afdf | cf5653b39027fdf87b81adeb0f03122bef0ecf5af9c7d77323c32827230f | |||
| a85aed406b10315e0cc6c44ee19321681c69f911bc90bf8d22c00358b0a7 | 6608342b7bf5c125f17148bd67880420ab0d03e235e6ca1d151274990358 | |||
| 01010204035863a2024782814100814101045856880c0014a40150fa6b4a | b2a701010204035865a2024782814100814101045858880c0014a40150fa | |||
| 53d5ad5fdfbe9de663e4d41ffe02501492af1425695e48bf429b2d51f2ab | 6b4a53d5ad5fdfbe9de663e4d41ffe02501492af1425695e48bf429b2d51 | |||
| 45038202582000112233445566778899aabbccddeeff0123456789abcdef | f2ab450358248202582000112233445566778899aabbccddeeff01234567 | |||
| fedcba98765432100e1987d001f602f6095827880c0013a115781b687474 | 89abcdeffedcba98765432100e1987d001f602f6095827880c0013a11578 | |||
| 703a2f2f6578616d706c652e636f6d2f66696c652e62696e15f603f60a45 | 1b687474703a2f2f6578616d706c652e636f6d2f66696c652e62696e15f6 | |||
| 840c0003f60b4b880c0113a1160016f603f60c45840c0117f6 | 03f60a45840c0003f60b4b880c0113a1160016f603f60c45840c0117f6 | |||
| 12.5. Example 4: Load and Decompress from External Storage | B.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. | |||
| { | { | |||
| / authentication-wrapper / 2:h'81d28443a10126a0582482025820310798d | / authentication-wrapper / 2:h'81586fd28443a10126a058248202582057b | |||
| 3d8276a740505d1f017972e281d6d26c9967a658879ae6d07e6a238a958404d48f0059 | edc0076919ba83908365faf6d205e95c71268d29a94dc5e82698edd3a48225840e0a4d | |||
| 918c261bc1636b467b2b455801c4d211758a42e82a8f8fc245f21857d7c0e78f1b6d6a | c500266518742802f2364b65f983175f060c1555d3d0b186f447500ba60c66e3231674 | |||
| 8ab1f0c9e147043066c0af53c1563070d4934faeec21bac55' / [ | 1c3b642c68fed73d47542c3375c0ab72e0f4b94ec392ab398599d' / [ | |||
| 18([ | h'd28443a10126a058248202582057bedc0076919ba83908365faf6d205e95 | |||
| c71268d29a94dc5e82698edd3a48225840e0a4dc500266518742802f2364b65f983175 | ||||
| f060c1555d3d0b186f447500ba60c66e32316741c3b642c68fed73d47542c3375c0ab7 | ||||
| 2e0f4b94ec392ab398599d' / 18([ | ||||
| / protected / h'a10126' / { | / protected / h'a10126' / { | |||
| / alg / 1:-7 / ES256 /, | / alg / 1:-7 / "ES256" /, | |||
| } /, | } /, | |||
| / unprotected / { | / unprotected / { | |||
| }, | }, | |||
| / payload / h'82025820310798d3d8276a740505d1f017972e28 | / payload / h'8202582057bedc0076919ba83908365faf6d205e | |||
| 1d6d26c9967a658879ae6d07e6a238a9' / [ | 95c71268d29a94dc5e82698edd3a4822' / [ | |||
| / algorithm-id / 2 / sha256 /, | / algorithm-id / 2 / "sha256" /, | |||
| / digest-bytes / | / digest-bytes / | |||
| h'310798d3d8276a740505d1f017972e281d6d26c9967a658879ae6d07e6a238a9' | h'"57bedc0076919ba83908365faf6d205e95c71268d29a94dc5e82698edd3a4822"' | |||
| ] /, | ] /, | |||
| / signature / h'4d48f0059918c261bc1636b467b2b455801c4d | / signature / h'"e0a4dc500266518742802f2364b65f983175f | |||
| 211758a42e82a8f8fc245f21857d7c0e78f1b6d6a8ab1f0c9e147043066c0af53c1563 | 060c1555d3d0b186f447500ba60c66e32316741c3b642c68fed73d47542c3375c0ab72 | |||
| 070d4934faeec21bac55' | e0f4b94ec392ab398599d"' | |||
| ]) | ]) / | |||
| ] /, | ] /, | |||
| / manifest / 3:h'a701010205035863a2024782814100814101045856880c001 | / manifest / 3:h'a701010205035865a2024782814100814101045858880c001 | |||
| 4a40150fa6b4a53d5ad5fdfbe9de663e4d41ffe02501492af1425695e48bf429b2d51f | 4a40150fa6b4a53d5ad5fdfbe9de663e4d41ffe02501492af1425695e48bf429b2d51f | |||
| 2ab45038202582000112233445566778899aabbccddeeff0123456789abcdeffedcba9 | 2ab450358248202582000112233445566778899aabbccddeeff0123456789abcdeffed | |||
| 8765432100e1987d001f602f6095827880c0013a115781b687474703a2f2f6578616d7 | cba98765432100e1987d001f602f6095827880c0013a115781b687474703a2f2f65786 | |||
| 06c652e636f6d2f66696c652e62696e15f603f60a45840c0003f60b4d880c0113a2130 | 16d706c652e636f6d2f66696c652e62696e15f603f60a45840c0003f60b4d880c0113a | |||
| 1160016f603f60c45840c0117f6' / { | 21301160016f603f60c45840c0117f6' / { | |||
| / manifest-version / 1:1, | / manifest-version / 1:1, | |||
| / manifest-sequence-number / 2:5, | / manifest-sequence-number / 2:5, | |||
| / common / 3:h'a2024782814100814101045856880c0014a40150fa6b4a5 | / common / 3:h'a2024782814100814101045858880c0014a40150fa6b4a5 | |||
| 3d5ad5fdfbe9de663e4d41ffe02501492af1425695e48bf429b2d51f2ab45038202582 | 3d5ad5fdfbe9de663e4d41ffe02501492af1425695e48bf429b2d51f2ab45035824820 | |||
| 000112233445566778899aabbccddeeff0123456789abcdeffedcba98765432100e198 | 2582000112233445566778899aabbccddeeff0123456789abcdeffedcba98765432100 | |||
| 7d001f602f6' / { | e1987d001f602f6' / { | |||
| / components / 2:h'82814100814101' / [ | / components / 2:h'82814100814101' / [ | |||
| [h'00'] , | [h'"00"'] , | |||
| [h'01'] | [h'"01"'] | |||
| ] /, | ] /, | |||
| / common-sequence / 4:h'880c0014a40150fa6b4a53d5ad5fdfbe9d | / common-sequence / 4:h'880c0014a40150fa6b4a53d5ad5fdfbe9d | |||
| e663e4d41ffe02501492af1425695e48bf429b2d51f2ab450382025820001122334455 | e663e4d41ffe02501492af1425695e48bf429b2d51f2ab450358248202582000112233 | |||
| 66778899aabbccddeeff0123456789abcdeffedcba98765432100e1987d001f602f6' | 445566778899aabbccddeeff0123456789abcdeffedcba98765432100e1987d001f602 | |||
| / [ | f6' / [ | |||
| / directive-set-component-index / 12,0 , | / directive-set-component-index / 12,0 , | |||
| / directive-override-parameters / 20,{ | / directive-override-parameters / 20,{ | |||
| / vendor-id / | / vendor-id / | |||
| 1:h'fa6b4a53d5ad5fdfbe9de663e4d41ffe' / fa6b4a53-d5ad-5fdf- | 1:h'"fa6b4a53d5ad5fdfbe9de663e4d41ffe"' / fa6b4a53-d5ad-5fdf- | |||
| be9d-e663e4d41ffe /, | be9d-e663e4d41ffe /, | |||
| / class-id / 2:h'1492af1425695e48bf429b2d51f2ab45' | / class-id / | |||
| / 1492af14-2569-5e48-bf42-9b2d51f2ab45 /, | 2:h'"1492af1425695e48bf429b2d51f2ab45"' / | |||
| / image-digest / 3:[ | 1492af14-2569-5e48-bf42-9b2d51f2ab45 /, | |||
| / algorithm-id / 2 / sha256 /, | / image-digest / 3:h'8202582000112233445566778899a | |||
| abbccddeeff0123456789abcdeffedcba9876543210' / [ | ||||
| / algorithm-id / 2 / "sha256" /, | ||||
| / digest-bytes / | / digest-bytes / | |||
| h'00112233445566778899aabbccddeeff0123456789abcdeffedcba9876543210' | h'"00112233445566778899aabbccddeeff0123456789abcdeffedcba9876543210"' | |||
| ], | ] /, | |||
| / image-size / 14:34768, | / image-size / 14:34768, | |||
| } , | } , | |||
| / condition-vendor-identifier / 1,F6 / nil / , | / condition-vendor-identifier / 1,F6 / nil / , | |||
| / condition-class-identifier / 2,F6 / nil / | / condition-class-identifier / 2,F6 / nil / | |||
| ] /, | ] /, | |||
| } /, | } /, | |||
| / install / 9:h'880c0013a115781b687474703a2f2f6578616d706c652e | / install / 9:h'880c0013a115781b687474703a2f2f6578616d706c652e | |||
| 636f6d2f66696c652e62696e15f603f6' / [ | 636f6d2f66696c652e62696e15f603f6' / [ | |||
| / directive-set-component-index / 12,0 , | / directive-set-component-index / 12,0 , | |||
| / directive-set-parameters / 19,{ | / directive-set-parameters / 19,{ | |||
| skipping to change at page 78, line 23 ¶ | skipping to change at page 83, line 5 ¶ | |||
| / directive-fetch / 21,F6 / nil / , | / directive-fetch / 21,F6 / nil / , | |||
| / condition-image-match / 3,F6 / nil / | / condition-image-match / 3,F6 / nil / | |||
| ] /, | ] /, | |||
| / validate / 10:h'840c0003f6' / [ | / validate / 10:h'840c0003f6' / [ | |||
| / directive-set-component-index / 12,0 , | / directive-set-component-index / 12,0 , | |||
| / condition-image-match / 3,F6 / nil / | / condition-image-match / 3,F6 / nil / | |||
| ] /, | ] /, | |||
| / load / 11:h'880c0113a21301160016f603f6' / [ | / load / 11:h'880c0113a21301160016f603f6' / [ | |||
| / directive-set-component-index / 12,1 , | / directive-set-component-index / 12,1 , | |||
| / directive-set-parameters / 19,{ | / directive-set-parameters / 19,{ | |||
| / source-component / 22:0 / [h'00'] /, | / source-component / 22:0 / [h'"00"'] /, | |||
| / compression-info / 19:1 / gzip /, | / compression-info / 19:1 / "gzip" /, | |||
| } , | } , | |||
| / directive-copy / 22,F6 / nil / , | / directive-copy / 22,F6 / nil / , | |||
| / condition-image-match / 3,F6 / nil / | / condition-image-match / 3,F6 / nil / | |||
| ] /, | ] /, | |||
| / run / 12:h'840c0117f6' / [ | / run / 12:h'840c0117f6' / [ | |||
| / directive-set-component-index / 12,1 , | / directive-set-component-index / 12,1 , | |||
| / directive-run / 23,F6 / nil / | / directive-run / 23,F6 / nil / | |||
| ] /, | ] /, | |||
| } /, | } /, | |||
| } | } | |||
| Total size of manifest without COSE authentication object: 182 | Total size of manifest without COSE authentication object: 184 | |||
| Manifest: | Manifest: | |||
| a10358b2a701010205035863a2024782814100814101045856880c0014a4 | a10358b4a701010205035865a2024782814100814101045858880c0014a4 | |||
| 0150fa6b4a53d5ad5fdfbe9de663e4d41ffe02501492af1425695e48bf42 | 0150fa6b4a53d5ad5fdfbe9de663e4d41ffe02501492af1425695e48bf42 | |||
| 9b2d51f2ab45038202582000112233445566778899aabbccddeeff012345 | 9b2d51f2ab450358248202582000112233445566778899aabbccddeeff01 | |||
| 6789abcdeffedcba98765432100e1987d001f602f6095827880c0013a115 | 23456789abcdeffedcba98765432100e1987d001f602f6095827880c0013 | |||
| 781b687474703a2f2f6578616d706c652e636f6d2f66696c652e62696e15 | a115781b687474703a2f2f6578616d706c652e636f6d2f66696c652e6269 | |||
| f603f60a45840c0003f60b4d880c0113a21301160016f603f60c45840c01 | 6e15f603f60a45840c0003f60b4d880c0113a21301160016f603f60c4584 | |||
| 17f6 | 0c0117f6 | |||
| Total size of manifest with COSE authentication object: 297 | Total size of manifest with COSE authentication object: 301 | |||
| Manifest with COSE authentication object: | Manifest with COSE authentication object: | |||
| a202587081d28443a10126a0582482025820310798d3d8276a740505d1f0 | a202587281586fd28443a10126a058248202582057bedc0076919ba83908 | |||
| 17972e281d6d26c9967a658879ae6d07e6a238a958404d48f0059918c261 | 365faf6d205e95c71268d29a94dc5e82698edd3a48225840e0a4dc500266 | |||
| bc1636b467b2b455801c4d211758a42e82a8f8fc245f21857d7c0e78f1b6 | 518742802f2364b65f983175f060c1555d3d0b186f447500ba60c66e3231 | |||
| d6a8ab1f0c9e147043066c0af53c1563070d4934faeec21bac550358b2a7 | 6741c3b642c68fed73d47542c3375c0ab72e0f4b94ec392ab398599d0358 | |||
| 01010205035863a2024782814100814101045856880c0014a40150fa6b4a | b4a701010205035865a2024782814100814101045858880c0014a40150fa | |||
| 53d5ad5fdfbe9de663e4d41ffe02501492af1425695e48bf429b2d51f2ab | 6b4a53d5ad5fdfbe9de663e4d41ffe02501492af1425695e48bf429b2d51 | |||
| 45038202582000112233445566778899aabbccddeeff0123456789abcdef | f2ab450358248202582000112233445566778899aabbccddeeff01234567 | |||
| fedcba98765432100e1987d001f602f6095827880c0013a115781b687474 | 89abcdeffedcba98765432100e1987d001f602f6095827880c0013a11578 | |||
| 703a2f2f6578616d706c652e636f6d2f66696c652e62696e15f603f60a45 | 1b687474703a2f2f6578616d706c652e636f6d2f66696c652e62696e15f6 | |||
| 840c0003f60b4d880c0113a21301160016f603f60c45840c0117f6 | 03f60a45840c0003f60b4d880c0113a21301160016f603f60c45840c0117 | |||
| f6 | ||||
| 12.6. Example 5: Compatibility Test, Download, Installation, and Secure | B.6. Example 5: Compatibility Test, Download, Installation, and Secure | |||
| Boot | Boot | |||
| Compatibility test, download, installation, and secure boot. | Compatibility test, download, installation, and secure boot. | |||
| { | { | |||
| / authentication-wrapper / 2:h'81d28443a10126a05824820258209a45659 | / authentication-wrapper / 2:h'81586fd28443a10126a0582482025820ecc | |||
| 58c6e09c92fc69feeb09081c875f113082245ba2025801fa46dc2280e58404604e6413 | 95235f2ab00b9912f8189b213b3e4ade42b792f491644e76004cd2ba87dc8584093952 | |||
| 30d610fd0a0545b9b816f09c0767edf66fc57f40393cd4423e0807b36226e843e0f57b | 6b77d63dac2e138bf074aac757c5f010e8b2cf3ae9fcbba4cafc2d0f81c9ae46bc973c | |||
| f860a3cf542655048648dea81e62e39f19e7ac96652d3de90' / [ | c0565410a1cb6bf10d2b3d0a2865392255cc4288d0337af3de837' / [ | |||
| 18([ | h'd28443a10126a0582482025820ecc95235f2ab00b9912f8189b213b3e4ad | |||
| e42b792f491644e76004cd2ba87dc85840939526b77d63dac2e138bf074aac757c5f01 | ||||
| 0e8b2cf3ae9fcbba4cafc2d0f81c9ae46bc973cc0565410a1cb6bf10d2b3d0a2865392 | ||||
| 255cc4288d0337af3de837' / 18([ | ||||
| / protected / h'a10126' / { | / protected / h'a10126' / { | |||
| / alg / 1:-7 / ES256 /, | / alg / 1:-7 / "ES256" /, | |||
| } /, | } /, | |||
| / unprotected / { | / unprotected / { | |||
| }, | }, | |||
| / payload / h'820258209a4565958c6e09c92fc69feeb09081c8 | / payload / h'82025820ecc95235f2ab00b9912f8189b213b3e4 | |||
| 75f113082245ba2025801fa46dc2280e' / [ | ade42b792f491644e76004cd2ba87dc8' / [ | |||
| / algorithm-id / 2 / sha256 /, | / algorithm-id / 2 / "sha256" /, | |||
| / digest-bytes / | / digest-bytes / | |||
| h'9a4565958c6e09c92fc69feeb09081c875f113082245ba2025801fa46dc2280e' | h'"ecc95235f2ab00b9912f8189b213b3e4ade42b792f491644e76004cd2ba87dc8"' | |||
| ] /, | ] /, | |||
| / signature / h'4604e641330d610fd0a0545b9b816f09c0767e | / signature / h'"939526b77d63dac2e138bf074aac757c5f010 | |||
| df66fc57f40393cd4423e0807b36226e843e0f57bf860a3cf542655048648dea81e62e | e8b2cf3ae9fcbba4cafc2d0f81c9ae46bc973cc0565410a1cb6bf10d2b3d0a28653922 | |||
| 39f19e7ac96652d3de90' | 55cc4288d0337af3de837"' | |||
| ]) | ]) / | |||
| ] /, | ] /, | |||
| / manifest / 3:h'a701010205035863a2024782814101814100045856880c011 | / manifest / 3:h'a701010205035865a2024782814100814101045858880c001 | |||
| 4a40150fa6b4a53d5ad5fdfbe9de663e4d41ffe02501492af1425695e48bf429b2d51f | 4a40150fa6b4a53d5ad5fdfbe9de663e4d41ffe02501492af1425695e48bf429b2d51f | |||
| 2ab45038202582000112233445566778899aabbccddeeff0123456789abcdeffedcba9 | 2ab450358248202582000112233445566778899aabbccddeeff0123456789abcdeffed | |||
| 8765432100e1987d001f602f6085823840c0013a115781b687474703a2f2f6578616d7 | cba98765432100e1987d001f602f6085823840c0113a115781b687474703a2f2f65786 | |||
| 06c652e636f6d2f66696c652e62696e094b880c0113a1160016f603f60a45840c0103f | 16d706c652e636f6d2f66696c652e62696e094b880c0013a1160116f603f60a45840c0 | |||
| 60c45840c0117f6' / { | 003f60c45840c0017f6' / { | |||
| / manifest-version / 1:1, | / manifest-version / 1:1, | |||
| / manifest-sequence-number / 2:5, | / manifest-sequence-number / 2:5, | |||
| / common / 3:h'a2024782814101814100045856880c0114a40150fa6b4a5 | / common / 3:h'a2024782814100814101045858880c0014a40150fa6b4a5 | |||
| 3d5ad5fdfbe9de663e4d41ffe02501492af1425695e48bf429b2d51f2ab45038202582 | 3d5ad5fdfbe9de663e4d41ffe02501492af1425695e48bf429b2d51f2ab45035824820 | |||
| 000112233445566778899aabbccddeeff0123456789abcdeffedcba98765432100e198 | 2582000112233445566778899aabbccddeeff0123456789abcdeffedcba98765432100 | |||
| 7d001f602f6' / { | e1987d001f602f6' / { | |||
| / components / 2:h'82814101814100' / [ | / components / 2:h'82814100814101' / [ | |||
| [h'01'] , | [h'"00"'] , | |||
| [h'00'] | [h'"01"'] | |||
| ] /, | ] /, | |||
| / common-sequence / 4:h'880c0114a40150fa6b4a53d5ad5fdfbe9d | / common-sequence / 4:h'880c0014a40150fa6b4a53d5ad5fdfbe9d | |||
| e663e4d41ffe02501492af1425695e48bf429b2d51f2ab450382025820001122334455 | e663e4d41ffe02501492af1425695e48bf429b2d51f2ab450358248202582000112233 | |||
| 66778899aabbccddeeff0123456789abcdeffedcba98765432100e1987d001f602f6' | 445566778899aabbccddeeff0123456789abcdeffedcba98765432100e1987d001f602 | |||
| / [ | f6' / [ | |||
| / directive-set-component-index / 12,1 , | / directive-set-component-index / 12,0 , | |||
| / directive-override-parameters / 20,{ | / directive-override-parameters / 20,{ | |||
| / vendor-id / | / vendor-id / | |||
| 1:h'fa6b4a53d5ad5fdfbe9de663e4d41ffe' / fa6b4a53-d5ad-5fdf- | 1:h'"fa6b4a53d5ad5fdfbe9de663e4d41ffe"' / fa6b4a53-d5ad-5fdf- | |||
| be9d-e663e4d41ffe /, | be9d-e663e4d41ffe /, | |||
| / class-id / 2:h'1492af1425695e48bf429b2d51f2ab45' | / class-id / | |||
| / 1492af14-2569-5e48-bf42-9b2d51f2ab45 /, | 2:h'"1492af1425695e48bf429b2d51f2ab45"' / | |||
| / image-digest / 3:[ | 1492af14-2569-5e48-bf42-9b2d51f2ab45 /, | |||
| / algorithm-id / 2 / sha256 /, | / image-digest / 3:h'8202582000112233445566778899a | |||
| abbccddeeff0123456789abcdeffedcba9876543210' / [ | ||||
| / algorithm-id / 2 / "sha256" /, | ||||
| / digest-bytes / | / digest-bytes / | |||
| h'00112233445566778899aabbccddeeff0123456789abcdeffedcba9876543210' | h'"00112233445566778899aabbccddeeff0123456789abcdeffedcba9876543210"' | |||
| ], | ] /, | |||
| / image-size / 14:34768, | / image-size / 14:34768, | |||
| } , | } , | |||
| / condition-vendor-identifier / 1,F6 / nil / , | / condition-vendor-identifier / 1,F6 / nil / , | |||
| / condition-class-identifier / 2,F6 / nil / | / condition-class-identifier / 2,F6 / nil / | |||
| ] /, | ] /, | |||
| } /, | } /, | |||
| / payload-fetch / 8:h'840c0013a115781b687474703a2f2f6578616d70 | / payload-fetch / 8:h'840c0113a115781b687474703a2f2f6578616d70 | |||
| 6c652e636f6d2f66696c652e62696e' / [ | 6c652e636f6d2f66696c652e62696e' / [ | |||
| / directive-set-component-index / 12,0 , | / directive-set-component-index / 12,1 , | |||
| / directive-set-parameters / 19,{ | / directive-set-parameters / 19,{ | |||
| / uri / 21:'http://example.com/file.bin', | / uri / 21:'http://example.com/file.bin', | |||
| } | } | |||
| ] /, | ] /, | |||
| / install / 9:h'880c0113a1160016f603f6' / [ | / install / 9:h'880c0013a1160116f603f6' / [ | |||
| / directive-set-component-index / 12,1 , | / directive-set-component-index / 12,0 , | |||
| / directive-set-parameters / 19,{ | / directive-set-parameters / 19,{ | |||
| / source-component / 22:0 / [h'01'] /, | / source-component / 22:1 / [h'"01"'] /, | |||
| } , | } , | |||
| / directive-copy / 22,F6 / nil / , | / directive-copy / 22,F6 / nil / , | |||
| / condition-image-match / 3,F6 / nil / | / condition-image-match / 3,F6 / nil / | |||
| ] /, | ] /, | |||
| / validate / 10:h'840c0103f6' / [ | / validate / 10:h'840c0003f6' / [ | |||
| / directive-set-component-index / 12,1 , | / directive-set-component-index / 12,0 , | |||
| / condition-image-match / 3,F6 / nil / | / condition-image-match / 3,F6 / nil / | |||
| ] /, | ] /, | |||
| / run / 12:h'840c0117f6' / [ | / run / 12:h'840c0017f6' / [ | |||
| / directive-set-component-index / 12,1 , | / directive-set-component-index / 12,0 , | |||
| / directive-run / 23,F6 / nil / | / directive-run / 23,F6 / nil / | |||
| ] /, | ] /, | |||
| } /, | } /, | |||
| } | } | |||
| Total size of manifest without COSE authentication object: 176 | Total size of manifest without COSE authentication object: 178 | |||
| Manifest: | Manifest: | |||
| a10358aca701010205035863a2024782814101814100045856880c0114a4 | a10358aea701010205035865a2024782814100814101045858880c0014a4 | |||
| 0150fa6b4a53d5ad5fdfbe9de663e4d41ffe02501492af1425695e48bf42 | 0150fa6b4a53d5ad5fdfbe9de663e4d41ffe02501492af1425695e48bf42 | |||
| 9b2d51f2ab45038202582000112233445566778899aabbccddeeff012345 | 9b2d51f2ab450358248202582000112233445566778899aabbccddeeff01 | |||
| 6789abcdeffedcba98765432100e1987d001f602f6085823840c0013a115 | 23456789abcdeffedcba98765432100e1987d001f602f6085823840c0113 | |||
| 781b687474703a2f2f6578616d706c652e636f6d2f66696c652e62696e09 | a115781b687474703a2f2f6578616d706c652e636f6d2f66696c652e6269 | |||
| 4b880c0113a1160016f603f60a45840c0103f60c45840c0117f6 | 6e094b880c0013a1160116f603f60a45840c0003f60c45840c0017f6 | |||
| Total size of manifest with COSE authentication object: 291 | Total size of manifest with COSE authentication object: 295 | |||
| Manifest with COSE authentication object: | Manifest with COSE authentication object: | |||
| a202587081d28443a10126a05824820258209a4565958c6e09c92fc69fee | a202587281586fd28443a10126a0582482025820ecc95235f2ab00b9912f | |||
| b09081c875f113082245ba2025801fa46dc2280e58404604e641330d610f | 8189b213b3e4ade42b792f491644e76004cd2ba87dc85840939526b77d63 | |||
| d0a0545b9b816f09c0767edf66fc57f40393cd4423e0807b36226e843e0f | dac2e138bf074aac757c5f010e8b2cf3ae9fcbba4cafc2d0f81c9ae46bc9 | |||
| 57bf860a3cf542655048648dea81e62e39f19e7ac96652d3de900358aca7 | 73cc0565410a1cb6bf10d2b3d0a2865392255cc4288d0337af3de8370358 | |||
| 01010205035863a2024782814101814100045856880c0114a40150fa6b4a | aea701010205035865a2024782814100814101045858880c0014a40150fa | |||
| 53d5ad5fdfbe9de663e4d41ffe02501492af1425695e48bf429b2d51f2ab | 6b4a53d5ad5fdfbe9de663e4d41ffe02501492af1425695e48bf429b2d51 | |||
| 45038202582000112233445566778899aabbccddeeff0123456789abcdef | f2ab450358248202582000112233445566778899aabbccddeeff01234567 | |||
| fedcba98765432100e1987d001f602f6085823840c0013a115781b687474 | 89abcdeffedcba98765432100e1987d001f602f6085823840c0113a11578 | |||
| 703a2f2f6578616d706c652e636f6d2f66696c652e62696e094b880c0113 | 1b687474703a2f2f6578616d706c652e636f6d2f66696c652e62696e094b | |||
| a1160016f603f60a45840c0103f60c45840c0117f6 | 880c0013a1160116f603f60a45840c0003f60c45840c0017f6 | |||
| 12.7. Example 6: Two Images | B.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. | |||
| { | { | |||
| / authentication-wrapper / 2:h'81d28443a10126a05824820258201d15a17 | / authentication-wrapper / 2:h'81586fd28443a10126a0582482025820732 | |||
| 13d3a4510ca392454adff987abb5425348e449618122ffa817012cc315840197a4a3a4 | 5a7d3acf130d161810c4874f275f658970b7bc5a63cda56e9920a4aaba3a3584088cb9 | |||
| 188fe1dd8baa468ae9a35ac8e5ef462017530116eadd90892c96c6ab00825fcb45edb7 | 6211bcc4cdb59cb0022cb213017b2d117bac1a5460ae92903acc196282f7888368bf0a | |||
| 57547733c14d3b637ea8a085ce7bfc782a0b2cd80d31b1294' / [ | 065756e43f53cdbeee367e9523312063e8eaad0889a7cee371859' / [ | |||
| 18([ | h'd28443a10126a05824820258207325a7d3acf130d161810c4874f275f658 | |||
| 970b7bc5a63cda56e9920a4aaba3a3584088cb96211bcc4cdb59cb0022cb213017b2d1 | ||||
| 17bac1a5460ae92903acc196282f7888368bf0a065756e43f53cdbeee367e952331206 | ||||
| 3e8eaad0889a7cee371859' / 18([ | ||||
| / protected / h'a10126' / { | / protected / h'a10126' / { | |||
| / alg / 1:-7 / ES256 /, | / alg / 1:-7 / "ES256" /, | |||
| } /, | } /, | |||
| / unprotected / { | / unprotected / { | |||
| }, | }, | |||
| / payload / h'820258201d15a1713d3a4510ca392454adff987a | / payload / h'820258207325a7d3acf130d161810c4874f275f6 | |||
| bb5425348e449618122ffa817012cc31' / [ | 58970b7bc5a63cda56e9920a4aaba3a3' / [ | |||
| / algorithm-id / 2 / sha256 /, | / algorithm-id / 2 / "sha256" /, | |||
| / digest-bytes / | / digest-bytes / | |||
| h'1d15a1713d3a4510ca392454adff987abb5425348e449618122ffa817012cc31' | h'"7325a7d3acf130d161810c4874f275f658970b7bc5a63cda56e9920a4aaba3a3"' | |||
| ] /, | ] /, | |||
| / signature / h'197a4a3a4188fe1dd8baa468ae9a35ac8e5ef4 | / signature / h'"88cb96211bcc4cdb59cb0022cb213017b2d11 | |||
| 62017530116eadd90892c96c6ab00825fcb45edb757547733c14d3b637ea8a085ce7bf | ||||
| c782a0b2cd80d31b1294' | 7bac1a5460ae92903acc196282f7888368bf0a065756e43f53cdbeee367e9523312063 | |||
| ]) | e8eaad0889a7cee371859"' | |||
| ]) / | ||||
| ] /, | ] /, | |||
| / manifest / 3:h'a501010203035899a202448181410004588f8814a20150fa6 | / manifest / 3:h'a50101020303589da20244818141000458938814a20150fa6 | |||
| b4a53d5ad5fdfbe9de663e4d41ffe02501492af1425695e48bf429b2d51f2ab450f825 | b4a53d5ad5fdfbe9de663e4d41ffe02501492af1425695e48bf429b2d51f2ab450f825 | |||
| 82e8405f614a2038202582000112233445566778899aabbccddeeff0123456789abcde | 8308405f614a20358248202582000112233445566778899aabbccddeeff0123456789a | |||
| ffedcba98765432100e1987d058308405f614a203820258200123456789abcdeffedcb | bcdeffedcba98765432100e1987d058328405f614a2035824820258200123456789abc | |||
| a987654321000112233445566778899aabbccddeeff0e1a00012c2201f602f60958538 | deffedcba987654321000112233445566778899aabbccddeeff0e1a00012c2201f602f | |||
| 60f8258248405f613a115781c687474703a2f2f6578616d706c652e636f6d2f66696c6 | 6095853860f8258248405f613a115781c687474703a2f2f6578616d706c652e636f6d2 | |||
| 5312e62696e58248405f613a115781c687474703a2f2f6578616d706c652e636f6d2f6 | f66696c65312e62696e58248405f613a115781c687474703a2f2f6578616d706c652e6 | |||
| 6696c65322e62696e15f603f60a438203f6' / { | 36f6d2f66696c65322e62696e15f603f60a438203f6' / { | |||
| / manifest-version / 1:1, | / manifest-version / 1:1, | |||
| / manifest-sequence-number / 2:3, | / manifest-sequence-number / 2:3, | |||
| / common / 3:h'a202448181410004588f8814a20150fa6b4a53d5ad5fdfb | / common / 3:h'a20244818141000458938814a20150fa6b4a53d5ad5fdfb | |||
| e9de663e4d41ffe02501492af1425695e48bf429b2d51f2ab450f82582e8405f614a20 | e9de663e4d41ffe02501492af1425695e48bf429b2d51f2ab450f8258308405f614a20 | |||
| 38202582000112233445566778899aabbccddeeff0123456789abcdeffedcba9876543 | 358248202582000112233445566778899aabbccddeeff0123456789abcdeffedcba987 | |||
| 2100e1987d058308405f614a203820258200123456789abcdeffedcba9876543210001 | 65432100e1987d058328405f614a2035824820258200123456789abcdeffedcba98765 | |||
| 12233445566778899aabbccddeeff0e1a00012c2201f602f6' / { | 4321000112233445566778899aabbccddeeff0e1a00012c2201f602f6' / { | |||
| / components / 2:h'81814100' / [ | / components / 2:h'81814100' / [ | |||
| [h'00'] | [h'"00"'] | |||
| ] /, | ] /, | |||
| / common-sequence / 4:h'8814a20150fa6b4a53d5ad5fdfbe9de663 | / common-sequence / 4:h'8814a20150fa6b4a53d5ad5fdfbe9de663 | |||
| e4d41ffe02501492af1425695e48bf429b2d51f2ab450f82582e8405f614a203820258 | e4d41ffe02501492af1425695e48bf429b2d51f2ab450f8258308405f614a203582482 | |||
| 2000112233445566778899aabbccddeeff0123456789abcdeffedcba98765432100e19 | 02582000112233445566778899aabbccddeeff0123456789abcdeffedcba9876543210 | |||
| 87d058308405f614a203820258200123456789abcdeffedcba98765432100011223344 | 0e1987d058328405f614a2035824820258200123456789abcdeffedcba987654321000 | |||
| 5566778899aabbccddeeff0e1a00012c2201f602f6' / [ | 112233445566778899aabbccddeeff0e1a00012c2201f602f6' / [ | |||
| / directive-override-parameters / 20,{ | / directive-override-parameters / 20,{ | |||
| / vendor-id / | / vendor-id / | |||
| 1:h'fa6b4a53d5ad5fdfbe9de663e4d41ffe' / fa6b4a53-d5ad-5fdf- | 1:h'"fa6b4a53d5ad5fdfbe9de663e4d41ffe"' / fa6b4a53-d5ad-5fdf- | |||
| be9d-e663e4d41ffe /, | be9d-e663e4d41ffe /, | |||
| / class-id / 2:h'1492af1425695e48bf429b2d51f2ab45' | / class-id / | |||
| / 1492af14-2569-5e48-bf42-9b2d51f2ab45 /, | 2:h'"1492af1425695e48bf429b2d51f2ab45"' / | |||
| 1492af14-2569-5e48-bf42-9b2d51f2ab45 /, | ||||
| } , | } , | |||
| / directive-try-each / 15,[ | / directive-try-each / 15,[ | |||
| h'8405f614a2038202582000112233445566778899aabbccdd | h'8405f614a20358248202582000112233445566778899aabb | |||
| eeff0123456789abcdeffedcba98765432100e1987d0' / [ | ccddeeff0123456789abcdeffedcba98765432100e1987d0' / [ | |||
| / condition-component-offset / 5,F6 / nil / , | / condition-component-offset / 5,F6 / nil / , | |||
| / directive-override-parameters / 20,{ | / directive-override-parameters / 20,{ | |||
| / image-digest / 3:[ | / image-digest / 3:h'820258200011223344556 | |||
| / algorithm-id / 2 / sha256 /, | 6778899aabbccddeeff0123456789abcdeffedcba9876543210' / [ | |||
| / algorithm-id / 2 / "sha256" /, | ||||
| / digest-bytes / | / digest-bytes / | |||
| h'00112233445566778899aabbccddeeff0123456789abcdeffedcba9876543210' | h'"00112233445566778899aabbccddeeff0123456789abcdeffedcba9876543210"' | |||
| ], | ] /, | |||
| / image-size / 14:34768, | / image-size / 14:34768, | |||
| } | } | |||
| ] / , | ] / , | |||
| h'8405f614a203820258200123456789abcdeffedcba987654 | h'8405f614a2035824820258200123456789abcdeffedcba98 | |||
| 321000112233445566778899aabbccddeeff0e1a00012c22' / [ | 7654321000112233445566778899aabbccddeeff0e1a00012c22' / [ | |||
| / condition-component-offset / 5,F6 / nil / , | / condition-component-offset / 5,F6 / nil / , | |||
| / directive-override-parameters / 20,{ | / directive-override-parameters / 20,{ | |||
| / image-digest / 3:[ | / image-digest / 3:h'820258200123456789abc | |||
| / algorithm-id / 2 / sha256 /, | deffedcba987654321000112233445566778899aabbccddeeff' / [ | |||
| / algorithm-id / 2 / "sha256" /, | ||||
| / digest-bytes / | / digest-bytes / | |||
| h'0123456789abcdeffedcba987654321000112233445566778899aabbccddeeff' | h'"0123456789abcdeffedcba987654321000112233445566778899aabbccddeeff"' | |||
| ], | ] /, | |||
| / image-size / 14:76834, | / image-size / 14:76834, | |||
| } | } | |||
| ] / | ] / | |||
| ] , | ] , | |||
| / condition-vendor-identifier / 1,F6 / nil / , | / condition-vendor-identifier / 1,F6 / nil / , | |||
| / condition-class-identifier / 2,F6 / nil / | / condition-class-identifier / 2,F6 / nil / | |||
| ] /, | ] /, | |||
| } /, | } /, | |||
| / install / 9:h'860f8258248405f613a115781c687474703a2f2f657861 | / install / 9:h'860f8258248405f613a115781c687474703a2f2f657861 | |||
| 6d706c652e636f6d2f66696c65312e62696e58248405f613a115781c687474703a2f2f | 6d706c652e636f6d2f66696c65312e62696e58248405f613a115781c687474703a2f2f | |||
| skipping to change at page 84, line 4 ¶ | skipping to change at page 88, line 49 ¶ | |||
| / uri / 21:'http://example.com/file2.bin', | / uri / 21:'http://example.com/file2.bin', | |||
| } | } | |||
| ] / | ] / | |||
| ] , | ] , | |||
| / directive-fetch / 21,F6 / nil / , | / directive-fetch / 21,F6 / nil / , | |||
| / condition-image-match / 3,F6 / nil / | / condition-image-match / 3,F6 / nil / | |||
| ] /, | ] /, | |||
| / validate / 10:h'8203f6' / [ | / validate / 10:h'8203f6' / [ | |||
| / condition-image-match / 3,F6 / nil / | / condition-image-match / 3,F6 / nil / | |||
| ] /, | ] /, | |||
| } /, | } /, | |||
| } | } | |||
| Total size of manifest without COSE authentication object: 256 | Total size of manifest without COSE authentication object: 261 | |||
| Manifest: | Manifest: | |||
| a10358fca501010203035899a202448181410004588f8814a20150fa6b4a | a103590100a50101020303589da20244818141000458938814a20150fa6b | |||
| 53d5ad5fdfbe9de663e4d41ffe02501492af1425695e48bf429b2d51f2ab | 4a53d5ad5fdfbe9de663e4d41ffe02501492af1425695e48bf429b2d51f2 | |||
| 450f82582e8405f614a2038202582000112233445566778899aabbccddee | ab450f8258308405f614a20358248202582000112233445566778899aabb | |||
| ff0123456789abcdeffedcba98765432100e1987d058308405f614a20382 | ccddeeff0123456789abcdeffedcba98765432100e1987d058328405f614 | |||
| 0258200123456789abcdeffedcba987654321000112233445566778899aa | a2035824820258200123456789abcdeffedcba9876543210001122334455 | |||
| bbccddeeff0e1a00012c2201f602f6095853860f8258248405f613a11578 | 66778899aabbccddeeff0e1a00012c2201f602f6095853860f8258248405 | |||
| 1c687474703a2f2f6578616d706c652e636f6d2f66696c65312e62696e58 | f613a115781c687474703a2f2f6578616d706c652e636f6d2f66696c6531 | |||
| 248405f613a115781c687474703a2f2f6578616d706c652e636f6d2f6669 | 2e62696e58248405f613a115781c687474703a2f2f6578616d706c652e63 | |||
| 6c65322e62696e15f603f60a438203f6 | 6f6d2f66696c65322e62696e15f603f60a438203f6 | |||
| Total size of manifest with COSE authentication object: 371 | Total size of manifest with COSE authentication object: 378 | |||
| Manifest with COSE authentication object: | Manifest with COSE authentication object: | |||
| a202587081d28443a10126a05824820258201d15a1713d3a4510ca392454 | a202587281586fd28443a10126a05824820258207325a7d3acf130d16181 | |||
| adff987abb5425348e449618122ffa817012cc315840197a4a3a4188fe1d | 0c4874f275f658970b7bc5a63cda56e9920a4aaba3a3584088cb96211bcc | |||
| d8baa468ae9a35ac8e5ef462017530116eadd90892c96c6ab00825fcb45e | 4cdb59cb0022cb213017b2d117bac1a5460ae92903acc196282f7888368b | |||
| db757547733c14d3b637ea8a085ce7bfc782a0b2cd80d31b12940358fca5 | f0a065756e43f53cdbeee367e9523312063e8eaad0889a7cee3718590359 | |||
| 01010203035899a202448181410004588f8814a20150fa6b4a53d5ad5fdf | 0100a50101020303589da20244818141000458938814a20150fa6b4a53d5 | |||
| be9de663e4d41ffe02501492af1425695e48bf429b2d51f2ab450f82582e | ad5fdfbe9de663e4d41ffe02501492af1425695e48bf429b2d51f2ab450f | |||
| 8405f614a2038202582000112233445566778899aabbccddeeff01234567 | 8258308405f614a20358248202582000112233445566778899aabbccddee | |||
| 89abcdeffedcba98765432100e1987d058308405f614a203820258200123 | ff0123456789abcdeffedcba98765432100e1987d058328405f614a20358 | |||
| 456789abcdeffedcba987654321000112233445566778899aabbccddeeff | 24820258200123456789abcdeffedcba9876543210001122334455667788 | |||
| 0e1a00012c2201f602f6095853860f8258248405f613a115781c68747470 | 99aabbccddeeff0e1a00012c2201f602f6095853860f8258248405f613a1 | |||
| 3a2f2f6578616d706c652e636f6d2f66696c65312e62696e58248405f613 | 15781c687474703a2f2f6578616d706c652e636f6d2f66696c65312e6269 | |||
| a115781c687474703a2f2f6578616d706c652e636f6d2f66696c65322e62 | 6e58248405f613a115781c687474703a2f2f6578616d706c652e636f6d2f | |||
| 696e15f603f60a438203f6 | 66696c65322e62696e15f603f60a438203f6 | |||
| 13. IANA Considerations | ||||
| IANA is requested to setup a registry group for SUIT elements. | ||||
| Within this group, IANA is requested to setup registries for SUIT | ||||
| keys: | ||||
| - SUIT Envelope Elements | ||||
| - SUIT Manifest Elements | ||||
| - SUIT Common Elements | ||||
| - SUIT Commands | ||||
| - SUIT Parameters | ||||
| - SUIT Text Values | ||||
| - SUIT Algorithm Identifiers | ||||
| For each registry, values 0-23 are Standards Action, 24-255 are IETF | ||||
| Review, 256-65535 are Expert Review, and 65536 or greater are First | ||||
| Come First Served. | ||||
| Negative values -23 to 0 are Experimental Use, -24 and lower are | ||||
| Private Use. | ||||
| 14. Security Considerations | ||||
| This document is about a manifest format describing and protecting | ||||
| firmware images and as such it is part of a larger solution for | ||||
| offering a standardized way of delivering firmware updates to IoT | ||||
| devices. A more detailed discussion about security can be found in | ||||
| the architecture document [I-D.ietf-suit-architecture] and in | ||||
| [I-D.ietf-suit-information-model]. | ||||
| 15. Mailing List Information | ||||
| The discussion list for this document is located at the e-mail | ||||
| address suit@ietf.org [1]. Information on the group and information | ||||
| on how to subscribe to the list is at | ||||
| https://www1.ietf.org/mailman/listinfo/suit [2] | ||||
| Archives of the list can be found at: https://www.ietf.org/mail- | ||||
| archive/web/suit/current/index.html [3] | ||||
| 16. Acknowledgements | ||||
| We would like to thank the following persons for their support in | ||||
| designing this mechanism: | ||||
| - Milosch Meriac | ||||
| - Geraint Luff | ||||
| - Dan Ros | ||||
| - John-Paul Stanford | ||||
| - Hugo Vincent | ||||
| - Carsten Bormann | ||||
| - Oeyvind Roenningstad | ||||
| - Frank Audun Kvamtroe | ||||
| - Krzysztof Chruściński | ||||
| - Andrzej Puzdrowski | ||||
| - Michael Richardson | C. Design Rational | |||
| - David Brown | In order to provide flexible behavior to constrained devices, while | |||
| still allowing more powerful devices to use their full capabilities, | ||||
| the SUIT manifest encodes the required behavior of a Recipient | ||||
| device. Behavior is encoded as a specialized byte code, contained in | ||||
| a CBOR list. This promotes a flat encoding, which simplifies the | ||||
| parser. The information encoded by this byte code closely matches | ||||
| the operations that a device will perform, which promotes ease of | ||||
| processing. The core operations used by most update and trusted | ||||
| execution operations are represented in the byte code. The byte code | ||||
| can be extended by registering new operations. | ||||
| - Emmanuel Baccelli | The specialized byte code approach gives benefits equivalent to those | |||
| provided by a scripting language or conventional byte code, with two | ||||
| substantial differences. First, the language is extremely high | ||||
| level, consisting of only the operations that a device may perform | ||||
| during update and trusted execution of a firmware image. Second, the | ||||
| language specifies linear behavior, without reverse branches. | ||||
| Conditional processing is supported, and parallel and out-of-order | ||||
| processing may be performed by sufficiently capable devices. | ||||
| 17. References | By structuring the data in this way, the manifest processor becomes a | |||
| very simple engine that uses a pull parser to interpret the manifest. | ||||
| This pull parser invokes a series of command handlers that evaluate a | ||||
| Condition or execute a Directive. Most data is structured in a | ||||
| highly regular pattern, which simplifies the parser. | ||||
| 17.1. Normative References | The results of this allow a Recipient to implement a very small | |||
| parser for constrained applications. If needed, such a parser also | ||||
| allows the Recipient to perform complex updates with reduced | ||||
| overhead. Conditional execution of commands allows a simple device | ||||
| to perform important decisions at validation-time. | ||||
| [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | Dependency handling is vastly simplified as well. Dependencies | |||
| Requirement Levels", BCP 14, RFC 2119, | function like subroutines of the language. When a manifest has a | |||
| DOI 10.17487/RFC2119, March 1997, | dependency, it can invoke that dependency's commands and modify their | |||
| <https://www.rfc-editor.org/info/rfc2119>. | behavior by setting parameters. Because some parameters come with | |||
| security implications, the dependencies also have a mechanism to | ||||
| reject modifications to parameters on a fine-grained level. | ||||
| [RFC4122] Leach, P., Mealling, M., and R. Salz, "A Universally | Developing a robust permissions system works in this model too. The | |||
| Unique IDentifier (UUID) URN Namespace", RFC 4122, | Recipient can use a simple ACL that is a table of Identities and | |||
| DOI 10.17487/RFC4122, July 2005, | Component Identifier permissions to ensure that operations on | |||
| <https://www.rfc-editor.org/info/rfc4122>. | components fail unless they are permitted by the ACL. This table can | |||
| be further refined with individual parameters and commands. | ||||
| [RFC8152] Schaad, J., "CBOR Object Signing and Encryption (COSE)", | Capability reporting is similarly simplified. A Recipient can report | |||
| RFC 8152, DOI 10.17487/RFC8152, July 2017, | the Commands, Parameters, Algorithms, and Component Identifiers that | |||
| <https://www.rfc-editor.org/info/rfc8152>. | it supports. This is sufficiently precise for a manifest author to | |||
| create a manifest that the Recipient can accept. | ||||
| [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC | The simplicity of design in the Recipient due to all of these | |||
| 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, | benefits allows even a highly constrained platform to use advanced | |||
| May 2017, <https://www.rfc-editor.org/info/rfc8174>. | update capabilities. | |||
| 17.2. Informative References | D. Implementation Confirmance Matrix | |||
| [I-D.ietf-suit-architecture] | This section summarizes the functionality a minimal implementation | |||
| Moran, B., Tschofenig, H., Brown, D., and M. Meriac, "A | needs to offer to claim conformance to this specification. | |||
| Firmware Update Architecture for Internet of Things", | ||||
| draft-ietf-suit-architecture-08 (work in progress), | ||||
| November 2019. | ||||
| [I-D.ietf-suit-information-model] | The subsequent table shows the conditions. | |||
| Moran, B., Tschofenig, H., and H. Birkholz, "An | ||||
| Information Model for Firmware Updates in IoT Devices", | ||||
| draft-ietf-suit-information-model-05 (work in progress), | ||||
| January 2020. | ||||
| 17.3. URIs | +-------------------+------------------+----------------+ | |||
| | Name | Reference | Implementation | | ||||
| +-------------------+------------------+----------------+ | ||||
| | Vendor Identifier | Section 9.12.1.1 | REQUIRED | | ||||
| | | | | | ||||
| | Class Identifier | Section 9.12.1.1 | REQUIRED | | ||||
| | | | | | ||||
| | Device Identifier | Section 9.12.1.1 | OPTIONAL | | ||||
| | | | | | ||||
| | Image Match | Section 9.12.1.2 | REQUIRED | | ||||
| | | | | | ||||
| | Image Not Match | Section 9.12.1.3 | OPTIONAL | | ||||
| | | | | | ||||
| | Use Before | Section 9.12.1.4 | OPTIONAL | | ||||
| | | | | | ||||
| | Component Offset | Section 9.12.1.5 | OPTIONAL | | ||||
| | | | | | ||||
| | Minimum Battery | Section 9.12.1.6 | OPTIONAL | | ||||
| | | | | | ||||
| | Update Authorized | Section 9.12.1.7 | OPTIONAL | | ||||
| | | | | | ||||
| | Version | Section 9.12.1.8 | OPTIONAL | | ||||
| | | | | | ||||
| | Custom Condition | Section 9.12.1.9 | OPTIONAL | | ||||
| +-------------------+------------------+----------------+ | ||||
| [1] mailto:suit@ietf.org | The subsequent table shows the directives. | |||
| [2] https://www1.ietf.org/mailman/listinfo/suit | +-------------------+---------------+-------------------------------+ | |||
| | Name | Reference | Implementation | | ||||
| +-------------------+---------------+-------------------------------+ | ||||
| | Set Component | Section | REQUIRED if more than one | | ||||
| | Index | 9.12.3 | component | | ||||
| | | | | | ||||
| | Set Dependency | Section | REQUIRED if dependencies used | | ||||
| | Index | 9.12.4 | | | ||||
| | | | | | ||||
| | Abort | Section | OPTIONAL | | ||||
| | | 9.12.5 | | | ||||
| | | | | | ||||
| | Try Each | Section | OPTIONAL | | ||||
| | | 9.12.6 | | | ||||
| | | | | | ||||
| | Process | Section | OPTIONAL | | ||||
| | Dependency | 9.12.7 | | | ||||
| | | | | | ||||
| | Set Parameters | Section | OPTIONAL | | ||||
| | | 9.12.8 | | | ||||
| | | | | | ||||
| | Override | Section | REQUIRED | | ||||
| | Parameters | 9.12.9 | | | ||||
| | | | | | ||||
| | Fetch | Section | REQUIRED for Updater | | ||||
| | | 9.12.10 | | | ||||
| | | | | | ||||
| | Copy | Section | OPTIONAL | | ||||
| | | 9.12.11 | | | ||||
| | | | | | ||||
| | Run | Section | REQUIRED for Bootloader | | ||||
| | | 9.12.12 | | | ||||
| | | | | | ||||
| | Wait For Event | Section | OPTIONAL | | ||||
| | | 9.12.13 | | | ||||
| | | | | | ||||
| | Run Sequence | Section | OPTIONAL | | ||||
| | | 9.12.14 | | | ||||
| | | | | | ||||
| | Swap | Section | OPTIONAL | | ||||
| | | 9.12.15 | | | ||||
| +-------------------+---------------+-------------------------------+ | ||||
| [3] https://www.ietf.org/mail-archive/web/suit/current/index.html | TThe subsequent table shows the parameters | |||
| +------------------+-----------------+----------------+ | ||||
| | Name | Reference | Implementation | | ||||
| +------------------+-----------------+----------------+ | ||||
| | Vendor ID | Section 9.11.1 | TBD | | ||||
| | | | | | ||||
| | Class ID | Section 9.11.2 | TBD | | ||||
| | | | | | ||||
| | Image Digest | Section 9.11.3 | TBD | | ||||
| | | | | | ||||
| | Image Size | Section 9.11.4 | TBD | | ||||
| | | | | | ||||
| | Use Before | Section 9.11.5 | TBD | | ||||
| | | | | | ||||
| | Component Offset | Section 9.11.6 | TBD | | ||||
| | | | | | ||||
| | Encryption Info | Section 9.11.7 | TBD | | ||||
| | | | | | ||||
| | Compression Info | Section 9.11.8 | TBD | | ||||
| | | | | | ||||
| | Unpack Info | Section 9.11.9 | TBD | | ||||
| | | | | | ||||
| | URI | Section 9.11.10 | TBD | | ||||
| | | | | | ||||
| | Source Component | Section 9.11.11 | TBD | | ||||
| | | | | | ||||
| | Run Args | Section 9.11.12 | TBD | | ||||
| | | | | | ||||
| | Device ID | Section 9.11.13 | TBD | | ||||
| | | | | | ||||
| | Minimum Battery | Section 9.11.14 | TBD | | ||||
| | | | | | ||||
| | Update Priority | Section 9.11.15 | TBD | | ||||
| | | | | | ||||
| | Version | Section 9.11.16 | TBD | | ||||
| | | | | | ||||
| | Wait Info | Section 9.11.17 | TBD | | ||||
| | | | | | ||||
| | URI List | Section 9.11.18 | TBD | | ||||
| | | | | | ||||
| | Strict Order | Section 9.11.19 | TBD | | ||||
| | | | | | ||||
| | Soft Failure | Section 9.11.20 | TBD | | ||||
| | | | | | ||||
| | Custom | Section 9.11.21 | TBD | | ||||
| +------------------+-----------------+----------------+ | ||||
| Authors' Addresses | Authors' Addresses | |||
| Brendan Moran | Brendan Moran | |||
| Arm Limited | Arm Limited | |||
| EMail: Brendan.Moran@arm.com | EMail: Brendan.Moran@arm.com | |||
| Hannes Tschofenig | Hannes Tschofenig | |||
| Arm Limited | Arm Limited | |||
| End of changes. 386 change blocks. | ||||
| 1712 lines changed or deleted | 1969 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/ | ||||