Mandatory-to-Implement Algorithms for Authors and Recipients of Software Update for the Internet of Things manifests
Brendan Moran
Arm Limited
brendan.moran.ietf@gmail.com
Øyvind Rønningstad
Nordic Semiconductor
oyvind.ronningstad@gmail.com
Akira Tsukamoto
ALAXALA Networks Corp.
akira.tsukamoto@alaxala.com
21 October 2024
Security
SUIT
Internet-Draft
This document specifies algorithm profiles for SUIT manifest parsers and authors to ensure better interoperability. These profiles apply specifically to a constrained node software update use case.
Introduction
Mandatory algorithms may change over time due to an evolving threat landscape. Algorithms are grouped into algorithm profiles to account for this. Profiles may be deprecated over time. SUIT will define five choices of MTI profile specifically for constrained node software update. These profiles are:
- One Symmetric MTI profile
- Two "Current" Constrained Asymmetric MTI profiles
- Two "Current" AEAD Asymmetric MTI profiles
- One "Future" Constrained Asymmetric MTI profile
At least one MTI algorithm in each category MUST be FIPS qualified.
Because SUIT presents an asymmetric communication profile, with powerful/complex manifest authors and constrained manifest recipients, the requirements for Recipients and Authors are different.
Recipients MAY choose which MTI profile they wish to implement. It is RECOMMENDED that they implement the "Future" Asymmetric MTI profile. Recipients MAY implement any number of other profiles. Recipients MAY choose not to implement an encryption algorithm if encrypted payloads will never be used.
Authors MUST implement all MTI profiles. Authors MAY implement any number of other profiles.
AEAD is preferred over un-authenticated encryption. Where possible an AEAD profile SHOULD be selected. Certain constrained IoT applications require streaming decryption, which necessitates a non-AEAD ecryption algorithm. If the application is not a constrained device, the two AEAD profiles are RECOMMENDED.
Other use-cases of SUIT MAY define their own MTI algorithms.
Algorithms
The algorithms that form a part of the profiles defined in this document are grouped into:
- Digest Algorithms
- Authentication Algorithms
- Key Exchange Algorithms (OPTIONAL)
- Encryption Algorithms (OPTIONAL)
Profiles
Recognized profiles are defined below.
Symmetric MTI profile: suit-sha256-hmac-a128kw-a128ctr
Algorithm Type | Algorithm | COSE Key
Digest | SHA-256 | -16
Authentication | HMAC-256 | 5
Key Exchange | A128KW Key Wrap | -3
Encryption | A128CTR | -65534
Current Constrained Asymmetric MTI Profile 1: suit-sha256-es256-ecdh-a128ctr
Algorithm Type | Algorithm | COSE Key
Digest | SHA-256 | -16
Authentication | ES256 | -7
Key Exchange | ECDH-ES + A128KW | -29
Encryption | A128CTR | -65534
Current Constrained Asymmetric MTI Profile 2: suit-sha256-eddsa-ecdh-a128ctr
Algorithm Type | Algorithm | COSE Key
Digest | SHA-256 | -16
Authentication | EDDSA | -8
Key Exchange | ECDH-ES + A128KW | -29
Encryption | A128CTR | -65534
Current AEAD Asymmetric MTI Profile 1: suit-sha256-es256-ecdh-a128gcm
Algorithm Type | Algorithm | COSE Key
Digest | SHA-256 | -16
Authentication | ES256 | -7
Key Exchange | ECDH-ES + A128KW | -29
Encryption | A128GCM | 1
Current AEAD Asymmetric MTI Profile 2: suit-sha256-eddsa-ecdh-chacha-poly
Algorithm Type | Algorithm | COSE Key
Digest | SHA-256 | -16
Authentication | EDDSA | -8
Key Exchange | ECDH-ES + A128KW | -29
Encryption | ChaCha20/Poly1305 | 24
Future Constrained Asymmetric MTI Profile 1: suit-sha256-hsslms-a256kw-a256ctr
Algorithm Type | Algorithm | COSE Key
Digest | SHA-256 | -16
Authentication | HSS-LMS | -46
Key Exchange | A256KW | -5
Encryption | A256CTR | -65532
This draft does not specify a particular set of HSS-LMS parameters. Deep trees are RECOMMENDED due to key lifetimes in IoT devices.
Reporting Profiles
When using reverse-direction communication, particularly data structures that are designed for reporting of update capabilities, status, progress, or success, the same profile as the is used on the SUIT manifest SHOULD be used. There are cases where this is not possible, such as suit-sha256-hsslms-a256kw-a256ctr. In this case, the closest equivalent profile SHOULD be used, for example suit-sha256-es256-ecdh-a128ctr.
Security Considerations
For the avoidance of doubt, there are scenarios where payload or manifest encryption are not required. In these scenarios, the encryption element of the selected profile is simply not used.
AES-CTR mode is specified, see [RFC9459]. All of the AES-CTR security considerations in [RFC9459] apply. A non-AEAD encryption mode is specified in this draft due to the following mitigating circumstances:
- Streaming decryption must be supported. Therefore, there is no difference between AEAD and plaintext hash verification.
- Out-of-order decryption must be supported. Therefore, we must use a stream cipher that supports random access.
- There are no chosen plaintext attacks: the plaintext is authenticated prior to encryption.
- Content Encryption Keys must be used to encrypt only once. See [I-D.ietf-suit-firmware-encryption].
As a result of these mitigating circumstances, AES-CTR is the most appropriate cipher for typical software/firmware delivery scenarios.
IANA Considerations
IANA is requested to create a page for COSE Algorithm Profiles within the category for Software Update for the Internet of Things (SUIT)
IANA is also requested to create a registry for COSE Alforithm Profiles within this page. The initial content of the registry is:
Profile | Status | Digest | Auth | Key Exchange | Encryption | Descriptor Array | Reference
suit-sha256-hmac-a128kw-a128ctr | MANDATORY | -16 | 5 | -3 | -65534 | [-16, 5, -3, -65534] | Section 3.1
suit-sha256-es256-ecdh-a128ctr | MANDATORY | -16 | -7 | -29 | -65534 | [-16, -7, -29, -65534] | Section 3.2
suit-sha256-eddsa-ecdh-a128ctr | MANDATORY | -16 | -8 | -29 | -65534 | [-16, -8, -29, -65534] | Section 3.3
suit-sha256-es256-ecdh-a128gcm | MANDATORY | -16 | -7 | -29 | 1 | [-16, -7, -29, 1] | Section 3.4
suit-sha256-eddsa-ecdh-chacha-poly | MANDATORY | -16 | -8 | -29 | 24 | [-16, -8, -29, 24] | Section 3.5
suit-sha256-hsslms-a256kw-a256ctr | MANDATORY | -16 | -46 | -5 | -65532 | [-16, -46, -5, -65532] | Section 3.6
New entries to this registry require standards action.

Normative References
[RFC8152]

CBOR Object Signing and Encryption (COSE)
J. Schaad
July 2017
RFC 8152
DOI 10.17487/RFC8152
[RFC8778]

Use of the HSS/LMS Hash-Based Signature Algorithm with CBOR Object Signing and Encryption (COSE)
R. Housley
April 2020
RFC 8778
DOI 10.17487/RFC8778
[RFC9052]

CBOR Object Signing and Encryption (COSE): Structures and Process
J. Schaad
August 2022
STD 96
RFC 9052
DOI 10.17487/RFC9052
[RFC9459]

CBOR Object Signing and Encryption (COSE): AES-CTR and AES-CBC
R. Housley
H. Tschofenig
September 2023
RFC 9459
DOI 10.17487/RFC9459
[I-D.ietf-suit-manifest]

A Concise Binary Object Representation (CBOR)-based Serialization Format for the Software Updates for Internet of Things (SUIT) Manifest
Brendan Moran
Arm Limited
Hannes Tschofenig
Henk Birkholz
Fraunhofer SIT
Koen Zandberg
Inria
Øyvind Rønningstad
Nordic Semiconductor
21 October 2024
Internet-Draft draft-ietf-suit-manifest-28

Informative References
[I-D.ietf-suit-firmware-encryption]

Encrypted Payloads in SUIT Manifests
Hannes Tschofenig
University of Applied Sciences Bonn-Rhein-Sieg
Russ Housley
Vigil Security, LLC
Brendan Moran
Arm Limited
David Brown
Linaro
Ken Takayama
SECOM CO., LTD.
21 October 2024
Internet-Draft draft-ietf-suit-firmware-encryption-21
[IANA-COSE]

CBOR Object Signing and Encryption (COSE)
2022
A. Full CDDL
The following CDDL creates a subset of COSE for use with SUIT. Both tagged and untagged messages are defined. SUIT only uses tagged COSE messages, but untagged messages are also defined for use in protocols that share a ciphersuite with SUIT.
To be valid, the following CDDL MUST have the COSE CDDL appended to it. The COSE CDDL can be obtained by following the directions in [RFC9052], Section 1.4.

SUIT_COSE_tool_tweak /= suit-sha256-hmac-a128kw-a128ctr
SUIT_COSE_tool_tweak /= suit-sha256-es256-ecdh-a128ctr
SUIT_COSE_tool_tweak /= suit-sha256-eddsa-ecdh-a128ctr
SUIT_COSE_tool_tweak /= suit-sha256-es256-ecdh-a128gcm
SUIT_COSE_tool_tweak /= suit-sha256-eddsa-ecdh-chacha-poly
SUIT_COSE_tool_tweak /= suit-sha256-hsslms-a256kw-a256ctr
SUIT_COSE_tool_tweak /= SUIT_COSE_Profiles

SUIT_COSE_Profiles /= SUIT_COSE_Profile_HMAC_A128KW_A128CTR
SUIT_COSE_Profiles /= SUIT_COSE_Profile_ES256_ECDH_A128CTR
SUIT_COSE_Profiles /= SUIT_COSE_Profile_EDDSA_ECDH_A128CTR
SUIT_COSE_Profiles /= SUIT_COSE_Profile_ES256_ECDH_A128GCM
SUIT_COSE_Profiles /= SUIT_COSE_Profile_EDDSA_ECDH_CHACHA20_POLY1304
SUIT_COSE_Profiles /= SUIT_COSE_Profile_HSSLMS_A256KW_A256CTR

suit-sha256-hmac-a128kw-a128ctr    = [-16, 5, -3, -65534]
suit-sha256-es256-ecdh-a128ctr     = [-16, -7, -29, -65534]
suit-sha256-eddsa-ecdh-a128ctr     = [-16, -8, -29, -65534]
suit-sha256-es256-ecdh-a128gcm     = [-16, -7, -29, 1]
suit-sha256-eddsa-ecdh-chacha-poly = [-16, -8, -29, 24]
suit-sha256-hsslms-a256kw-a256ctr  = [-16, -46, -5, -65532]

SUIT_COSE_Profile_HMAC_A128KW_A128CTR = SUIT_COSE_Profile<5, -65534> .and COSE_Messages
SUIT_COSE_Profile_ES256_ECDH_A128CTR = SUIT_COSE_Profile<-7,-65534> .and COSE_Messages
SUIT_COSE_Profile_EDDSA_ECDH_A128CTR = SUIT_COSE_Profile<-8,-65534> .and COSE_Messages
SUIT_COSE_Profile_ES256_ECDH_A128GCM = SUIT_COSE_Profile<-7,1> .and COSE_Messages
SUIT_COSE_Profile_EDDSA_ECDH_CHACHA20_POLY1304 = SUIT_COSE_Profile<-8,24> .and COSE_Messages
SUIT_COSE_Profile_HSSLMS_A256KW_A256CTR = SUIT_COSE_Profile<-46,-65532> .and COSE_Messages

SUIT_COSE_Profile<authid, encid> = SUIT_COSE_Messages<authid,encid>

SUIT_COSE_Messages<authid, encid> = SUIT_COSE_Untagged_Message<authid, encid> /
    SUIT_COSE_Tagged_Message<authid, encid>

SUIT_COSE_Untagged_Message<authid, encid> = SUIT_COSE_Sign<authid> /
    SUIT_COSE_Sign1<authid> / SUIT_COSE_Encrypt<encid> /
    SUIT_COSE_Encrypt0<encid> / SUIT_COSE_Mac<authid> /
    SUIT_COSE_Mac0<authid>

SUIT_COSE_Tagged_Message<authid, encid> = SUIT_COSE_Sign_Tagged<authid> /
    SUIT_COSE_Sign1_Tagged<authid> / SUIT_COSE_Encrypt_Tagged<encid> /
    SUIT_COSE_Encrypt0_Tagged<encid> / SUIT_COSE_Mac_Tagged<authid> /
    SUIT_COSE_Mac0_Tagged<authid>

; Note: This is not the same definition as is used in COSE.
; It restricts a COSE header definition further without
; repeating the COSE definition. It should be merged
; with COSE by using the CDDL .and operator.
SUIT_COSE_Profile_Headers<algid> = (
    protected : bstr .cbor SUIT_COSE_alg_map<algid>,
    unprotected : SUIT_COSE_header_map
)
SUIT_COSE_alg_map<algid> = {
    1 => algid,
    * int => any
}

SUIT_COSE_header_map = {
    * int => any
}

SUIT_COSE_Sign_Tagged<authid> = #6.98(SUIT_COSE_Sign<authid>)

SUIT_COSE_Sign<authid> = [
    SUIT_COSE_Profile_Headers<authid>,
    payload : bstr / nil,
    signatures : [+ SUIT_COSE_Signature<authid>]
]

SUIT_COSE_Signature<authid> =  [
    SUIT_COSE_Profile_Headers<authid>,
    signature : bstr
]

SUIT_COSE_Sign1_Tagged<authid> = #6.18(SUIT_COSE_Sign1<authid>)

SUIT_COSE_Sign1<authid> = [
    SUIT_COSE_Profile_Headers<authid>,
    payload : bstr / nil,
    signature : bstr
]

SUIT_COSE_Encrypt_Tagged<encid> = #6.96(SUIT_COSE_Encrypt<encid>)

SUIT_COSE_Encrypt<encid> = [
    SUIT_COSE_Profile_Headers<encid>,
    ciphertext : bstr / nil,
    recipients : [+SUIT_COSE_recipient<encid>]
]

SUIT_COSE_recipient<encid> = [
    SUIT_COSE_Profile_Headers<encid>,
    ciphertext : bstr / nil,
    ? recipients : [+SUIT_COSE_recipient<encid>]
]

SUIT_COSE_Encrypt0_Tagged<encid> = #6.16(SUIT_COSE_Encrypt0<encid>)

SUIT_COSE_Encrypt0<encid> = [
    SUIT_COSE_Profile_Headers<encid>,
    ciphertext : bstr / nil,
]

SUIT_COSE_Mac_Tagged<authid> = #6.97(SUIT_COSE_Mac<authid>)

SUIT_COSE_Mac<authid> = [
   SUIT_COSE_Profile_Headers<authid>,
   payload : bstr / nil,
   tag : bstr,
   recipients :[+SUIT_COSE_recipient<authid>]
]

SUIT_COSE_Mac0_Tagged<authid> = #6.17(SUIT_COSE_Mac0<authid>)

SUIT_COSE_Mac0<authid> = [
   SUIT_COSE_Profile_Headers<authid>,
   payload : bstr / nil,
   tag : bstr,
]