rfc9219xml2.original.xml | rfc9219.xml | |||
---|---|---|---|---|
<?xml version="1.0" encoding="US-ASCII"?> | <?xml version="1.0" encoding="UTF-8"?> | |||
<!DOCTYPE rfc SYSTEM "rfc2629.dtd"> | <!DOCTYPE rfc [ | |||
<?rfc toc="yes"?> | <!ENTITY nbsp " "> | |||
<?rfc rfcedstyle="yes"?> | <!ENTITY zwsp "​"> | |||
<?rfc subcompact="no"?> | <!ENTITY nbhy "‑"> | |||
<?rfc symrefs="yes"?> | <!ENTITY wj "⁠"> | |||
<?rfc comments="yes" ?> | ]> | |||
<?rfc inline="yes" ?> | ||||
<rfc ipr="trust200902" category="std" docName='draft-ietf-jmap-smime-12'> | <rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" submissionType | |||
="IETF" category="std" consensus="true" docName="draft-ietf-jmap-smime-12" numbe | ||||
r="9219" obsoletes="" updates="" xml:lang="en" tocInclude="true" symRefs="true" | ||||
sortRefs="true" version="3"> | ||||
<!-- xml2rfc v2v3 conversion 3.12.0 --> | ||||
<front> | <front> | |||
<title abbrev="JMAP extension for S/MIME"> | <title abbrev="JMAP Extension for S/MIME"> | |||
S/MIME signature verification extension to JMAP | S/MIME Signature Verification Extension to the JSON Meta Application Protoco | |||
l | ||||
(JMAP) | ||||
</title> | </title> | |||
<seriesInfo name="RFC" value="9219"/> | ||||
<author initials="A." surname="Melnikov" fullname="Alexey Melnikov"> | <author initials="A." surname="Melnikov" fullname="Alexey Melnikov"> | |||
<organization>Isode Ltd</organization> | <organization>Isode Ltd</organization> | |||
<address> | <address> | |||
<postal> | <postal> | |||
<street>14 Castle Mews</street> | <street>14 Castle Mews</street> | |||
<city>Hampton</city> | <city>Hampton, Middlesex</city> | |||
<region>Middlesex</region> | <code>TW12 2NP</code> | |||
<code>TW12 2NP</code> | <country>United Kingdom</country> | |||
<country>UK</country> | </postal> | |||
</postal> | <email>Alexey.Melnikov@isode.com</email> | |||
<email>Alexey.Melnikov@isode.com</email> | ||||
</address> | </address> | |||
</author> | </author> | |||
<date year="2022" month="March" /> | ||||
<date year="2022" /> | ||||
<keyword>JMAP</keyword> | <keyword>JMAP</keyword> | |||
<keyword>S/MIME</keyword> | <keyword>S/MIME</keyword> | |||
<abstract> | <abstract> | |||
<t> | ||||
<t> | This document specifies an extension to "The JSON Meta Application Protoc | |||
This document specifies an extension to JMAP for Mail (RFC 8621) for returni | ol | |||
ng S/MIME signature verification status. | (JMAP) for Mail" (RFC 8621) for returning the S/MIME signature verificati | |||
</t> | on status. | |||
</t> | ||||
</abstract> | </abstract> | |||
</front> | </front> | |||
<middle> | <middle> | |||
<section numbered="true" toc="default"> | ||||
<section title="Introduction"> | <name>Introduction</name> | |||
<t> | ||||
<t> | <xref target="RFC8621" format="default">JMAP for Mail</xref> is a JSON-b | |||
<xref target="RFC8621">JMAP for Mail</xref> is a JSON-based application | ased application protocol for synchronizing email data | |||
protocol for synchronising email data | ||||
between a client and a server. | between a client and a server. | |||
</t> | ||||
<!-- | <t> | |||
JMAP [RFC8620] is a generic protocol for synchronising | This document describes an extension to JMAP for returning the S/MIME | |||
data, such as mail, calendars or contacts, between a client and a | signature verification status <xref target="RFC8551" | |||
server. It is optimised for mobile and web environments, and aims to | format="default"/>, without requiring a JMAP client to download the | |||
provide a consistent interface to different data types. | signature body part and all signed body parts (when the | |||
[RFC8621] builds on top of JMAP and defines how to perform | multipart/signed media type <xref target="RFC1847" format="default"/> | |||
email synchronization. | is used) or to download and decode the Cryptographic Message Syntax (CMS | |||
</t> | ) | |||
(when the application/pkcs7-mime media type (<xref target="RFC8551" | ||||
<t> | section="3.2" sectionFormat="of" format="default"/>) is used). The | |||
This document describes an extension to JMAP for returning S/MIME <xref | use of the extension implies the client trusts the JMAP server's | |||
target="RFC8551"/> signature verification status, | S/MIME signature verification code and configuration. This extension | |||
without requiring a JMAP client to download the signature body part and | is suitable for cases where reduction in network bandwidth and | |||
all signed body parts | client-side code complexity outweigh security concerns about trusting | |||
(when the multipart/signed media type <xref target="RFC1847"/> is used) | the JMAP server to perform S/MIME signature verifications. One | |||
or to download and decode CMS (when the application/pkcs7-mime media typ | possible use case is when the same organization controls both the JMAP | |||
e (Section 3.2 of <xref target="RFC8551"/>) | server and the JMAP client. | |||
is used). | </t> | |||
The use of the extension implies the client trusts the JMAP server's S/M | ||||
IME signature verification code and configuration. | ||||
This extension is suitable for cases where reduction in network bandwidt | ||||
h and client-side code complexity outweigh security concerns | ||||
about trusting the JMAP server to perform S/MIME signature verifications | ||||
. One possible use case is when the same organization controls both | ||||
the JMAP server and the JMAP client. | ||||
</t> | ||||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Conventions Used in This Document"> | <name>Conventions Used in This Document</name> | |||
<t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14 | ||||
<t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | >REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL NOT</bcp14>", | |||
"SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", | "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMEND | |||
and "OPTIONAL" in this document are to be interpreted as described in | ED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>", "<bcp14>MAY</bcp14>", | |||
BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only | and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as | |||
when, they | described in | |||
BCP 14 <xref target="RFC2119" format="default"/> <xref target="RFC8174" | ||||
format="default"/> when, and only when, they | ||||
appear in all capitals, as shown here. | appear in all capitals, as shown here. | |||
</t> | </t> | |||
<t> | <t> | |||
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 <xref target="RFC8620 "/>. | follow the conventions established in <xref target="RFC8620" section="1.1" sectionFormat="of" format="default"/>. | |||
Data types defined in the core specification are also used in this documen t. | Data types defined in the core specification are also used in this documen t. | |||
</t> | </t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Addition to the capabilities object"> | <name>Addition to the Capabilities Object</name> | |||
<t> | <t> | |||
The capabilities object is returned as part of the standard JMAP | The <strong>capabilities</strong> object is returned as part of the stan | |||
Session object; see Section 2 of <xref target="RFC8620"/>. Servers supp | dard JMAP | |||
orting _this_ | Session object; see <xref target="RFC8620" section="2" sectionFormat="of | |||
specification MUST add a property called | " format="default"/>. | |||
Servers supporting this | ||||
specification <bcp14>MUST</bcp14> add a property called | ||||
"urn:ietf:params:jmap:smimeverify" to the capabilities object. | "urn:ietf:params:jmap:smimeverify" to the capabilities object. | |||
</t> | </t> | |||
<t> | <t> | |||
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 <em>capabilities</em> property and an account's | |||
_accountCapabilities_ property. | <em>accountCapabilities</em> property. | |||
</t> | </t> | |||
</section> | </section> | |||
<section anchor="smime" numbered="true" toc="default"> | ||||
<name>Extension for S/MIME Signature Verification</name> | ||||
<section anchor="email-get-ext" numbered="true" toc="default"> | ||||
<name>Extension to Email/get</name> | ||||
<t> | ||||
<section title="Extension for S/MIME signature verification" anchor="smime"> | <xref target="RFC8621" format="default"/> defines the Email/get method f | |||
or retrieving message-specific information. | ||||
<section title="Extension to Email/get" anchor="email-get-ext"> | This document defines the following pseudo values in the <em>properties< | |||
<t> | /em> argument:</t> | |||
<xref target="RFC8621"/> defines the Email/get method for retrieving messa | <dl newline="true" spacing="normal"> | |||
ge specific information. | <dt><strong>smimeStatus</strong>:</dt> | |||
This document defines the following pseudo values in the _properties_ ar | <dd>If "smimeStatus" is included in the list of requested | |||
gument:<vspace/> | properties, it <bcp14>MUST</bcp14> be interpreted by the server as a r | |||
<list style="bullets"> | equest to | |||
return the "smimeStatus" response property.</dd> | ||||
<t>*smimeStatus*: If "smimeStatus" is included in the list of requested | <dt><strong>smimeStatusAtDelivery</strong>:</dt> | |||
properties, it MUST be interpreted by the server as a request to | <dd>If "smimeStatusAtDelivery" is included in the list of requested | |||
return the "smimeStatus" response property.</t> | properties, it <bcp14>MUST</bcp14> be interpreted by the server as a req | |||
uest to | ||||
<t>*smimeStatusAtDelivery*: If "smimeStatusAtDelivery" is included in th | return the "smimeStatusAtDelivery" response property. (It is effectively | |||
e list of requested | the same as | |||
properties, it MUST be interpreted by the server as a request to | the "smimeStatus" | |||
return the "smimeStatusAtDelivery" response property. (It is effectively | value calculated at the date/time of delivery, as specified by "received | |||
the same as the "smimeStatus" | At".)</dd> | |||
value calculated at the date/time of delivery, as specified by "received | <dt><strong>smimeErrors</strong>:</dt> | |||
At".)</t> | <dd>If "smimeErrors" is included in the list of requested | |||
properties, it <bcp14>MUST</bcp14> be interpreted by the server as a req | ||||
<t>*smimeErrors*: If "smimeErrors" is included in the list of requested | uest to | |||
properties, it MUST be interpreted by the server as a request to | return the "smimeErrors" response property.</dd> | |||
return the "smimeErrors" response property.</t> | <dt><strong>smimeVerifiedAt</strong>:</dt> | |||
<dd>If "smimeVerifiedAt" is included in the list of requested | ||||
<!--///Rename "smimeVerifiedAt" to "smimeValidatedAt" everywhere?--> | properties, it <bcp14>MUST</bcp14> be interpreted by the server as a req | |||
<t>*smimeVerifiedAt*: If "smimeVerifiedAt" is included in the list of re | uest to | |||
quested | return the "smimeVerifiedAt" response property.</dd> | |||
properties, it MUST be interpreted by the server as a request to | </dl> | |||
return the "smimeVerifiedAt" response property.</t> | <t>The "smimeStatus" response property is defined as follows:</t> | |||
<dl newline="true" spacing="normal"> | ||||
</list> | <dt><strong>smimeStatus</strong>:</dt> | |||
</t> | <dd><t>"String|null" (server-set). null signifies that the message does | |||
n't | ||||
<t>The "smimeStatus" response property is defined as follows:</t> | ||||
<t> | ||||
smimeStatus: "String|null" (server-set). null signifies that the message | ||||
doesn't | ||||
contain any signature. Otherwise, this property contains the S/MIME sign ature | contain any signature. Otherwise, this property contains the S/MIME sign ature | |||
and certificate verification status calculated according to | and certificate verification status calculated according to | |||
<xref target="RFC8551"/> and <xref target="RFC8550"/><!--and RFC 5280 th at the latter depends on -->. | <xref target="RFC8551" format="default"/>, <xref target="RFC8550" format ="default"/>, and <xref target="RFC5280" format="default"/>. | |||
Possible string values of the property are | Possible string values of the property are | |||
listed below. Servers MAY return other values not defined below, | listed below. Servers <bcp14>MAY</bcp14> return other values not define d below, | |||
as defined in extensions to this document. | as defined in extensions to this document. | |||
<!--///Alexey (based on feedback from Murray): maybe just use "unknown" | Clients <bcp14>MUST</bcp14> treat unrecognized values as "unknown" or "s | |||
and clarify that some will treat | igned/failed". | |||
"unknown" as "signed/failed" for security reasons?--> | Note that the value of this property might change over time.</t> | |||
Clients MUST treat unrecognized values as "unknown" or "signed/failed". | <dl newline="true" spacing="normal"> | |||
Note that the value of this property might change over time. | <dt>unknown:</dt> | |||
<dd> | ||||
<list style="hanging"> | An S/MIME message, but it was neither signed nor encrypted. | |||
<t hangText="unknown:"> | This can also be returned for a multipart/signed message that | |||
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 which | </dd> | |||
contains an unrecognized signing protocol (for example OpenPGP). | <dt>signed:</dt> | |||
</t> | <dd> | |||
An S/MIME signed message, but the signature was not yet | ||||
<t hangText="signed:"> | ||||
S/MIME signed message, but the signature was not yet | ||||
verified. Some servers might not attempt to verify a signature | verified. Some servers might not attempt to verify a signature | |||
until a particular message is requested by the client. | until a particular message is requested by the client. | |||
(This is a useful optimization for a JMAP server to avoid doing work | (This is a useful optimization for a JMAP server to avoid doing work | |||
until exact information is needed. | until exact | |||
A JMAP client that only needs to display an icon that signifies pres | information is needed. | |||
ence of an S/MIME signature can still use this value.) | A JMAP client that only needs to display an icon that signifies pres | |||
JMAP servers compliant with this document SHOULD attempt signature v | ence of an | |||
erification | S/MIME signature can still use this value.) | |||
JMAP servers compliant with this document <bcp14>SHOULD</bcp14> atte | ||||
mpt signature | ||||
verification | ||||
and return "signed/verified" or "signed/failed" instead of this sign ature | and return "signed/verified" or "signed/failed" instead of this sign ature | |||
status. | status. | |||
</t> | </dd> | |||
<dt>signed/verified:</dt> | ||||
<t hangText="signed/verified:"> | <dd> | |||
S/MIME signed message and the sender's signature | An S/MIME signed message, and the sender's signature | |||
was successfully verified according to | was successfully verified according to | |||
<xref target="RFC8551"/> and <xref target="RFC8550"/>. | <xref target="RFC8551" format="default"/> and <xref target="RFC8550" | |||
Additionally the signer email address extracted from the S/MIME | format="default"/>. | |||
Additionally, the signer email address extracted from the S/MIME | ||||
certificate matches the From header field value, and | certificate matches the From header field value, and | |||
the signer certificate SHOULD be checked for revocation. | the signer certificate <bcp14>SHOULD</bcp14> be checked for revocati | |||
</t> | on. | |||
</dd> | ||||
<t hangText="signed/failed:"> | <dt>signed/failed:</dt> | |||
<dd> | ||||
S/MIME signed message, but the signature failed to | S/MIME signed message, but the signature failed to | |||
verify according to <xref target="RFC8551"/> and <xref target="RFC85 | verify according to <xref target="RFC8551" format="default"/> and <x | |||
50"/>. | ref | |||
This might be a policy related decision (e.g. the message signer ema | target="RFC8550" format="default"/>. | |||
il address | This might be because of a policy-related decision (e.g., the messag | |||
doesn't match the From header field value), message was modified, | e signer | |||
email address | ||||
doesn't match the From header field value), the message was modified | ||||
, | ||||
the signer's certificate has expired or was revoked, etc. | the signer's certificate has expired or was revoked, etc. | |||
</t> | </dd> | |||
<dt>encrypted+signed/verified:</dt> | ||||
<t hangText="encrypted+signed/verified:"> | <dd> | |||
This value is reserved for future use. It is typically handled in th e same way as "signed/verified". | This value is reserved for future use. It is typically handled in th e same way as "signed/verified". | |||
</t> | </dd> | |||
<dt>encrypted+signed/failed:</dt> | ||||
<t hangText="encrypted+signed/failed:"> | <dd> | |||
This value is reserved for future use. It is typically handled in th e same way as "signed/failed". | This value is reserved for future use. It is typically handled in th e same way as "signed/failed". | |||
</t> | </dd> | |||
</dl> | ||||
</list> | </dd> | |||
</t> | </dl> | |||
<t>The "smimeStatusAtDelivery" response property | ||||
<t>The "smimeStatusAtDelivery" response property | ||||
has the same syntax as "smimeStatus" but is calculated in relationship to the "receivedAt" | has the same syntax as "smimeStatus" but is calculated in relationship to the "receivedAt" | |||
date/time. | date/time. | |||
Unlike "smimeStatus", the "smimeStatusAtDelivery" response property | Unlike "smimeStatus", the "smimeStatusAtDelivery" response property | |||
value doesn't change, unless Trust Anchors are added. (For example, additi on of a Trust Anchor | value doesn't change unless trust anchors are added. (For example, additio n of a trust anchor | |||
can change the value of a message "smimeStatusAtDelivery" property from "s igned/failed" | can change the value of a message "smimeStatusAtDelivery" property from "s igned/failed" | |||
to "signed/verified". Note that Trust Anchor removal doesn't affect this r | to "signed/verified". Note that trust anchor removal doesn't affect this r | |||
esponse property.) | esponse property.) | |||
The "smimeStatusAtDelivery" allows clients to compare the S/MIME | The "smimeStatusAtDelivery" response property value allows clients to comp | |||
are the S/MIME | ||||
signature verification status at delivery with the current status as retur ned | signature verification status at delivery with the current status as retur ned | |||
by "smimeStatus", for example to help to answer questions like | by "smimeStatus", for example, to help to answer questions like | |||
"was the signature valid at the time of delivery?". | "was the signature valid at the time of delivery?". | |||
</t> | </t> | |||
<t>Note that the "smimeStatusAtDelivery" response property | ||||
<t>Note that the "smimeStatusAtDelivery" response property | ||||
value doesn't have to be calculated at delivery time. A JMAP server | value doesn't have to be calculated at delivery time. A JMAP server | |||
can defer its calculation until it is explicitly requested, | can defer its calculation until it is explicitly requested; | |||
but once calculated its value is remembered for later use. | however, once it is calculated, its value is remembered for later use. | |||
</t> | </t> | |||
<t>The "smimeErrors" response property is defined as follows:</t> | ||||
<t>The "smimeErrors" response property is defined as follows:</t> | <dl newline="true" spacing="normal"> | |||
<dt><strong>smimeErrors</strong>:</dt> | ||||
<t> | <dd>"String[]|null" (server-set). null signifies that the message doesn | |||
smimeErrors: "String[]|null" (server-set). null signifies that the messa | 't | |||
ge doesn't | ||||
contain any signature or that there were no errors when verifying | contain any signature or that there were no errors when verifying | |||
the S/MIME signature. (I.e., this property is non null only | the S/MIME signature. (That is, this property is non-null only | |||
when the corresponding "smimeStatus" response property value | when the corresponding "smimeStatus" response property value | |||
is "signed/failed" or "encrypted+signed/failed". Note that future extens | is "signed/failed" or "encrypted+signed/failed". | |||
ions to this document | Note that future extensions to this document | |||
can specify other smimeStatus values that can be used with smimeErrors.) | can specify other "smimeStatus" values that can be used with "smimeError | |||
Each string in the array is a human readable description | s".) | |||
Each string in the array is a human-readable description | ||||
(in the language specified in the Content-Language header field, if any) | (in the language specified in the Content-Language header field, if any) | |||
of a problem with the signature, the signing certificate or the signing | of a problem with the signature, the signing certificate, or the signing | |||
certificate chain. | certificate | |||
(See Section 3.8 of <xref target="RFC8620"/> in regards to how this is a | chain. | |||
ffected | (See <xref target="RFC8620" section="3.8" sectionFormat="of" format="def | |||
ault"/> in regards to how this | ||||
is affected | ||||
by the language selection.) | by the language selection.) | |||
In one example, the signing certificate might be expired | In one example, the signing certificate might be expired | |||
and the message From email address might not correspond to any of the em ail | and the message From email address might not correspond to any of the em ail | |||
addresses in the signing certificate. | addresses in the signing certificate. | |||
In another example the certificate might be expired and the JMAP server | In another example, the certificate might be expired and the JMAP server | |||
might be unable | might | |||
to retrieve a CRL for the certificate. | be unable | |||
In both of these cases there would be 2 elements in the array. | to retrieve a Certificate Revocation List (CRL) for the certificate. | |||
</t> | In both of these cases, there would be 2 elements in the array. | |||
</dd> | ||||
<t>The "smimeVerifiedAt" response property is defined as follows:</t> | </dl> | |||
<t>The "smimeVerifiedAt" response property is defined as follows:</t> | ||||
<t> | <dl newline="true" spacing="normal"> | |||
smimeVerifiedAt: "UTCDate|null" (server-set). null signifies that the me | <dt><strong>smimeVerifiedAt</strong>:</dt> | |||
ssage doesn't | <dd>"UTCDate|null" (server-set). null signifies that the message doesn' | |||
t | ||||
contain any S/MIME signature or that there is a signature, but there was no attempt | contain any S/MIME signature or that there is a signature, but there was no attempt | |||
to verify it. | to verify it. | |||
(Retrieval of the smimeStatus value can be used to distinguish these 2 c | (Retrieval of the "smimeStatus" value can be used to distinguish these 2 | |||
ases). | cases). | |||
In all other cases it is set to the date and time of when the S/MIME sig | In all other cases, it is set to the date and time of when the S/MIME si | |||
nature | gnature | |||
was most recently verified. | was most recently verified. | |||
Note that a request to fetch "smimeStatus", "smimeStatusAtDelivery" and/ | Note that a request to fetch "smimeStatus", "smimeStatusAtDelivery", and | |||
or "smimeErrors" would force this response | /or "smimeErrors" would force this response | |||
property to be set to a non null value, if an S/MIME signature exists. | property to be set to a non-null value if an S/MIME signature exists. | |||
</t> | </dd> | |||
</dl> | ||||
<t>"smimeStatus" and "smimeErrors" values are calculated at the time the c | <t>The "smimeStatus" and "smimeErrors" values are calculated at the time | |||
orresponding JMAP | the | |||
request was processed (but see below about the effect of result caching), | corresponding JMAP | |||
not at the time when the message was generated (according to its | request is processed (but see below about the effect of result caching), | |||
Date header field value). In all cases "smimeVerifiedAt" is set to the tim | not at the time when the message is generated (according to its | |||
e when | Date header field value). In all cases, "smimeVerifiedAt" is set to the ti | |||
me when | ||||
"smimeStatus" and "smimeErrors" were last updated. | "smimeStatus" and "smimeErrors" were last updated. | |||
As recalculating these values is expensive for the server, | As recalculating these values is expensive for the server, | |||
<!--This seems to be a reasonable balance between doing online CRL / OCSP | they <bcp14>MAY</bcp14> be cached for up to 24 hours from the moment when | |||
checks right away | they were calculated. | |||
and typical expiration period for certificates.--> | </t> | |||
they MAY be cached for up to 24 hours from the moment when they were calcu | <t keepWithNext="true"> | |||
lated. | Example 1: Retrieval of minimal information about a message, including i | |||
</t> | ts From, Subject, and Date header fields, | |||
as well as the S/MIME signature verification status at delivery and date | ||||
<figure> | /time when the message was received. | |||
<preamble> | </t> | |||
Example 1: Retrieval of minimal information about a message, including i | ||||
ts From, Subject and Date header fields, | ||||
as well as S/MIME signature verification status at delivery and date/tim | ||||
e when the message was received. | ||||
</preamble> | ||||
<artwork><![CDATA[ | ||||
["Email/get", { | ||||
"ids": [ "fe123u457" ], | ||||
"properties": [ "mailboxIds", "from", "subject", "date", | ||||
"smimeStatusAtDelivery", "receivedAt" ] | ||||
}, "#1"] | ||||
This might result in the following response: | ||||
[["Email/get", { | <sourcecode name="" type=""><![CDATA[ | |||
"accountId": "abc", | ["Email/get", { | |||
"state": "51234123231", | "ids": [ "fe123u457" ], | |||
"list": [ | "properties": [ "mailboxIds", "from", "subject", "date", | |||
{ | "smimeStatusAtDelivery", "receivedAt" ] | |||
"id": "fe123u457", | }, "#1"] | |||
"mailboxIds": { "f123": true }, | ]]></sourcecode> | |||
"from": [{"name": "Joe Bloggs", "email": "joe@bloggs.example.net"}] | ||||
, | ||||
"subject": "Dinner tonight?", | ||||
"date": "2020-07-07T14:12:00Z", | ||||
"smimeStatusAtDelivery": "signed/verified", | ||||
"receivedAt": "2020-07-07T14:15:18Z" | ||||
} | ||||
] | ||||
}, "#1"]] | ||||
]]></artwork> | ||||
<postamble> | ||||
</postamble> | ||||
</figure> | ||||
<figure> | <t>This might result in the following response:</t> | |||
<preamble> | <sourcecode name="" type=""><![CDATA[ | |||
Example 2: Retrieval of minimal information about a message, including i | [["Email/get", { | |||
ts From, Subject and Date header fields, | "accountId": "abc", | |||
as well as the latest S/MIME signature verification status, S/MIME verif | "state": "51234123231", | |||
ication errors (if any) and | "list": [ | |||
when was the S/MIME signature status last verified. | { | |||
"id": "fe123u457", | ||||
"mailboxIds": { "f123": true }, | ||||
"from": [{"name": "Joe Bloggs", | ||||
"email": "joe@bloggs.example.net"}], | ||||
"subject": "Dinner tonight?", | ||||
"date": "2020-07-07T14:12:00Z", | ||||
"smimeStatusAtDelivery": "signed/verified", | ||||
"receivedAt": "2020-07-07T14:15:18Z" | ||||
} | ||||
] | ||||
}, "#1"]] | ||||
]]></sourcecode> | ||||
<t keepWithNext="true"> | ||||
Example 2: Retrieval of minimal information about a message, including i | ||||
ts From, Subject, and Date header fields, | ||||
as well as the latest S/MIME signature verification status, S/MIME verif | ||||
ication errors (if any), and | ||||
when the S/MIME signature status was last verified. | ||||
The response contains 2 S/MIME errors related to S/MIME signature verifi cation. | The response contains 2 S/MIME errors related to S/MIME signature verifi cation. | |||
</preamble> | </t> | |||
<artwork><![CDATA[ | <sourcecode name="" type=""><![CDATA[ | |||
["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"] | |||
]]></sourcecode> | ||||
This might result in the following response: | <t>This might result in the following response:</t> | |||
<sourcecode name="" type=""><![CDATA[ | ||||
[["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"]] | |||
]]></artwork> | ]]></sourcecode> | |||
<postamble> | <section numbered="true" toc="default"> | |||
</postamble> | <name>"smimeStatus" Response Property Extensibility</name> | |||
</figure> | ||||
<section title='"smimeStatus" response property extensibility'> | ||||
<t> | <t> | |||
Future extensions to this document can specify extra allowed values fo | Future extensions to this document can specify extra allowed values fo | |||
r the smimeStatus response property. | r the "smimeStatus" response property. | |||
All values (defined in this document or in extensions to this document | All values (defined in this document or in extensions to this document | |||
) MUST be in ASCII. | ) <bcp14>MUST</bcp14> be in ASCII. | |||
(Note that this response property contains tokens, thus it is not subj | (Note that this response property contains tokens; thus, it is not sub | |||
ect to | ject to | |||
Internationalization or Localization). | internationalization or localization). | |||
</t> | </t> | |||
<t> | <t> | |||
New smimeStatus response property values defined in extensions may aff | New "smimeStatus" response property values defined in extensions may a | |||
ect behaviour of | ffect the behavior of | |||
properties such as smimeErrors response property of Email/get (see <xr | properties, such as the "smimeErrors" response property of Email/get ( | |||
ef target="email-get-ext"/>) or | see <xref target="email-get-ext" format="default"/>) or the | |||
hasVerifiedSmime property of Email/query (see <xref target="email-quer | "hasVerifiedSmime" property of Email/query (see <xref target="email-qu | |||
y-ext"/>). In particular | ery-ext" format="default"/>). In particular, | |||
the new values can be treated similar to values defined in this docume | the new values can be treated similarly to values defined in this docu | |||
nt. | ment. | |||
</t> | </t> | |||
<t> | <t> | |||
<!--///Should this be reworded to allow for reserved "encrypted+signed | For example, a putative JMAP extension for automatically decrypting S/ | |||
/failed" and "encrypted+signed/verified"?--> | MIME messages can specify | |||
For example a putative JMAP extension for automatically decrypting S/M | ||||
IME messages can specify | ||||
two additional values, one specifying that a message is both encrypted and signed with a valid S/MIME signature | two additional values, one specifying that a message is both encrypted and signed with a valid S/MIME signature | |||
and another one specifying that a message is both encrypted and signed | (e.g. "encrypted+signed/verified") | |||
with an invalid S/MIME signature. | and another one specifying that a message is both encrypted and signed | |||
The former value can be treated as "signed/verified" (and would thus a | with an invalid S/MIME signature | |||
ffect hasVerifiedSmime) | (e.g. "encrypted+signed/failed"). | |||
and the latter can be treated as "signed/failed" (and thus can be used | The former value can be treated as "signed/verified" (and would thus a | |||
with smimeErrors). | ffect "hasVerifiedSmime") | |||
and the latter can be treated as "signed/failed" (and thus can be used | ||||
with "smimeErrors"). | ||||
</t> | </t> | |||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="email-query-ext" numbered="true" toc="default"> | ||||
<name>Extension to Email/query</name> | ||||
<t> | ||||
<xref target="RFC8621" format="default"/> defines the Email/query method | ||||
for searching for messages with specific properties. | ||||
This document defines the following properties of the <strong>FilterCond | ||||
ition</strong> object: | ||||
<section title="Extension to Email/query" anchor="email-query-ext"> | </t> | |||
<t> | <dl newline="true" spacing="normal"> | |||
<xref target="RFC8621"/> defines the Email/query method for searching fo | <dt><strong>hasSmime</strong>:</dt> | |||
r messages with specific properties. | <dd>"Boolean". If "hasSmime" has the value true, only messages with "sm | |||
This document defines the following properties of the *FilterCondition* | imeStatus" | |||
object: | other than null match the condition. | |||
If "hasSmime" has the value false, only messages with "smimeStatus" eq | ||||
<list style="bullets"> | ual to null | |||
match the condition.</dd> | ||||
<t>*hasSmime*: "Boolean". If "hasSmime" has the value true, only messa | <dt><strong>hasVerifiedSmime</strong>:</dt> | |||
ges with "smimeStatus" other than null match the condition. | <dd><t>"Boolean". If "hasVerifiedSmime" has the value true, only messag | |||
If "hasSmime" has the value false, only messages with "smimeStatus" eq | es with | |||
ual to null match the condition.</t> | "smimeStatus" equal | |||
to "signed/verified" or "encrypted+signed/verified" (*) match the cond | ||||
<t>*hasVerifiedSmime*: "Boolean". If "hasVerifiedSmime" has the value | ition. | |||
true, only messages with "smimeStatus" equal | If "hasVerifiedSmime" has the value false, only messages with "smimeSt | |||
to "signed/verified" or "encrypted+signed/verified" (*), match the con | atus" not | |||
dition. | equal | |||
If "hasVerifiedSmime" has the value false, only messages with "smimeSt | to "signed/verified" and not equal to "encrypted+signed/verified" (*) | |||
atus" not equal | (including | |||
to "signed/verified" and not equal to "encrypted+signed/verified" (*) | the value null) match the condition. | |||
(including the value null) match the condition. | Note that use of this attribute is potentially expensive for a JMAP se | |||
Note that use of this attribute is potentially expensive for a JMAP se | rver, as it | |||
rver, as it forces | forces | |||
calculation of smimeStatus property value for each message. However ca | calculation of the "smimeStatus" property value for each message. Howe | |||
ching of smimeStatus | ver, caching of the | |||
values should ameliorate this cost somewhat.<vspace/> | "smimeStatus" | |||
values should ameliorate this cost somewhat.</t> | ||||
(*) as well as "smimeStatus" values added by future extensions to this | <t> | |||
document | (*) as well as the "smimeStatus" values added by future extensions to | |||
that are explicitly specified as having similar effect to "signed/veri | this document | |||
fied" as far as | that are explicitly specified as having similar effect to "signed/veri | |||
"hasVerifiedSmime" calculation is concerned. | fied" as far | |||
</t> | as | |||
"hasVerifiedSmime" calculation is concerned.</t></dd> | ||||
<t>*hasVerifiedSmimeAtDelivery*: "Boolean". The "hasVerifiedSmimeAtDel | <dt><strong>hasVerifiedSmimeAtDelivery</strong>:</dt> | |||
ivery" property is handled similar to "hasVerifiedSmime" property, | <dd>"Boolean". The "hasVerifiedSmimeAtDelivery" property is handled sim | |||
ilarly to | ||||
the "hasVerifiedSmime" property, | ||||
but the value of "smimeStatusAtDelivery" is used instead of "smimeStat us" to assess | but the value of "smimeStatusAtDelivery" is used instead of "smimeStat us" to assess | |||
whether a particular message matches the condition. | whether a particular message matches the condition. | |||
</t> | </dd> | |||
</dl> | ||||
</list> | ||||
</t> | ||||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Interaction with Email/changes"> | <name>Interaction with Email/changes</name> | |||
<t>Changes to the "smimeVerifiedAt" response property value <bcp14>MUST | ||||
<t>Changes to "smimeVerifiedAt" response property value MUST NOT | NOT</bcp14> | |||
cause the message to be included in the "updated" argument of Email/chan | cause the message to be included in the "updated" argument of the Email/ | |||
ges response. | changes response. | |||
However changes to "smimeStatus", "smimeStatusAtDelivery" and/or "smimeE | However, changes to the "smimeStatus", "smimeStatusAtDelivery", and/or " | |||
rrors" | smimeErrors" | |||
response properties MUST result in message inclusion in the "updated" ar | response properties <bcp14>MUST</bcp14> result in message inclusion in t | |||
gument of Email/changes response. | he "updated" argument of the | |||
Email/changes response. | ||||
</t> | </t> | |||
</section> | </section> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="IANA Considerations"> | <name>IANA Considerations</name> | |||
<section numbered="true" toc="default"> | ||||
<section title='JMAP capability registration for "smimeverify"'> | <name>JMAP Capability Registration for "smimeverify"</name> | |||
<t> | ||||
IANA is requested to register the "smimeverify" JMAP Capability as fol | ||||
lows: | ||||
</t> | ||||
<t> | ||||
Capability Name: "urn:ietf:params:jmap:smimeverify" | ||||
</t> | ||||
<t> | ||||
Specification document: this document | ||||
</t> | ||||
<t> | ||||
Intended use: common | ||||
</t> | ||||
<t> | ||||
Change Controller: IETF | ||||
</t> | ||||
<t> | <t> | |||
Security and privacy considerations: this document, <xref target="secc ons"/> | IANA has registered the "smimeverify" JMAP capability as follows: | |||
</t> | </t> | |||
<dl newline="false" spacing="compact"> | ||||
<dt>Capability Name:</dt> | ||||
<dd>urn:ietf:params:jmap:smimeverify</dd> | ||||
<dt>Specification document:</dt> | ||||
<dd>RFC 9219</dd> | ||||
<dt>Intended use:</dt> | ||||
<dd>common</dd> | ||||
<dt>Change Controller:</dt> | ||||
<dd>IETF</dd> | ||||
<dt>Security and privacy considerations:</dt> | ||||
<dd>RFC 9219, <xref target="seccons" format="default"/></dd> | ||||
</dl> | ||||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="seccons" numbered="true" toc="default"> | ||||
<section title="Security Considerations" anchor="seccons"> | <name>Security Considerations</name> | |||
<t> | <t> | |||
Use of the server-side S/MIME signature verification JMAP extension requir es | Use of the server-side S/MIME signature verification JMAP extension requir es | |||
the client to trust the server signature verification code, server configu | the client to trust the server signature verification code, the server con | |||
ration and its operational practices | figuration, and | |||
the server's operational practices | ||||
to perform S/MIME signature verification, as well as to trust that the cha nnel between | to perform S/MIME signature verification, as well as to trust that the cha nnel between | |||
the client and the server is integrity protected. | the client and the server is integrity protected. | |||
(For example, if the server is not configured | (For example, if the server is not configured | |||
with some Trust Anchors, some messages will have "signed/failed" status in | with some trust anchors, some messages will have the "signed/failed" statu | |||
stead of | s | |||
"signed/verified".) | instead of "signed/verified".) | |||
A malicious or compromised server could | A malicious or compromised server could | |||
return false verification status to a client. A successful verification c ould | return a false verification status to a client. A successful verification could | |||
be conveyed to a client for a forged or altered message. A properly signe d | be conveyed to a client for a forged or altered message. A properly signe d | |||
message could be signaled as having a failed signature verification or no | message could be signaled as having a failed signature verification or no | |||
signature at all. In the case of the latter attack, no new attack surface is | signature at all. In the case of the latter attack, no new attack surface is | |||
presented with this extension above what malicious or compromised server c ould | presented with this extension above what a malicious or compromised server could | |||
already do by stripping or tampering with the S/MIME information in the | already do by stripping or tampering with the S/MIME information in the | |||
message. In the case of the former attack, client software capable of | message. In the case of the former attack, client software capable of | |||
performing S/MIME signature verification could detect this attack. Local | performing S/MIME signature verification could detect this attack. Local | |||
configuration of the client should determine if this client-side verificat ion | configuration of the client should determine if this client-side verificat ion | |||
should occur. For clients without local verification capabilities, such a n | should occur. For clients without local verification capabilities, such a n | |||
attack would be difficult to detect. | attack would be difficult to detect. | |||
</t> | </t> | |||
<t> | <t> | |||
Integrity protection of the channel between the client and the server is p rovided by use of TLS, | Integrity protection of the channel between the client and the server is p rovided by use of TLS, | |||
as required by JMAP specification (see Section 8.1 of <xref target="RFC862 0"/>). | as required by the JMAP specification (see <xref target="RFC8620" section= "8.1" sectionFormat="of" format="default"/>). | |||
</t> | </t> | |||
<t>Constant recalculation of the S/MIME signature status can result in a d | ||||
<t>Constant recalculation of S/MIME signature status can result in a Denia | enial-of-service condition. | |||
l-of-Service condition. | For that reason, it is <bcp14>RECOMMENDED</bcp14> that servers cache resul | |||
For that reason, it is RECOMMENDED that servers cache results of signature | ts of signature verification for up to 24 hours.</t> | |||
verification for up to 24 hours.</t> | ||||
</section> | </section> | |||
</middle> | </middle> | |||
<back> | <back> | |||
<references title="Normative References"> | <references> | |||
<?rfc include="reference.RFC.2119"?> <!-- Keywords. BCP 14, part 1. --> | <name>References</name> | |||
<?rfc include="reference.RFC.8174"?> <!-- Keywords. BCP 14, part 2. --> | <references> | |||
<?rfc include="reference.RFC.8550"?> <!-- S/MIME Certificate Handling --> | <name>Normative References</name> | |||
<?rfc include="reference.RFC.8551"?> <!-- S/MIME Message Format --> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.2 | |||
<?rfc include="reference.RFC.8620"?> <!-- JMAP Core --> | 119.xml"/> | |||
<?rfc include="reference.RFC.8621"?> <!-- JMAP Mail --> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8 | |||
174.xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.5 | ||||
280.xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8 | ||||
550.xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8 | ||||
551.xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8 | ||||
620.xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8 | ||||
621.xml"/> | ||||
</references> | </references> | |||
<references> | ||||
<references title="Informative References"> | <name>Informative References</name> | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.1 | ||||
<?rfc include="reference.RFC.1847"?> <!-- Multipart/signed --> | 847.xml"/> | |||
</references> | </references> | |||
</references> | ||||
<section title="Acknowledgements"> | <section numbered="false" toc="default"> | |||
<name>Acknowledgements</name> | ||||
<t>This document is a product of the JMAP Working Group. | <t>This document is a product of the JMAP Working Group. | |||
Special thank you to Bron Gondwana, Neil Jenkins, Murray Kucherawy, | Special thank you to <contact fullname="Bron Gondwana"/>, <contact fullnam | |||
Kirsty Paine, Benjamin Kaduk, Roman Danyliw, Peter Yee, Robert Wilton, | e="Neil | |||
Erik Kline and Menachem Dodge for suggestions, comments and corrections to | Jenkins"/>, <contact fullname="Murray Kucherawy"/>, <contact fullname="Kir | |||
this document. | sty Paine"/>, | |||
<contact fullname="Benjamin Kaduk"/>, <contact fullname="Roman Danyliw"/>, | ||||
<contact | ||||
fullname="Peter Yee"/>, <contact fullname="Robert Wilton"/>, | ||||
<contact fullname="Erik Kline"/>, and <contact fullname="Menachem Dodge"/> | ||||
for | ||||
suggestions, comments, and corrections to this document. | ||||
</t> | </t> | |||
</section> | </section> | |||
</back> | </back> | |||
</rfc> | </rfc> | |||
End of changes. 81 change blocks. | ||||
464 lines changed or deleted | 452 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/ |