rfc8946.original | rfc8946.txt | |||
---|---|---|---|---|
Network Working Group J. Peterson | Internet Engineering Task Force (IETF) J. Peterson | |||
Internet-Draft Neustar | Request for Comments: 8946 Neustar | |||
Updates: RFC8224 (if approved) July 13, 2020 | Updates: 8224 February 2021 | |||
Intended status: Standards Track | Category: Standards Track | |||
Expires: January 14, 2021 | ISSN: 2070-1721 | |||
PASSporT Extension for Diverted Calls | Personal Assertion Token (PASSporT) Extension for Diverted Calls | |||
draft-ietf-stir-passport-divert-09 | ||||
Abstract | Abstract | |||
PASSporT is specified in RFC 8225 to convey cryptographically-signed | The Personal Assertion Token (PASSporT) is specified in RFC 8225 to | |||
information about the people involved in personal communications. | convey cryptographically signed information about the people involved | |||
This document extends PASSporT to include an indication that a call | in personal communications. This document extends PASSporT to | |||
has been diverted from its original destination to a new one. This | include an indication that a call has been diverted from its original | |||
information can greatly improve the decisions made by verification | destination to a new one. This information can greatly improve the | |||
services in call forwarding scenarios. Also specified here is an | decisions made by verification services in call forwarding scenarios. | |||
encapsulation mechanism for nesting a PASSporT within another | Also specified here is an encapsulation mechanism for nesting a | |||
PASSporT that assists relying parties in some diversion scenarios. | PASSporT within another PASSporT that assists relying parties in some | |||
diversion scenarios. | ||||
Status of This Memo | This document updates RFC 8224. | |||
This Internet-Draft is submitted in full conformance with the | Status of This Memo | |||
provisions of BCP 78 and BCP 79. | ||||
Internet-Drafts are working documents of the Internet Engineering | This is an Internet Standards Track document. | |||
Task Force (IETF). Note that other groups may also distribute | ||||
working documents as Internet-Drafts. The list of current Internet- | ||||
Drafts is at https://datatracker.ietf.org/drafts/current/. | ||||
Internet-Drafts are draft documents valid for a maximum of six months | This document is a product of the Internet Engineering Task Force | |||
and may be updated, replaced, or obsoleted by other documents at any | (IETF). It represents the consensus of the IETF community. It has | |||
time. It is inappropriate to use Internet-Drafts as reference | received public review and has been approved for publication by the | |||
material or to cite them other than as "work in progress." | Internet Engineering Steering Group (IESG). Further information on | |||
Internet Standards is available in Section 2 of RFC 7841. | ||||
This Internet-Draft will expire on January 14, 2021. | Information about the current status of this document, any errata, | |||
and how to provide feedback on it may be obtained at | ||||
https://www.rfc-editor.org/info/rfc8946. | ||||
Copyright Notice | Copyright Notice | |||
Copyright (c) 2020 IETF Trust and the persons identified as the | Copyright (c) 2021 IETF Trust and the persons identified as the | |||
document authors. All rights reserved. | document authors. All rights reserved. | |||
This document is subject to BCP 78 and the IETF Trust's Legal | This document is subject to BCP 78 and the IETF Trust's Legal | |||
Provisions Relating to IETF Documents | Provisions Relating to IETF Documents | |||
(https://trustee.ietf.org/license-info) in effect on the date of | (https://trustee.ietf.org/license-info) in effect on the date of | |||
publication of this document. Please review these documents | publication of this document. Please review these documents | |||
carefully, as they describe your rights and restrictions with respect | carefully, as they describe your rights and restrictions with respect | |||
to this document. Code Components extracted from this document must | to this document. Code Components extracted from this document must | |||
include Simplified BSD License text as described in Section 4.e of | include Simplified BSD License text as described in Section 4.e of | |||
the Trust Legal Provisions and are provided without warranty as | the Trust Legal Provisions and are provided without warranty as | |||
described in the Simplified BSD License. | described in the Simplified BSD License. | |||
Table of Contents | Table of Contents | |||
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 2 | 1. Introduction | |||
2. Terminology . . . . . . . . . . . . . . . . . . . . . . . . . 4 | 2. Terminology | |||
3. The 'div' PASSporT Type and Claim . . . . . . . . . . . . . . 4 | 3. The "div" PASSporT Type and Claim | |||
4. Using 'div' in SIP . . . . . . . . . . . . . . . . . . . . . 6 | 4. Using "div" in SIP | |||
4.1. Authentication Service Behavior . . . . . . . . . . . . . 6 | 4.1. Authentication Service Behavior | |||
4.2. Verification Service Behavior . . . . . . . . . . . . . . 8 | 4.2. Verification Service Behavior | |||
5. The 'div-o' PASSporT Type . . . . . . . . . . . . . . . . . . 10 | 5. The "div-o" PASSporT Type | |||
5.1. Processing 'div-o' PASSporTs . . . . . . . . . . . . . . 12 | 5.1. Processing "div-o" PASSporTs | |||
6. Definition of 'opt' . . . . . . . . . . . . . . . . . . . . . 13 | 6. Definition of "opt" | |||
7. 'div' and Redirection . . . . . . . . . . . . . . . . . . . . 13 | 7. "div" and Redirection | |||
8. Extending 'div' to work with Service Logic Tracking . . . . . 14 | 8. Extending "div" to Work with Service Logic Tracking | |||
9. Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . 15 | 9. IANA Considerations | |||
10. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 15 | 9.1. JSON Web Token Claims Registrations | |||
10.1. JSON Web Token Claims Registrations . . . . . . . . . . 15 | 9.1.1. "div" registration | |||
10.1.1. 'div' registration . . . . . . . . . . . . . . . . . 15 | 9.1.2. "opt" registration | |||
10.1.2. 'opt' registration . . . . . . . . . . . . . . . . . 16 | 9.2. PASSporT Type Registrations | |||
10.2. PASSporT Type Registrations . . . . . . . . . . . . . . 16 | 10. Privacy Considerations | |||
11. Privacy Considerations . . . . . . . . . . . . . . . . . . . 16 | 11. Security Considerations | |||
12. Security Considerations . . . . . . . . . . . . . . . . . . . 17 | 12. References | |||
13. References . . . . . . . . . . . . . . . . . . . . . . . . . 17 | 12.1. Normative References | |||
13.1. Normative References . . . . . . . . . . . . . . . . . . 17 | 12.2. Informative References | |||
13.2. Informative References . . . . . . . . . . . . . . . . . 18 | Appendix A. Keys for Examples | |||
Appendix A. Appendix A: Keys for Examples . . . . . . . . . . . 19 | Acknowledgments | |||
Author's Address . . . . . . . . . . . . . . . . . . . . . . . . 19 | Author's Address | |||
1. Introduction | 1. Introduction | |||
A Personal Assertion Token (PASSporT [RFC8225]) is a token format | A Personal Assertion Token (PASSporT) [RFC8225] is a token format | |||
based on the JSON Web Token (JWT [RFC7519]) for conveying | based on the JSON Web Token (JWT) [RFC7519] for conveying | |||
cryptographically-signed information about the people involved in | cryptographically signed information about the people involved in | |||
personal communications; it is used by the Secure Telephone Identity | personal communications; it is used by the Secure Telephone Identity | |||
Revisited (STIR [RFC8224]) protocol to convey a signed assertion of | Revisited (STIR) protocol [RFC8224] to convey a signed assertion of | |||
the identity of the participants in real-time communications | the identity of the participants in real-time communications | |||
established via a protocol like SIP. This specification extends | established via a protocol like SIP. This specification extends | |||
PASSporT to include an indication that a call has been diverted from | PASSporT to include an indication that a call has been diverted from | |||
its original destination to a new one. | its original destination to a new one. | |||
Although the STIR problem statement [RFC7340] is focused on | Although the STIR problem statement [RFC7340] is focused on | |||
preventing the impersonation of the caller's identity, which is a | preventing the impersonation of the caller's identity, which is a | |||
common enabler for threats such as robocalling and voicemail hacking | common enabler for threats such as robocalling and voicemail hacking | |||
on the telephone network today, it also provides a signature over the | on the telephone network today, it also provides a signature over the | |||
called number at the time that the authentication service sees it. | called number at the time that the authentication service sees it. | |||
As [RFC8224] Section 12.1 describes, this protection over the | As [RFC8224], Section 12.1 describes, this protection over the | |||
contents of the To header field is intended to prevent a class of | contents of the To header field is intended to prevent a class of | |||
cut-and-paste attacks. If Alice calls Bob, for example, Bob might | cut-and-paste attacks. If Alice calls Bob, for example, Bob might | |||
attempt to cut-and-paste the Identity header field in Alice's INVITE | attempt to cut and paste the Identity header field in Alice's INVITE | |||
into a new INVITE that Bob sends to Carol, and thus be able to fool | into a new INVITE that Bob sends to Carol, and thus be able to fool | |||
Carol into thinking the call came from Alice and not Bob. With the | Carol into thinking the call came from Alice and not Bob. With the | |||
signature over the To header field value, the INVITE Carol sees will | signature over the To header field value, the INVITE Carol sees will | |||
clearly have been destined originally for Bob, and thus Carol can | clearly have been destined originally for Bob, and thus Carol can | |||
view the INVITE as suspect. | view the INVITE as suspect. | |||
However, as [RFC8224] Section 12.1.1 points out, it is difficult for | However, as [RFC8224], Section 12.1.1 points out, it is difficult for | |||
Carol to confirm or reject these suspicions based on the information | Carol to confirm or reject these suspicions based on the information | |||
she receives from the baseline PASSporT object. The common "call | she receives from the baseline PASSporT object. The common "call | |||
forwarding" service serves as a good example of the reality that the | forwarding" service serves as a good example of the reality that the | |||
original called party number is not always the number to which a call | original called party number is not always the number to which a call | |||
is delivered. There are a number of potential ways for | is delivered. There are a number of potential ways for | |||
intermediaries to indicate that such a forwarding operating has taken | intermediaries to indicate that such a forwarding operating has taken | |||
place. The address in the To header field value of SIP requests is | place. The address in the To header field value of SIP requests is | |||
not supposed to change, according to baseline SIP behavior [RFC3261]; | not supposed to change, according to baseline SIP behavior [RFC3261]; | |||
instead, it is the Request-URI that is supposed to be updated when a | instead, it is the Request-URI that is supposed to be updated when a | |||
call is retargeted. Practically speaking, however, many operational | call is retargeted. Practically speaking, however, many operational | |||
environments do alter the To header field. The History-Info header | environments do alter the To header field. The History-Info header | |||
field [RFC7044] was created to store the Request-URIs that are | field [RFC7044] was created to store the Request-URIs that are | |||
discarded by a call in transit. The SIP Diversion header field | discarded by a call in transit. The SIP Diversion header field | |||
[RFC5806], though historic, is still used for this purpose by some | [RFC5806], though historic, is still used for this purpose by some | |||
operators today. Neither of these header fields provide any | operators today. Neither of these header fields provide any | |||
cryptographic assurance of secure redirection, and they both record | cryptographic assurance of secure redirection, and they both record | |||
entries for minor syntactical changes in URIs that do not reflect a | entries for minor syntactical changes in URIs that do not reflect a | |||
change to the actual target of a call. | change to the actual target of a call. | |||
This specification therefore extends PASSporT with an explicit | Therefore, this specification extends PASSporT with an explicit | |||
indication that the original called number in PASSporT no longer | indication that the original called number in PASSporT no longer | |||
reflects the destination to which a call is intended to be delivered. | reflects the destination to which a call is intended to be delivered. | |||
For this purpose, it specifies a Divert PASSporT type ("div") for use | For this purpose, it specifies a Divert PASSporT type ("div") for use | |||
in common SIP retargeting cases; it is expected that in this case, | in common SIP retargeting cases; it is expected that in this case, | |||
SIP INVITE requests will carry multiple Identity header fields, each | SIP INVITE requests will carry multiple Identity header fields, each | |||
containing its own PASSporT. Throughout this document, PASSporTs | containing its own PASSporT. Throughout this document, PASSporTs | |||
that contain a "div" element will be referred to as "div" PASSporTs. | that contain a "div" element will be referred to as "div" PASSporTs. | |||
Verification services and the relying parties who make authorization | Verification services and the relying parties who make authorization | |||
decisions about communications may use this diversion indication to | decisions about communications may use this diversion indication to | |||
confirm that a legitimate retargeting of the call has taken place, | confirm that a legitimate retargeting of the call has taken place, | |||
rather than a cut-and-paste attack. For out-of-band | rather than a cut-and-paste attack. For out-of-band use cases | |||
[I-D.ietf-stir-oob] use cases, and other non-SIP applications of | [RFC8816] and other non-SIP applications of PASSporT, a separate | |||
PASSporT, a separate "div-o" PASSporT type is also specified, which | "div-o" PASSporT type is also specified, which defines an "opt" | |||
defines an "opt" PASSporT element for carrying nested PASSporTs | PASSporT element for carrying nested PASSporTs within a PASSporT. | |||
within a PASSporT. These shall in turn be referred to in this | These shall in turn be referred to in this document as "div-o" | |||
document as "div-o" PASSporTs. | PASSporTs. | |||
2. Terminology | 2. Terminology | |||
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | |||
"SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | |||
"OPTIONAL" in this document are to be interpreted as described in BCP | "OPTIONAL" in this document are to be interpreted as described in | |||
14 [RFC2119] [RFC8174] when, and only when, they appear in all | BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all | |||
capitals, as shown here. | capitals, as shown here. | |||
3. The 'div' PASSporT Type and Claim | 3. The "div" PASSporT Type and Claim | |||
This specification defines a PASSporT [RFC8225] type called "div" | This specification defines a PASSporT [RFC8225] type called "div", | |||
that may be employed by authentication services located at | which may be employed by authentication services located at | |||
retargeting entities. All "div" PASSporTs MUST contain a new JSON | retargeting entities. All "div" PASSporTs MUST contain a new JSON | |||
Web Token "div" claim, also specified in this document, which | Web Token "div" claim, also specified in this document, which | |||
indicates a previous destination for a call during its routing | indicates a previous destination for a call during its routing | |||
process. When a retargeting entity receives a call signed with a | process. When a retargeting entity receives a call signed with a | |||
PASSporT, it may act as an authentication service and create a new | PASSporT, it may act as an authentication service and create a new | |||
PASSporT containing the "div" claim to attach to the call. | PASSporT containing the "div" claim to attach to the call. | |||
Note that a new PASSporT is only necessary when the canonical form of | Note that a new PASSporT is only necessary when the canonical form of | |||
the "dest" identifier (per the canonicalization procedures in | the "dest" identifier (per the canonicalization procedures in | |||
[RFC8224] Section 8.3) changes due to this retargeting. If the | [RFC8224], Section 8.3) changes due to this retargeting. If the | |||
canonical form of the "dest" identifier is not changed during | canonical form of the "dest" identifier is not changed during | |||
retargeting, then a new PASSporT with a "div" claim MUST NOT be | retargeting, then a new PASSporT with a "div" claim MUST NOT be | |||
produced. | produced. | |||
The headers of the new PASSporTs generated by retargeting entities | The headers of the new PASSporTs generated by retargeting entities | |||
MUST include the "div" PASSporT type, and an "x5u" field pointing to | MUST include the "div" PASSporT type and an "x5u" field pointing to a | |||
a credential that the retargeting entity controls. "div" PASSporTs | credential that the retargeting entity controls. "div" PASSporTs MUST | |||
MUST use full form instead of compact form. The new PASSporT header | use full form instead of compact form. The new PASSporT header will | |||
will look as follows: | look as follows: | |||
{ "typ":"passport", | { "typ":"passport", | |||
"ppt":"div", | "ppt":"div", | |||
"alg":"ES256", | "alg":"ES256", | |||
"x5u":"https://www.example.com/cert.cer" } | "x5u":"https://www.example.com/cert.cer" } | |||
A "div" PASSporT claims set is populated with elements drawn from the | A "div" PASSporT claims set is populated with elements drawn from the | |||
PASSporT(s) received for a call by the retargeting entity: at a high | PASSporT(s) received for a call by the retargeting entity; at a high | |||
level, the original identifier for the called party in the "dest" | level, the original identifier for the called party in the "dest" | |||
object will become the "div" claim in the new PASSporT. If the | object will become the "div" claim in the new PASSporT. If the | |||
"dest" object of the original PASSporT contains multiple identifiers, | "dest" object of the original PASSporT contains multiple identifiers, | |||
because it contains one or more name/value pairs with an array as its | because it contains one or more name/value pairs with an array as its | |||
value, the retargeting entity MUST select only one identifier from | value, the retargeting entity MUST select only one identifier from | |||
the value(s) of the "dest" object to occupy the value of the "div" | the value(s) of the "dest" object to occupy the value of the "div" | |||
field in the new PASSporT. Moreover, it MUST select an identifier | field in the new PASSporT. Moreover, it MUST select an identifier | |||
that is within the scope of the credential that the retargeting | that is within the scope of the credential that the retargeting | |||
entity will specify in the "x5u" of the PASSporT header (as described | entity will specify in the "x5u" of the PASSporT header (as described | |||
below). | below). | |||
The new target for the call selected by the retargeting entity | The new target for the call selected by the retargeting entity | |||
becomes the value of the "dest" object of the new PASSporT. The | becomes the value of the "dest" object of the new PASSporT. The | |||
"orig" object MUST be copied into the new PASSporT from the original | "orig" object MUST be copied into the new PASSporT from the original | |||
PASSporT received by the retargeting entity. The retargeting entity | PASSporT received by the retargeting entity. The retargeting entity | |||
SHOULD retain the "iat" object from the original PASSporT, though if | SHOULD retain the "iat" object from the original PASSporT, though if | |||
in the underlying signaling protocol (e.g. SIP) the retargeting | in the underlying signaling protocol (e.g., SIP) the retargeting | |||
entity changes the date and time information in the retargeted | entity changes the date and time information in the retargeted | |||
request, the new PASSporT should instead reflect that date and time. | request, the new PASSporT should instead reflect that date and time. | |||
No other claims or extensions are to be copied from the original | No other claims or extensions are to be copied from the original | |||
PASSporT to the "div" PASSporT. | PASSporT to the "div" PASSporT. | |||
So, for an original PASSporT claims set of the form: | So, for an original PASSporT claims set of the form: | |||
{ "dest":{"tn":["12155551213"]}, | { "dest":{"tn":["12155551213"]}, | |||
"iat":1443208345, | "iat":1443208345, | |||
"orig":{"tn":"12155551212"} } | "orig":{"tn":"12155551212"} } | |||
If the retargeting entity is changing the target from 12155551213 to | If the retargeting entity is changing the target from 12155551213 to | |||
12155551214, the claims set of a "div" PASSpoRT generated by the | 12155551214, the claims set of a "div" PASSporT generated by the | |||
retargeting entity would look as follows: | retargeting entity would look as follows: | |||
{ "dest":{"tn":["12155551214"]}, | { "dest":{"tn":["12155551214"]}, | |||
"div":{"tn":"121555551213"}, | "div":{"tn":"121555551213"}, | |||
"iat":1443208345, | "iat":1443208345, | |||
"orig":{"tn":"12155551212"} } | "orig":{"tn":"12155551212"} } | |||
The combined full form PASSporT (with a signature covered by the | The combined full form PASSporT (with a signature covered by the | |||
ES256 keys given in Appendix A) would look as follows: | ES256 keys given in Appendix A) would look as follows: | |||
eyJhbGciOiJFUzI1NiIsInBwdCI6ImRpdiIsInR5cCI6InBhc3Nwb3J0IiwieDV1Ij \ | eyJhbGciOiJFUzI1NiIsInBwdCI6ImRpdiIsInR5cCI6InBhc3Nwb3J0IiwieDV1Ij \ | |||
oiaHR0cHM6Ly93d3cuZXhhbXBsZS5jb20vY2VydC5jZXIifQ.eyJkZXN0Ijp7InRuI \ | oiaHR0cHM6Ly93d3cuZXhhbXBsZS5jb20vY2VydC5jZXIifQ.eyJkZXN0Ijp7InRuI \ | |||
jpbIjEyMTU1NTUxMjE0Il19LCJkaXYiOnsidG4iOiIxMjE1NTU1NTEyMTMifSwiaWF \ | jpbIjEyMTU1NTUxMjE0Il19LCJkaXYiOnsidG4iOiIxMjE1NTU1NTEyMTMifSwiaWF \ | |||
0IjoxNDQzMjA4MzQ1LCJvcmlnIjp7InRuIjoiMTIxNTU1NTEyMTIifX0.xBHWipDEE \ | 0IjoxNDQzMjA4MzQ1LCJvcmlnIjp7InRuIjoiMTIxNTU1NTEyMTIifX0.xBHWipDEE \ | |||
J8a6TsdX6xUXAnblsFiGUiAxwLiv0HLC9IICj6eG9jQd6WzeSSjHRBwxmChHhVIiMT \ | J8a6TsdX6xUXAnblsFiGUiAxwLiv0HLC9IICj6eG9jQd6WzeSSjHRBwxmChHhVIiMT \ | |||
SqIlk3yCNkg | SqIlk3yCNkg | |||
The same "div" PASSporT would result if the "dest" object of the | The same "div" PASSporT would result if the "dest" object of the | |||
original PASSporT contained an array value, such as | original PASSporT contained an array value, such as | |||
{"tn":["12155551213","19995551234"]}, and the retargeting entity | {"tn":["12155551213","19995551234"]}, and the retargeting entity | |||
chose to retarget from the first telephone number in the array. | chose to retarget from the first telephone number in the array. | |||
Every "div" PASSporT is diverting from only one identifier. | Every "div" PASSporT is diverting from only one identifier. | |||
Note that the "div" element may contain other name/value pairs than | Note that the "div" element may contain other name/value pairs than | |||
just a destination, including a History-Info indicator (see | just a destination, including a History-Info indicator (see | |||
Section 8). After the PASSporT header and claims have been | Section 8). After the PASSporT header and claims have been | |||
constructed, their signature is generated per the guidance in | constructed, their signature is generated per the guidance in | |||
[RFC8225] - except for the credential required to sign it. While in | [RFC8225] -- except for the credential required to sign it. While in | |||
the ordinary construction of a PASSporT, the credential used to sign | the ordinary construction of a PASSporT, the credential used to sign | |||
will have authority over the identity in the "orig" claim (for | will have authority over the identity in the "orig" claim (for | |||
example, a certificate with authority over the telephone number in | example, a certificate with authority over the telephone number in | |||
"orig" per [RFC8226]), for all PASSporTs using the "div" type the | "orig" per [RFC8226]), for all PASSporTs using the "div" type the | |||
signature MUST be created with a credential with authority over the | signature MUST be created with a credential with authority over the | |||
identity present in the "div" claim. So for the example above, where | identity present in the "div" claim. So for the example above, where | |||
the original "dest" is "12155551213", the signer of the new PASSporT | the original "dest" is "12155551213", the signer of the new PASSporT | |||
object MUST have authority over that telephone number, and need not | object MUST have authority over that telephone number and need not | |||
have any authority over the telephone number present in the "orig" | have any authority over the telephone number present in the "orig" | |||
claim. | claim. | |||
Note that Identity header fields are not ordered in a SIP request, | Note that Identity header fields are not ordered in a SIP request, | |||
and in a case where there is a multiplicity of Identity header fields | and in a case where there is a multiplicity of Identity header fields | |||
in a request, some sorting may be required to match "div" PASSporTs | in a request, some sorting may be required to match "div" PASSporTs | |||
to their originals. | to their originals. | |||
PASSporTs of type "div" MUST NOT contain an "opt" (see Section 6) | PASSporTs of type "div" MUST NOT contain an "opt" (see Section 6) | |||
element in their payload. | element in their payload. | |||
4. Using 'div' in SIP | 4. Using "div" in SIP | |||
This section specifies SIP-specific usage for the "div" PASSporT type | This section specifies SIP-specific usage for the "div" PASSporT type | |||
and its handling in the SIP Identity header field "ppt" parameter | and its handling in the SIP Identity header field "ppt" parameter | |||
value. Other protocols using PASSporT may define behavior specific | value. Other protocols using PASSporT may define behavior specific | |||
to their use of the "div" claim. | to their use of the "div" claim. | |||
4.1. Authentication Service Behavior | 4.1. Authentication Service Behavior | |||
An authentication service only adds an Identity header field value | An authentication service only adds an Identity header field value | |||
containing the "div" PASSporT type to a SIP request that already | containing the "div" PASSporT type to a SIP request that already | |||
skipping to change at page 7, line 26 ¶ | skipping to change at line 310 ¶ | |||
changes to the syntax of identifiers that might be captured by other | changes to the syntax of identifiers that might be captured by other | |||
mechanisms that record retargeting (like History-Info) will likely | mechanisms that record retargeting (like History-Info) will likely | |||
not require a "div" PASSporT. | not require a "div" PASSporT. | |||
When adding an Identity header field with a PASSporT claims set | When adding an Identity header field with a PASSporT claims set | |||
containing a "div" claim, SIP authentication services MUST also add a | containing a "div" claim, SIP authentication services MUST also add a | |||
"ppt" parameter to that Identity header with a value of "div". For | "ppt" parameter to that Identity header with a value of "div". For | |||
the example PASSporT given in Section 3, the new Identity header | the example PASSporT given in Section 3, the new Identity header | |||
added after retargeting might look as follows: | added after retargeting might look as follows: | |||
Identity:eyJhbGciOiJFUzI1NiIsInBwdCI6ImRpdiIsInR5cCI6InBhc3Nwb3J0I \ | Identity:eyJhbGciOiJFUzI1NiIsInBwdCI6ImRpdiIsInR5cCI6InBhc3Nwb3J0I \ | |||
iwieDV1IjoiaHR0cHM6Ly93d3cuZXhhbXBsZS5jb20vY2VydC5jZXIifQ.eyJkZXN0 \ | iwieDV1IjoiaHR0cHM6Ly93d3cuZXhhbXBsZS5jb20vY2VydC5jZXIifQ.eyJkZXN0 \ | |||
Ijp7InRuIjpbIjEyMTU1NTUxMjE0Il19LCJkaXYiOnsidG4iOiIxMjE1NTU1NTEyMT \ | Ijp7InRuIjpbIjEyMTU1NTUxMjE0Il19LCJkaXYiOnsidG4iOiIxMjE1NTU1NTEyMT \ | |||
MifSwiaWF0IjoxNDQzMjA4MzQ1LCJvcmlnIjp7InRuIjoiMTIxNTU1NTEyMTIifX0. \ | MifSwiaWF0IjoxNDQzMjA4MzQ1LCJvcmlnIjp7InRuIjoiMTIxNTU1NTEyMTIifX0. \ | |||
xBHWipDEEJ8a6TsdX6xUXAnblsFiGUiAxwLiv0HLC9IICj6eG9jQd6WzeSSjHRBwxm \ | xBHWipDEEJ8a6TsdX6xUXAnblsFiGUiAxwLiv0HLC9IICj6eG9jQd6WzeSSjHRBwxm \ | |||
ChHhVIiMTSqIlk3yCNkg; \ | ChHhVIiMTSqIlk3yCNkg; \ | |||
info=<https://www.example.com/cert.cer>;ppt="div" | info=<https://www.example.com/cert.cer>;ppt="div" | |||
Note that in some deployments, an authentication service will need to | Note that in some deployments, an authentication service will need to | |||
generate "div" PASSporTs for a request that contains multiple | generate "div" PASSporTs for a request that contains multiple | |||
non-"div" Identity header field values. For example, a request | non-"div" Identity header field values. For example, a request | |||
arriving at a retargeting entity might contain in different Identity | arriving at a retargeting entity might contain, in different Identity | |||
header fields a baseline [RFC8224] PASSporT and a PASSporT of type | header fields, a baseline [RFC8224] PASSporT and a PASSporT of type | |||
"rph" [RFC8443] signed by a separate authority. Provided that these | "rph" [RFC8443] signed by a separate authority. Provided that these | |||
PASSporTs share the same "orig" and "dest" values, the retargeting | PASSporTs share the same "orig" and "dest" values, the retargeting | |||
entity's authentication service SHOULD generate only one "div" | entity's authentication service SHOULD generate only one "div" | |||
PASSporT. If the "orig" or "dest" of these PASSporTs differ, | PASSporT. If the "orig" or "dest" of these PASSporTs differ, | |||
however, one "div" PASSporT SHOULD be generated for each non-"div" | however, one "div" PASSporT SHOULD be generated for each non-"div" | |||
PASSporT. Note that this effectively creates multiple chains of | PASSporT. Note that this effectively creates multiple chains of | |||
"div" PASSporTs in a single request, which complicates the procedures | "div" PASSporTs in a single request, which complicates the procedures | |||
that need to be performed at verification services. | that need to be performed at verification services. | |||
Furthermore, a request may also be retargeted a second time, at which | Furthermore, a request may also be retargeted a second time, at which | |||
point the subsequent retargeting entity SHOULD generate one "div" | point the subsequent retargeting entity SHOULD generate one "div" | |||
PASSporT for each previous "div" PASSporT in the request which | PASSporT for each previous "div" PASSporT in the request that | |||
contains a "dest" object with the value of the current target - but | contains a "dest" object with the value of the current target -- but | |||
not for "div" PASSporTs with earlier targets. Ordinarily, the | not for "div" PASSporTs with earlier targets. Ordinarily, the | |||
current target will be readily identifiable, as it will be in the | current target will be readily identifiable, as it will be in the | |||
last "div" PASSporT in each chain, and in SIP cases it will | last "div" PASSporT in each chain, and in SIP cases, it will | |||
correspond to the Request-URI received by the retargeting entity. | correspond to the Request-URI received by the retargeting entity. | |||
Moreover, the current target will be an identifier that the | Moreover, the current target will be an identifier that the | |||
retargeting entity possesses a credential to sign for, which may not | retargeting entity possesses a credential to sign for, which may not | |||
be true for earlier targets. Ultimately, on each retargeting, the | be true for earlier targets. Ultimately, on each retargeting, the | |||
number of PASSporTs added to a request will be equal to the number of | number of PASSporTs added to a request will be equal to the number of | |||
non-"div" PASSporTs that do not share the same "orig" and "dest" | non-"div" PASSporTs that do not share the same "orig" and "dest" | |||
object values. | object values. | |||
4.2. Verification Service Behavior | 4.2. Verification Service Behavior | |||
[RFC8224] Section 6.2 Step 5 requires that specifications defining | [RFC8224], Section 6.2, Step 5 requires that specifications defining | |||
"ppt" values describe any additional or alternative verifier | "ppt" values describe any additional or alternative verifier | |||
behavior. The job of a SIP verification service handling one or more | behavior. The job of a SIP verification service handling one or more | |||
"div" PASSporTs is very different from that of a traditional | "div" PASSporTs is very different from that of a traditional | |||
verification service. At a high level, the immediate responsibility | verification service. At a high level, the immediate responsibility | |||
of the verification service is to extract all PASSporTs from the two | of the verification service is to extract all PASSporTs from the two | |||
or more Identity header fields in a request, identify which are "div" | or more Identity header fields in a request, identify which are "div" | |||
PASSporTs and which are not, and then order and link the "div" | PASSporTs and which are not, and then order and link the "div" | |||
PASSporTs to the original PASSporT(s) in order to build one or more | PASSporTs to the original PASSporT(s) in order to build one or more | |||
chains of retargeting. | chains of retargeting. | |||
In order to validate a SIP request using the "div" PASSporT type, a | In order to validate a SIP request using the "div" PASSporT type, a | |||
verification service needs to inspect all of the valid Identity | verification service needs to inspect all of the valid Identity | |||
header field values associated with a request, as an Identity header | header field values associated with a request, as an Identity header | |||
field value containing "div" necessarily refers to an earlier | field value containing "div" necessarily refers to an earlier | |||
PASSporT already in the message. For each "div" PASSporT, the | PASSporT already in the message. For each "div" PASSporT, the | |||
verification service MUST find an earlier PASSporT that contains a | verification service MUST find an earlier PASSporT that contains a | |||
"dest" claim with a value equivalent to the "div" claim in each "div" | "dest" claim with a value equivalent to the "div" claim in each "div" | |||
PASSporT. It is possible that this earlier PASSporT will also | PASSporT. It is possible that this earlier PASSporT will also | |||
contain a "div", and that it will in turn chain to a still earlier | contain a "div" and that it will in turn chain to a still earlier | |||
PASSporT stored in a different Identity header field value. If a | PASSporT stored in a different Identity header field value. If a | |||
complete chain cannot be constructed, the verification service cannot | complete chain cannot be constructed, the verification service cannot | |||
complete "div" validation; it MAY still validate any non-"div" | complete "div" validation; it MAY still validate any non-"div" | |||
PASSporTs in the request per normal [RFC8224] procedures. If a chain | PASSporTs in the request per the normal procedures in [RFC8224]. If | |||
has been successfully constructed, the verification service extracts | a chain has been successfully constructed, the verification service | |||
from the outermost (that is, the most recent) PASSporT in the chain a | extracts from the outermost (that is, the most recent) PASSporT in | |||
"dest" field; this will be a "div" PASSporT that no other "div" | the chain a "dest" field; this will be a "div" PASSporT that no other | |||
PASSporT in the SIP request refers to. Its "dest" element value will | "div" PASSporT in the SIP request refers to. Its "dest" element | |||
be referred to in the procedures that follow as the value of the | value will be referred to in the procedures that follow as the value | |||
"outermost "dest" field." | of the "outermost "dest" field". | |||
Ultimately, by looking at this chain of transformations and | Ultimately, by looking at this chain of transformations and | |||
validating the associated signatures, the verification service will | validating the associated signatures, the verification service will | |||
be able to ascertain that the appropriate parties were responsible | be able to ascertain that the appropriate parties were responsible | |||
for the retargeting of the call to its current destination. This can | for the retargeting of the call to its current destination. This can | |||
help the verification service to determine that the original PASSporT | help the verification service to determine that the original PASSporT | |||
in the call was not simply used in a cut-and-paste attack and inform | in the call was not simply used in a cut-and-paste attack and inform | |||
any associated authorization decisions in terms of how the call will | any associated authorization decisions in terms of how the call will | |||
be treated - though, per [RFC8224] Section 6.2.1, that decision is a | be treated -- though, per [RFC8224], Section 6.2.1, that decision is | |||
matter of local policy and is thus outside the scope of this | a matter of local policy and is thus outside the scope of this | |||
specification. | specification. | |||
A verification service parses a chain of PASSporTs as follows: | A verification service parses a chain of PASSporTs as follows: | |||
First, the verification service MUST compare the value in the | 1. The verification service MUST compare the value in the outermost | |||
outermost "dest" field to the target of the call. As it is | "dest" field to the target of the call. As it is anticipated | |||
anticipated that SIP authentication services that create "div" | that SIP authentication services that create "div" PASSporTs will | |||
PASSporTs will populate the "dest" header from the retargeted | populate the "dest" header from the retargeted Request-URI (see | |||
Request-URI (see Section 4.1), in ordinary SIP operations, the | Section 4.1), in ordinary SIP operations, the Request-URI is | |||
Request-URI is where verification services will find the latest | where verification services will find the latest call target. | |||
call target. Note however that after a "div" PASSporT has been | Note, however, that after a "div" PASSporT has been added to a | |||
added to a SIP request, the Request-URI may have been updated | SIP request, the Request-URI may have been updated during normal | |||
during normal call processing to an identifier that no longer | call processing to an identifier that no longer contains the | |||
contains the logical destination of a call; in this case, the | logical destination of a call; in this case, the verification | |||
verification service MAY compare the "dest" field to a provisioned | service MAY compare the "dest" field to a provisioned telephone | |||
telephone number for the recipient. | number for the recipient. | |||
Second, the verification service MUST validate the signature over | 2. The verification service MUST validate the signature over the | |||
the outermost "div" PASSporT, and establish that the credential | outermost "div" PASSporT and establish that the credential that | |||
that signed the "div" PASSporT has the authority to attest for the | signed the "div" PASSporT has the authority to attest for the | |||
identifier in the "div" element of the PASSporT (per [RFC8224] | identifier in the "div" element of the PASSporT (per [RFC8224], | |||
Section 6.2 Step 3). | Section 6.2, Step 3). | |||
Third, the verification service MUST validate that the "orig" | 3. The verification service MUST validate that the "orig" field of | |||
field of the innermost PASSporT of the chain (the only PASSporT in | the innermost PASSporT of the chain (the only PASSporT in the | |||
the chain which will not be of PASSporT type "div") is equivalent | chain that will not be of PASSporT type "div") is equivalent to | |||
to the "orig" field of the outermost "div" PASSporT; in other | the "orig" field of the outermost "div" PASSporT; in other words, | |||
words, that the original calling identifier has not been altered | that the original calling identifier has not been altered by | |||
by retargeting authentication services. If the "orig" value has | retargeting authentication services. If the "orig" value has | |||
changed, the verification service MUST treat the entire PASSporT | changed, the verification service MUST treat the entire PASSporT | |||
chain as invalid. The verification service MUST also verify that | chain as invalid. The verification service MUST also verify that | |||
all other "div" PASSporTs in the chain share the same "orig" | all other "div" PASSporTs in the chain share the same "orig" | |||
value. Then the verification service validates the relationship | value. Then, the verification service validates the relationship | |||
of the "orig" field to the SIP-level call signaling per the | of the "orig" field to the SIP-level call signaling per the | |||
guidance in [RFC8224] Section 6.2 Step 2. | guidance in [RFC8224], Section 6.2, Step 2. | |||
Fourth, the verification service MUST check the date freshness in | 4. The verification service MUST check the date freshness in the | |||
the outermost "div" PASSporT per [RFC8224] Section 6.2 Step 4. It | outermost "div" PASSporT, per [RFC8224], Section 6.2, Step 4. | |||
is furthermore RECOMMENDED that the verification service check | Furthermore, it is RECOMMENDED that the verification service | |||
that the "iat" field of the innermost PASSporT is also within the | check that the "iat" field of the innermost PASSporT is also | |||
date freshness interval; otherwise the verification service could | within the date freshness interval; otherwise, the verification | |||
allow attackers to replay an old, stale PASSporT embedded in a | service could allow attackers to replay an old, stale PASSporT | |||
fresh "div". However, note that in some use cases, including | embedded in a fresh "div". However, note that in some use cases, | |||
certain ways that call transfers are implemented, it is possible | including certain ways that call transfers are implemented, it is | |||
that an established call will be retargeted long after it has | possible that an established call will be retargeted long after | |||
originally been placed, and verification services may want to | it has originally been placed, and verification services may want | |||
allow a longer window for the freshness of the innermost PASSporT | to allow a longer window for the freshness of the innermost | |||
if the call is transferred from a trusted party (as an upper | PASSporT if the call is transferred from a trusted party (as an | |||
bound, a freshness window on the order of three hours might | upper bound, a freshness window on the order of three hours might | |||
suffice). | suffice). | |||
Fifth, the verification service MUST inspect and validate the | 5. The verification service MUST inspect and validate the signatures | |||
signatures on each and every PASSporT object in the chain between | on each and every PASSporT object in the chain between the | |||
the outermost "div" PASSporT and the innermost PASSporT. Note | outermost "div" PASSporT and the innermost PASSporT. Note that | |||
that (per Section 4.1) a chain may terminate at more than one | (per Section 4.1) a chain may terminate at more than one | |||
innermost PASSporT, in cases where a single "div" is used to | innermost PASSporT, in cases where a single "div" is used to | |||
retarget from multiple innermost PASSporTs. Also note that | retarget from multiple innermost PASSporTs. Also note that | |||
[RFC8224] Section 6.2 Step 1 applies to the chain validation | [RFC8224], Section 6.2, Step 1 applies to the chain validation | |||
process: if the innermost PASSporT contains an unsupported "ppt", | process; if the innermost PASSporT contains an unsupported "ppt", | |||
its chain MUST be ignored. | its chain MUST be ignored. | |||
Note that the To header field is not used in the first step above. | Note that the To header field is not used in the first step above. | |||
Optionally, the verification service MAY verify that the To header | Optionally, the verification service MAY verify that the To header | |||
field value of the received SIP signaling is equal to the "dest" | field value of the received SIP signaling is equal to the "dest" | |||
value in the innermost PASSporT; however, as has been observed in | value in the innermost PASSporT; however, as has been observed in | |||
some deployments, the original To header field value may be altered | some deployments, the original To header field value may be altered | |||
by intermediaries to reflect changes of target. Deployments that | by intermediaries to reflect changes of target. Deployments that | |||
change the original To header field value to conceal the original | change the original To header field value to conceal the original | |||
destination of the call from the ultimate recipient should note that | destination of the call from the ultimate recipient should note that | |||
the original destination of a call may be preserved in the innermost | the original destination of a call may be preserved in the innermost | |||
PASSporT. Future work on "div" might explore methods to implement | PASSporT. Future work on "div" might explore methods to implement | |||
that sort of policy while retaining a secure chain of redirection. | that sort of policy while retaining a secure chain of redirection. | |||
5. The 'div-o' PASSporT Type | 5. The "div-o" PASSporT Type | |||
This specification defines a "div-o" PASSporT type that uses the | This specification defines a "div-o" PASSporT type that uses the | |||
"div" claim element in conjunction with the "opt" (Section 6) claim | "div" claim element in conjunction with the "opt" (Section 6) claim | |||
element. As is the case with "div" PASSporT type, a "div-o" PASSporT | element. As is the case with "div" PASSporT type, a "div-o" PASSporT | |||
is created by an authentication service acting for a retargeting | is created by an authentication service acting for a retargeting | |||
entity, but instead of generating a separate "div" PASSporT to be | entity, but instead of generating a separate "div" PASSporT to be | |||
conveyed alongside an original PASSporT, the authentication service | conveyed alongside an original PASSporT, the authentication service | |||
in this case embeds the original PASSporT inside the "opt" element of | in this case embeds the original PASSporT inside the "opt" element of | |||
the "div-o" PASSporT. The "div-o" extension is designed for use in | the "div-o" PASSporT. The "div-o" extension is designed for use in | |||
non-SIP or gatewayed SIP environments where the conveyance of | non-SIP or gatewayed SIP environments where the conveyance of | |||
PASSporTs in separate Identity header fields in impossible, such as | PASSporTs in separate Identity header fields in impossible, such as | |||
out-of-band [I-D.ietf-stir-oob] STIR scenarios. | out-of-band STIR scenarios [RFC8816]. | |||
The syntax of "div-o" PASSporTs is very similar to "div". A "div-o" | The syntax of "div-o" PASSporTs is very similar to "div". A "div-o" | |||
PASSporT header object might look as follows: | PASSporT header object might look as follows: | |||
{ "typ":"passport", | { "typ":"passport", | |||
"ppt":"div-o", | "ppt":"div-o", | |||
"alg":"ES256", | "alg":"ES256", | |||
"x5u":"https://www.example.com/cert.cer" } | "x5u":"https://www.example.com/cert.cer" } | |||
Whereas a "div" PASSporT claims set contains only the "orig", "dest", | Whereas a "div" PASSporT claims set contains only the "orig", "dest", | |||
skipping to change at page 12, line 5 ¶ | skipping to change at line 517 ¶ | |||
HM6Ly93d3cuZXhhbXBsZS5jb20vY2VydC5jZXIifQ.eyJkZXN0Ijp7InRuIjpbIj \ | HM6Ly93d3cuZXhhbXBsZS5jb20vY2VydC5jZXIifQ.eyJkZXN0Ijp7InRuIjpbIj \ | |||
EyMTU1NTUxMjEzIl19LCJpYXQiOjE0NDMyMDgzNDUsIm9yaWciOnsidG4iOiIxMj \ | EyMTU1NTUxMjEzIl19LCJpYXQiOjE0NDMyMDgzNDUsIm9yaWciOnsidG4iOiIxMj \ | |||
E1NTU1MTIxMiJ9fQ.1bEzkzcNbKvgz4QoMx0_DJ2T8qFMDC1sPqHPXl1WvbauzRJ \ | E1NTU1MTIxMiJ9fQ.1bEzkzcNbKvgz4QoMx0_DJ2T8qFMDC1sPqHPXl1WvbauzRJ \ | |||
RvYlZqQ0qgGTlS8tJ_wXjVe07Z3wvDrdApHhhYw" } | RvYlZqQ0qgGTlS8tJ_wXjVe07Z3wvDrdApHhhYw" } | |||
While in ordinary operations, it is not expected that SIP would carry | While in ordinary operations, it is not expected that SIP would carry | |||
a "div-o" PASSporT, it might be possible in some gatewaying | a "div-o" PASSporT, it might be possible in some gatewaying | |||
scenarios. The resulting full form Identity header field with a | scenarios. The resulting full form Identity header field with a | |||
"div-o" PASSporT would look as follows: | "div-o" PASSporT would look as follows: | |||
Identity:eyJhbGciOiJFUzI1NiIsInBwdCI6ImRpdi1vIiwidHlwIjoicGFzc3Bvc \ | Identity:eyJhbGciOiJFUzI1NiIsInBwdCI6ImRpdi1vIiwidHlwIjoicGFzc3Bvc \ | |||
nQiLCJ4NXUiOiJodHRwczovL3d3dy5leGFtcGxlLmNvbS9jZXJ0LmNlciJ9.eyJkZX \ | nQiLCJ4NXUiOiJodHRwczovL3d3dy5leGFtcGxlLmNvbS9jZXJ0LmNlciJ9.eyJkZX \ | |||
N0Ijp7InRuIjoiMTIxNTU1NTEyMTQifSwiZGl2Ijp7InRuIjoiMTIxNTU1NTUxMjEz \ | N0Ijp7InRuIjoiMTIxNTU1NTEyMTQifSwiZGl2Ijp7InRuIjoiMTIxNTU1NTUxMjEz \ | |||
In0sImlhdCI6MTQ0MzIwODM0NSwib3B0IjoiZXlKaGJHY2lPaUpGVXpJMU5pSXNJbl \ | In0sImlhdCI6MTQ0MzIwODM0NSwib3B0IjoiZXlKaGJHY2lPaUpGVXpJMU5pSXNJbl \ | |||
I1Y0NJNkluQmhjM053YjNKMElpd2llRFYxSWpvaWFIUjBjSE02THk5M2QzY3VaWGho \ | I1Y0NJNkluQmhjM053YjNKMElpd2llRFYxSWpvaWFIUjBjSE02THk5M2QzY3VaWGho \ | |||
YlhCc1pTNWpiMjB2WTJWeWRDNWpaWElpZlEuZXlKa1pYTjBJanA3SW5SdUlqcGJJak \ | YlhCc1pTNWpiMjB2WTJWeWRDNWpaWElpZlEuZXlKa1pYTjBJanA3SW5SdUlqcGJJak \ | |||
V5TVRVMU5UVXhNakV6SWwxOUxDSnBZWFFpT2pFME5ETXlNRGd6TkRVc0ltOXlhV2Np \ | V5TVRVMU5UVXhNakV6SWwxOUxDSnBZWFFpT2pFME5ETXlNRGd6TkRVc0ltOXlhV2Np \ | |||
T25zaWRHNGlPaUl4TWpFMU5UVTFNVEl4TWlKOWZRLjFiRXpremNOYkt2Z3o0UW9NeD \ | T25zaWRHNGlPaUl4TWpFMU5UVTFNVEl4TWlKOWZRLjFiRXpremNOYkt2Z3o0UW9NeD \ | |||
BfREoyVDhxRk1EQzFzUHFIUFhsMVd2YmF1elJKUnZZbFpxUTBxZ0dUbFM4dEpfd1hq \ | BfREoyVDhxRk1EQzFzUHFIUFhsMVd2YmF1elJKUnZZbFpxUTBxZ0dUbFM4dEpfd1hq \ | |||
VmUwN1ozd3ZEcmRBcEhoaFl3Iiwib3JpZyI6eyJ0biI6IjEyMTU1NTUxMjEyIn19.C \ | VmUwN1ozd3ZEcmRBcEhoaFl3Iiwib3JpZyI6eyJ0biI6IjEyMTU1NTUxMjEyIn19.C \ | |||
HeA9wRnthl7paMe6rP0TARpmFCXjmi_vF_HRz2O_oulB_R-G9xZNiLVvmvHv4gk6LI \ | HeA9wRnthl7paMe6rP0TARpmFCXjmi_vF_HRz2O_oulB_R-G9xZNiLVvmvHv4gk6LI \ | |||
LaDV2y2VtHTLIEgmHig; \ | LaDV2y2VtHTLIEgmHig; \ | |||
info=<https://www.example.com/cert.cer>;ppt="div-o" | info=<https://www.example.com/cert.cer>;ppt="div-o" | |||
5.1. Processing 'div-o' PASSporTs | 5.1. Processing "div-o" PASSporTs | |||
The authentication and verification service procedures required for | The authentication and verification service procedures required for | |||
"div-o" closely follow the guidance given in Section 4.1 and | "div-o" closely follow the guidance given in Sections 4.1 and 4.2, | |||
Section 4.2, with the major caveats being first, that they do store | with the major caveats being, first, that they do store or retrieve | |||
or retrieve PASSporTs via the Identity header field values of SIP | PASSporTs via the Identity header field values of SIP requests and, | |||
requests, and second, that they process nested PASSporTs in the "opt" | second, that they process nested PASSporTs in the "opt" claim | |||
claim element. But transposing the rest of the behaviors described | element. But transposing the rest of the behaviors described above | |||
above to creating and validating "div-o" PASSporTs is | to creating and validating "div-o" PASSporTs is straightforward. | |||
straightforward. | ||||
For the "div-o" PASSporT type, retargeting authentication services | For the "div-o" PASSporT type, retargeting authentication services | |||
that handle calls with one or more existing PASSporTs will create a | that handle calls with one or more existing PASSporTs will create a | |||
corresponding "div-o" PASSporT for each received PASSporT. Each | corresponding "div-o" PASSporT for each received PASSporT. Each | |||
"div-o" PASSporT MUST contain an "opt" claim set element with the | "div-o" PASSporT MUST contain an "opt" claim set element with the | |||
value of the original PASSporT from which the "div-o" was created; | value of the original PASSporT from which the "div-o" was created; as | |||
and as specified in Section 4.1, the authentication service MUST | specified in Section 4.1, the authentication service MUST populate | |||
populate the "div" claim set element of the "div-o" PASSporT with the | the "div" claim set element of the "div-o" PASSporT with the "dest" | |||
"dest" field fo the original PASSporT. Each received PASSporT may in | field of the original PASSporT. Each received PASSporT may in turn | |||
turn contain its own "opt" claim set element, if the retargeting | contain its own "opt" claim set element if the retargeting | |||
authentication service is not the first in its chain. Note that if | authentication service is not the first in its chain. Note that if | |||
the retargeting authentication service is handling a call with | the retargeting authentication service is handling a call with | |||
multiple PASSporTs, which in ordinary SIP operation would result in | multiple PASSporTs, which in ordinary SIP operation would result in | |||
the construction of multiple "div" chains, it will in effect be | the construction of multiple "div" chains, it will in effect be | |||
generating one "div-o" PASSporT per chain. | generating one "div-o" PASSporT per chain. | |||
The job of a verification service is in many ways easier for "div-o" | The job of a verification service is in many ways easier for "div-o" | |||
than for "div", as the verification service has no need to correlate | than for "div", as the verification service has no need to correlate | |||
the PASSporTs it receives and assemble them into chains, as any | the PASSporTs it receives and assemble them into chains, as any | |||
chains in "div-o" will be nested through the "opt" element. | chains in "div-o" will be nested through the "opt" element. | |||
Nonetheless, the verification services MUST perform the same chain | Nonetheless, the verification services MUST perform the same chain | |||
validation described in Section 4.2 to validate that each nested | validation described in Section 4.2 to validate that each nested | |||
PASSporT shares the same "orig" field as its enclosing PASSporT, and | PASSporT shares the same "orig" field as its enclosing PASSporT and | |||
that the "dest" field of each nested PASSporT corresponds to the | that the "dest" field of each nested PASSporT corresponds to the | |||
"div" field of its enclosing PASSporT. The same checks MUST also be | "div" field of its enclosing PASSporT. The same checks MUST also be | |||
performed for freshness, signature validation, and so on. It is | performed for freshness, signature validation, and so on. It is | |||
similarly OPTIONAL for the verification service to determine that the | similarly OPTIONAL for the verification service to determine that the | |||
"dest" claims element of the outermost PASSporT corresponds to the | "dest" claims element of the outermost PASSporT corresponds to the | |||
called party indication of receive telephone signaling, where such | called party indication of receive telephone signaling, where such | |||
indication would vary depending on the using protocol. | indication would vary depending on the using protocol. | |||
How authentication services or verification services receive or | How authentication services or verification services receive or | |||
transport PASSporTs for "div-o" is outside the scope of this | transport PASSporTs for "div-o" is outside the scope of this document | |||
document, and dependent on the using protocol. | and dependent on the using protocol. | |||
6. Definition of 'opt' | 6. Definition of "opt" | |||
The presence of an "Original PASSporT" ("opt") claims set element | The presence of an "Original PASSporT" ("opt") claims set element | |||
signifies that a PASSporT encapsulates another entire PASSporT within | signifies that a PASSporT encapsulates another entire PASSporT within | |||
it, typically a PASSporT that was transformed in some way to create | it, typically a PASSporT that was transformed in some way to create | |||
the current PASSporT. Relying parties may need to consult the | the current PASSporT. Relying parties may need to consult the | |||
encapsulated PASSporT in order to validate the identity of a caller. | encapsulated PASSporT in order to validate the identity of a caller. | |||
"opt" as defined in this specification may be used by future PASSporT | "opt", as defined in this specification, may be used by future | |||
extensions as well as in conjunction with "div-o". | PASSporT extensions as well as in conjunction with "div-o". | |||
"opt" MUST contain a quoted full-form PASSporT as specified by | "opt" MUST contain a quoted full-form PASSporT, as specified by | |||
[RFC8225] Appendix A; it MUST NOT contain a compact form PASSporT. | [RFC8225], Appendix A; it MUST NOT contain a compact form PASSporT. | |||
For an example of a "div-o" PASSporT containing "opt," see Section 5. | For an example of a "div-o" PASSporT containing "opt", see Section 5. | |||
7. 'div' and Redirection | 7. "div" and Redirection | |||
The "div" mechanism exists primarily to prevent false negatives at | The "div" mechanism exists primarily to prevent false negatives at | |||
verification services when an arriving SIP request, due to | verification services when an arriving SIP request, due to | |||
intermediary retargeting, does not appear to be intended for its | intermediary retargeting, does not appear to be intended for its | |||
eventual recipient, because the original PASSporT "dest" value | eventual recipient, because the original PASSporT "dest" value | |||
designates a different destination. | designates a different destination. | |||
Any intermediary that assigns a new target to a request can, instead | Any intermediary that assigns a new target to a request can, instead | |||
of retargeting and forwarding the request, instead redirect with a | of retargeting and forwarding the request, redirect with a 3xx | |||
3xx response code. In ordinary operations, a redirection poses no | response code. In ordinary operations, a redirection poses no | |||
difficulties for the operations of baseline STIR: when the user agent | difficulties for the operations of baseline STIR: when the user agent | |||
client (UAC) receives the 3xx response, it will initiate a new | client (UAC) receives the 3xx response, it will initiate a new | |||
request to the new target (typically the target carried in the | request to the new target (typically the target carried in the | |||
Contact header field value of the 3xx), and the "dest" of the | Contact header field value of the 3xx), and the "dest" of the | |||
PASSporT created for the new request will match that new target. As | PASSporT created for the new request will match that new target. As | |||
no impersonation attack can arise from this case, it creates no new | no impersonation attack can arise from this case, it creates no new | |||
requirements for STIR. | requirements for STIR. | |||
However, some UACs record the original target of a call with | However, some UACs record the original target of a call with | |||
mechanisms like History-Info [RFC7044] or Diversion [RFC5806], and | mechanisms like History-Info [RFC7044] or Diversion [RFC5806] and may | |||
may want to leverage STIR to demonstrate to the ultimate recipient | want to leverage STIR to demonstrate to the ultimate recipient that | |||
that the call has been redirected securely: that is, that the | the call has been redirected securely, that is, that the original | |||
original destination was the one that sent the redirection message | destination was the one that sent the redirection message that led to | |||
that led to the recipient receiving the request. The semantics of | the recipient receiving the request. The semantics of the PASSporT | |||
the PASSporT necessary for that assertion are the same as those for | necessary for that assertion are the same as those for the "div" | |||
the "div" retargeting cases above. The only wrinkle is that the | retargeting cases above. The only wrinkle is that the PASSporT needs | |||
PASSporT needs to be generated by the redirecting entity and sent | to be generated by the redirecting entity and sent back to the | |||
back to the originating user agent client within the 3xx response. | originating user agent client within the 3xx response. | |||
This introduces more complexity than might immediately be apparent. | This introduces more complexity than might immediately be apparent. | |||
In the first place, a 3xx response can convey multiple targets | In the first place, a 3xx response can convey multiple targets | |||
through the Contact header field value; to accommodate this, the | through the Contact header field value; to accommodate this, the | |||
"div" PASSporT MAY include one "dest" object array value per Contact, | "div" PASSporT MAY include one "dest" object array value per Contact, | |||
but if the retargeting entity wants to keep the Contact list private | but if the retargeting entity wants to keep the Contact list private | |||
from targets, it may need to generate one PASSporT per Contact. Bear | from targets, it may need to generate one PASSporT per Contact. Bear | |||
in mind as well that the original SIP request could have carried | in mind as well that the original SIP request could have carried | |||
multiple Identity header field values that had been added by | multiple Identity header field values that had been added by | |||
different authentication services in the request path, so a | different authentication services in the request path, so a | |||
redirecting entity might need to generate one "div" PASSporT for each | redirecting entity might need to generate one "div" PASSporT for each | |||
PASSporT in the original request. Often, this will mean just one | PASSporT in the original request. Often, this will mean just one | |||
"div" PASSporT, but for some deployment scenarios, it could require | "div" PASSporT, but for some deployment scenarios, it could require | |||
an impractical number of combinations. But in very complex call | an impractical number of combinations. But in very complex call | |||
routing scenarios, attestation of source identity would only add | routing scenarios, attestation of source identity would only add | |||
limited value anyway. | limited value anyway. | |||
STIR-aware SIP intermediaries that redirect requests MAY therefore | Therefore, STIR-aware SIP intermediaries that redirect requests MAY | |||
convey one or more PASSporTs in the backwards direction within | convey one or more PASSporTs in the backwards direction within | |||
Identity header fields. These redirecting entities will act as | Identity header fields. These redirecting entities will act as | |||
authentication services for "div" as described in Section 4.1. This | authentication services for "div" as described in Section 4.1. This | |||
document consequently updates [RFC8224] to permit carrying Identity | document consequently updates [RFC8224] to permit carrying Identity | |||
header fields in SIP 300-class responses. It is left to the | header fields in SIP 300-class responses. It is left to the | |||
originating user agent to determine which Identity header fields | originating user agent to determine which Identity header fields | |||
should be copied from the 3xx into any new requests resulting from | should be copied from the 3xx into any new requests resulting from | |||
the redirection, if any: use of these Identity header fields by | the redirection, if any; use of these Identity header fields by | |||
entities receiving a 3xx response is OPTIONAL. | entities receiving a 3xx response is OPTIONAL. | |||
Finally, note that if an intermediary in the response path consumes | Finally, note that if an intermediary in the response path consumes | |||
the 3xx and explores new targets itself while performing sequential | the 3xx and explores new targets itself while performing sequential | |||
forking, it will effectively retarget the call on behalf of the | forking, it will effectively retarget the call on behalf of the | |||
redirecting server, and this will create the same need for "div" | redirecting server, and this will create the same need for "div" | |||
PASSporTs as any other retargeted call. These intermediaries MAY | PASSporTs as any other retargeted call. These intermediaries MAY | |||
also copy PASSporTs from the 3xx response and insert them into | also copy PASSporTs from the 3xx response and insert them into | |||
sequential forking requests, if appropriate. | sequential forking requests, if appropriate. | |||
8. Extending 'div' to work with Service Logic Tracking | 8. Extending "div" to Work with Service Logic Tracking | |||
It is anticipated that "div" may be used in concert with History-Info | It is anticipated that "div" may be used in concert with History-Info | |||
[RFC7044] in some deployments. It may not be clear from the "orig" | [RFC7044] in some deployments. It may not be clear from the "orig" | |||
and "dest" values which History-Info header a given PASSporT | and "dest" values which History-Info header a given PASSporT | |||
correlates to, especially because some of the target changes tracked | correlates to, especially because some of the target changes tracked | |||
by History-Info will not be reflected in a "div" PASSporT (see | by History-Info will not be reflected in a "div" PASSporT (see | |||
Section 1). Therefore an "hi" element as defined here may appear in | Section 1). Therefore, an "hi" element as defined here may appear in | |||
"div" corresponding to the History-Info header field index parameter | "div" corresponding to the History-Info header field index parameter | |||
value. So for a History-Info header field with an index value of | value. So for a History-Info header field with an index value of | |||
"1.2.1", the claims set of the corresponding PASSporT with "div" | "1.2.1", the claims set of the corresponding PASSporT with "div" | |||
might look like: | might look like: | |||
{ "orig":{"tn":"12155551212"}, | { "orig":{"tn":"12155551212"}, | |||
"dest":{"tn":["12155551214"]}, | "dest":{"tn":["12155551214"]}, | |||
"iat":1443208345, | "iat":1443208345, | |||
"div":{"tn":"121555551213", | "div":{"tn":"121555551213", | |||
"hi":"1.2.1"} } | "hi":"1.2.1"} } | |||
Past experience has shown that there may be additional information | Past experience has shown that there may be additional information | |||
about the motivation for retargeting that relying parties might | about the motivation for retargeting, which relying parties might | |||
consider when making authorization decisions about a call, see for | consider when making authorization decisions about a call; see, for | |||
example the "reason" associated with the SIP Diversion header field | example, the "reason" associated with the SIP Diversion header field | |||
[RFC5806]. Future extensions to this specification might incorporate | [RFC5806]. Future extensions to this specification might incorporate | |||
reasons into "div". | reasons into "div". | |||
9. Acknowledgments | 9. IANA Considerations | |||
We would like to thank Ning Zhang, Dave Hancock, Chris Wendt, Sean | ||||
Turner, Russ Housley, Ben Campbell, Eric Burger, and Robert Sparks | ||||
for contributions to this document. | ||||
10. IANA Considerations | ||||
This document contains actions for the IANA. | ||||
10.1. JSON Web Token Claims Registrations | 9.1. JSON Web Token Claims Registrations | |||
This specification requests that the IANA add two new claims to the | Per this specification, IANA has added two new claims to the "JSON | |||
JSON Web Token Claims registry as defined in [RFC7519]. | Web Token Claims" registry as defined in [RFC7519]. | |||
10.1.1. 'div' registration | 9.1.1. "div" registration | |||
Claim Name: "div" | Claim Name: div | |||
Claim Description: Diverted Target of a Call | Claim Description: Diverted Target of a Call | |||
Change Controller: IESG | Change Controller: IESG | |||
Specification Document(s): [RFCThis] | Reference: RFC 8946 | |||
10.1.2. 'opt' registration | 9.1.2. "opt" registration | |||
Claim Name: "opt" | Claim Name: opt | |||
Claim Description: Original PASSporT (in Full Form) | Claim Description: Original PASSporT (in Full Form) | |||
Change Controller: IESG | Change Controller: IESG | |||
Specification Document(s): [RFCThis] | Reference: RFC 8946 | |||
10.2. PASSporT Type Registrations | 9.2. PASSporT Type Registrations | |||
This specification defines two new PASSporT types for the PASSport | This specification defines two new PASSporT types for the "Personal | |||
Extensions Registry defined in [RFC8225], which resides at | Assertion Token (PASSporT) Extensions" registry defined in [RFC8225], | |||
https://www.iana.org/assignments/passport/passport.xhtml#passport- | which resides at <https://www.iana.org/assignments/passport>. They | |||
extensions. They are: | are: | |||
"div" as defined in [RFCThis] Section 3. | * "div", as defined in Section 3. | |||
"div-o" as defined in [RFCThis] Section 5. | * "div-o", as defined in Section 5. | |||
11. Privacy Considerations | 10. Privacy Considerations | |||
There is an inherent trade-off in any mechanism that tracks in SIP | There is an inherent trade-off in any mechanism that tracks, in SIP | |||
signaling how calls are routed through a network, as routing | signaling, how calls are routed through a network, as routing | |||
decisions may expose policies set by users for how calls are | decisions may expose policies set by users for how calls are | |||
forwarded, potentially revealing relationships between different | forwarded, potentially revealing relationships between different | |||
identifiers representing the same user. Note however that in | identifiers representing the same user. Note, however, that in | |||
ordinary operations, this information is revealed to the user agent | ordinary operations, this information is revealed to the user agent | |||
service of the called party, not the calling party. It is usually | service of the called party, not the calling party. It is usually | |||
the called party who establishes these forwarding relationships, and | the called party who establishes these forwarding relationships, and | |||
if indeed some other party is responsible for calls being forwarded | if indeed some other party is responsible for calls being forwarded | |||
to the called party, many times the called party should likely be | to the called party, many times the called party should likely be | |||
entitled to information about why they are receiving these calls. | entitled to information about why they are receiving these calls. | |||
Similarly, a redirecting entity who sends a 3xx in the backwards | Similarly, a redirecting entity who sends a 3xx in the backwards | |||
direction knowingly shares information about service logic with the | direction knowingly shares information about service logic with the | |||
caller's network. However, as there may be unforeseen circumstances | caller's network. However, as there may be unforeseen circumstances | |||
where the revelation of service logic to the called party poses a | where the revelation of service logic to the called party poses a | |||
privacy risk, implementers and users of this or similar diversion- | privacy risk, implementers and users of this or similar diversion- | |||
tracking techniques should understand the trade-off. | tracking techniques should understand the trade-off. | |||
Furthermore, it is a general privacy risk of identity mechanisms | Furthermore, it is a general privacy risk of identity mechanisms | |||
overall that they do not interface well with anonymization services; | overall that they do not interface well with anonymization services; | |||
the interaction of STIR with anonymization services is detailed in | the interaction of STIR with anonymization services is detailed in | |||
[RFC8224] Section 11. Any forwarding service that acts as an | [RFC8224], Section 11. Any forwarding service that acts as an | |||
anonymizing proxy may not be able to provide a secure chain of | anonymizing proxy may not be able to provide a secure chain of | |||
retargeting due to the obfuscation of the originating identity. | retargeting due to the obfuscation of the originating identity. | |||
Also see [RFC8224] Section 11 for further considerations on the | Also see [RFC8224], Section 11 for further considerations on the | |||
privacy of using PASSporTs in SIP. | privacy of using PASSporTs in SIP. | |||
12. Security Considerations | 11. Security Considerations | |||
This specification describes a security feature, and is primarily | This specification describes a security feature and is primarily | |||
concerned with increasing security when calls are forwarded. | concerned with increasing security when calls are forwarded. | |||
Including information about how calls were retargeted during the | Including information about how calls were retargeted during the | |||
routing process can allow downstream entities to infer particulars of | routing process can allow downstream entities to infer particulars of | |||
the policies used to route calls through the network. However, | the policies used to route calls through the network. However, | |||
including this information about forwarding is at the discretion of | including this information about forwarding is at the discretion of | |||
the retargeting entity, so if there is a requirement to keep an | the retargeting entity, so if there is a requirement to keep an | |||
intermediate called number confidential, no PASSporT should be | intermediate called number confidential, no PASSporT should be | |||
created for that retargeting - the only consequence will be that | created for that retargeting -- the only consequence will be that | |||
downstream entities will be unable to correlate an incoming call with | downstream entities will be unable to correlate an incoming call with | |||
the original PASSporT without access to some prior knowledge of the | the original PASSporT without access to some prior knowledge of the | |||
policies that could have caused the retargeting. | policies that could have caused the retargeting. | |||
Any extension that makes PASSporTs larger creates a potential | Any extension that makes PASSporTs larger creates a potential | |||
amplification mechanism for SIP-based DDoS attacks. Since diversion | amplification mechanism for SIP-based DDoS attacks. Since diversion | |||
PASSporTs are created as a part of normal forwarding activity, this | PASSporTs are created as a part of normal forwarding activity, this | |||
risk arises at the discretion of the retargeting domain: simply using | risk arises at the discretion of the retargeting domain; simply using | |||
3xx response redirections rather than retargeting (by supplying a | 3xx response redirections rather than retargeting (by supplying a | |||
"div" per Section 7) mitigates the potential impact. Under unusual | "div" per Section 7) mitigates the potential impact. Under unusual | |||
traffic loads, even domains that might ordinarily retarget requests | traffic loads, even domains that might ordinarily retarget requests | |||
can switch to redirection. | can switch to redirection. | |||
SIP has an inherent capability to redirect requests, including | SIP has an inherent capability to redirect requests, including | |||
forking them to multiple parties -- potentially a very large numbers | forking them to multiple parties -- potentially, a very large number | |||
of parties. The use of the "div" PASSporT type does not grant any | of parties. The use of the "div" PASSporT type does not grant any | |||
additional powers to attackers who hope to place bulk calls; if | additional powers to attackers who hope to place bulk calls; if | |||
present, the "div" PASSporT instead identifies the party responsible | present, the "div" PASSporT instead identifies the party responsible | |||
for the forwarding. As such, senders of bulk unsolicited traffic are | for the forwarding. As such, senders of bulk unsolicited traffic are | |||
unlikely to find the use of "div" attractive. | unlikely to find the use of "div" attractive. | |||
13. References | 12. References | |||
13.1. Normative References | 12.1. Normative References | |||
[RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | |||
Requirement Levels", BCP 14, RFC 2119, | Requirement Levels", BCP 14, RFC 2119, | |||
DOI 10.17487/RFC2119, March 1997, | DOI 10.17487/RFC2119, March 1997, | |||
<https://www.rfc-editor.org/info/rfc2119>. | <https://www.rfc-editor.org/info/rfc2119>. | |||
[RFC3261] Rosenberg, J., Schulzrinne, H., Camarillo, G., Johnston, | [RFC3261] Rosenberg, J., Schulzrinne, H., Camarillo, G., Johnston, | |||
A., Peterson, J., Sparks, R., Handley, M., and E. | A., Peterson, J., Sparks, R., Handley, M., and E. | |||
Schooler, "SIP: Session Initiation Protocol", RFC 3261, | Schooler, "SIP: Session Initiation Protocol", RFC 3261, | |||
DOI 10.17487/RFC3261, June 2002, | DOI 10.17487/RFC3261, June 2002, | |||
skipping to change at page 18, line 40 ¶ | skipping to change at line 824 ¶ | |||
[RFC8225] Wendt, C. and J. Peterson, "PASSporT: Personal Assertion | [RFC8225] Wendt, C. and J. Peterson, "PASSporT: Personal Assertion | |||
Token", RFC 8225, DOI 10.17487/RFC8225, February 2018, | Token", RFC 8225, DOI 10.17487/RFC8225, February 2018, | |||
<https://www.rfc-editor.org/info/rfc8225>. | <https://www.rfc-editor.org/info/rfc8225>. | |||
[RFC8226] Peterson, J. and S. Turner, "Secure Telephone Identity | [RFC8226] Peterson, J. and S. Turner, "Secure Telephone Identity | |||
Credentials: Certificates", RFC 8226, | Credentials: Certificates", RFC 8226, | |||
DOI 10.17487/RFC8226, February 2018, | DOI 10.17487/RFC8226, February 2018, | |||
<https://www.rfc-editor.org/info/rfc8226>. | <https://www.rfc-editor.org/info/rfc8226>. | |||
13.2. Informative References | 12.2. Informative References | |||
[I-D.ietf-stir-oob] | ||||
Rescorla, E. and J. Peterson, "STIR Out-of-Band | ||||
Architecture and Use Cases", draft-ietf-stir-oob-07 (work | ||||
in progress), March 2020. | ||||
[RFC5806] Levy, S. and M. Mohali, Ed., "Diversion Indication in | [RFC5806] Levy, S. and M. Mohali, Ed., "Diversion Indication in | |||
SIP", RFC 5806, DOI 10.17487/RFC5806, March 2010, | SIP", RFC 5806, DOI 10.17487/RFC5806, March 2010, | |||
<https://www.rfc-editor.org/info/rfc5806>. | <https://www.rfc-editor.org/info/rfc5806>. | |||
[RFC7340] Peterson, J., Schulzrinne, H., and H. Tschofenig, "Secure | [RFC7340] Peterson, J., Schulzrinne, H., and H. Tschofenig, "Secure | |||
Telephone Identity Problem Statement and Requirements", | Telephone Identity Problem Statement and Requirements", | |||
RFC 7340, DOI 10.17487/RFC7340, September 2014, | RFC 7340, DOI 10.17487/RFC7340, September 2014, | |||
<https://www.rfc-editor.org/info/rfc7340>. | <https://www.rfc-editor.org/info/rfc7340>. | |||
[RFC8443] Singh, R., Dolly, M., Das, S., and A. Nguyen, "Personal | [RFC8443] Singh, R., Dolly, M., Das, S., and A. Nguyen, "Personal | |||
Assertion Token (PASSporT) Extension for Resource Priority | Assertion Token (PASSporT) Extension for Resource Priority | |||
Authorization", RFC 8443, DOI 10.17487/RFC8443, August | Authorization", RFC 8443, DOI 10.17487/RFC8443, August | |||
2018, <https://www.rfc-editor.org/info/rfc8443>. | 2018, <https://www.rfc-editor.org/info/rfc8443>. | |||
Appendix A. Appendix A: Keys for Examples | [RFC8816] Rescorla, E. and J. Peterson, "STIR Out-of-Band | |||
Architecture and Use Cases", RFC 8816, | ||||
DOI 10.17487/RFC8816, February 2021, | ||||
<https://www.rfc-editor.org/info/rfc8816>. | ||||
Appendix A. Keys for Examples | ||||
The following EC256 keys are used in the signing examples given in | The following EC256 keys are used in the signing examples given in | |||
this document. WARNING: Do not use this key pair in production | this document. WARNING: Do not use this key pair in production | |||
systems. | systems. | |||
-----BEGIN PUBLIC KEY----- | -----BEGIN PUBLIC KEY----- | |||
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEmzGM1VsO+3IqbMF54rQMaYKQftO4 | MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEmzGM1VsO+3IqbMF54rQMaYKQftO4 | |||
hUYm9wv5wutLgEd9FsiTy3+4+Wa2O7pffOXPC0QzO+yD8hGEXGP/2mZo6w== | hUYm9wv5wutLgEd9FsiTy3+4+Wa2O7pffOXPC0QzO+yD8hGEXGP/2mZo6w== | |||
-----END PUBLIC KEY----- | -----END PUBLIC KEY----- | |||
-----BEGIN EC PRIVATE KEY----- | -----BEGIN EC PRIVATE KEY----- | |||
MHcCAQEEIFKCsFZ4Wsw3ZpBxgc4Z0sOjaXDdMk07Ny1fKg6OntAkoAoGCCqGSM49 | MHcCAQEEIFKCsFZ4Wsw3ZpBxgc4Z0sOjaXDdMk07Ny1fKg6OntAkoAoGCCqGSM49 | |||
AwEHoUQDQgAEmzGM1VsO+3IqbMF54rQMaYKQftO4hUYm9wv5wutLgEd9FsiTy3+4 | AwEHoUQDQgAEmzGM1VsO+3IqbMF54rQMaYKQftO4hUYm9wv5wutLgEd9FsiTy3+4 | |||
+Wa2O7pffOXPC0QzO+yD8hGEXGP/2mZo6w== | +Wa2O7pffOXPC0QzO+yD8hGEXGP/2mZo6w== | |||
-----END EC PRIVATE KEY----- | -----END EC PRIVATE KEY----- | |||
Acknowledgments | ||||
We would like to thank Ning Zhang, Dave Hancock, Chris Wendt, Sean | ||||
Turner, Russ Housley, Ben Campbell, Eric Burger, and Robert Sparks | ||||
for contributions to this document. | ||||
Author's Address | Author's Address | |||
Jon Peterson | Jon Peterson | |||
Neustar, Inc. | Neustar, Inc. | |||
1800 Sutter St Suite 570 | 1800 Sutter St., Suite 570 | |||
Concord, CA 94520 | Concord, CA 94520 | |||
US | United States of America | |||
Email: jon.peterson@team.neustar | Email: jon.peterson@team.neustar | |||
End of changes. 94 change blocks. | ||||
271 lines changed or deleted | 267 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ |