RFC 9323

A Profile for RPKI Signed Checklists (RSCs)

πŸ“… published November 2022, from ietf

RFC 9323 ✨ A Profile for RPKI Signed Checklists (RSCs)

okay bestie, this is RFC 9323, and it's a Standards Track doc πŸŽ€ It came out in November 2022 from the IETF, and the authors are J. Snijders (Fastly), T. Harrison (APNIC), and B. Maddison (Workonline). The header doesn't list anything it obsoletes or updates, so nothing gets replaced or amended here πŸ’…

Abstract ✨

okay so this doc defines a Cryptographic Message Syntax (CMS) protected content type for the Resource Public Key Infrastructure (RPKI) 🌸 It carries a general-purpose listing of checksums, which they call a 'checklist'. The goal is an attestation called an "RPKI Signed Checklist (RSC)", which holds one or more checksums of arbitrary digital objects (files) and gets signed with a specific set of Internet Number Resources. When you validate an RSC, it confirms that the Internet resource holder is the one who produced it πŸ”πŸ¦‹

Status of This Memo

this is an Internet Standards Track document 🧚

it's a product of the Internet Engineering Task Force (IETF), so it represents the consensus of the IETF community. It went through public review and got approved for publication by the Internet Engineering Steering Group (IESG). If you want more on Internet Standards, check Section 2 of RFC 7841 πŸ“š

for the current status, errata, and how to send feedback, go to https://www.rfc-editor.org/info/rfc9323 πŸ’œ

Copyright (c) 2022 IETF Trust and the persons identified as the document authors. All rights reserved 🌈

this doc is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (https://trustee.ietf.org/license-info) as they stood on the publication date. Please read them carefully, because they spell out your rights and restrictions 🫢

⚠️ if you pull Code Components out of this document, they have to include the Revised BSD License text described in Section 4.e of the Trust Legal Provisions. They come without warranty, as the Revised BSD License says. ⚠️

Table of Contents

1.  Introduction
  1.1.  Requirements Language
2.  RSC Profile and Distribution
  2.1.  RSC EE Certificates
3.  The RSC eContentType
4.  The RSC eContent
  4.1.  Version
  4.2.  Resources
    4.2.1.  ConstrainedASIdentifiers Type
    4.2.2.  ConstrainedIPAddrBlocks Type
  4.3.  digestAlgorithm
  4.4.  checkList
    4.4.1.  FileNameAndHash
5.  RSC Validation
6.  Verifying Files or Data Using RSC
7.  Operational Considerations
8.  Security Considerations
9.  IANA Considerations
  9.1.  SMI Security for S/MIME CMS Content Type
        (1.2.840.113549.1.9.16.1)
  9.2.  RPKI Signed Objects
  9.3.  RPKI Repository Name Schemes
  9.4.  SMI Security for S/MIME Module Identifier
        (1.2.840.113549.1.9.16.0)
  9.5.  Media Types
10. References
  10.1.  Normative References
  10.2.  Informative References
Acknowledgements
Authors' Addresses

1. Introduction πŸŽ€

this doc defines a Cryptographic Message Syntax (CMS) [RFC5652] [RFC6268] protected content type for a general-purpose listing of checksums (a 'checklist'), made for the Resource Public Key Infrastructure (RPKI) [RFC6480] 🌸 The idea is to create and validate an RPKI Signed Checklist (RSC), which is a checksum listing signed with a specific set of Internet Number Resources. The whole point is an attestation that, once validated, lets you confirm a given Internet resource holder produced the RSC ✨

RSCs are expected to make inter-domain business stuff way easier, especially anything that needs to check who holds which resources πŸ’… RPKI-based validation is also expected to become the industry norm for automated Bring Your Own IP (BYOIP) onboarding and for setting up physical interconnections between Autonomous Systems (ASes) πŸ”₯

the RSC concept borrows a lot from Resource Tagged Attestation (RTA) [RPKI-RTA], Manifests [RFC9286], and OpenBSD's signify utility [signify] πŸ¦‹ The big difference from RTA is that RTA lets multiple signers attest a single digital object through a checksum of its content, while RSC lets a single signer attest the content of multiple digital objects. Single-signer profiles are considered a simplification for both implementers and operators, which is honestly so iconic πŸ‘‘

1.1. Requirements Language

okay, here's the important bit about the capital letters πŸ™ˆ The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all capitals, as shown here πŸ’œ

2. RSC Profile and Distribution 🌈

RSC follows the Signed Object Template for the RPKI [RFC6488] with one exception πŸ’– because RSCs MUST NOT be distributed through the global RPKI repository system, the Subject Information Access (SIA) extension MUST be omitted from the RSC's X.509 End-Entity (EE) certificate. no SIA extension, no global repo, bestie πŸ™…β€β™€οΈ

what transport you use for RSC files is deliberately left unspecified 🧚 It could be a USB stick, a web interface secured with HTTPS, an email signed with Pretty Good Privacy (PGP), a T-shirt printed with a QR code, or a carrier pigeon πŸ•ŠοΈ literally whatever works πŸ’€

2.1. RSC EE Certificates

the Certification Authority (CA) MUST only sign one RSC with each EE certificate, and it MUST generate a new key pair for each new RSC πŸ” This kind of EE certificate is called a "one-time-use" EE certificate (see Section 3 of [RFC6487]). one cert, one RSC, one key pair, period ✨

3. The RSC eContentType πŸ’…

the eContentType for an RSC is id-ct-signedChecklist, with Object Identifier (OID) 1.2.840.113549.1.9.16.1.48 πŸŽ€

this OID MUST appear in both the eContentType in the encapContentInfo object and the ContentType signed attribute in the signerInfo object (see [RFC6488]). it has to show up in both spots, no exceptions 🫢

4. The RSC eContent πŸ¦‹

the content of an RSC says that a checklist for arbitrary digital objects has been signed with a specific set of Internet Number Resources. Here's the formal definition, verbatim πŸ“œ

RpkiSignedChecklist-2022
  { iso(1) member-body(2) us(840) rsadsi(113549)
    pkcs(1) pkcs9(9) smime(16) mod(0)
    id-mod-rpkiSignedChecklist-2022(73) }

DEFINITIONS EXPLICIT TAGS ::=
BEGIN

IMPORTS
  CONTENT-TYPE, Digest, DigestAlgorithmIdentifier
  FROM CryptographicMessageSyntax-2010 -- in [RFC6268]
    { iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1)
      pkcs-9(9) smime(16) modules(0) id-mod-cms-2009(58) }

  IPAddressOrRange, ASIdOrRange
  FROM IPAddrAndASCertExtn -- in [RFC3779]
    { iso(1) identified-organization(3) dod(6) internet(1)
      security(5) mechanisms(5) pkix(7) mod(0)
      id-mod-ip-addr-and-as-ident(30) } ;

ct-rpkiSignedChecklist CONTENT-TYPE ::=
  { TYPE RpkiSignedChecklist
    IDENTIFIED BY id-ct-signedChecklist }

id-ct-signedChecklist OBJECT IDENTIFIER ::=
  { iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1)
    pkcs-9(9) id-smime(16) id-ct(1) 48 }

RpkiSignedChecklist ::= SEQUENCE {
  version [0]           INTEGER DEFAULT 0,
  resources             ResourceBlock,
  digestAlgorithm       DigestAlgorithmIdentifier,
  checkList             SEQUENCE (SIZE(1..MAX)) OF FileNameAndHash }

FileNameAndHash ::= SEQUENCE {
  fileName              PortableFilename OPTIONAL,
  hash                  Digest }

PortableFilename ::=
  IA5String (FROM("a".."z" | "A".."Z" | "0".."9" | "." | "_" | "-"))

ResourceBlock ::= SEQUENCE {
  asID         [0]      ConstrainedASIdentifiers OPTIONAL,
  ipAddrBlocks [1]      ConstrainedIPAddrBlocks OPTIONAL }
  -- at least one of asID or ipAddrBlocks MUST be present
  ( WITH COMPONENTS { ..., asID PRESENT} |
    WITH COMPONENTS { ..., ipAddrBlocks PRESENT } )

ConstrainedIPAddrBlocks ::=
  SEQUENCE (SIZE(1..MAX)) OF ConstrainedIPAddressFamily

ConstrainedIPAddressFamily ::= SEQUENCE {
  addressFamily         OCTET STRING (SIZE(2)),
  addressesOrRanges     SEQUENCE (SIZE(1..MAX)) OF IPAddressOrRange }

ConstrainedASIdentifiers ::= SEQUENCE {
  asnum [0]             SEQUENCE (SIZE(1..MAX)) OF ASIdOrRange }

END

4.1. Version

the version number of the RpkiSignedChecklist MUST be 0. that's it, that's the whole vibe πŸ’–

4.2. Resources

the resources in here are the ones used to mark the attestation, and they MUST be a subset of the set of resources listed by the EE certificate carried in the CMS certificates field 🌸

if the asID field is present, it MUST contain an instance of ConstrainedASIdentifiers ✨

if the ipAddrBlocks field is present, it MUST contain an instance of ConstrainedIPAddrBlocks ✨

at least one of asID or ipAddrBlocks MUST be present πŸ’…

ConstrainedASIdentifiers and ConstrainedIPAddrBlocks are specified so that the resulting DER-encoded data instances are binary compatible with ASIdentifiers and IPAddrBlocks (defined in [RFC3779]), respectively πŸ¦‹

implementations that run into decoding errors while reading DER-encoded data using this spec should be aware of the possibility that the data was encoded by an implementation meant for [RFC3779]. Such data may contain elements the current spec prohibits πŸ™ˆ

trying to decode the errored data with the more permissive specification in [RFC3779] may help implementors gather extra context for reporting errors to the user 🧚

🚨 however, implementations MUST NOT ignore errors that come from the more restrictive definitions in this doc. Specifically, those errors MUST cause the validation procedure described in Section 5 to fail. this part is not optional, bestie πŸ’€

4.2.1. ConstrainedASIdentifiers Type

ConstrainedASIdentifiers is a SEQUENCE with a single field, asnum, which holds a SEQUENCE OF one or more ASIdOrRange instances as defined in [RFC3779] πŸŽ€

it's defined so the resulting DER-encoded data is binary compatible with ASIdentifiers defined in [RFC3779] πŸ’œ

4.2.2. ConstrainedIPAddrBlocks Type

ConstrainedIPAddrBlocks is a SEQUENCE OF one or more instances of ConstrainedIPAddressFamily 🌈

there MUST be only one instance of ConstrainedIPAddressFamily per unique Address Family Identifier (AFI) πŸ”₯

the elements of ConstrainedIPAddressFamily MUST be ordered by ascending addressFamily values, treating the octets as unsigned numbers 🫢 So when you've got both IPv4 and IPv6 addresses, the IPv4 addresses MUST precede the IPv6 addresses. this makes sense because the IPv4 AFI of 0001 is less than the IPv6 AFI of 0002 🧚

ConstrainedIPAddrBlocks is defined so the resulting DER-encoded data is binary compatible with IPAddrBlocks defined in [RFC3779] ✨

4.2.2.1. ConstrainedIPAddressFamily Type πŸ¦‹

4.2.2.1.1. addressFamily Field

the addressFamily field is an OCTET STRING holding a 2-octet AFI, in network byte order πŸ’– Unlike IPAddrBlocks [RFC3779], a third octet with a Subsequent Address Family Identifier (SAFI) MUST NOT be present. AFIs are specified in the "Address Family Numbers" registry [IANA.ADDRESS-FAMILY-NUMBERS] maintained by IANA 🌸

4.2.2.1.2. addressesOrRanges Field

✨ Okay so the addressesOrRanges element is a SEQUENCE OF one or more IPAddressOrRange values, defined in [RFC3779]. πŸ¦‹ The canonicalization and encoding rules in Section 2.2.3.6 of [RFC3779] apply to its value. πŸ’…

4.3. digestAlgorithm

πŸ” The digest algorithm is what makes the message digest of the attested digital object(s). This algorithm MUST be a hashing algorithm defined in [RFC7935].

4.4. checkList

πŸ“ This field is a SEQUENCE OF one or more FileNameAndHash values. There is one FileNameAndHash entry for each digital object referenced on the RSC.

4.4.1. FileNameAndHash

πŸŽ€ Each FileNameAndHash is an ordered pair: the name of the directory entry holding the digital object, plus the message digest of that object.

The hash field is mandatory. Its value is the calculated message digest of the digital object, and the hashing algorithm is specified in the digestAlgorithm field.

The fileName field is OPTIONAL. 🧚 This exists so RSCs can be used in a "stand-alone" fashion, where nameless digital objects are addressed directly through their message digest instead of through a file system abstraction.

If the fileName field is present, then its value:

  • MUST contain only characters specified in the Portable Filename Character Set as defined in [POSIX].
  • MUST be unique with respect to the other FileNameAndHash elements of checkList for which the fileName field is also present.

Conversely, if the fileName field is omitted, then the value of the hash field MUST be unique with respect to the other FileNameAndHash elements of checkList for which the fileName field is also omitted. πŸ™ˆ

5. RSC Validation

🌸 Before a Relying Party (RP) can use an RSC to validate a set of digital objects, the RP MUST first validate the RSC. To validate an RSC, the RP MUST perform all the validation checks specified in [RFC6488], except for checking for the presence of an SIA extension, which MUST NOT be present in the EE certificate (see Section 2). On top of that, the RP MUST perform the following RSC-specific validation steps:

  1. The contents of the CMS eContent field MUST conform to all of the constraints described in Section 4, including the constraints described in Section 4.4.1.
  2. If the asID field is present within the contents of the resources field, then the AS identifier delegation extension [RFC3779] MUST be present in the EE certificate contained in the CMS certificates field. The AS identifiers present in the eContent resources field MUST be a subset of those present in the certificate extension. The EE certificate's AS identifier delegation extension MUST NOT contain "inherit" elements.
  3. If the ipAddrBlocks field is present within the contents of the resources field, then the IP address delegation extension [RFC3779] MUST be present in the EE certificate contained in the CMS certificates field. The IP addresses present in the eContent resources field MUST be a subset of those present in the certificate extension. The EE certificate's IP address delegation extension MUST NOT contain "inherit" elements.

6. Verifying Files or Data Using RSC

πŸ” To verify a set of digital objects with an RSC:

  • The RSC MUST be validated according to the procedure described in Section 5. If the RSC cannot be validated, verification MUST fail. This error SHOULD be reported to the user.
  • For every digital object to be verified:
    1. If the verification procedure is provided with a filename for the object being verified (e.g., because the user has provided a file system path from which to read the object), then verification SHOULD proceed in "filename-aware" mode. Otherwise, verification SHOULD proceed in "filename-unaware" mode.

Implementations MAY provide an option to override the verification mode, for example, to ignore the fact that the object is to be read from a file.

  1. The message digest MUST be computed from the file contents or data using the digest algorithm specified in the digestAlgorithm field of the RSC.
  2. The digest computed in Step 2 MUST be compared to the value appearing in the hash field of all FileNameAndHash elements of the checkList field of the RSC.

One or more FileNameAndHash elements MUST be found with a matching hash value; otherwise, verification MUST fail, and the error SHOULD be reported to the user.

  1. If the mode selected in Step 1 is "filename-aware", then exactly one of the FileNameAndHash elements matched in Step 3 MUST contain a fileName field value exactly matching the filename of the object being verified.

Alternatively, if the mode selected in Step 1 is "filename-unaware", then exactly one of the FileNameAndHash elements matched in Step 3 MUST have the fileName field omitted.

Otherwise, verification MUST fail, and the error SHOULD be reported to the user.

Note that in the above procedure, not all elements of checkList necessarily need be used. That is, it is not an error if the length of checkList is greater than the size of the set of digital objects to be verified. 🫢 However, in this situation, implementations SHOULD issue a warning to the user, allowing for corrective action to be taken if necessary.

7. Operational Considerations

πŸ“ When creating digital objects of a plain-text nature (such as ASCII, UTF-8, HTML, Javascript, and XML), converting such objects into a lossless compressed form is RECOMMENDED. Distributing plain-text objects within a compression envelope (such as GZIP [RFC1952]) might help avoid unexpected canonicalization at intermediate systems (which in turn would lead to checksum verification errors). Validator implementations are expected to treat a checksummed digital object as a string of arbitrary single octets.

If a fileName field is present, but no digital object within the set of to-be-verified digital objects has a filename that matches the content of that field, a validator implementation SHOULD compare the message digest of each digital object to the value from the hash field of the associated FileNameAndHash and report matches to the user for further consideration. πŸ‘€

8. Security Considerations

🚨 RPs are hereby warned that the data in an RSC is self-asserted. When determining the meaning of any data contained in an RSC, RPs MUST NOT make any assumptions about the signer beyond the fact that it had sufficient control of the issuing CA to create the object. These data have not been verified by the Certificate Authority (CA) that issued the CA certificate to the entity that issued the EE certificate used to validate the RSC.

RPKI certificates are not bound to real-world identities; see [RFC9255] for an elaboration. RPs can only associate real-world entities to Internet Number Resources by additionally consulting an exogenous authority. RSCs are a tool to communicate assertions signed with Internet Number Resources and do not communicate any other aspect of the resource holder's business operations, such as the identity of the resource holder itself.

RSC objects are not distributed through the RPKI repository system. From this, it follows that third parties who do not have a copy of a given RSC may not be aware of the existence of that RSC. Since RSC objects use EE certificates but all other currently defined types of RPKI object profiles are published in public CA repositories, an observer may infer from discrepancies in the repository that RSC object(s) may exist. For example, if a CA does not use random serial numbers for certificates, an observer could detect gaps between the serial numbers of the published EE certificates. Similarly, if the CA includes a serial number on a Certificate Revocation List (CRL) that does not match any published object, an observer could postulate that an RSC EE certificate was revoked.

Conversely, a gap in serial numbers does not imply that an RSC exists. Nor does the presence in a CRL of a serial number unknown to the RP imply an RSC object exists: the implicitly referenced object might not be an RSC, it might have never been published, or it may have been revoked before it was visible to RPs. In general, it is not possible to confidently infer the existence or non-existence of RSCs from the repository state without access to a given RSC. πŸ•΅οΈ

While a one-time-use EE certificate must only be used to generate and sign a single RSC object, CAs technically are not restricted from generating and signing multiple different RSC objects with a single key pair. Any RSC objects sharing the same EE certificate cannot be revoked individually. 😭

9. IANA Considerations

9.1. SMI Security for S/MIME CMS Content Type (1.2.840.113549.1.9.16.1)

🏷️ IANA has allocated the following in the "SMI Security for S/MIME CMS Content Type (1.2.840.113549.1.9.16.1)" registry:

          +=========+=======================+============+
          | Decimal | Description           | References |
          +=========+=======================+============+
          | 48      | id-ct-signedChecklist | RFC 9323   |
          +---------+-----------------------+------------+

                              Table 1

9.2. RPKI Signed Objects

πŸ—‚οΈ IANA has registered the OID for the RSC in the "RPKI Signed Objects" registry [RFC6488] as follows:

    +==================+============================+===========+
    | Name             | OID                        | Reference |
    +==================+============================+===========+
    | Signed Checklist | 1.2.840.113549.1.9.16.1.48 | RFC 9323  |
    +------------------+----------------------------+-----------+

                               Table 2

9.3. RPKI Repository Name Schemes

πŸ“ IANA has added the Signed Checklist file extension to the "RPKI Repository Name Schemes" registry [RFC6481] as follows:

        +====================+==================+===========+
        | Filename Extension | RPKI Object      | Reference |
        +====================+==================+===========+
        | .sig               | Signed Checklist | RFC 9323  |
        +--------------------+------------------+-----------+

                               Table 3

9.4. SMI Security for S/MIME Module Identifier (1.2.840.113549.1.9.16.0)

🧩 IANA has allocated the following in the "SMI Security for S/MIME Module Identifier (1.2.840.113549.1.9.16.0)" registry:

     +=========+=================================+============+
     | Decimal | Description                     | References |
     +=========+=================================+============+
     | 73      | id-mod-rpkiSignedChecklist-2022 | RFC 9323   |
     +---------+---------------------------------+------------+

                              Table 4

Okay so this is the last bit of the doc and it's giving closing-credits energy 🎬✨


9.5. Media Types πŸŽ€

Okay bestie, so IANA registered a media type called "application/rpki-checklist" in the "Media Types" registry, and here's the whole vibe of it πŸ’…:

Type name:  application

Subtype name:  rpki-checklist

Required parameters:  N/A

Optional parameters:  N/A

Encoding considerations:  binary

Security considerations:  Carries an RPKI Signed Checklist.  This
   media type contains no active content.  See Section 5 of RFC 9323
   for further information.

Interoperability considerations:  N/A

Published specification:  RFC 9323

Applications that use this media type:  RPKI operators

Fragment identifier considerations:  N/A

Additional information:

   Content:  This media type is a signed object, as defined in
      [RFC6488], which contains a payload of a list of checksums as
      defined in RFC 9323.
   Magic number(s):  N/A
   File extension(s):  .sig
   Macintosh file type code(s):  N/A

Person & email address to contact for further information:  Job
   Snijders (job@fastly.com)

Intended usage:  COMMON

Restrictions on usage:  N/A

Author:  Job Snijders (job@fastly.com)

Change controller:  IETF

So the big takeaways are that it's binary, it has no active content (no cap πŸ™…β€β™€οΈ), and the file extension is .sig πŸ¦‹. Honestly the security note is the main thing to remember πŸ”₯.


10. References πŸ“š

10.1. Normative References πŸ’œ

Okay, these are the ones the spec needs to make sense, so this is where the key pieces live 🧚:

10.2. Informative References 🌸

These ones are more like extra reading, but still good to know about 🫢:


Acknowledgements 🫢🌈

The authors wish to thank George Michaelson, Geoff Huston, Randy Bush, Stephen Kent, Matt Lepinski, Rob Austein, Ted Unangst, and Marc Espie for prior art πŸ’–. The authors thank Russ Housley for reviewing the ASN.1 notation and providing suggestions πŸŽ€. The authors would like to thank Nimrod Levy, Tim Bruijnzeels, Alberto Leiva, Ties de Kock, Peter Peele, Claudio Jeker, Theo Buehler, Donald Eastlake 3rd, Erik Kline, Robert Wilton, Roman Danyliw, Γ‰ric Vyncke, Lars Eggert, Paul Wouters, and Murray S. Kucherawy for document review and suggestions πŸ‘‘.

Authors' Addresses πŸ¦‹

Job Snijders Fastly Amsterdam Netherlands Email: job@fastly.com

Tom Harrison Asia Pacific Network Information Centre 6 Cordelia St South Brisbane QLD 4101 Australia Email: tomh@apnic.net

Ben Maddison Workonline Communications Cape Town South Africa Email: benm@workonline.africa


That's the whole thing, bestie 🌈✨ RFC 9323 is a wrap, and you made it through! πŸ’…πŸ«Ά

πŸ“¦ where this page comes from