RFC 9795

Personal Assertion Token (PASSporT) Extension for Rich Call Data

๐Ÿ“… published July 2025, from ietf

RFC 9795: Personal Assertion Token (PASSporT) Extension for Rich Call Data ๐Ÿ’–

Okay bestie, the header facts first ๐ŸŽ€. This is RFC 9795 from the Internet Engineering Task Force (IETF). It's a Standards Track document with ISSN 2070-1721, dated July 2025. The authors are C. Wendt from Somos Inc. and J. Peterson from TransUnion. The title block doesn't list anything it obsoletes or updates.


Abstract โœจ

Okay so this doc extends PASSporT, the token that carries cryptographically signed call info about personal communications, so it can hold rich metadata about a call and the caller ๐Ÿ“ž. That metadata can be signed, integrity protected, transmitted, and then rendered to the called party. It's meant to go way beyond a human-readable display name, kind of like the "Caller ID" vibe from the telephone network ๐Ÿ’…. It also gets an integrity mechanism to protect how this info is authored and transported for different authoritative use cases ๐Ÿ”ฅ.

Status of This Memo ๐ŸŒธ

This is an Internet Standards Track document ๐Ÿ’œ.

It's a product of the IETF and represents the consensus of the IETF community. It got public review and was approved for publication by the Internet Engineering Steering Group (IESG). If you want more on Internet Standards, check out Section 2 of RFC 7841 ๐Ÿงš.

For the current status, any errata, and how to send feedback, go to https://www.rfc-editor.org/info/rfc9795 ๐Ÿฆ‹.

Copyright (c) 2025 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 in effect on the date of publication. Please review those carefully, because they spell out your rights and restrictions for this document ๐Ÿซถ. Code Components extracted from this document must include Revised BSD License text as described in Section 4.e of the Trust Legal Provisions. They're provided without warranty, as described in the Revised BSD License โญ.

Table of Contents ๐Ÿ“

   1.  Introduction
   2.  Terminology
   3.  Overview of the Use of the Rich Call Data PASSporT Extension
   4.  Overview of Rich Call Data Integrity
   5.  "rcd" PASSporT Claim: Definition and Usage
     5.1.  PASSporT "rcd" Claim
       5.1.1.  "nam" key
       5.1.2.  "apn" key
       5.1.3.  "icn" key
       5.1.4.  "jcd" key
       5.1.5.  "jcl" key
   6.  "rcdi" PASSporT Claim: Definition and Usage
     6.1.  Creation of the "rcd" Element Digests
       6.1.1.  "nam" and "apn" Elements
       6.1.2.  "icn" Elements
       6.1.3.  "jcd" Elements
       6.1.4.  "jcl" Elements
     6.2.  JWT Claim Constraints for "rcd" Claims
     6.3.  JWT Claim Constraints for "rcd" and "rcdi" Claims
   7.  "crn" PASSporT Claim: Definition and Usage
     7.1.  JWT Constraint for "crn" Claim
   8.  Rich Call Data Claims Usage Rules
     8.1.  "rcd" PASSporT Verification
     8.2.  "rcdi" Integrity Verification
     8.3.  Example "rcd" PASSporTs
   9.  Compact Form of "rcd" PASSporT
     9.1.  Compact Form of the "rcd" PASSporT Claim
     9.2.  Compact Form of the "rcdi" PASSporT Claim
     9.3.  Compact Form of the "crn" PASSporT Claim
   10. Third-Party Uses
     10.1.  Signing as a Third Party
     10.2.  Verification Using Third-Party RCD
   11. Levels of Assurance
   12. Use of "rcd" PASSporTs in SIP
     12.1.  Authentication Service Behavior for SIP Protocol
     12.2.  Verification Service Behavior for SIP Protocol
   13. Using "rcd", "rcdi", and "crn" as Additional Claims to Other
           PASSporT Extensions
     13.1.  Procedures for Applying RCD Claims as Claims Only
     13.2.  Example for Applying RCD Claims as Claims Only
   14. Further Information Associated with Callers
   15. IANA Considerations
     15.1.  JSON Web Token Claim
     15.2.  Personal Assertion Token (PASSporT) Extensions
     15.3.  PASSporT RCD Claim Types
   16. Security Considerations
     16.1.  Use of JWT Claim Constraints in Delegate Certificates to
            Exclude Unauthorized Claims
   17. References
     17.1.  Normative References
     17.2.  Informative References
   Acknowledgements
   Authors' Addresses

1. Introduction ๐Ÿ’–

PASSporT [RFC8225] is a token format built on JSON Web Token (JWT) [RFC7519]. It carries cryptographically signed info about the parties in personal communications, and it's used to deliver a signed assertion of who the participants are in real-time communications set up with a protocol like SIP [RFC8224] ๐Ÿ“ž. The Secure Telephone Identity Revisited (STIR) problem statement [RFC7340] said that securing the display name of callers was outside STIR's initial scope ๐Ÿ™ˆ. This document extends JWT and PASSporT within the overall STIR framework. It defines a PASSporT extension plus the STIR procedures to protect extra caller- and call-related info โœจ. That info goes beyond the calling party's originating identity (like a telephone number or SIP URI). It's meant to be shown to the called party so they can decide whether to accept or trust an incoming communication ๐Ÿ‘‘. It covers things like the name of the person or entity on one side of the session, which is basically the traditional "Caller ID" of the telephone network, along with related display info. That info can be rendered during alerting, or an automaton might use it to decide whether and how to alert a called party to a call and who is calling ๐Ÿฆ‹.

Telephone network signaling has long supported delivering a 'calling name' from the originating side. In practice though, the terminating side often has to work out a name from the calling party number by checking a local address book or an external database ๐Ÿ’…. SIP can carry this info too. It can put it in a display-name in the From header field value, or alternatively in the Call-Info header field, to send it from the originating side to the terminating side ๐ŸŒธ. This document uses the STIR framework to extend the assertion of an extensible set of identity info. It isn't limited to calling name, though calling name is included ๐Ÿ’œ.

This document extends PASSporT to give cryptographic protection to the "display-name" field of SIP requests, or to similar name fields in other protocols ๐Ÿ”. It also adds further "rich call data" (RCD) about the caller. That includes the contents of the Call-Info header field, or other data structures that can be added to the PASSporT ๐ŸŒˆ. Section 12 describes use cases where external third-party authorities can share rich info tied to a calling number through an "rcd" PASSporT. It also makes clear that the third party is the source of the Rich Call Data ๐Ÿซถ. Last, this document explains how to keep the RCD's integrity intact in scenarios where non-authoritative users might start and sign RCD. It does this by limiting a PASSporT, and the RCD claims it asserts, with certificate-level controls ๐Ÿ›ก๏ธ.

2. Terminology ๐Ÿ’…

Quick terminology check, bestie ๐ŸŽ€. The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" are read as described in BCP 14 [RFC2119] [RFC8174]. That only happens when they show up in all capitals, exactly like shown here ๐Ÿง.

3. Overview of the Use of the Rich Call Data PASSporT Extension ๐Ÿงš

This document defines Rich Call Data (RCD). It's a PASSporT extension [RFC8225] with an extensible claim for asserting info about the call beyond the telephone number โœจ. That includes more detailed info about the calling party, the calling number, or the purpose of the call ๐Ÿ“. The doc describes lots of use cases around who is responsible for signing and integrity for this info. That could be the entity that originates the call, a service provider acting on behalf of a caller, or third-party services that may be authoritative over the RCD on the caller's behalf ๐Ÿ‘‘. PASSporT [RFC8225] is defined to be independent of the communications protocol. But its initial usage, as detailed in [RFC8224], is with the SIP protocol [RFC3261] ๐Ÿ“ž. This document has lots of SIP-specific references and definitions. Future specs might extend RCD PASSporTs and claims to other protocol-specific usage and definitions ๐Ÿฆ‹.

The RCD tied to the calling party's identity, as described in this document, comes in two main categories ๐Ÿ’–. The first is a more traditional set of info about a caller, tied to "display-name" in SIP [RFC3261]. That's typically a textual description of the caller. It can also include alternate presentation numbers, which are often used in the From header field [RFC3261] or the P-Asserted-Identity header field [RFC3325], or an icon associated with the caller ๐ŸŒธ. The second category is RCD defined as part of the jCard definitions, or extensions to that data ๐ŸŒˆ. [RFC9796] describes the optional use of jCard in the Call-Info header field as RCD, using the "jcard" Call-Info purpose token ๐Ÿ’œ. Either or both of these types of data can be put into an "rcd" claim as defined in this document โœจ.

Separately, and this is about the specific communications event itself (not the identity stuff from the paragraph above), [RFC9796] also describes a "call-reason" parameter ๐Ÿ”ฅ. It's meant for describing the intent or reason for a particular call ๐Ÿซถ. This document adds a new PASSporT claim, "crn" (call reason), which can contain a string that describes the intent of the call ๐Ÿ’…. It's kept separate from the "rcd" claim on purpose. Call reason isn't the same as info about the caller, and it may change more often, on a per-call basis ๐Ÿฆ‹.


(part 1 of 7 done! part 2 is next, bestie ๐Ÿ’œโœจ)

4. Overview of Rich Call Data Integrity โœจ

Okay so, when you're putting together call data that represents a user, even the traditional calling name services we have today come with rules about what data is allowed. ๐Ÿ™…โ€โ™€๏ธ Stuff like blocking offensive words or icons, keeping names unique, flagging possible trademark or copyright problems, or enforcing other policies. That means someone might want to pre-certify or "vet" exactly how RCD gets used. ๐Ÿ’… This document defines a mechanism for a direct or indirect party that (a) enforces the policies so it can approve or certify the content, (b) creates a cryptographic digest that can be used to validate that data, and (c) applies a constraint in the certificate so the recipient and verifier can confirm that the RCD content is exactly what was intended when it was created and approved or certified. It's giving accountability, bestie. ๐Ÿซถ

There are two mechanisms defined to handle two different categories of purposes. ๐Ÿฆ‹ The first one is the definition of an integrity claim. The RCD integrity mechanism generates a cryptographic digest for each resource referenced by a URI within a claim value (for example, an image file referenced by "jcd" or a jCard referenced by "jcl"). It's inspired by and based on the W3C Subresource Integrity specification [W3C-SubresourceIntegrity]. The second mechanism uses the capability called JWT Claim Constraints, which is defined in [RFC8226] and extended in [RFC9118]. JWT Claim Constraints guide the verifier, through the certificate used to compute the signature in the PASSporT, on whether specific claims and their values should be included (or excluded), so the content the signer intended can be verified as accurate. ๐Ÿ”

Both of these, integrity digests and JWT Claim Constraints, can be used together or separately depending on what you're going for. ๐ŸŒˆ The first category of purpose is whether the RCD in the PASSporT claims is passed by value or by reference. In other words, is the information right there in the PASSporT claims (and therefore integrity protected by the PASSporT signature), or is it in an external resource referenced by a URI in the PASSporT? The second category of purpose is whether the signer is authoritative, meaning responsible for the accuracy of the RCD, based on the policies of the ecosystem where the "rcd" PASSporTs or "rcd" claims are used. ๐Ÿ‘‘

Here's a quick overview of how integrity should be used with RCD. ("Auth" stands for "authoritative" in this table.) ๐Ÿ“

+==========+=====================+==================================+
| Modes    | No URI refs         | Includes URI refs                |
+==========+=====================+==================================+
| Auth     | 1: No integrity req | 2: RCD Integrity                 |
+==========+---------------------+----------------------------------+
| Non-Auth | 3: JWT Claim Const. | 4: RCD Integ. /                  |
|          |                     | JWT Claim Const.                 |
+==========+---------------------+----------------------------------+

Table 1

Mode 1 is the simplest one, and it's exclusively for when all the RCD content is directly included in the claims (no URIs pointing to external content) and the signer is authoritative over that content. ๐Ÿ’– Integrity protection isn't required here. The set of claims is just protected by the signature from the standard PASSporT [RFC8225] and SIP identity header [RFC8224] procedures. Mode 2 is an extension of Mode 1 where the signer is still authoritative, but the "rcd" claim contents include a URI identifying external resources. In this mode, an RCD Integrity or "rcdi" claim MUST be included. ๐Ÿ”’ That integrity claim is defined later in this document, and it provides a digest of the "rcd" claim content. This is especially important when there are URI references in the RCD, because it lets the content be comprehensively validated as having been received the way the signer intended. ๐Ÿงš

Modes 3 and 4 cover cases where a different authoritative entity is responsible for the RCD content, separate from the signer of the PASSporT itself. ๐ŸŒธ This makes it possible, especially when signing authority for a PASSporT is delegated, for agreed or vetted content to be included in or referenced by the RCD claim contents. The main framework for separating authority from the signing of PASSporTs by non-authorized entities is detailed in [RFC9060], although other cases may apply. โœจ Just like Modes 1 and 2, Modes 3 and 4 differ based on whether external content is referenced using URIs or not.


5. "rcd" PASSporT Claim: Definition and Usage ๐ŸŽ€

5.1. PASSporT "rcd" Claim ๐Ÿ’œ

This document defines a new JSON Web Token claim called "rcd", which stands for Rich Call Data. ๐Ÿฆ‹ Its value is a JSON object that can contain one or more key value pairs. This document also defines a default set of key values.

5.1.1. "nam" key ๐ŸŒท

The "nam" key value is a display name associated with the originator of personal communications. It might match the display-name component of the From header field value of a SIP request [RFC3261], or the P-Asserted-Identity header field value [RFC3325], or a similar field in other PASSporT-using protocols. ๐Ÿ’… This key MUST be included once as part of the "rcd" claim value JSON object. The key syntax of "nam" MUST follow the display-name ABNF given in [RFC3261]. And if there's no string associated with a display name, the claim value MUST be an empty string. ๐Ÿซถ

5.1.2. "apn" key ๐Ÿ“ž

The "apn" key value is an optional alternate presentation number associated with the originator of personal communications. It might match the user component of the From header field value of a SIP request (in cases where a network number is carried in the P-Asserted-Identity [RFC3325]), or the Additional-Identity header field value [TS.3GPP.24.229], or a similar field in other PASSporT-using protocols. ๐ŸŒˆ The intended meaning is to convey a number that the originating user is authorized to show to called parties in place of their default number. A classic example is a remote call agent using the main number of a call center instead of their personal telephone number. The "apn" key value is a canonicalized telephone number per [RFC8224], Section 8.3. If present, this key MUST be included once as part of the "rcd" claim value JSON object. ๐Ÿ“ฑ

The optional "apn" key is meant for cases where the signer of an "rcd" PASSporT or "rcd" claims authorizes the user to use an alternate presentation number. How the signer decides that a user is authorized to present that number is a policy decision outside the scope of this document. ๐Ÿ™ˆ However, vetting the alternate presentation number should get the same level of vetting as telephone identities or any other information in an "rcd" PASSporT or "rcd" claims. The "apn" key is an alternative to putting the presentation number in the "tel" key value of a jCard, for situations where no other rich jCard data needs to be conveyed with the call. Only one "apn" key may be present. "apn" MUST be used when the caller or signer intends to display the alternate presentation number, even if "jcd" or "jcl" keys are present in a PASSporT with a "tel" key value. ๐Ÿ‘‘

5.1.3. "icn" key ๐Ÿ–ผ๏ธ

The "icn" key value is an optional HTTPS URL reference to an image resource that can be used to represent the originator of personal communications pictorially. ๐Ÿฆ‹ This icon key value should be used as a base or default way of associating an image with a calling party.

When SIP [RFC3261] is being used, this claim key value protects the Call-Info header field with a purpose parameter value of "icon", as described in Section 20.9 of [RFC3261]. For example:

Call-Info: <http://wwww.example.com/alice/photo.jpg>;
  purpose=icon

Note that [RFC9796] extends the specific usage of "icon" in SIP, within the larger rich call data framework, with specific guidance on referencing images and on image types, sizes, and formats. โœจ

It should also be noted that with jCard, as described for the "jcd" and "jcl" key values (Sections 5.1.4 and 5.1.5) and in [RFC9796], there are alternative ways to include photos and logos as HTTPS URL references. ๐ŸŒธ The "icn" key should be considered a base or default image. jCard usage should be considered for profiles and extensions that give more direct guidance on what each image type represents, so things render properly for end users. ๐Ÿ’–

5.1.4. "jcd" key ๐Ÿงพ

The "jcd" key value is defined to contain a jCard JSON object [RFC7095]. In this specification, jCard is an extensible object format used to contain RCD information about the call initiator. ๐ŸŽ€ It's meant to directly match the Call-Info header field value defined in [RFC9796] with a type of "jcard". The format of the jCard and the properties used should follow the normative usage and formatting rules and procedures in that document. The calling party can provide the standard types of information defined in jCard, or use jCard's built-in extensibility to add more information. โœจ The "jcd" key is optional. Either a "jcd" or "jcl" MAY appear in the "rcd" claim, but not both. ๐Ÿ™…โ€โ™€๏ธ

The jCard object value for "jcd" MUST be a jCard JSON object that MAY have URI-referenced content. However, that URI-referenced content MUST NOT further reference URIs. Future specifications may extend this capability, but [RFC9796] constrains the security properties of RCD information and the integrity of the content referenced by URIs. ๐Ÿ”

Note: Even though we refer to [RFC9796] as the definition of the jCard properties for usage in "rcd" claims, using the Call-Info header field with RCD information in a SIP request beyond the use of the identity header defined in this document is not required. ๐Ÿค“ Identity header fields are generally encouraged for all transport of authenticated and protected RCD information over Network-to-Network Interfaces (NNIs) between untrusted parties or over untrusted networks. ๐Ÿ›ก๏ธ The use of Call-Info header fields to carry RCD information as defined in [RFC9796] is suggested for trusted network relationships, generally for User-Network Interfaces (UNIs). ๐Ÿซถ

5.1.5. "jcl" key โœจ

okay so the "jcl" key is an HTTPS URL ๐Ÿ”— that points to a jCard JSON object [RFC7095] sitting on a web server. The web server MUST use the media type for JSON text as application/json with a default encoding of UTF-8 [RFC8259]. This link may match the Call-Info header field value from [RFC9796] with a type of "jcard". Also per [RFC9796], the jCard and its properties should follow the normative usage and formatting rules and procedures, bestie ๐Ÿ“‹. The "jcl" key is optional ๐Ÿ’…. The "jcd" or "jcl" keys MAY only appear once in the "rcd" claim, but they MUST be mutually exclusive, so you can't have both at the same time ๐Ÿ™…โ€โ™€๏ธ.

The jCard object that the URI in "jcl" points to MUST be a jCard JSON object. It MAY have URI-referenced content, but that content MUST NOT further reference URIs ๐Ÿ›‘. Future specifications may extend this, but [RFC9796] keeps a tight grip on the security properties of RCD information and on the integrity of anything referenced by URIs ๐Ÿ”’. Very responsible, very serious, iconic.

6. "rcdi" PASSporT Claim: Definition and Usage ๐Ÿ‘‘

the "rcdi" claim shows up for the second and fourth modes in the integrity overview (Section 4) ๐ŸŽ€. "rcdi" and "rcd" claims MAY each appear once in a PASSporT, but if "rcdi" is included, the "rcd" MUST be present correspondingly, no exceptions ๐Ÿ™ƒ. The value of "rcdi" is a JSON object, and here's how it's defined.

The claim value of the "rcdi" key is a JSON object with a set of JSON key/value pairs ๐Ÿงฉ. Each key/value pair in "rcdi" lines up with one of the elements in the "rcd" claim object that needs integrity protection, paired with a digest over the content that the key string references. The digests for different elements of the "rcd" data and for URI-referenced external content are kept totally separate on purpose, so you can verify just the bits that actually get fetched, downloaded, or rendered for the end user. Smart, right? ๐Ÿง โœจ

The key value points at a specific object inside the "rcd" claim value using a JSON pointer defined in [RFC6901], with a minor extra rule so it can reference external content that includes JSON objects themselves. That extra rule is for the specific case of using "jcl", which is defined in Section 6.1.4 ๐Ÿฆ‹. The JSON pointer syntax is the key value, and it documents exactly which part of the JSON gets used to generate the digest that becomes the value for that key. The detailed procedures come later, but here's an example "rcdi" to get you vibing:

"rcdi" : {
  "/jcl": "sha256-7kdCBZqH0nqMSPsmABvsKlHPhZEStgjojhdSJGRr3rk",
  "/jcl/1/2/3": "sha256-jL4f47fF82LuwcrOrSyckA4SWrlElfARHkW6kYo1JdI"
}

Each key/value pair's value is a digest across one of these three things, referenced by the JSON pointer key:

  • the content inline in the referenced object,
  • the content of a resource referenced by an inline URI object, or
  • the content of a resource specified by a URI that is embedded in content specified by an inline URI object (for example, "jcl")

That digest gets combined with a string that names the cryptographic algorithm used to make it ๐Ÿ”. RCD implementations MUST support the hash algorithms SHA-256, SHA-384, and SHA-512. These are identified by "sha256", "sha384", and "sha512", respectively. SHA-256, SHA-384, and SHA-512 are part of the SHA-2 set of cryptographic hash functions [RFC6234], defined by the US National Institute of Standards and Technology (NIST) ๐Ÿ‡บ๐Ÿ‡ธ. Implementations MAY support additional recommended hash algorithms from [IANA-COSE-ALG], meaning the ones with "Yes" in the "Recommended" column of that IANA registry ๐Ÿ“š. Hash algorithm identifiers MUST use only lowercase letters, and they MUST NOT contain hyphen characters ๐Ÿ”ค. The character right after the algorithm string MUST be a hyphen character ("-", %x2D). The characters after that are the base64 encoded [RFC4648] digest of a canonicalized and concatenated string or binary data, based on the JSON pointer referenced elements of the "rcd" claim or the URI-referenced content contained in the claim ๐Ÿงƒ. The next section covers how the input string for the digest gets figured out ๐Ÿ’–.

6.1. Creation of the "rcd" Element Digests ๐Ÿง

"rcd" claim objects can contain "nam", "apn", "icn", "jcd", or "jcl" keys as part of the "rcd" JSON object claim value. This document uses JSON pointer [RFC6901] as the mechanism for referencing specific "rcd" claim elements, so it's basically the glue ๐Ÿซถ.

To make sure digests can be verified properly, and to figure out whether "rcd" elements or URI-referenced content got modified, the input to the digest must be completely deterministic at three points in the process ๐Ÿ•ต๏ธโ€โ™€๏ธ. First, it must be deterministic at the certification point, when the content gets evaluated against the application policy and when the JWT Claim Constraints are applied to the certificate containing the digest. Second, when the call is signed at the Authentication Service, there may be a local policy to check that the provided "rcd" claim matches each digest. Third, when the "rcd" data is verified at the verification service, the verification happens for each digest by building the input digest string for the element being verified, which is referenced by the JSON pointer string ๐Ÿ”.

Here's the procedure for creating each "rcd" element digest string that corresponds to a JSON pointer string key:

  1. The JSON pointer either refers to a value that is a part or the whole of a JSON object, or to a string that is a URI referencing an external resource.
  2. For a JSON value, serialize the JSON to remove all white space and line breaks. The procedures for this deterministic JSON serialization are defined in [RFC8225], Section 9. The resulting string is the input for the hash function.
  3. For any URI-referenced content, the bytes of the body of the HTTP response are the input for the hash function.

Heads up, though: the digest is computed on the JSON representation of the string, which necessarily includes the beginning and ending double-quote characters ๐ŸŽ€.

6.1.1. "nam" and "apn" Elements ๐Ÿ’…

For "nam" and "apn", the only allowed value is a string. For both of these keys, an "rcdi" JSON pointer or integrity digest is optional, because the direct value is already protected by the signature and can be constrained directly with JWT Claim Constraints ๐Ÿ›ก๏ธ.

6.1.2. "icn" Elements ๐Ÿ–ผ๏ธ

For "icn", the only allowed value is a URI value that references an image file. If the URI references externally linked content, there MUST be a JSON pointer and digest entry for the content in that linked resource ๐Ÿ“ธ. When you create a key/value pair representing "icn", the key is the JSON pointer string "/icn", and the digest value string is created using the image file byte data referenced in the URI ๐ŸŒธ.

6.1.3. "jcd" Elements ๐Ÿ“

For "jcd", the value is a jCard JSON object, which happens to be a JSON array with sub-arrays inside it ๐Ÿช†. JSON pointer notation uses numeric indices to reach into array elements, including when those elements are arrays themselves.

Here's an example "rcd" claim:

"rcd": {
  "jcd": ["vcard",
    [ ["version",{},"text","4.0"],
      ["fn",{},"text","Q Branch"],
      ["org",{},"text","MI6;Q Branch Spy Gadgets"],
      ["photo",{},"uri",
        "https://example.com/photos/quartermaster-256x256.png"],
      ["logo",{},"uri",
        "https://example.com/logos/mi6-256x256.jpg"],
      ["logo",{},"uri",
        "https://example.com/logos/mi6-64x64.jpg"]
    ]
  ],
  "nam": "Q Branch Spy Gadgets"
}

To point a JSON pointer at the URIs, the following example "rcdi" claim includes a digest for the entire "jcd" array string, plus three more digests for the URIs. As defined in [RFC6901], zero-based array indices are used to reference the URI strings ๐Ÿ•ถ๏ธ.

"rcdi": {
  "/jcd": "sha256-7kdCBZqH0nqMSPsmABvsKlHPhZEStgjojhdSJGRr3rk",
  "/jcd/1/3/3": "sha256-RojgWwU6xUtI4q82+kHPyHm1JKbm7+663bMvzymhkl4",
  "/jcd/1/4/3": "sha256-jL4f47fF82LuwcrOrSyckA4SWrlElfARHkW6kYo1JdI",
  "/jcd/1/5/3": "sha256-GKNxxqlLRarbyBNh7hc/4lbZAdK6B0kMRf1AMRWPkSo"
  }
}

Using a JSON pointer and integrity digest for the "jcd" claim key and value is optional. The "jcd" value is the directly included jCard array, so it can be protected by the signature and constrained directly with JWT Claim Constraints. However, for data length reasons (like with "icn" above), or, more importantly, for potential privacy and/or security considerations with a publicly accessible certificate, using the "rcdi" JSON pointer and integrity digest as the constraint value in JWT Claim Constraints over the jCard data is RECOMMENDED ๐ŸŒŸ.

It's important to remember that array indices for JSON pointer depend on the order of the elements in the jCard ๐Ÿ“. Using a digest for "/jcd", which covers the entire jCard array string, can be included as a redundant mechanism to avoid any possibility of substitution, insertion attacks, or other techniques that might try to undermine integrity detection. Extra layers, obsessed ๐Ÿ˜ค.

Each URI referenced in the jCard array string MUST have a corresponding JSON pointer string key and digest value ๐Ÿ”—.

6.1.4. "jcl" Elements ๐Ÿงš

When you use a "jcl" URI reference to an external jCard, the procedures are similar to "jcd", with one small change to the JSON pointer: "/jcl" is used to refer to the external jCard array string. Also, any numeric array indices added after "jcl" (for example, "/jcl/1/2/3") are treated as if the external content referenced by the jCard were directly part of the overall "rcd" claim JSON object ๐ŸŒˆ. The following example shows a "jcl" version of the "jcd" example above:

"rcd": {
  "jcl": "https://example.com/qbranch.json",
  "nam": "Q Branch Spy Gadgets"
},
"rcdi": {
  "/jcl": "sha256-7kdCBZqH0nqMSPsmABvsKlHPhZEStgjojhdSJGRr3rk",
  "/jcl/1/3/3": "sha256-RojgWwU6xUtI4q82+kHPyHm1JKbm7+663bMvzymhkl4",
  "/jcl/1/4/3": "sha256-jL4f47fF82LuwcrOrSyckA4SWrlElfARHkW6kYo1JdI",
  "/jcl/1/5/3": "sha256-GKNxxqlLRarbyBNh7hc/4lbZAdK6B0kMRf1AMRWPkSo"
}

The "rcdi" MUST have a "/jcl" key value and digest value to protect the referenced jCard object, and each URI referenced in the referenced jCard array string MUST have a corresponding JSON pointer string key and digest value ๐Ÿซถ.

Here are the example contents of the resource at https://example.com/qbranch.json. It's what you use to calculate the "/jcl" digest above ๐Ÿงฎ:

["vcard",
  [ ["version",{},"text","4.0"],
    ["fn",{},"text","Q Branch"],
    ["org",{},"text","MI6;Q Branch Spy Gadgets"],
    ["photo",{},"uri",
      "https://example.com/photos/quartermaster-256x256.png"],
    ["logo",{},"uri",
      "https://example.com/logos/mi6-256x256.jpg"],
    ["logo",{},"uri",
      "https://example.com/logos/mi6-64x64.jpg"]
  ]
]

6.2. JWT Claim Constraints for "rcd" Claims โœจ

Okay bestie, when you're setting up JWT Claim Constraints for "rcd" claims ๐Ÿ’…, the signing certificate has to follow these guidelines ๐ŸŽ€.

The "permittedValues" for "rcd" MAY hold a single entry, or it can optionally MAY hold multiple entries ๐Ÿฆ‹. Multiple entries are for when the certificate holder is allowed to use different sets of rich call data for different call scenarios.

Only including "permittedValues" for "rcd", with no "mustInclude", lets you build a valid PASSporT that either has no "rcd" claim at all or has only one of the constrained "permittedValues" values inside it ๐ŸŒธ.

6.3. JWT Claim Constraints for "rcd" and "rcdi" Claims ๐Ÿงš

Using JWT Claim Constraints with an "rcdi" claim is for when URI-referenced content needs protecting by the authoritative certificate issuer ๐Ÿ”.

The goal of using JWT Claim Constraints for both "rcd" and "rcdi" claims is to constrain the signer so it only builds "rcd" and "rcdi" claims inside a PASSporT that contain and reference a predetermined set of content ๐Ÿ’–. Once the contents of the "rcd" claim and any referenced content are both certified by the party that's authoritative for the certificate issued to the signer, the "rcdi" claim gets built and linked to the STIR certificate tied to the signature in the PASSporT. That linking happens through the JWT Claim Constraints extension defined in [RFC8226], Section 8 and extended in [RFC9118] โœจ.

It should be recognized that the "rcdi" set of digests is only meant to be unique for one specific combination of "rcd" content and URI-referenced external content ๐Ÿ”. That's why the set gives you a robust integrity mechanism for an authentication service run by a non-authoritative party. For example, this may be used with delegate certificates [RFC9060] for the signing of calls by the calling party directly, even though the "authorized party" is not necessarily the subject of a STIR certificate ๐Ÿ“ž.

For the cases where both "rcd" and "rcdi" claims should always be included in the PASSporT, the certificate JWT Claims Constraint extension MUST include both of the following:

  • a "mustInclude" for the "rcd" claim, which simply constrains the fact that an "rcd" must be included
  • a "mustInclude" for the "rcdi" claim and a "permittedValues" equal to the created "rcdi" claim value string

Note that optionally the "rcd" claims may be included in the "permittedValues". Heads up though, it's recognized that this may be redundant with the "rcdi" "permittedValues", because the "rcdi" digest already implies the content of the "rcd" claims themselves ๐Ÿ™ˆ.

The "permittedValues" for the "rcdi" claims (or "rcd" claims more generally) may contain multiple entries so the certificate holder can use different sets of RCD ๐Ÿ’….


7. "crn" PASSporT Claim: Definition and Usage ๐Ÿ“ž

This document defines a brand new JSON Web Token claim called "crn", which stands for Call Reason ๐Ÿ’œ. Its value is a single string that can hold information as defined in [RFC9796], and it corresponds to the "call-reason" parameter for the Call-Info header. This claim is optional โœจ.

Here's an example of a "crn" claim with "rcd":

"crn" : "For your ears only",
"rcd": { "nam": "James Bond",
         "jcl": "https://example.org/james_bond.json"}

7.1. JWT Constraint for "crn" Claim ๐ŸŽ€

The integrity of the "crn" claim contents can optionally be protected by the authoritative certificate issuer, using JWT Claim Constraints in the certificate ๐Ÿ”’. If the PASSporT signer always wants to include a call reason string of any value, a "mustInclude" for the "crn" claim in the JWT Claim Constraints says that a "crn" claim must always be present. The certificate issuer is RECOMMENDED to include it ๐ŸŒˆ. If the signer of the "crn" claim wants to constrain its contents, then the "permittedValues" for "crn" in JWT Claim Constraints should match the allowed strings, and the certificate issuer is RECOMMENDED to include that too ๐Ÿ’….


8. Rich Call Data Claims Usage Rules ๐Ÿ“œ

The "rcd" or "crn" claims MAY appear in any PASSporT claims object as optional elements โœจ. The creator of a PASSporT MAY also add a PASSporT extension ("ppt") value of "rcd" to the header of a PASSporT. That extension is defined in [RFC8225], Section 8.1. When it's added, the PASSporT claims MUST contain at least one "rcd" or "crn" claim (or both) ๐Ÿงš. Any entities verifying the PASSporT claims defined in this document are required to understand the PASSporT extension in order to process the PASSporT in question ๐Ÿซถ. Here's an example PASSporT header with the "ppt" value of "rcd" included:

{ "typ":"passport",
  "ppt":"rcd",
  "alg":"ES256",
  "x5u":"https://www.example.com/cert.cer" }

The PASSporT claims object holds the "rcd" key with its matching value. The value of "rcd" is an array of JSON objects, and one of them, the "nam" key and value, is mandatory ๐Ÿ“‡.

Once the header and claims PASSporT objects are built, their signature is computed normally, following the guidance in [RFC8225] ๐Ÿ”ฅ.

8.1. "rcd" PASSporT Verification ๐Ÿ”

A verifier that successfully verifies a PASSporT containing an "rcd" claim MUST ensure the following about the PASSporT:

  • It has a valid signature per the verification procedures detailed in [RFC8225].
  • It abides by all rules set forth in the proper construction of the claims defined in Section 5.
  • It abides by JWT Claims Constraint rules defined in [RFC8226], Section 8 or extended by [RFC9118] if present in the certificate used to compute the signature in the PASSporT.

Also, if the "iss" claim is included in the PASSporT, verification should follow the procedures described in Section 10.2 ๐ŸŒธ.

Consistent with the verification rules for PASSporTs more generally [RFC8225], if any of the above criteria is not met, relying parties MUST NOT use any of the claims in the PASSporT. No cap, that one's serious ๐Ÿ’€.

8.2. "rcdi" Integrity Verification ๐Ÿ”

When the "rcdi" claim exists, the verifier should verify the digest for each JSON pointer key. Any digest string that doesn't match a generated digest MUST be considered a failure of verifying the content referenced by the JSON pointer ๐Ÿ˜ญ.

If there's any issue completing the integrity verification procedures for referenced external content, including HTTP or HTTPS errors, the referenced content MUST be considered not verified. However, this SHOULD NOT impact the result of base PASSporT verification for claims content that's directly included in the claims of the PASSporT ๐Ÿฆ‹.

As a potential optimization, an entity that doesn't otherwise need to dereference a URI from the "rcd" claim for display to the end user is NOT RECOMMENDED to dereference the URI just to do integrity verification. Don't do extra work bestie ๐Ÿ™ˆ.

8.3. Example "rcd" PASSporTs ๐Ÿ“š

Here's a "nam"-only PASSporT claims object. Line breaks are only there for readability ๐ŸŽ€:

{  "orig":{"tn":"12025551000"},
   "dest":{"tn":["12025551001"]},
   "iat":1443208345,
   "rcd":{"nam":"James Bond"} }

Next up is a "nam", "apn", and "icn" example using an https URI PASSporT claims object. Line breaks are for readability only. Note that in this example there's no integrity protection over the "icn" element in the "rcd" claim ๐Ÿ‘€.

{  "orig":{"tn":"12025551000"},
   "dest":{"tn":["12155551001"]},
   "iat":1443208345,
   "rcd":{
     "apn":"12025559990",
     "icn":"https://example.com/photos/quartermaster-256x256.png",
     "nam":"Her Majesty's Secret Service" } }

Here's a "nam", "apn", and "icn" example using a data URI PASSporT claims object. Line breaks are for readability only. In this one, the "icn" data is built right into the "rcd" claim, so separate integrity protection isn't required โœจ.

{  "orig":{"tn":"12025551000"},
   "dest":{"tn":["12155551001"]},
   "iat":1443208345,
   "rcd":{
     "apn":"12025559990",
     "icn":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAY
       AAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OH
       wAAAABJRU5ErkJggg==",
     "nam":"Her Majesty's Secret Service" } }

Now an "rcd" claims object that includes the "jcd" and also contains URI references to content ๐Ÿงš. Those references need an "rcdi" claim plus corresponding digests. In this example, the "rcdi" claim provides integrity protection for the URI-referenced content ๐Ÿ’–.

{
  "crn": "Rendezvous for Little Nellie",
  "orig": { "tn": "12025551000"},
  "dest": { "tn": ["12155551001"]},
  "iat": 1443208345,
  "rcd": {
    "jcd": ["vcard",
    [ ["version",{},"text","4.0"],
      ["fn",{},"text","Q Branch"],
      ["org",{},"text","MI6;Q Branch Spy Gadgets"],
      ["photo",{},"uri","https://example.com/photos/q-256x256.png"],
      ["logo",{},"uri","https://example.com/logos/mi6-256x256.jpg"],
      ["logo",{},"uri","https://example.com/logos/mi6-64x64.jpg"]
    ] ],
    "nam": "Q Branch Spy Gadgets"
  },
  "rcdi": {
   "/jcd/1/3/3":"sha256-RojgWwU6xUtI4q82+kHPyHm1JKbm7+663bMvzymhkl4",
   "/jcd/1/4/3":"sha256-jL4f47fF82LuwcrOrSyckA4SWrlElfARHkW6kYo1JdI",
   "/jcd/1/5/3":"sha256-GKNxxqlLRarbyBNh7hc/4lbZAdK6B0kMRf1AMRWPkSo"
  }
}

In the next PASSporT example, a jCard is linked via HTTPS URL using "jcl", and a jCard file is served at a particular URL ๐ŸŒ.

Here's the example jCard JSON file hosted at https://example.com/qbranch.json:

["vcard",
  [ ["version",{},"text","4.0"],
    ["fn",{},"text","Q Branch"],
    ["org",{},"text","MI6;Q Branch Spy Gadgets"],
    ["photo",{},"uri","https://example.com/photos/q-256x256.png"],
    ["logo",{},"uri","https://example.com/logos/mi6-256x256.jpg"],
    ["logo",{},"uri","https://example.com/logos/mi6-64x64.jpg"]
  ]
]

For that referenced jCard, the matching PASSporT claims object would look like this ๐ŸŽ€:

{
  "crn": "Rendezvous for Little Nellie",
  "orig": {"tn": "12025551000"},
  "dest": {"tn": ["12155551001"]},
  "iat": 1443208345,
  "rcd": {
    "nam": "Q Branch Spy Gadgets",
    "jcl": "https://example.com/qbranch.json"
  },
  "rcdi": {
   "/jcl":"sha256-qCn4pEH6BJu7zXndLFuAP6DwlTv5fRmJ1AFkqftwnCs",
   "/jcl/1/3/3":"sha256-RojgWwU6xUtI4q82+kHPyHm1JKbm7+663bMvzymhkl4",
   "/jcl/1/4/3":"sha256-jL4f47fF82LuwcrOrSyckA4SWrlElfARHkW6kYo1JdI",
   "/jcl/1/5/3":"sha256-GKNxxqlLRarbyBNh7hc/4lbZAdK6B0kMRf1AMRWPkSo"
  }
}

And here's an "rcd" PASSporT that uses "nam" and "icn" keys with "rcdi" for the calling name and the referenced icon image content ๐ŸŒˆ:

{
  "crn": "Rendezvous for Little Nellie",
  "orig": {"tn": "12025551000"},
  "dest": {"tn": ["12155551001"]},
  "iat": 1443208345,
  "rcd": {
    "nam": "Q Branch Spy Gadgets",
    "icn": "https://example.com/photos/q-256x256.png"
  },
  "rcdi": {
    "/nam": "sha256-sM275lTgzCte+LHOKHtU4SxG8shlOo6OS4ot8IJQImY",
    "/icn": "sha256-RojgWwU6xUtI4q82+kHPyHm1JKbm7+663bMvzymhkl4"
  }
}

9. Compact Form of "rcd" PASSporT ๐Ÿฆ‹

9.1. Compact Form of the "rcd" PASSporT Claim

okay so the compact form of an "rcd" PASSporT claim, defined in [RFC8225], Section 7, has a few restrictions we're about to go through ๐Ÿ’…. It mostly follows the standard PASSporT compact form procedures though, so it's not a total glow-up from scratch ๐Ÿฆ‹. ngl the big thing to know is that compact form only carries the signature from the PASSporT โœจ. That means the receiver has to rebuild all the other PASSporT claims from the SIP header fields, as discussed in Section 4.1 of [RFC8224].

so for the "nam" claim: if you're using SIP, rebuild it from the display-name string in the From header field ๐ŸŒธ. For other protocols, if there's a display name field, use that string. If there isn't one, the string should be an empty string, e.g., "" ๐Ÿซถ.

the "jcl" and "jcd" claims MUST NOT be used with compact form ๐Ÿ™ˆ. bc the integrity rules and URI reference rules defined in this document would lead to a set of constraints that is too restrictive ๐Ÿ’€. future specs may revisit this and propose a consistent, comprehensive way to handle integrity and security of information, and give specific guidance for other protocol usage ๐Ÿงš.

9.2. Compact Form of the "rcdi" PASSporT Claim

the compact form of a PASSporT using an "rcdi" claim is not supported ๐Ÿ˜ญ. so if "rcdi" is required, compact form MUST NOT be used ๐Ÿšซ.

9.3. Compact Form of the "crn" PASSporT Claim

compact form of a "crn" PASSporT claim shall be reconstructed using the "call-reason" parameter of a Call-Info header, as defined by [RFC9796] ๐Ÿ’–.

10. Third-Party Uses ๐ŸŒˆ

okay this one is giving main character energy ๐Ÿ‘‘. rich data about a call can come from an originating authentication service, sure, but an intermediary in the call path can also grab rich call data by querying a third-party service. that service basically acts like a STIR Authentication Service, generating its own PASSporT, and that PASSporT could get attached to a call by either the originating or terminating side ๐ŸŽ€.

here's the catch: this third-party PASSporT is attesting info about the calling number, not the call or the caller themselves ๐Ÿ‘€. so its RCD MUST NOT be used when a call doesn't have a first-party PASSporT that assures verification services the calling party number isn't spoofed ๐Ÿ™…โ€โ™€๏ธ. the whole point of a third-party PASSporT is for when the originating side doesn't supply a display-name for the caller, so some entity in the call path asks a third-party service for rich caller data instead ๐Ÿ“.

in telephone land today, a third-party info service often gets queried with the calling party's number to figure out who's calling, and other helpful info could ride along over that same interface ๐Ÿ“ž. the real value of using a PASSporT for this is that the third party's signature stays over the data, and the PASSporT can be passed from intermediaries down to endpoint devices ๐Ÿ’œ. basically these use cases are a sub-case of out-of-band use cases [RFC8816] ๐ŸŒธ. how you discover third-party services is outside the scope of this document, so we're not going there ๐Ÿ™ˆ.

let's do an intermediary example with SIP ๐Ÿงš. a SIP INVITE carries a display name in its From header field value, plus an initial PASSporT object without the "rcd" claim. when a terminating verification service running at a SIP proxy server gets this request and sees the signature is valid, it might query a third-party service that maps phone numbers to calling party names ๐Ÿ”. once it gets back a PASSporT from that third party, the terminating side could add a new Identity header field to the request carrying that third-party PASSporT object. then it forwards the INVITE on to the terminating user agent. if the display name in the PASSporT object matches, or is string-equivalent to, the display name in the INVITE, the name would presumably get rendered to the end user by the terminating user agent ๐Ÿซถ.

a very similar flow could happen with an intermediary closer to where the call starts. presumably a service like that could live at an originating network, so the systems that sign for calling party numbers are decoupled from the systems that provide rich data about calls ๐Ÿง.

in an alternative case, the terminating user agent itself might query a third-party service ๐Ÿ“ฑ. then no new Identity header field gets generated. the terminating user agent might just get a PASSporT object back from the third party and use the "rcd" field in it as a calling name to show users while alerting ๐Ÿ””.

in the traditional telephone network, the business relationship between calling customers and their phone service providers is the ultimate root of info about a caller's name ๐Ÿ’ผ. but other stuff, like crowdsourced reputation scores, might come from third parties ๐Ÿ“Š. when those elements are present, they MUST be in a third-party "rcd" PASSporT that uses the "iss" claim, which the next section covers ๐Ÿ’….

10.1. Signing as a Third Party

a third-party PASSporT has an "iss" element that tells it apart from first-party PASSporTs ๐Ÿชช. third-party "rcd" PASSporTs get signed with credentials that have no authority over the identity showing up in the "orig" element of the PASSporT claims ๐Ÿ™…โ€โ™€๏ธ. the presence of "iss" means a different category of credential signed this PASSporT, compared to the certificates (as defined in [RFC8226]) that sign STIR calls. instead, it's a certificate identifying the source of the "rcd" data ๐ŸŽ€. how those credentials get issued and managed is outside the scope of this document ๐Ÿคทโ€โ™€๏ธ. however, the value of "iss" MUST reflect the Subject of the certificate used to sign a third-party PASSporT ๐Ÿ”.

how the Subject field of the certificate gets reflected is out of scope here too ๐Ÿ™ˆ. it's left to the certificate governance policies that define how to map the "iss" value in the PASSporT to the Subject field in the certificate ๐Ÿ“œ. relying parties in STIR have always been left to make their own authorization calls about whether to trust PASSporT signers ๐Ÿ’…. in the third-party case, an entity explicitly asked a service for the PASSporT object, so it may be some external trust or business relationship that gets the relying party to trust it ๐Ÿค.

here's an example of a PASSporT claims object issued by a third party โœจ:

{  "orig":{"tn":"12025551000"},
   "dest":{"tn":["12025551001"]},
   "iat":1443208345,
   "iss":"Zorin Industries",
   "rcd":{"nam":"James St. John Smythe"} }

10.2. Verification Using Third-Party RCD

okay the third-party "rcd" PASSporT cases must be considered in the verification service ๐Ÿ•ต๏ธโ€โ™€๏ธ. why? bc an attacker could try to cut and paste a third-party PASSporT into a SIP request, hoping to get the terminating user agent to render the display name or confidence values in it for a call that should have zero of that assurance ๐Ÿ˜ค.

following the rules of [RFC8225], and especially when there are multiple identity headers (like an "rcd" and a "shaken" PASSporT from two different signing providers), a verification service MUST determine two things ๐Ÿซถ. first, that the calling party number shown in the "orig" of the "rcd" PASSporT matches the calling party number of the call it received. second, that the "iat" field of the "rcd" PASSporT falls within the date interval the verification service would normally accept for a PASSporT โฐ. it's also possible that when multiple identity headers are present, only the verified identity info should be shown to an end user ๐Ÿ‘€.

verification services may change their authorization policies for the credentials they accept to sign PASSporTs when third parties generate the PASSporT objects, per Section 10.1 ๐Ÿฆ‹. that can include accepting a valid signature over a PASSporT even when it's signed with a credential that doesn't attest authority over the identity in the "orig" claim, as long as the verification service has some other reason to trust the signer ๐Ÿค. no further guidance on verification service authorization policy is given here, so that's on you ๐Ÿ’….

11. Levels of Assurance ๐Ÿ†

a set of "rcd" claims can come from first-party providers that are directly authorized to sign PASSporTs in the STIR ecosystem, or from third-party providers that have indirect or delegated authority to sign PASSporTs ๐ŸŒˆ. relying parties could benefit from an extra claim that says who the attesting party to the caller is, in the form of a uniquely identifiable name ๐Ÿชช.

even in first-party cases, the Communications Service Provider (CSP) that a number was assigned to might hand the number off to a reseller, who then sells it to an enterprise. in that case the CSP might have very little insight into the caller's name ๐Ÿ˜ฌ. in third-party cases, a caller's name could come from pretty much any data source, anywhere on a spectrum from public data scraped off web searches all the way to a direct business relationship with the caller ๐Ÿ”Ž.

since multiple PASSporTs can be tied to the same call, a verification service could potentially get attestations of the caller name from multiple sources, each with different levels of granularity or accuracy ๐Ÿ“Š. so third-party PASSporTs that carry "rcd" data are RECOMMENDED to also carry an indication of who generated the PASSporT, in the form of the 'iss' claim ๐Ÿ’–.

12. Use of "rcd" PASSporTs in SIP ๐Ÿ“ž

this section covers the SIP-specific usage for "rcd" PASSporTs in the SIP Identity header field value ๐ŸŽ€. other protocols that use PASSporT may define their own guidance for "rcd" PASSporTs, so keep an eye out for that ๐Ÿงš.

12.1. Authentication Service Behavior for SIP Protocol ๐Ÿ“žโœจ

okay so, an authentication service making a PASSporT with an rcd claim MAY include a PASSporT extension (ppt value) of rcd ๐Ÿ’– Third-party authentication services following the behavior in Section 10.1 MUST include a PASSporT extension value of rcd. If the PASSporT extension does contain an rcd, then any SIP authentication services MUST add a PASSporT extension ppt parameter to the Identity header field containing that PASSporT with a value of rcd. The resulting Identity header field might look like this:

   Identity: sv5CTo05KqpSmtHt3dcEiO/1CWTSZtnG3iV+1nmurLXV/HmtyNS7Ltrg9
          dlxkWzoeU7d7OV8HweTTDobV3itTmgPwCFjaEmMyEI3d7SyN21yNDo2ER/Ovgt
          w0Lu5csIppPqOg1uXndzHbG7mR6Rl9BnUhHufVRbp51Mn3w0gfUs=;
          info=<https://biloxi.example.org/biloxi.cer>;alg=ES256;
          ppt="rcd"

So by default when we're using SIP, an authentication service figures out the rcd value ๐Ÿ”ฅ, specifically only the nam key value, from the display-name part of the From header field value of the request. Sometimes for certain calls it may come from the P-Asserted-ID header instead. It's totally up to authentication service policy how it fills in the nam key ๐Ÿง . That policy MAY also match or be determined by other fields in the request, customer profile data, or access to external services. If the authentication service generates an rcd claim with a nam value that is not string-equivalent to the From header field display-name value, it MUST use the full form of the PASSporT object in SIP. ๐Ÿšจ

Also, [RFC9796] defines a Call-Info header field that MAY be used as a source of RCD information ๐ŸŽ€, which an authentication service uses to build the right PASSporT RCD claim types.

Note also, as a best practice ๐Ÿง, the accuracy and legitimacy of Rich Call Data information included in the claims is RECOMMENDED to follow a trust framework that is out of scope of this document. Just like telephone numbers in the STIR framework, Rich Call Data should go through some kind of vetting process by an entity that's the authority on whether that info is accurate and legit. That includes how and from whom the authentication service receives the info. For example, using Call-Info over SIP as a trusted source of RCD on the authentication side is NOT RECOMMENDED ๐Ÿ™…


12.2. Verification Service Behavior for SIP Protocol ๐Ÿ”

okay, so [RFC8224], Section 6.2, Step 5 says future specs that define ppt values need to describe any extra verifier behavior that's specific to SIP ๐Ÿ“‹. The general verification steps in Section 8.1 should be followed, but the paragraphs below spill the specifics for building a verification service with SIP ๐Ÿ’œ.

If the PASSporT is in compact form, the verification service MUST extract the display-name from the From header field value (if there is one), and MUST use that as the string value for the nam key when it recomputes the header and claims of the PASSporT object. Plus, if there's a Call-Info header field as defined in [RFC9796], the jcard JSON object value MUST be used to build the jcd key value when it recomputes the header and claims of the PASSporT object. If the signature checks out over the recomputed object, then verification counts as successful โœ…

If the PASSporT is in full form with a PASSporT extension value of rcd, the verification service MUST extract the value associated with the rcd claim nam key in the object. If the PASSporT signature is verified successfully, the verification service MUST additionally compare the string value of the rcd claim nam key value with the From header field value or the preferred value. The preferred value depends on the local policy of the SIP network technique that conveys the display name string through a field other than the From header field to interoperate with this specification (e.g., P-Asserted-Identity), as discussed in [RFC8224]. Similarly, "jcd", "jcl", "icn", "apn", or "crn" elements can be used optionally (based on local policy for devices that support it) to populate a Call-Info header field following the format of [RFC9796] ๐ŸŒธ. If PASSporT RCD claims types defined in the future are present, they should follow similar defined procedures and policies.

The behavior of a SIP User Agent Server (UAS) when it gets an INVITE or other type of session initiation request containing a PASSporT object with an "rcd" claim is mostly up to implementation policy ๐Ÿคทโ€โ™€๏ธ. Most of the time, implementations would show this calling party name info to the user while alerting ๐Ÿ“ฑ. Any UI additions that express confidence in the veracity of this info are outside the scope of this specification ๐Ÿ™ˆ


13. Using "rcd", "rcdi", and "crn" as Additional Claims to Other PASSporT Extensions ๐Ÿฆ‹

Rich Call Data, including calling name information (the most common example ๐Ÿ’…), is often data that adds to the personal communications information defined in the core PASSporT data required to support the security properties defined in [RFC8225]. For cases where the entity originating the personal communications supports the authentication service for the calling identity and is the authority of the Rich Call Data, the authentication service can skip creating multiple Identity header fields for multiple PASSporT extensions. Instead, it can directly add the "rcd" claim to a PASSporT that authenticates the calling identity ๐Ÿซถ

13.1. Procedures for Applying RCD Claims as Claims Only ๐Ÿงฉ

For a given PASSporT using some other extension than "rcd", the Authentication Service MAY additionally include the "rcd" defined in Section 5, "rcdi" defined in Section 6, and "crn" defined in Section 7 claims. This results in a set of claims that match the original intended extension, plus the "rcd" claim โœจ

The verification service that receives the PASSporT, if it supports this specification and chooses to, should interpret the "rcd" claim as simply an additional claim meant to deliver and/or validate delivered Rich Call Data ๐ŸŒˆ

13.2. Example for Applying RCD Claims as Claims Only ๐ŸŽ€

okay bestie, [RFC8588] is the PASSporT extension supporting the Signature-based Handling of Asserted information using toKENs (SHAKEN) specification [ATIS-1000074.v003] ๐Ÿ”ฅ. A common case is an authentication service sitting in a CSP network alongside the authority over the calling name used for the call. Instead of needing two identity headers, the CSP authentication service can apply both the SHAKEN PASSporT claims and extension, and simply add the "rcd" required claims defined in this document ๐Ÿ’–

For example, the PASSporT claims for the "shaken" PASSporT with "rcd" claims would look like this:

   Protected Header
   {
      "alg":"ES256",
      "typ":"passport",
      "ppt":"shaken",
      "x5u":"https://cert.example.org/passport.cer"
   }
   Payload
   {
      "attest":"A",
      "dest":{"tn":["12025551001"]},
      "iat":1443208345,
      "orig":{"tn":"12025551000"},
      "origid":"123e4567-e89b-12d3-a456-426655440000",
      "rcd":{"nam":"James Bond"}
   }

A verification service that understands and supports the claims defined in the "rcd" and "shaken" PASSporT extensions can receive the above PASSporT and interpret both the "shaken" claims and the "rcd" claims ๐Ÿงš

If the verification service only understands the "shaken" PASSporT extension claims and doesn't support the "rcd" PASSporT extension or claims, then the "rcd" claim in this example is used during PASSporT signature validation but is otherwise ignored and disregarded ๐Ÿ™ƒ


14. Further Information Associated with Callers ๐Ÿ•ต๏ธโ€โ™€๏ธ๐Ÿ’…

Beyond naming info and the info that can be in a jCard object [RFC7095], there may be extra human-readable info about the calling party that should be shown to the end user, so the called party can decide whether or not to pick up the phone ๐Ÿ“ž๐Ÿ˜ญ. This isn't limited to info about the caller. It also includes info about the call itself, which may come from analytics that figure out (based on call patterns or similar data) whether the call is one the called party wants to receive. Such data could include:

  • information related to the location of the caller, or
  • any organizations or institutions that the caller is associated with, or even categories of institutions (whether this a government agency, a bank, or what have you), or
  • hyperlinks to images, such as logos or pictures of faces, or to similar external profile information, or
  • information processed by an application before rendering it to a user, like social networking data that shows that an unknown caller is a friend-of-a-friend, or reputation scores derived from crowdsourcing, or confidence scores based on broader analytics about the caller and callee.

All of these data elements would benefit from the secure attestations provided by the STIR and PASSporT frameworks ๐Ÿ”. A new IANA registry has been defined to hold potential values of the "rcd" array; see Section 15.3. Specific extensions to the "rcd" PASSporT claim are left for future specification ๐ŸŒŸ

There are a few ways RCD can be extended in the future ๐ŸŒท. jCard is an extensible object, and the key/values in the RCD claim object can also be extended. General guidance for future extensibility that the authors followed is that jCard typically should refer to data that references the caller as an individual or entity, whereas other claims, such as "crn", refer to data regarding the specific call. There may be other considerations discovered in the future, but this logical grouping of data should be followed to the extent possible for future extensibility ๐Ÿง ๐Ÿ’œ

15. IANA Considerations ๐Ÿ›๏ธโœจ

15.1. JSON Web Token Claim ๐Ÿชช

Per this document, IANA has added three new claims to the "JSON Web Token Claims" registry as defined in [RFC7519] ๐ŸŽ‰

   Claim Name:  "rcd"
   Claim Description:  Rich Call Data Information
   Change Controller:  IETF
   Reference:  RFC 9795

   Claim Name:  "rcdi"
   Claim Description:  Rich Call Data Integrity Information
   Change Controller:  IETF
   Reference:  RFC 9795

   Claim Name:  "crn"
   Claim Description:  Call Reason
   Change Controller:  IETF
   Reference:  RFC 9795

15.2. Personal Assertion Token (PASSporT) Extensions ๐Ÿฆ„

Per this document, IANA has added a new entry to the "Personal Assertion Token (PASSporT) Extensions" registry for the type "rcd", which is specified in this document ๐Ÿ’–

15.3. PASSporT RCD Claim Types ๐ŸŽ€

okay so IANA made a brand new registry called "PASSporT RCD Claim Types" ๐Ÿ’…, and it lives inside the "Personal Assertion Token (PASSporT)" registry group. Registering new PASSporT RCD claim types shall be under the Specification Required policy [RFC8126], so there's a gatekeeper ๐Ÿ”.

The registry starts out with five claim name values, nam, apn, icn, jcd, and jcl, all specified in this document ๐Ÿฆ‹. The columns are "Name" and "Reference". Any new registrations should consist of only the name and the reference document ๐Ÿ’–.

There's also an expert review obligation ๐Ÿ”. The designated expert should check that a proposed new PASSporT RCD claim type doesn't potentially conflict or overlap with how the other types in the registry are used or interpreted. no double-booking the vibe, bestie ๐Ÿ’€


16. Security Considerations ๐Ÿ”

okay this part is SERIOUS, bestie ๐Ÿ˜ญ. Signing the info inside a "rcd" PASSporT (identities, identifiers, alternate identities or identifiers, images, logos, physical addresses, or whatever else) should go through a vetting process where an authoritative entity follows an appropriate, consistent policy. That policy is defined and governed by the ecosystem using RCD and the STIR framework ๐Ÿ‘‘. It can look like a lot of different things depending on the setup and the policy requirements of the ecosystem, so it's out of scope for this doc ๐Ÿ™ˆ. BUT the general chain of trust matters SO much. Signers of "rcd" PASSporTs are either directly authoritative or have been delegated authority through certificates, using JWT Claim Constraints and integrity mechanisms defined in this and related documents. keeping that chain intact is critical for the integrity of the whole ecosystem using this and other STIR-related specifications ๐Ÿซถ.

Revealing info like someone's name, location, and affiliation necessarily comes with privacy risks ๐Ÿ˜ฌ. Baseline PASSporT has no particular confidentiality requirement, because the info it signs is already carried in the clear in many current base protocols (SIP, for example) ๐Ÿ™ƒ. Transport-level security can hide those SIP fields from eavesdroppers, and the same confidentiality mechanisms would protect any PASSporT(s) carried in SIP ๐Ÿ”’.

Dereferencing and downloading any RCD URI-linked resources during verification, either in-network or on a device, could give some level of info about calling patterns ๐Ÿ‘€. So this should be considered when making these resources available ๐Ÿงš.

The use of JWT Claim Constraints, a mechanism defined in [RFC8226] and extended in [RFC9118], can constrain RCD info in the public certificate by putting that info in the certificate. Depending on the availability in the deployment of the PKI system, this may present a privacy issue ๐Ÿ˜ณ. The use of the "rcdi" claim and digests for representing JWT claim contents is RECOMMENDED for preventing that info from being exposed through certificates that are often publicly accessible and available ๐ŸŒธ.

Computing "rcdi" digests for URIs requires loading the referenced content, so it would be best practice to validate that content when the "rcdi" or corresponding JWT claim constraint value is created ๐Ÿง. Check for content that may cause issues for verification services, or that doesn't follow the behavior defined in this document. Think unreasonably sized data, the inclusion of recursive URI references, etc. Along the same lines, the verification service should also use precautionary best practices to avoid attacks when accessing URI-linked content ๐Ÿ›ก๏ธ.

As general guidance, the use of URLs and URIs that reference potentially dangerous or intentionally harmful content should be considered in implementing this specification โš ๏ธ. [RFC3986], Section 7 has good additional guidance to consider when communicating or dereferencing URLs and URIs ๐Ÿฆ‹.


16.1. Use of JWT Claim Constraints in Delegate Certificates to Exclude Unauthorized Claims ๐Ÿšซ

this can apply to any PASSporT signed with a STIR Delegate Certificate [RFC9060] ๐ŸŽ€. Here's the important part: when you constrain PASSporTs to include specific claims or claim contents, you also have to think about attacks by non-authorized signers. They might include other PASSporT claims that weren't originally vetted by the authorized entity that provided the delegate certificate ๐Ÿ‘€. Using JWT claims constraints (as defined in [RFC9118]) to stop claims beyond the ones defined in this document from being included may need to be considered ๐Ÿ’œ.


17. References ๐Ÿ“š

17.1. Normative References ๐ŸŒŸ

   [IANA-COSE-ALG]
              IANA, "COSE Algorithms",
              <https://www.iana.org/assignments/cose>.

   [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>.

   [RFC3261]  Rosenberg, J., Schulzrinne, H., Camarillo, G., Johnston,
              A., Peterson, J., Sparks, R., Handley, M., and E.
              Schooler, "SIP: Session Initiation Protocol", RFC 3261,
              DOI 10.17487/RFC3261, June 2002,
              <https://www.rfc-editor.org/info/rfc3261>.

   [RFC3986]  Berners-Lee, T., Fielding, R., and L. Masinter, "Uniform
              Resource Identifier (URI): Generic Syntax", STD 66,
              RFC 3986, DOI 10.17487/RFC3986, January 2005,
              <https://www.rfc-editor.org/info/rfc3986>.

   [RFC4648]  Josefsson, S., "The Base16, Base32, and Base64 Data
              Encodings", RFC 4648, DOI 10.17487/RFC4648, October 2006,
              <https://www.rfc-editor.org/info/rfc4648>.

   [RFC6234]  Eastlake 3rd, D. and T. Hansen, "US Secure Hash Algorithms
              (SHA and SHA-based HMAC and HKDF)", RFC 6234,
              DOI 10.17487/RFC6234, May 2011,
              <https://www.rfc-editor.org/info/rfc6234>.

   [RFC6901]  Bryan, P., Ed., Zyp, K., and M. Nottingham, Ed.,
              "JavaScript Object Notation (JSON) Pointer", RFC 6901,
              DOI 10.17487/RFC6901, April 2013,
              <https://www.rfc-editor.org/info/rfc6901>.

   [RFC7095]  Kewisch, P., "jCard: The JSON Format for vCard", RFC 7095,
              DOI 10.17487/RFC7095, January 2014,
              <https://www.rfc-editor.org/info/rfc7095>.

   [RFC7519]  Jones, M., Bradley, J., and N. Sakimura, "JSON Web Token
              (JWT)", RFC 7519, DOI 10.17487/RFC7519, May 2015,
              <https://www.rfc-editor.org/info/rfc7519>.

   [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>.

   [RFC8224]  Peterson, J., Jennings, C., Rescorla, E., and C. Wendt,
              "Authenticated Identity Management in the Session
              Initiation Protocol (SIP)", RFC 8224,
              DOI 10.17487/RFC8224, February 2018,
              <https://www.rfc-editor.org/info/rfc8224>.

   [RFC8225]  Wendt, C. and J. Peterson, "PASSporT: Personal Assertion
              Token", RFC 8225, DOI 10.17487/RFC8225, February 2018,
              <https://www.rfc-editor.org/info/rfc8225>.

   [RFC8226]  Peterson, J. and S. Turner, "Secure Telephone Identity
              Credentials: Certificates", RFC 8226,
              DOI 10.17487/RFC8226, February 2018,
              <https://www.rfc-editor.org/info/rfc8226>.

   [RFC8259]  Bray, T., Ed., "The JavaScript Object Notation (JSON) Data
              Interchange Format", STD 90, RFC 8259,
              DOI 10.17487/RFC8259, December 2017,
              <https://www.rfc-editor.org/info/rfc8259>.

   [RFC8588]  Wendt, C. and M. Barnes, "Personal Assertion Token
              (PaSSporT) Extension for Signature-based Handling of
              Asserted information using toKENs (SHAKEN)", RFC 8588,
              DOI 10.17487/RFC8588, May 2019,
              <https://www.rfc-editor.org/info/rfc8588>.

   [RFC9060]  Peterson, J., "Secure Telephone Identity Revisited (STIR)
              Certificate Delegation", RFC 9060, DOI 10.17487/RFC9060,
              September 2021, <https://www.rfc-editor.org/info/rfc9060>.

   [RFC9118]  Housley, R., "Enhanced JSON Web Token (JWT) Claim
              Constraints for Secure Telephone Identity Revisited (STIR)
              Certificates", RFC 9118, DOI 10.17487/RFC9118, August
              2021, <https://www.rfc-editor.org/info/rfc9118>.

   [RFC9796]  Wendt, C. and J. Peterson, "SIP Call-Info Parameters for
              Rich Call Data", RFC 9796, DOI 10.17487/RFC9796, July
              2025, <https://www.rfc-editor.org/info/rfc9796>.

17.2. Informative References ๐Ÿ’ญ

   [ATIS-1000074.v003]
              Alliance for Telecommunications Industry Solutions,
              "Signature-based Handling of Asserted information using
              toKENs (SHAKEN)", ATIS-1000074.v003, August 2022,
              <https://access.atis.org/higherlogic/ws/public/
              download/67436>.

   [RFC3325]  Jennings, C., Peterson, J., and M. Watson, "Private
              Extensions to the Session Initiation Protocol (SIP) for
              Asserted Identity within Trusted Networks", RFC 3325,
              DOI 10.17487/RFC3325, November 2002,
              <https://www.rfc-editor.org/info/rfc3325>.

   [RFC7340]  Peterson, J., Schulzrinne, H., and H. Tschofenig, "Secure
              Telephone Identity Problem Statement and Requirements",
              RFC 7340, DOI 10.17487/RFC7340, September 2014,
              <https://www.rfc-editor.org/info/rfc7340>.

   [RFC8126]  Cotton, M., Leiba, B., and T. Narten, "Guidelines for
              Writing an IANA Considerations Section in RFCs", BCP 26,
              RFC 8126, DOI 10.17487/RFC8126, June 2017,
              <https://www.rfc-editor.org/info/rfc8126>.

   [RFC8816]  Rescorla, E. and J. Peterson, "Secure Telephone Identity
              Revisited (STIR) Out-of-Band Architecture and Use Cases",
              RFC 8816, DOI 10.17487/RFC8816, February 2021,
              <https://www.rfc-editor.org/info/rfc8816>.

   [TS.3GPP.24.229]
              3GPP, "IP multimedia call control protocol based on
              Session Initiation Protocol (SIP) and Session Description
              Protocol (SDP); Stage 3", 16.7.0, 3GPP TS 24.229,
              September 2020,
              <https://www.3gpp.org/ftp/Specs/html-info/24229.htm>.

   [W3C-SubresourceIntegrity]
              Braun, F., Ed., "Subresource Integrity", W3C First Public
              Working Draft, 25 April 2025,
              <https://www.w3.org/TR/2025/WD-sri-2-20250422/>.

Acknowledgements ๐Ÿซถ

huge thanks to David Hancock, Robert Sparks, Russ Housley, Eric Burger, Alec Fenichel, Ben Campbell, Jack Rickard, and Jordan Simpson for helpful suggestions, review, and comments ๐Ÿ’–โœจ

Authors' Addresses ๐Ÿฆ‹

   Chris Wendt
   Somos Inc.
   Email: chris-ietf@chriswendt.net


   Jon Peterson
   TransUnion
   Email: jon.peterson@transunion.com
๐Ÿ“ฆ where this page comes from