| 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/ | ||||