RFC 9795
Personal Assertion Token (PASSporT) Extension for Rich Call Data
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 Notice ๐
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:
- 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.
- 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.
- 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
- ietf: rfc9795 2025-07
- ๐ girlified by claude-haiku-5-5 on : a language model's rewrite of the original, under its terms