rfc9219.original | rfc9219.txt | |||
---|---|---|---|---|
Network Working Group A. Melnikov | Internet Engineering Task Force (IETF) A. Melnikov | |||
Internet-Draft Isode Ltd | Request for Comments: 9219 Isode Ltd | |||
Intended status: Standards Track 6 January 2022 | Category: Standards Track March 2022 | |||
Expires: 10 July 2022 | ISSN: 2070-1721 | |||
S/MIME signature verification extension to JMAP | S/MIME Signature Verification Extension to the JSON Meta Application | |||
draft-ietf-jmap-smime-12 | Protocol (JMAP) | |||
Abstract | Abstract | |||
This document specifies an extension to JMAP for Mail (RFC 8621) for | This document specifies an extension to "The JSON Meta Application | |||
returning S/MIME signature verification status. | Protocol (JMAP) for Mail" (RFC 8621) for returning the S/MIME | |||
signature verification status. | ||||
Status of This Memo | Status of This Memo | |||
This Internet-Draft is submitted in full conformance with the | This is an Internet Standards Track document. | |||
provisions of BCP 78 and BCP 79. | ||||
Internet-Drafts are working documents of the Internet Engineering | ||||
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 10 July 2022. | 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/rfc9219. | ||||
Copyright Notice | Copyright Notice | |||
Copyright (c) 2022 IETF Trust and the persons identified as the | Copyright (c) 2022 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 (https://trustee.ietf.org/ | Provisions Relating to IETF Documents | |||
license-info) in effect on the date of publication of this document. | (https://trustee.ietf.org/license-info) in effect on the date of | |||
Please review these documents carefully, as they describe your rights | publication of this document. Please review these documents | |||
and restrictions with respect to this document. Code Components | carefully, as they describe your rights and restrictions with respect | |||
extracted from this document must include Revised BSD License text as | to this document. Code Components extracted from this document must | |||
described in Section 4.e of the Trust Legal Provisions and are | include Revised BSD License text as described in Section 4.e of the | |||
provided without warranty as described in the Revised BSD License. | Trust Legal Provisions and are provided without warranty as described | |||
in the Revised BSD License. | ||||
Table of Contents | Table of Contents | |||
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 2 | 1. Introduction | |||
2. Conventions Used in This Document . . . . . . . . . . . . . . 2 | 2. Conventions Used in This Document | |||
3. Addition to the capabilities object . . . . . . . . . . . . . 3 | 3. Addition to the Capabilities Object | |||
4. Extension for S/MIME signature verification . . . . . . . . . 3 | 4. Extension for S/MIME Signature Verification | |||
4.1. Extension to Email/get . . . . . . . . . . . . . . . . . 3 | 4.1. Extension to Email/get | |||
4.1.1. "smimeStatus" response property extensibility . . . . 7 | 4.1.1. "smimeStatus" Response Property Extensibility | |||
4.2. Extension to Email/query . . . . . . . . . . . . . . . . 8 | 4.2. Extension to Email/query | |||
4.3. Interaction with Email/changes . . . . . . . . . . . . . 8 | 4.3. Interaction with Email/changes | |||
5. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 9 | 5. IANA Considerations | |||
5.1. JMAP capability registration for "smimeverify" . . . . . 9 | 5.1. JMAP Capability Registration for "smimeverify" | |||
6. Security Considerations . . . . . . . . . . . . . . . . . . . 9 | 6. Security Considerations | |||
7. References . . . . . . . . . . . . . . . . . . . . . . . . . 10 | 7. References | |||
7.1. Normative References . . . . . . . . . . . . . . . . . . 10 | 7.1. Normative References | |||
7.2. Informative References . . . . . . . . . . . . . . . . . 10 | 7.2. Informative References | |||
Appendix A. Acknowledgements . . . . . . . . . . . . . . . . . . 10 | Acknowledgements | |||
Author's Address . . . . . . . . . . . . . . . . . . . . . . . . 10 | Author's Address | |||
1. Introduction | 1. Introduction | |||
JMAP for Mail [RFC8621] is a JSON-based application protocol for | JMAP for Mail [RFC8621] is a JSON-based application protocol for | |||
synchronising email data between a client and a server. | synchronizing email data between a client and a server. | |||
This document describes an extension to JMAP for returning S/MIME | This document describes an extension to JMAP for returning the S/MIME | |||
[RFC8551] signature verification status, without requiring a JMAP | signature verification status [RFC8551], without requiring a JMAP | |||
client to download the signature body part and all signed body parts | client to download the signature body part and all signed body parts | |||
(when the multipart/signed media type [RFC1847] is used) or to | (when the multipart/signed media type [RFC1847] is used) or to | |||
download and decode CMS (when the application/pkcs7-mime media type | download and decode the Cryptographic Message Syntax (CMS) (when the | |||
(Section 3.2 of [RFC8551]) is used). The use of the extension | application/pkcs7-mime media type (Section 3.2 of [RFC8551]) is | |||
implies the client trusts the JMAP server's S/MIME signature | used). The use of the extension implies the client trusts the JMAP | |||
verification code and configuration. This extension is suitable for | server's S/MIME signature verification code and configuration. This | |||
cases where reduction in network bandwidth and client-side code | extension is suitable for cases where reduction in network bandwidth | |||
complexity outweigh security concerns about trusting the JMAP server | and client-side code complexity outweigh security concerns about | |||
to perform S/MIME signature verifications. One possible use case is | trusting the JMAP server to perform S/MIME signature verifications. | |||
when the same organization controls both the JMAP server and the JMAP | One possible use case is when the same organization controls both the | |||
client. | JMAP server and the JMAP client. | |||
2. Conventions Used in This Document | 2. Conventions Used in This Document | |||
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 BCP | |||
14 [RFC2119] [RFC8174] when, and only when, they appear in all | 14 [RFC2119] [RFC8174] when, and only when, they appear in all | |||
capitals, as shown here. | capitals, as shown here. | |||
Type signatures, examples, and property descriptions in this document | Type signatures, examples, and property descriptions in this document | |||
follow the conventions established in Section 1.1 of [RFC8620]. Data | follow the conventions established in Section 1.1 of [RFC8620]. Data | |||
types defined in the core specification are also used in this | types defined in the core specification are also used in this | |||
document. | document. | |||
3. Addition to the capabilities object | 3. Addition to the Capabilities Object | |||
The capabilities object is returned as part of the standard JMAP | The *capabilities* object is returned as part of the standard JMAP | |||
Session object; see Section 2 of [RFC8620]. Servers supporting | Session object; see Section 2 of [RFC8620]. Servers supporting this | |||
_this_ specification MUST add a property called | specification MUST add a property called | |||
"urn:ietf:params:jmap:smimeverify" to the capabilities object. | "urn:ietf:params:jmap:smimeverify" to the capabilities object. | |||
The value of this property is an empty object in both the JMAP | The value of this property is an empty object in both the JMAP | |||
session _capabilities_ property and an account's | Session _capabilities_ property and an account's | |||
_accountCapabilities_ property. | _accountCapabilities_ property. | |||
4. Extension for S/MIME signature verification | 4. Extension for S/MIME Signature Verification | |||
4.1. Extension to Email/get | 4.1. Extension to Email/get | |||
[RFC8621] defines the Email/get method for retrieving message | [RFC8621] defines the Email/get method for retrieving message- | |||
specific information. This document defines the following pseudo | specific information. This document defines the following pseudo | |||
values in the _properties_ argument: | values in the _properties_ argument: | |||
* *smimeStatus*: If "smimeStatus" is included in the list of | *smimeStatus*: | |||
requested properties, it MUST be interpreted by the server as a | If "smimeStatus" is included in the list of requested properties, | |||
request to return the "smimeStatus" response property. | it MUST be interpreted by the server as a request to return the | |||
"smimeStatus" response property. | ||||
* *smimeStatusAtDelivery*: If "smimeStatusAtDelivery" is included in | *smimeStatusAtDelivery*: | |||
the list of requested properties, it MUST be interpreted by the | If "smimeStatusAtDelivery" is included in the list of requested | |||
server as a request to return the "smimeStatusAtDelivery" response | properties, it MUST be interpreted by the server as a request to | |||
property. (It is effectively the same as the "smimeStatus" value | return the "smimeStatusAtDelivery" response property. (It is | |||
calculated at the date/time of delivery, as specified by | effectively the same as the "smimeStatus" value calculated at the | |||
"receivedAt".) | date/time of delivery, as specified by "receivedAt".) | |||
* *smimeErrors*: If "smimeErrors" is included in the list of | *smimeErrors*: | |||
requested properties, it MUST be interpreted by the server as a | If "smimeErrors" is included in the list of requested properties, | |||
request to return the "smimeErrors" response property. | it MUST be interpreted by the server as a request to return the | |||
"smimeErrors" response property. | ||||
* *smimeVerifiedAt*: If "smimeVerifiedAt" is included in the list of | *smimeVerifiedAt*: | |||
requested properties, it MUST be interpreted by the server as a | If "smimeVerifiedAt" is included in the list of requested | |||
request to return the "smimeVerifiedAt" response property. | properties, it MUST be interpreted by the server as a request to | |||
return the "smimeVerifiedAt" response property. | ||||
The "smimeStatus" response property is defined as follows: | The "smimeStatus" response property is defined as follows: | |||
smimeStatus: "String|null" (server-set). null signifies that the | *smimeStatus*: | |||
message doesn't contain any signature. Otherwise, this property | "String|null" (server-set). null signifies that the message | |||
contains the S/MIME signature and certificate verification status | doesn't contain any signature. Otherwise, this property contains | |||
calculated according to [RFC8551] and [RFC8550]. Possible string | the S/MIME signature and certificate verification status | |||
values of the property are listed below. Servers MAY return other | calculated according to [RFC8551], [RFC8550], and [RFC5280]. | |||
values not defined below, as defined in extensions to this document. | Possible string values of the property are listed below. Servers | |||
Clients MUST treat unrecognized values as "unknown" or "signed/ | MAY return other values not defined below, as defined in | |||
failed". Note that the value of this property might change over | extensions to this document. Clients MUST treat unrecognized | |||
time. | values as "unknown" or "signed/failed". Note that the value of | |||
this property might change over time. | ||||
unknown: S/MIME message, but it was neither signed nor encrypted. | unknown: | |||
This can also be returned for a multipart/signed message which | An S/MIME message, but it was neither signed nor encrypted. | |||
contains an unrecognized signing protocol (for example OpenPGP). | This can also be returned for a multipart/signed message that | |||
contains an unrecognized signing protocol (for example, | ||||
OpenPGP). | ||||
signed: S/MIME signed message, but the signature was not yet | signed: | |||
verified. Some servers might not attempt to verify a signature | An S/MIME signed message, but the signature was not yet | |||
until a particular message is requested by the client. (This is a | verified. Some servers might not attempt to verify a signature | |||
useful optimization for a JMAP server to avoid doing work until | until a particular message is requested by the client. (This | |||
exact information is needed. A JMAP client that only needs to | is a useful optimization for a JMAP server to avoid doing work | |||
display an icon that signifies presence of an S/MIME signature can | until exact information is needed. A JMAP client that only | |||
still use this value.) JMAP servers compliant with this document | needs to display an icon that signifies presence of an S/MIME | |||
SHOULD attempt signature verification and return "signed/verified" | signature can still use this value.) JMAP servers compliant | |||
or "signed/failed" instead of this signature status. | with this document SHOULD attempt signature verification and | |||
return "signed/verified" or "signed/failed" instead of this | ||||
signature status. | ||||
signed/verified: S/MIME signed message and the sender's signature | signed/verified: | |||
was successfully verified according to [RFC8551] and [RFC8550]. | An S/MIME signed message, and the sender's signature was | |||
Additionally the signer email address extracted from the S/MIME | successfully verified according to [RFC8551] and [RFC8550]. | |||
certificate matches the From header field value, and the signer | Additionally, the signer email address extracted from the S/ | |||
certificate SHOULD be checked for revocation. | MIME certificate matches the From header field value, and the | |||
signer certificate SHOULD be checked for revocation. | ||||
signed/failed: S/MIME signed message, but the signature failed to | signed/failed: | |||
verify according to [RFC8551] and [RFC8550]. This might be a | S/MIME signed message, but the signature failed to verify | |||
policy related decision (e.g. the message signer email address | according to [RFC8551] and [RFC8550]. This might be because of | |||
doesn't match the From header field value), message was modified, | a policy-related decision (e.g., the message signer email | |||
the signer's certificate has expired or was revoked, etc. | address doesn't match the From header field value), the message | |||
was modified, the signer's certificate has expired or was | ||||
revoked, etc. | ||||
encrypted+signed/verified: This value is reserved for future use. | encrypted+signed/verified: | |||
It is typically handled in the same way as "signed/verified". | This value is reserved for future use. It is typically handled | |||
in the same way as "signed/verified". | ||||
encrypted+signed/failed: This value is reserved for future use. It | encrypted+signed/failed: | |||
is typically handled in the same way as "signed/failed". | This value is reserved for future use. It is typically handled | |||
in the same way as "signed/failed". | ||||
The "smimeStatusAtDelivery" response property has the same syntax as | The "smimeStatusAtDelivery" response property has the same syntax as | |||
"smimeStatus" but is calculated in relationship to the "receivedAt" | "smimeStatus" but is calculated in relationship to the "receivedAt" | |||
date/time. Unlike "smimeStatus", the "smimeStatusAtDelivery" | date/time. Unlike "smimeStatus", the "smimeStatusAtDelivery" | |||
response property value doesn't change, unless Trust Anchors are | response property value doesn't change unless trust anchors are | |||
added. (For example, addition of a Trust Anchor can change the value | added. (For example, addition of a trust anchor can change the value | |||
of a message "smimeStatusAtDelivery" property from "signed/failed" to | of a message "smimeStatusAtDelivery" property from "signed/failed" to | |||
"signed/verified". Note that Trust Anchor removal doesn't affect | "signed/verified". Note that trust anchor removal doesn't affect | |||
this response property.) The "smimeStatusAtDelivery" allows clients | this response property.) The "smimeStatusAtDelivery" response | |||
to compare the S/MIME signature verification status at delivery with | property value allows clients to compare the S/MIME signature | |||
the current status as returned by "smimeStatus", for example to help | verification status at delivery with the current status as returned | |||
to answer questions like "was the signature valid at the time of | by "smimeStatus", for example, to help to answer questions like "was | |||
delivery?". | the signature valid at the time of delivery?". | |||
Note that the "smimeStatusAtDelivery" response property value doesn't | Note that the "smimeStatusAtDelivery" response property value doesn't | |||
have to be calculated at delivery time. A JMAP server can defer its | have to be calculated at delivery time. A JMAP server can defer its | |||
calculation until it is explicitly requested, but once calculated its | calculation until it is explicitly requested; however, once it is | |||
value is remembered for later use. | calculated, its value is remembered for later use. | |||
The "smimeErrors" response property is defined as follows: | The "smimeErrors" response property is defined as follows: | |||
smimeErrors: "String[]|null" (server-set). null signifies that the | *smimeErrors*: | |||
message doesn't contain any signature or that there were no errors | "String[]|null" (server-set). null signifies that the message | |||
when verifying the S/MIME signature. (I.e., this property is non | doesn't contain any signature or that there were no errors when | |||
null only when the corresponding "smimeStatus" response property | verifying the S/MIME signature. (That is, this property is non- | |||
value is "signed/failed" or "encrypted+signed/failed". Note that | null only when the corresponding "smimeStatus" response property | |||
future extensions to this document can specify other smimeStatus | value is "signed/failed" or "encrypted+signed/failed". Note that | |||
values that can be used with smimeErrors.) Each string in the array | future extensions to this document can specify other "smimeStatus" | |||
is a human readable description (in the language specified in the | values that can be used with "smimeErrors".) Each string in the | |||
Content-Language header field, if any) of a problem with the | array is a human-readable description (in the language specified | |||
signature, the signing certificate or the signing certificate chain. | in the Content-Language header field, if any) of a problem with | |||
(See Section 3.8 of [RFC8620] in regards to how this is affected by | the signature, the signing certificate, or the signing certificate | |||
the language selection.) In one example, the signing certificate | chain. (See Section 3.8 of [RFC8620] in regards to how this is | |||
might be expired and the message From email address might not | affected by the language selection.) In one example, the signing | |||
correspond to any of the email addresses in the signing certificate. | certificate might be expired and the message From email address | |||
In another example the certificate might be expired and the JMAP | might not correspond to any of the email addresses in the signing | |||
server might be unable to retrieve a CRL for the certificate. In | certificate. In another example, the certificate might be expired | |||
both of these cases there would be 2 elements in the array. | and the JMAP server might be unable to retrieve a Certificate | |||
Revocation List (CRL) for the certificate. In both of these | ||||
cases, there would be 2 elements in the array. | ||||
The "smimeVerifiedAt" response property is defined as follows: | The "smimeVerifiedAt" response property is defined as follows: | |||
smimeVerifiedAt: "UTCDate|null" (server-set). null signifies that the | *smimeVerifiedAt*: | |||
message doesn't contain any S/MIME signature or that there is a | "UTCDate|null" (server-set). null signifies that the message | |||
signature, but there was no attempt to verify it. (Retrieval of the | doesn't contain any S/MIME signature or that there is a signature, | |||
smimeStatus value can be used to distinguish these 2 cases). In all | but there was no attempt to verify it. (Retrieval of the | |||
other cases it is set to the date and time of when the S/MIME | "smimeStatus" value can be used to distinguish these 2 cases). In | |||
signature was most recently verified. Note that a request to fetch | all other cases, it is set to the date and time of when the S/MIME | |||
"smimeStatus", "smimeStatusAtDelivery" and/or "smimeErrors" would | signature was most recently verified. Note that a request to | |||
force this response property to be set to a non null value, if an S/ | fetch "smimeStatus", "smimeStatusAtDelivery", and/or "smimeErrors" | |||
MIME signature exists. | would force this response property to be set to a non-null value | |||
if an S/MIME signature exists. | ||||
"smimeStatus" and "smimeErrors" values are calculated at the time the | The "smimeStatus" and "smimeErrors" values are calculated at the time | |||
corresponding JMAP request was processed (but see below about the | the corresponding JMAP request is processed (but see below about the | |||
effect of result caching), not at the time when the message was | effect of result caching), not at the time when the message is | |||
generated (according to its Date header field value). In all cases | generated (according to its Date header field value). In all cases, | |||
"smimeVerifiedAt" is set to the time when "smimeStatus" and | "smimeVerifiedAt" is set to the time when "smimeStatus" and | |||
"smimeErrors" were last updated. As recalculating these values is | "smimeErrors" were last updated. As recalculating these values is | |||
expensive for the server, they MAY be cached for up to 24 hours from | expensive for the server, they MAY be cached for up to 24 hours from | |||
the moment when they were calculated. | the moment when they were calculated. | |||
Example 1: Retrieval of minimal information about a message, | Example 1: Retrieval of minimal information about a message, | |||
including its From, Subject and Date header fields, as well as S/MIME | including its From, Subject, and Date header fields, as well as the | |||
signature verification status at delivery and date/time when the | S/MIME signature verification status at delivery and date/time when | |||
message was received. | the message was received. | |||
["Email/get", { | ["Email/get", { | |||
"ids": [ "fe123u457" ], | "ids": [ "fe123u457" ], | |||
"properties": [ "mailboxIds", "from", "subject", "date", | "properties": [ "mailboxIds", "from", "subject", "date", | |||
"smimeStatusAtDelivery", "receivedAt" ] | "smimeStatusAtDelivery", "receivedAt" ] | |||
}, "#1"] | }, "#1"] | |||
This might result in the following response: | This might result in the following response: | |||
[["Email/get", { | [["Email/get", { | |||
"accountId": "abc", | "accountId": "abc", | |||
"state": "51234123231", | "state": "51234123231", | |||
"list": [ | "list": [ | |||
{ | { | |||
"id": "fe123u457", | "id": "fe123u457", | |||
"mailboxIds": { "f123": true }, | "mailboxIds": { "f123": true }, | |||
"from": [{"name": "Joe Bloggs", "email": "joe@bloggs.example.net"}], | "from": [{"name": "Joe Bloggs", | |||
"subject": "Dinner tonight?", | "email": "joe@bloggs.example.net"}], | |||
"date": "2020-07-07T14:12:00Z", | "subject": "Dinner tonight?", | |||
"smimeStatusAtDelivery": "signed/verified", | "date": "2020-07-07T14:12:00Z", | |||
"receivedAt": "2020-07-07T14:15:18Z" | "smimeStatusAtDelivery": "signed/verified", | |||
} | "receivedAt": "2020-07-07T14:15:18Z" | |||
] | } | |||
}, "#1"]] | ] | |||
}, "#1"]] | ||||
Example 2: Retrieval of minimal information about a message, | Example 2: Retrieval of minimal information about a message, | |||
including its From, Subject and Date header fields, as well as the | including its From, Subject, and Date header fields, as well as the | |||
latest S/MIME signature verification status, S/MIME verification | latest S/MIME signature verification status, S/MIME verification | |||
errors (if any) and when was the S/MIME signature status last | errors (if any), and when the S/MIME signature status was last | |||
verified. The response contains 2 S/MIME errors related to S/MIME | verified. The response contains 2 S/MIME errors related to S/MIME | |||
signature verification. | signature verification. | |||
["Email/get", { | ["Email/get", { | |||
"ids": [ "ag123u123" ], | "ids": [ "ag123u123" ], | |||
"properties": [ "mailboxIds", "from", "subject", "date", | "properties": [ "mailboxIds", "from", "subject", "date", | |||
"smimeStatus", "smimeErrors", "smimeVerifiedAt" ] | "smimeStatus", "smimeErrors", "smimeVerifiedAt" ] | |||
}, "#1"] | }, "#1"] | |||
This might result in the following response: | This might result in the following response: | |||
[["Email/get", { | [["Email/get", { | |||
"accountId": "abc", | "accountId": "abc", | |||
"state": "47234123231", | "state": "47234123231", | |||
"list": [ | "list": [ | |||
{ | { | |||
"id": "ag123u123", | "id": "ag123u123", | |||
"mailboxIds": { "f123": true }, | "mailboxIds": { "f123": true }, | |||
"from": [{"name": "Jane Doe", | "from": [{"name": "Jane Doe", | |||
"email": "jdoe@example.com"}], | "email": "jdoe@example.com"}], | |||
"subject": "Company takeover", | "subject": "Company takeover", | |||
"date": "2020-01-31T23:00:00Z", | "date": "2020-01-31T23:00:00Z", | |||
"smimeStatus": "signed/failed", | "smimeStatus": "signed/failed", | |||
"smimeErrors": [ | "smimeErrors": [ | |||
"From email address doesn't match the certificate", | "From email address doesn't match the certificate", | |||
"Can't retrieve CRL from the CRL URL"], | "Can't retrieve CRL from the CRL URL"], | |||
"smimeVerifiedAt": "2020-03-01T12:11:19Z" | "smimeVerifiedAt": "2020-03-01T12:11:19Z" | |||
} | } | |||
] | ] | |||
}, "#1"]] | }, "#1"]] | |||
4.1.1. "smimeStatus" response property extensibility | 4.1.1. "smimeStatus" Response Property Extensibility | |||
Future extensions to this document can specify extra allowed values | Future extensions to this document can specify extra allowed values | |||
for the smimeStatus response property. All values (defined in this | for the "smimeStatus" response property. All values (defined in this | |||
document or in extensions to this document) MUST be in ASCII. (Note | document or in extensions to this document) MUST be in ASCII. (Note | |||
that this response property contains tokens, thus it is not subject | that this response property contains tokens; thus, it is not subject | |||
to Internationalization or Localization). | to internationalization or localization). | |||
New smimeStatus response property values defined in extensions may | New "smimeStatus" response property values defined in extensions may | |||
affect behaviour of properties such as smimeErrors response property | affect the behavior of properties, such as the "smimeErrors" response | |||
of Email/get (see Section 4.1) or hasVerifiedSmime property of Email/ | property of Email/get (see Section 4.1) or the "hasVerifiedSmime" | |||
query (see Section 4.2). In particular the new values can be treated | property of Email/query (see Section 4.2). In particular, the new | |||
similar to values defined in this document. | values can be treated similarly to values defined in this document. | |||
For example a putative JMAP extension for automatically decrypting S/ | For example, a putative JMAP extension for automatically decrypting | |||
MIME messages can specify two additional values, one specifying that | S/MIME messages can specify two additional values, one specifying | |||
a message is both encrypted and signed with a valid S/MIME signature | that a message is both encrypted and signed with a valid S/MIME | |||
and another one specifying that a message is both encrypted and | signature (e.g. "encrypted+signed/verified") and another one | |||
signed with an invalid S/MIME signature. The former value can be | specifying that a message is both encrypted and signed with an | |||
treated as "signed/verified" (and would thus affect hasVerifiedSmime) | invalid S/MIME signature (e.g. "encrypted+signed/failed"). The | |||
and the latter can be treated as "signed/failed" (and thus can be | former value can be treated as "signed/verified" (and would thus | |||
used with smimeErrors). | affect "hasVerifiedSmime") and the latter can be treated as "signed/ | |||
failed" (and thus can be used with "smimeErrors"). | ||||
4.2. Extension to Email/query | 4.2. Extension to Email/query | |||
[RFC8621] defines the Email/query method for searching for messages | [RFC8621] defines the Email/query method for searching for messages | |||
with specific properties. This document defines the following | with specific properties. This document defines the following | |||
properties of the *FilterCondition* object: | properties of the *FilterCondition* object: | |||
* *hasSmime*: "Boolean". If "hasSmime" has the value true, only | *hasSmime*: | |||
messages with "smimeStatus" other than null match the condition. | "Boolean". If "hasSmime" has the value true, only messages with | |||
If "hasSmime" has the value false, only messages with | "smimeStatus" other than null match the condition. If "hasSmime" | |||
"smimeStatus" equal to null match the condition. | has the value false, only messages with "smimeStatus" equal to | |||
null match the condition. | ||||
* *hasVerifiedSmime*: "Boolean". If "hasVerifiedSmime" has the | *hasVerifiedSmime*: | |||
value true, only messages with "smimeStatus" equal to "signed/ | "Boolean". If "hasVerifiedSmime" has the value true, only | |||
verified" or "encrypted+signed/verified" (*), match the condition. | messages with "smimeStatus" equal to "signed/verified" or | |||
If "hasVerifiedSmime" has the value false, only messages with | "encrypted+signed/verified" (*) match the condition. If | |||
"hasVerifiedSmime" has the value false, only messages with | ||||
"smimeStatus" not equal to "signed/verified" and not equal to | "smimeStatus" not equal to "signed/verified" and not equal to | |||
"encrypted+signed/verified" (*) (including the value null) match | "encrypted+signed/verified" (*) (including the value null) match | |||
the condition. Note that use of this attribute is potentially | the condition. Note that use of this attribute is potentially | |||
expensive for a JMAP server, as it forces calculation of | expensive for a JMAP server, as it forces calculation of the | |||
smimeStatus property value for each message. However caching of | "smimeStatus" property value for each message. However, caching | |||
smimeStatus values should ameliorate this cost somewhat. | of the "smimeStatus" values should ameliorate this cost somewhat. | |||
(*) as well as "smimeStatus" values added by future extensions to | (*) as well as the "smimeStatus" values added by future extensions | |||
this document that are explicitly specified as having similar | to this document that are explicitly specified as having similar | |||
effect to "signed/verified" as far as "hasVerifiedSmime" | effect to "signed/verified" as far as "hasVerifiedSmime" | |||
calculation is concerned. | calculation is concerned. | |||
* *hasVerifiedSmimeAtDelivery*: "Boolean". The | *hasVerifiedSmimeAtDelivery*: | |||
"hasVerifiedSmimeAtDelivery" property is handled similar to | "Boolean". The "hasVerifiedSmimeAtDelivery" property is handled | |||
"hasVerifiedSmime" property, but the value of | similarly to the "hasVerifiedSmime" property, but the value of | |||
"smimeStatusAtDelivery" is used instead of "smimeStatus" to assess | "smimeStatusAtDelivery" is used instead of "smimeStatus" to assess | |||
whether a particular message matches the condition. | whether a particular message matches the condition. | |||
4.3. Interaction with Email/changes | 4.3. Interaction with Email/changes | |||
Changes to "smimeVerifiedAt" response property value MUST NOT cause | Changes to the "smimeVerifiedAt" response property value MUST NOT | |||
the message to be included in the "updated" argument of Email/changes | cause the message to be included in the "updated" argument of the | |||
response. However changes to "smimeStatus", "smimeStatusAtDelivery" | Email/changes response. However, changes to the "smimeStatus", | |||
and/or "smimeErrors" response properties MUST result in message | "smimeStatusAtDelivery", and/or "smimeErrors" response properties | |||
inclusion in the "updated" argument of Email/changes response. | MUST result in message inclusion in the "updated" argument of the | |||
Email/changes response. | ||||
5. IANA Considerations | 5. IANA Considerations | |||
5.1. JMAP capability registration for "smimeverify" | 5.1. JMAP Capability Registration for "smimeverify" | |||
IANA is requested to register the "smimeverify" JMAP Capability as | ||||
follows: | ||||
Capability Name: "urn:ietf:params:jmap:smimeverify" | ||||
Specification document: this document | ||||
Intended use: common | ||||
Change Controller: IETF | IANA has registered the "smimeverify" JMAP capability as follows: | |||
Security and privacy considerations: this document, Section 6 | Capability Name: urn:ietf:params:jmap:smimeverify | |||
Specification document: RFC 9219 | ||||
Intended use: common | ||||
Change Controller: IETF | ||||
Security and privacy considerations: RFC 9219, Section 6 | ||||
6. Security Considerations | 6. Security Considerations | |||
Use of the server-side S/MIME signature verification JMAP extension | Use of the server-side S/MIME signature verification JMAP extension | |||
requires the client to trust the server signature verification code, | requires the client to trust the server signature verification code, | |||
server configuration and its operational practices to perform S/MIME | the server configuration, and the server's operational practices to | |||
signature verification, as well as to trust that the channel between | perform S/MIME signature verification, as well as to trust that the | |||
the client and the server is integrity protected. (For example, if | channel between the client and the server is integrity protected. | |||
the server is not configured with some Trust Anchors, some messages | (For example, if the server is not configured with some trust | |||
will have "signed/failed" status instead of "signed/verified".) A | anchors, some messages will have the "signed/failed" status instead | |||
malicious or compromised server could return false verification | of "signed/verified".) A malicious or compromised server could | |||
status to a client. A successful verification could be conveyed to a | return a false verification status to a client. A successful | |||
client for a forged or altered message. A properly signed message | verification could be conveyed to a client for a forged or altered | |||
could be signaled as having a failed signature verification or no | message. A properly signed message could be signaled as having a | |||
signature at all. In the case of the latter attack, no new attack | failed signature verification or no signature at all. In the case of | |||
surface is presented with this extension above what malicious or | the latter attack, no new attack surface is presented with this | |||
compromised server could already do by stripping or tampering with | extension above what a malicious or compromised server could already | |||
the S/MIME information in the message. In the case of the former | do by stripping or tampering with the S/MIME information in the | |||
attack, client software capable of performing S/MIME signature | message. In the case of the former attack, client software capable | |||
verification could detect this attack. Local configuration of the | of performing S/MIME signature verification could detect this attack. | |||
client should determine if this client-side verification should | Local configuration of the client should determine if this client- | |||
occur. For clients without local verification capabilities, such an | side verification should occur. For clients without local | |||
attack would be difficult to detect. | verification capabilities, such an attack would be difficult to | |||
detect. | ||||
Integrity protection of the channel between the client and the server | Integrity protection of the channel between the client and the server | |||
is provided by use of TLS, as required by JMAP specification (see | is provided by use of TLS, as required by the JMAP specification (see | |||
Section 8.1 of [RFC8620]). | Section 8.1 of [RFC8620]). | |||
Constant recalculation of S/MIME signature status can result in a | Constant recalculation of the S/MIME signature status can result in a | |||
Denial-of-Service condition. For that reason, it is RECOMMENDED that | denial-of-service condition. For that reason, it is RECOMMENDED that | |||
servers cache results of signature verification for up to 24 hours. | servers cache results of signature verification for up to 24 hours. | |||
7. References | 7. References | |||
7.1. Normative References | 7.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>. | |||
[RFC5280] Cooper, D., Santesson, S., Farrell, S., Boeyen, S., | ||||
Housley, R., and W. Polk, "Internet X.509 Public Key | ||||
Infrastructure Certificate and Certificate Revocation List | ||||
(CRL) Profile", RFC 5280, DOI 10.17487/RFC5280, May 2008, | ||||
<https://www.rfc-editor.org/info/rfc5280>. | ||||
[RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC | [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC | |||
2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, | 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, | |||
May 2017, <https://www.rfc-editor.org/info/rfc8174>. | May 2017, <https://www.rfc-editor.org/info/rfc8174>. | |||
[RFC8550] Schaad, J., Ramsdell, B., and S. Turner, "Secure/ | [RFC8550] Schaad, J., Ramsdell, B., and S. Turner, "Secure/ | |||
Multipurpose Internet Mail Extensions (S/MIME) Version 4.0 | Multipurpose Internet Mail Extensions (S/MIME) Version 4.0 | |||
Certificate Handling", RFC 8550, DOI 10.17487/RFC8550, | Certificate Handling", RFC 8550, DOI 10.17487/RFC8550, | |||
April 2019, <https://www.rfc-editor.org/info/rfc8550>. | April 2019, <https://www.rfc-editor.org/info/rfc8550>. | |||
[RFC8551] Schaad, J., Ramsdell, B., and S. Turner, "Secure/ | [RFC8551] Schaad, J., Ramsdell, B., and S. Turner, "Secure/ | |||
skipping to change at page 10, line 43 ¶ | skipping to change at line 474 ¶ | |||
Protocol (JMAP) for Mail", RFC 8621, DOI 10.17487/RFC8621, | Protocol (JMAP) for Mail", RFC 8621, DOI 10.17487/RFC8621, | |||
August 2019, <https://www.rfc-editor.org/info/rfc8621>. | August 2019, <https://www.rfc-editor.org/info/rfc8621>. | |||
7.2. Informative References | 7.2. Informative References | |||
[RFC1847] Galvin, J., Murphy, S., Crocker, S., and N. Freed, | [RFC1847] Galvin, J., Murphy, S., Crocker, S., and N. Freed, | |||
"Security Multiparts for MIME: Multipart/Signed and | "Security Multiparts for MIME: Multipart/Signed and | |||
Multipart/Encrypted", RFC 1847, DOI 10.17487/RFC1847, | Multipart/Encrypted", RFC 1847, DOI 10.17487/RFC1847, | |||
October 1995, <https://www.rfc-editor.org/info/rfc1847>. | October 1995, <https://www.rfc-editor.org/info/rfc1847>. | |||
Appendix A. Acknowledgements | Acknowledgements | |||
This document is a product of the JMAP Working Group. Special thank | This document is a product of the JMAP Working Group. Special thank | |||
you to Bron Gondwana, Neil Jenkins, Murray Kucherawy, Kirsty Paine, | you to Bron Gondwana, Neil Jenkins, Murray Kucherawy, Kirsty Paine, | |||
Benjamin Kaduk, Roman Danyliw, Peter Yee, Robert Wilton, Erik Kline | Benjamin Kaduk, Roman Danyliw, Peter Yee, Robert Wilton, Erik Kline, | |||
and Menachem Dodge for suggestions, comments and corrections to this | and Menachem Dodge for suggestions, comments, and corrections to this | |||
document. | document. | |||
Author's Address | Author's Address | |||
Alexey Melnikov | Alexey Melnikov | |||
Isode Ltd | Isode Ltd | |||
14 Castle Mews | 14 Castle Mews | |||
Hampton | Hampton, Middlesex | |||
TW12 2NP | TW12 2NP | |||
United Kingdom | United Kingdom | |||
Email: Alexey.Melnikov@isode.com | Email: Alexey.Melnikov@isode.com | |||
End of changes. 64 change blocks. | ||||
278 lines changed or deleted | 300 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/ |