<?xml version='1.0'?>
<!DOCTYPE rfc SYSTEM 'rfc2629.dtd'>
<rfc ipr="trust200902" docName="draft-hallambaker-mesh-recrypt-01" category="std">
<?rfc toc="yes"?>  
<?rfc symrefs="yes"?>  
<?rfc sortrefs="yes"?>  
<?rfc compact="yes"?>  
<?rfc subcompact="no"?>  
<front>
<title abbrev="Mesh/Recrypt">Mesh/Recrypt</title>
<author fullname="Phillip Hallam-BakerPhillip Hallam-Baker" initials="P. M." surname="Hallam-Baker">
<organization>Comodo Group Inc.</organization>
<address>
<email>philliph@comodo.com</email>
</address>
</author>
<date day="9" month="May" year="2017"/>
<area>General</area>
<workgroup/>
<keyword>Cryptography</keyword>
<keyword>PKI</keyword>
<keyword>PKIX</keyword>
<keyword>Proxy Re-encryption</keyword>
<abstract>
<t>Proxy Re-encryption 'recryption' is a form of public key encryption in which decryption requires the use of multiple keys. The Mesh/Recrypt protocol is an implementation of a recryption scheme that supports use of end-to-end encryption by groups of users whose membership may change over time. The system is implemented using two separate protocols; An administration protocol that allows the creation of recryption groups, adding and removing members and a client protocol that allows an authorized group member request a partial decryption operation.</t>
</abstract>
</front>
<middle>
<section title="Definitions" anchor="Section_1">
<section title="Requirements Language" anchor="Section_1_1">
<t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in [RFC2119].</t>
</section>
<section title="Related Specifications" anchor="Section_1_2">
<t>This protocol is makes use of technology described in the following specifications</t>
<t>JSON [RFC7159]</t>
<t>For encoding of message data structures.</t>
<t>JOSE [RFC7515] [RFC7516] [RFC7518]</t>
<t>Formats for cryptographic messages and keys in JSON.</t>
<t>JSON Web Service [draft-hallambaker-json-web-service-04]</t>
<t>Describes the approach used for Web Service discovery and the encapsulation of JSON messages as HTTP payloads with the necessary authentication and encryption services.</t>
<t>Uniform Data Fingerprint [draft-hallambaker-udf-05]</t>
<t>Describes the mechanism used to create identifiers for cryptographic keypairs from the public key.</t>
<t>In addition, the following specifications are closely related but not required for implementation:</t>
<t>Transport Layer Security [RFC5246]</t>
<t>The use of TLS to protect the confidentiality and integrity of all protocol communications is of course highly recommended. It is however highly undesirable for a cryptographic protocol such as LURK should rely on transport layer security enhancements alone. </t>
<t>The Mathematical Mesh [draft-hallambaker-mesh-architecture-03] [draft-hallambaker-mesh-reference-04]</t>
<t>MAY be used to establish trust relationships between the parties in the protocol.</t>
<t>CFRG Elliptic Curves and Algorithms [RFC7748]</t>
<t>The threshold and proxy re-encryption schemes described are likely to be of most interest in conjunction with the emerging elliptic curve based cryptography.</t>
<t>JSON-BCD [draft-hallambaker-jsonbcd-06]</t>
<t>JSON-B or JSON-C encoding may be used if an efficient binary or compressed encoding is required. Alternatively, message structures MAY be encoded according to TLS conventions.</t>
</section>
</section>
<section title="Introduction" anchor="Section_2">
<t>In traditional public key encryption, one key, the public key is used to encrypt messages and a second key, the private key is used for decryption. While this is sufficient for communication between two parties, it is less satisfactory when a message is to be sent to a group of users. Use of a session key allows a message to be sent to multiple recipients at once, but only if the list of recipients is known to the sender. And unless special processing is performed in the infrastructure, the distribution list is disclosed to all the message recipients.</t>
<t>The need for more flexible communication patterns has traditionally been supported through the use of key management services. A message encrypted under the public key of the key management service is decrypted on demand and re-encrypted under the public key of an authorized recipient. Again the use of session keys permits this to be performed efficiently (only the session key need be re-encrypted). This approach provides the necessary functionality but the end-to-end protection of confidentiality is lost.</t>
<t>The use of proxy re-encryption 'recryption', affords full flexibility without losing end-to-end protection of the encrypted data. As with traditional public key encryption, one public key is used for encryption but instead of using one private key to decrypt, this is split into a pair of decryption keys for each authorized recipient. One of these keys is held by the key server and the other is held by the recipient. Since both private keys are required to complete decryption of the message, neither the key server nor the recipient can decrypt the message without the co-operation of the other. Thus end-to-end confidentiality is preserved even if the ciphertext is disclosed and the key service is entirely compromised.</t>
<section title="Recryption Algorithms" anchor="Section_2_1">
<t>Currently three forms of public key encryption algorithm are in widespread use, RSA, Diffie Hellman and Elliptic Curve Diffie-Hellman. In each case, the operation at the heart of the algorithm is a method of calculating some function f^n(x) for some very large value n in some group order p. It follows therefore that if n = a+b mod pand there is an efficient method of calculating f^n(x) from f^a(x) and f^b(x), we can perform a private key operation in two separate stages and then combine the results to obtain f^n(x).</t>
<t>In practice, the encryption algorithms of greatest interest at the current time is Elliptic Curve Diffie-Hellman using the curves Ed-25519 and Ed-448. While the Montgomery forms of these curves for encryption is widely established, existing implementations do not provide the primitives required to implement a recryption form of the algorithm directly. Equivalent Edwards curves were defined because the same limitation also hinders implementation of digital signatures. Since this code provides the cryptographic primitives we need for recryption, it makes sense to use them for both purposes.</t>
</section>
<section title="Basic Protocol" anchor="Section_2_2">
<t>The basic Mesh/Recrypt protocol has three parties:</t>
<t>Administrator</t>
<t>The initial generator of the encryption keypair associated with the group and the holder of the corresponding private key. The administrator has the ability to add users to the group and the authority to remove them.</t>
<t>Service</t>
<t>The recryption key service responds to administration requests from the authorized administrator(s) and recryption requests from members of the recryption group(s) it manages.</t>
<t>Member</t>
<t>A member of at least one recryption group. All group members have at least one personal decryption key.</t>
<t>Note that the use of recryption does not change the encryption process at all, except to the extent that the party encrypting the message MUST support use of the algorithm specified by the recryption key. Thus a message sender or a creator of an encrypted document is not a party to the Mesh/Recrypt protocol.</t>
<t>To create a recryption group, the administrator first creates a public encryption keypair and publishes the public key. She then uses the private key to create a recryption keypair for each of the initial members of the group and publishes these to the key server. Note that the private key for the recryption group is held by the administrator and is never revealed to the key service. In applications requiring a high level of security, this private key may be stored on a smartcart or other form of Hardware Security Module (HSM). </t>
<t>The administrator client creates a recryption entry for each member and publishes it to the key service. This recryption entry contains:</t>
<t>The UDF fingerprint of the user's mesh profile</t>
<t>The recryption key for the user</t>
<t>User decryption entry containing the corresponding decryption key encrypted under the public encryption key of the user.</t>
<t>Storing the decryption key information at the keyserver avoids the need to communicate any information to the user during group administration operations.</t>
<t>The administrator may add or remove group members at any time. Note however that while the key server cannot add members to a group, the ability to permanently delete members from the group relies on the key service permanently erasing the information in the recryption entry. </t>
<t>To decrypt a message, a group member reads the recryption data provided and determines which Mesh/Recrypt service to contact. The member then submits a recryption request specifying the UDF of their mesh profile. If a recryption entry exists for the specified key and the member is authorized to decrypt that message, the recryption service generates a partial recryption result and returns it together with the user decryption entry. The member then decrypts the private key in the decryption entry, uses it to obtain a second partial decryption result and combines the two partial results to obtain the decryption key.</t>
<section title="Extended Protocol" anchor="Section_2_2_1">
<t>The basic protocol may be extended in several ways:</t>
<t>Support for multiple encryption keys within a group to prevent collusion between the key server and former group members after a key rollover event occurs.</t>
<t>Distinguishing between Administrators authorized to add and remove users and Super-Administrators with the ability to add and remove Administrators.</t>
<t>Specify quotas to restrict the amount of data members may decrypt.</t>
<t>Enforce separation of duties in the administration function through key splitting.</t>
<t>Use of linked notary logs, aka Blockchain techniques.</t>
</section>
</section>
</section>
<section title="Architecture" anchor="Section_3">
<t/>
<section title="Check service connection " anchor="Section_3_1">
<t>It is often useful to be able to verify that a service is ready and willing to perform transactions before attempting to perform one. Especially so when the transaction requires considerable amounts of data and may require the  use of specific server determined authentication options. </t>
<t>The request message is 'HelloRequest' and has no parameters: </t>
<figure>
<artwork>
<![CDATA[POST /.well-known/recrypt/HTTP/1.1
Host: prismproof.org
Content-Length: 23

{
  "HelloRequest": {}}]]></artwork>
</figure>
<t>The response message specifies the protocol version(s) supported, the corresponding encodings and bindings: </t>
<figure>
<artwork>
<![CDATA[HTTP/1.1 200 OK
Date: Tue 09 May 2017 05:18:53
Content-Length: 157

{
  "HelloResponse": {
    "Status": 201,
    "StatusDescription": "Operation completed successfully",
    "Version": {
      "Major": 0,
      "Minor": 1}}}]]></artwork>
</figure>
</section>
<section title="Create and populate a group " anchor="Section_3_2">
<t>The request message is 'CreateGroupRequest' and specifies the initial data to be used to populate the group. </t>
<figure>
<artwork>
<![CDATA[POST /.well-known/recrypt/HTTP/1.1
Host: prismproof.org
Content-Length: 23

{
  "HelloRequest": {}}]]></artwork>
</figure>
<t>The response message returns success or the reason for failure </t>
<figure>
<artwork>
<![CDATA[HTTP/1.1 200 OK
Date: Tue 09 May 2017 05:18:53
Content-Length: 157

{
  "HelloResponse": {
    "Status": 201,
    "StatusDescription": "Operation completed successfully",
    "Version": {
      "Major": 0,
      "Minor": 1}}}]]></artwork>
</figure>
</section>
<section title="Request Recyption " anchor="Section_3_3">
<t>The request message is 'RecryptDataRequest' </t>
<figure>
<artwork>
<![CDATA[POST /.well-known/recrypt/HTTP/1.1
Host: prismproof.org
Content-Length: 23

{
  "HelloRequest": {}}]]></artwork>
</figure>
<t>If the request is successful, the response 'RecryptDataResponse' is  returned containing the necessary partial decryption data and user decryption entry </t>
</section>
<section title="Revoke Membership " anchor="Section_3_4">
<t>The request message is 'UpdateMemberRequest'. This specifies which  member record in which group is to be updated and the new data to populate the entry.  </t>
<figure>
<artwork>
<![CDATA[POST /.well-known/recrypt/HTTP/1.1
Host: prismproof.org
Content-Length: 23

{
  "HelloRequest": {}}]]></artwork>
</figure>
<t>The response message returns success or the reason for failure </t>
</section>
<section title="Check service connection " anchor="Section_3_5">
<t>It is often useful to be able to verify that a service is ready and willing to perform transactions before attempting to perform one. Especially so when the transaction requires considerable amounts of data and may require the  use of specific server determined authentication options. </t>
<t>The request message is 'HelloRequest' and has no parameters: </t>
<figure>
<artwork>
<![CDATA[POST /.well-known/recrypt/HTTP/1.1
Host: prismproof.org
Content-Length: 23

{
  "HelloRequest": {}}]]></artwork>
</figure>
<t>The response message specifies the protocol version(s) supported, the corresponding encodings and bindings: </t>
<figure>
<artwork>
<![CDATA[HTTP/1.1 200 OK
Date: Tue 09 May 2017 05:38:35
Content-Length: 157

{
  "HelloResponse": {
    "Status": 201,
    "StatusDescription": "Operation completed successfully",
    "Version": {
      "Major": 0,
      "Minor": 1}}}]]></artwork>
</figure>
</section>
<section title="Create and populate a group " anchor="Section_3_6">
<t>The first step in creating a recryption group is to create at least one public key encryption keypair.  </t>
<t>Note that a recryption group should be specified as some form of Mesh  profile. Whether this should be an application profile or a personal profile is not yet clear. This part of the protocol is likely to change before deployment. </t>
<t>Alice creates the recryption group and creates member entries for herself  and Bob. [[TBS: Need to add profiles for Alice and Bob at some point. This needs thought.] </t>
<t>The request message is 'CreateGroupRequest' and specifies the initial data to be used to populate the group. </t>
<figure>
<artwork>
<![CDATA[POST /.well-known/recrypt/HTTP/1.1
Host: prismproof.org
Content-Length: 29

{
  "CreateGroupRequest": {}}]]></artwork>
</figure>
<t>The response message returns success or the reason for failure </t>
<figure>
<artwork>
<![CDATA[HTTP/1.1 200 OK
Date: Tue 09 May 2017 05:38:35
Content-Length: 109

{
  "CreateGroupResponse": {
    "Status": 201,
    "StatusDescription": "Operation completed successfully"}}]]></artwork>
</figure>
</section>
<section title="Request Recyption " anchor="Section_3_7">
<t>To test the new group, Alice encrypts a message under the group public key and sends it to Bob.  </t>
<t>Bob receives the test message from Alice. To decrypt the message, Bob's client  requests the corresponding partial recryption information from the key server. </t>
<t>The request message is 'RecryptDataRequest'. It specifies the Recipient data from the encrypted message and Bob's recryption key identifier for that particular  key service. </t>
<figure>
<artwork>
<![CDATA[POST /.well-known/recrypt/HTTP/1.1
Host: prismproof.org
Content-Length: 29

{
  "RecryptDataRequest": {}}]]></artwork>
</figure>
<t>If the request is successful, the response 'RecryptDataResponse' is  returned containing the necessary partial decryption data and user decryption entry </t>
</section>
<section title="Revoke Membership " anchor="Section_3_8">
<t>Bob leaves the company and Alice revokes the access to the recryption group that she granted earlier. Note that this will not stop Bob from reading material  that he has already decrypted, it will only prevent him decrypting new material. Nor will this prevent the use of the key material that was issued to Bob being  used to decrypt messages should the key service be breached. </t>
<t>The request message is 'UpdateMemberRequest'. This specifies which  member record in which group is to be updated and the new data to populate the entry.  </t>
<figure>
<artwork>
<![CDATA[POST /.well-known/recrypt/HTTP/1.1
Host: prismproof.org
Content-Length: 30

{
  "UpdateMemberRequest": {}}]]></artwork>
</figure>
<t>The response message returns success or the reason for failure </t>
</section>
<section title="Check service connection " anchor="Section_3_9">
<t>It is often useful to be able to verify that a service is ready and willing to perform transactions before attempting to perform one. Especially so when the transaction requires considerable amounts of data and may require the  use of specific server determined authentication options. </t>
<t>The request message is 'HelloRequest' and has no parameters: </t>
<figure>
<artwork>
<![CDATA[POST /.well-known/recrypt/HTTP/1.1
Host: prismproof.org
Content-Length: 23

{
  "HelloRequest": {}}]]></artwork>
</figure>
<t>The response message specifies the protocol version(s) supported, the corresponding encodings and bindings: </t>
<figure>
<artwork>
<![CDATA[HTTP/1.1 200 OK
Date: Tue 09 May 2017 05:42:32
Content-Length: 157

{
  "HelloResponse": {
    "Status": 201,
    "StatusDescription": "Operation completed successfully",
    "Version": {
      "Major": 0,
      "Minor": 1}}}]]></artwork>
</figure>
</section>
<section title="Create and populate a group " anchor="Section_3_10">
<t>The first step in creating a recryption group is to create at least one public key encryption keypair.  </t>
<t>Note that a recryption group should be specified as some form of Mesh  profile. Whether this should be an application profile or a personal profile is not yet clear. This part of the protocol is likely to change before deployment. </t>
<t>Alice creates the recryption group and creates member entries for herself  and Bob. [[TBS: Need to add profiles for Alice and Bob at some point. This needs thought.] </t>
<t>The request message is 'CreateGroupRequest' and specifies the initial data to be used to populate the group. </t>
<figure>
<artwork>
<![CDATA[POST /.well-known/recrypt/HTTP/1.1
Host: prismproof.org
Content-Length: 29

{
  "CreateGroupRequest": {}}]]></artwork>
</figure>
<t>The response message returns success or the reason for failure </t>
<figure>
<artwork>
<![CDATA[HTTP/1.1 200 OK
Date: Tue 09 May 2017 05:42:32
Content-Length: 109

{
  "CreateGroupResponse": {
    "Status": 201,
    "StatusDescription": "Operation completed successfully"}}]]></artwork>
</figure>
</section>
<section title="Request Recyption " anchor="Section_3_11">
<t>To test the new group, Alice encrypts a message under the group public key and sends it to Bob.  </t>
<t>Bob receives the test message from Alice. To decrypt the message, Bob's client  requests the corresponding partial recryption information from the key server. </t>
<t>The request message is 'RecryptDataRequest'. It specifies the Recipient data from the encrypted message and Bob's recryption key identifier for that particular  key service. </t>
<figure>
<artwork>
<![CDATA[POST /.well-known/recrypt/HTTP/1.1
Host: prismproof.org
Content-Length: 29

{
  "RecryptDataRequest": {}}]]></artwork>
</figure>
<t>If the request is successful, the response 'RecryptDataResponse' is  returned containing the necessary partial decryption data and user decryption entry </t>
</section>
<section title="Revoke Membership " anchor="Section_3_12">
<t>Bob leaves the company and Alice revokes the access to the recryption group that she granted earlier. Note that this will not stop Bob from reading material  that he has already decrypted, it will only prevent him decrypting new material. Nor will this prevent the use of the key material that was issued to Bob being  used to decrypt messages should the key service be breached. </t>
<t>The request message is 'UpdateMemberRequest'. This specifies which  member record in which group is to be updated and the new data to populate the entry.  </t>
<figure>
<artwork>
<![CDATA[POST /.well-known/recrypt/HTTP/1.1
Host: prismproof.org
Content-Length: 30

{
  "UpdateMemberRequest": {}}]]></artwork>
</figure>
<t>The response message returns success or the reason for failure </t>
<t/>
</section>
</section>
<section title="Mesh/Recrypt/Admin Service " anchor="Section_4">
<t>The Mesh/Recrypt administration service supports transactions to  Add and Delete members from a group and to list all the members in a group. </t>
<t>SRV Prefix: </t>
<t><list style="hanging">
<t><list style="hanging">
<t hangText="_recrypt._tcp "> </t>
</list></t>
</list></t>
<t>HTTP Well Known Service Prefix: </t>
<t><list style="hanging">
<t><list style="hanging">
<t hangText="/.well-known/recrypt "> </t>
</list></t>
</list></t>
<t>Every Recrypt Service transaction consists of exactly one request followed by exactly one response. </t>
<t>Mesh Service transactions MAY cause modification of the data stored in the Mesh Portal or the Mesh itself but do not cause changes to the connection state. The protocol itself is thus idempotent. There is no set sequence in which operations are required to be performed. It is not necessary to perform a Hello transaction prior to a CreateGroup, AddMember or any other transaction. </t>
<section title="Request Messages " anchor="Section_4_1">
<t>A Mesh/Recrypt administration Service request consists of a payload object that inherits from the MeshRequest class. When using the  HTTP binding, the request MUST specify the portal DNS address in the HTTP Host field.  </t>
<section title="Message: RecryptRequest " anchor="Section_4_1_1">
<t>Base class for all request messages. </t>
<t>Portal: String (Optional) </t>
<t><list style="hanging">
<t><list style="hanging">
<t hangText="Name of the Mesh/Recrypt administration Service to which the request  is directed. "> </t>
</list></t>
</list></t>
</section>
</section>
<section title="Response Messages " anchor="Section_4_2">
<t>A Mesh/Recrypt administration Service response consists of a payload object that inherits from the MeshResponse class. When using the HTTP binding, the response SHOULD report the Status response code in the HTTP response  message. However the response code returned in the payload object MUST always be considered authoritative. </t>
<section title="Message: RecryptResponse " anchor="Section_4_2_1">
<t>Base class for all response messages. Contains only the status code and status description fields. </t>
<t>A service MAY return either the response message specified for that transaction or any parent of that message.  Thus the RecryptResponse message MAY be returned in response  to any request. </t>
<t>Status: Integer (Optional) </t>
<t><list style="hanging">
<t><list style="hanging">
<t hangText="Status return code. The SMTP/HTTP scheme of 2xx = Success, 3xx = incomplete, 4xx = failure is followed. "> </t>
</list></t>
</list></t>
<t>StatusDescription: String (Optional) </t>
<t><list style="hanging">
<t><list style="hanging">
<t hangText="Text description of the status return code for debugging  and log file use. "> </t>
</list></t>
</list></t>
</section>
<section title="Successful Response Codes " anchor="Section_4_2_2">
<t>The following response codes are returned when a transaction has completed successfully. </t>
<t>[201] SuccessOK </t>
<t><list style="hanging">
<t><list style="hanging">
<t hangText="Operation completed successfully "> </t>
</list></t>
</list></t>
<t>[201] SuccessCreated </t>
<t><list style="hanging">
<t><list style="hanging">
<t hangText="Operation completed successfully, new data item created "> </t>
</list></t>
</list></t>
<t>[202] SuccessUpdated </t>
<t><list style="hanging">
<t><list style="hanging">
<t hangText="Operation completed successfully, data item was updated "> </t>
</list></t>
</list></t>
</section>
<section title="Warning Response Codes " anchor="Section_4_2_3">
<t>The following response codes are returned when a transaction did not complete because the target service has been redirected. </t>
<t>In the case that a redirect code is returned, the  StatusDescription field contains the URI of the  new service. Note however that the redirect location  indicated in a status response might be incorrect or even malicious and cannot be considered  trustworthy without appropriate authentication. </t>
<t>[303] RedirectPermanent </t>
<t><list style="hanging">
<t><list style="hanging">
<t hangText="Service has been permanently moved "> </t>
</list></t>
</list></t>
<t>[307] RedirectTemporary </t>
<t><list style="hanging">
<t><list style="hanging">
<t hangText="Service has been temporarily moved "> </t>
</list></t>
</list></t>
</section>
<section title="Error Response Codes " anchor="Section_4_2_4">
<t>A response code in the range 400-499 is returned when the service was able to process the transaction but the transaction resulted in an error. </t>
<t>[401] ClientUnauthorized </t>
<t><list style="hanging">
<t><list style="hanging">
<t hangText="Client is not authorized to perform specified request "> </t>
</list></t>
</list></t>
<t>[404] NotFound </t>
<t><list style="hanging">
<t><list style="hanging">
<t hangText="The requested object could not be found. "> </t>
</list></t>
</list></t>
<t>[409] AlreadyExists </t>
<t><list style="hanging">
<t><list style="hanging">
<t hangText="The requested object already exists. "> </t>
</list></t>
</list></t>
</section>
<section title="Failure Response Codes " anchor="Section_4_2_5">
<t>A response code in the range 500-599 is returned when the service was unable to process the transaction but the transaction due to an internal failure. </t>
<t>[500] ServerInternal </t>
<t><list style="hanging">
<t><list style="hanging">
<t hangText="An internal error occurred at the server "> </t>
</list></t>
</list></t>
<t>[503] ServerOverload </t>
<t><list style="hanging">
<t><list style="hanging">
<t hangText="The server cannot handle the request as it is overloaded "> </t>
</list></t>
</list></t>
</section>
</section>
<section title="Imported Objects " anchor="Section_4_3">
<t>The Recrypt Administration Sercice makes use of JSON objects defined in the JOSE Signatgure and Encryption specifications. </t>
</section>
<section title="Common classes " anchor="Section_4_4">
<t>The following classes are referenced at multiple points in the protocol. </t>
<section title="Structure: RecryptionGroup " anchor="Section_4_4_1">
<t>Describes a group of recryption users. </t>
<t>Name: String (Optional) </t>
<t><list style="hanging">
<t><list style="hanging">
<t hangText="A user friendly account name in RFC821 format (user@example.com). "> </t>
</list></t>
</list></t>
<t>Members: Member [0..Many] </t>
<t><list style="hanging">
<t><list style="hanging">
<t hangText="Member of a recryption group "> </t>
</list></t>
</list></t>
<t>ArchivedKeys: PublicKey (Optional) </t>
<t><list style="hanging">
<t><list style="hanging">
<t hangText="The set of past encryption keys associated with the group. "> </t>
</list></t>
</list></t>
</section>
<section title="Structure: Member " anchor="Section_4_4_2">
<t>Describes a member of a recryption group </t>
<t>UDF: String (Optional) </t>
<t><list style="hanging">
<t><list style="hanging">
<t hangText="UDF fingerprint of the user's master profile "> </t>
</list></t>
</list></t>
<t>Privileges: String [0..Many] </t>
<t><list style="hanging">
<t><list style="hanging">
<t hangText="A list of privileges assigned to the user. "> </t>
<t hangText="Currently defined privileges are RECRYPT, ADMIN and SUPER.  Recrypt grants a user the right to request decryption of  data encrypted under the group key. ADMIN grants the right to add or remove users from the group. SUPER grants the right to add or remove administrators and super-administrators from the  group. "> </t>
<t hangText="Note that being granted the necessary privilege does not in itself confer the ability to decrypt messages as this requires access to the master private key. "> </t>
</list></t>
</list></t>
<t>Quotas: String [0..Many] </t>
<t><list style="hanging">
<t><list style="hanging">
<t hangText="A list of quotas assigned to the user. "> </t>
<t hangText="Each quota is described by the UDF fingerprint of the quota  service. "> </t>
</list></t>
</list></t>
</section>
<section title="Structure: Version " anchor="Section_4_4_3">
<t>Describes a protocol version. </t>
<t>Major: Integer (Optional) </t>
<t><list style="hanging">
<t><list style="hanging">
<t hangText="Major version number of the service protocol. A higher "> </t>
</list></t>
</list></t>
<t>Minor: Integer (Optional) </t>
<t><list style="hanging">
<t><list style="hanging">
<t hangText="Minor version number of the service protocol. "> </t>
</list></t>
</list></t>
<t>Encodings: Encoding [0..Many] </t>
<t><list style="hanging">
<t><list style="hanging">
<t hangText="Enumerates alternative encodings (e.g. ASN.1, XML, JSON-B) supported by the service. If no encodings are specified, the JSON encoding is assumed. "> </t>
</list></t>
</list></t>
<t>URI: String [0..Many] </t>
<t><list style="hanging">
<t><list style="hanging">
<t hangText="The preferred URI for this service. This MAY be used to effect a redirect in the case that a service moves. "> </t>
</list></t>
</list></t>
</section>
<section title="Structure: Encoding " anchor="Section_4_4_4">
<t>Describes a message content encoding. </t>
<t>ID: String [0..Many] </t>
<t><list style="hanging">
<t><list style="hanging">
<t hangText="The IANA encoding name "> </t>
</list></t>
</list></t>
<t>Dictionary: String [0..Many] </t>
<t><list style="hanging">
<t><list style="hanging">
<t hangText="For encodings that employ a named dictionary for tag or data compression, the name of the dictionary as defined by that  encoding scheme.  "> </t>
</list></t>
</list></t>
</section>
<section title="Structure: PublicKey " anchor="Section_4_4_5">
<t>The PublicKey class is used to describe public key pairs and  trust assertions associated with a public key. </t>
<t>Note that this class is also defined in the Mesh protocol libraries. It being clearly desirable that both protocols share a common specification of the PublicKey class, these classes will be merged at some future point. Mosty likely the best way to do this would  be to define this element in a separate specification describing the Jose encryption wrapper. </t>
<t>UDF: String (Optional) </t>
<t><list style="hanging">
<t><list style="hanging">
<t hangText="UDF fingerprint of the public key parameters/ "> </t>
</list></t>
</list></t>
<t>X509Certificate: Binary (Optional) </t>
<t><list style="hanging">
<t><list style="hanging">
<t hangText="List of X.509 Certificates "> </t>
</list></t>
</list></t>
<t>X509Chain: Binary [0..Many] </t>
<t><list style="hanging">
<t><list style="hanging">
<t hangText="X.509 Certificate chain. "> </t>
</list></t>
</list></t>
<t>X509CSR: Binary (Optional) </t>
<t><list style="hanging">
<t><list style="hanging">
<t hangText="X.509 Certificate Signing Request. "> </t>
</list></t>
</list></t>
</section>
<section title="Structure: MemberEntry " anchor="Section_4_4_6">
<t>Name: String (Optional) </t>
<t><list style="hanging">
<t><list style="hanging">
<t hangText="User friendly account name "> </t>
</list></t>
</list></t>
<t>UDF: String (Optional) </t>
<t><list style="hanging">
<t><list style="hanging">
<t hangText="Fingerprint of the user's Mesh profile "> </t>
</list></t>
</list></t>
<t>Status: String (Optional) </t>
<t><list style="hanging">
<t><list style="hanging">
<t hangText="Member status. Valid values are ACTIVE, REVOKED and SUSPENDED. "> </t>
<t hangText="Once added to a recryption group, a user can never be 'deleted'. Instead their member record is marked as REVOKED or SUSPENDED which causes the recryption service to refuse further recryption requests. "> </t>
<t hangText="Note that it is entirely valid for newly created recryption group to contain member entries that are inactive. This allows a key administrator to generate key material for group members in anticipation of them requiring access without immediately granting that access. "> </t>
</list></t>
</list></t>
<t>UserDecryptionEntries: UserDecryptionEntry [0..Many] </t>
<t><list style="hanging">
<t><list style="hanging">
<t hangText="The User Decryption Entries for this user for one particular encryption key. "> </t>
<t hangText="This entry is a list since the user may be authorized to decrypt the information on more than one device. "> </t>
</list></t>
</list></t>
</section>
<section title="Structure: UserDecryptionEntry " anchor="Section_4_4_7">
<t>UDF: String (Optional) </t>
<t><list style="hanging">
<t><list style="hanging">
<t hangText="Fingerprint of the encryption key to which this recryption data corresponds "> </t>
</list></t>
</list></t>
<t>RecryptionKey: Key (Optional) </t>
<t><list style="hanging">
<t><list style="hanging">
<t hangText="The recryption key to be used to recrypt for this user. "> </t>
</list></t>
</list></t>
<t>DecryptionKey: JoseWebEncryption (Optional) </t>
<t><list style="hanging">
<t><list style="hanging">
<t hangText="The user's decryption key encrypted under a one or more encryption keys held by the user. The encrypted content is a PrivateKey structure specifying the decryption key for the user. "> </t>
</list></t>
</list></t>
</section>
</section>
<section title="Administrator Transactions " anchor="Section_4_5">
</section>
<section title="Transaction: Hello " anchor="Section_4_6">
<t>Request: HelloRequest </t>
<t>Response:HelloResponse </t>
<t>Report service and version information.  </t>
<t>The Hello transaction provides a means of determining which protocol versions, message encodings and transport protocols are supported by the service. </t>
<section title="Message: HelloRequest " anchor="Section_4_6_1">
<t><list style="symbols">
<t><list style="symbols">
<t> Inherits: RecryptRequest </t>
</list></t>
</list></t>
<t>Request service description. </t>
<t>[None] </t>
</section>
<section title="Message: HelloResponse " anchor="Section_4_6_2">
<t>Always reports success. Describes the configuration of the service. </t>
<t><list style="symbols">
<t><list style="symbols">
<t> Inherits: RecryptResponse </t>
</list></t>
</list></t>
<t>Version: Version (Optional) </t>
<t><list style="hanging">
<t><list style="hanging">
<t hangText="Enumerates the protocol versions supported "> </t>
</list></t>
</list></t>
<t>Alternates: Version [0..Many] </t>
<t><list style="hanging">
<t><list style="hanging">
<t hangText="Enumerates alternate protocol version(s) supported "> </t>
</list></t>
</list></t>
</section>
</section>
<section title="Transaction: CreateGroup " anchor="Section_4_7">
<t>Request: CreateGroupRequest </t>
<t>Response:CreateGroupResponse </t>
<t>Create a new recryption group. </t>
<section title="Message: CreateGroupRequest " anchor="Section_4_7_1">
<t><list style="symbols">
<t><list style="symbols">
<t> Inherits: RecryptRequest </t>
</list></t>
</list></t>
<t>Request creation of a recryption group. The only request parameter describes the group to be created. </t>
<t>RecryptionGroup: RecryptionGroup (Optional) </t>
<t><list style="hanging">
<t><list style="hanging">
<t hangText="The Recryption Group to create	 "> </t>
</list></t>
</list></t>
</section>
<section title="Message: CreateGroupResponse " anchor="Section_4_7_2">
<t><list style="symbols">
<t><list style="symbols">
<t> Inherits: RecryptResponse </t>
</list></t>
</list></t>
<t>Reports the success or failure of a CreateGroup request. The operation either succeeds or fails, there are no returned parameters </t>
<t>[None] </t>
</section>
</section>
<section title="Transaction: UpdateGroup " anchor="Section_4_8">
<t>Request: UpdateGroupRequest </t>
<t>Response:UpdateGroupResponse </t>
<t>Update the information describing a recryption group. </t>
<section title="Message: UpdateGroupRequest " anchor="Section_4_8_1">
<t><list style="symbols">
<t><list style="symbols">
<t> Inherits: RecryptRequest </t>
</list></t>
</list></t>
<t>Request an update to a recryption group.  </t>
<t>Note that the update  process is currently limited to 'strike and replace'. This is  likely to become cumbersome if groups with very large numbers  of entries are being maintained. It is likely that a future  version of the protocol will support update requests that implement commonly occurring tasks such as updates to  add a new encryption key, etc. </t>
<t>RecryptionGroup: RecryptionGroup (Optional) </t>
<t><list style="hanging">
<t><list style="hanging">
<t hangText="The Recryption Group to create	 "> </t>
</list></t>
</list></t>
</section>
<section title="Message: UpdateGroupResponse " anchor="Section_4_8_2">
<t><list style="symbols">
<t><list style="symbols">
<t> Inherits: RecryptResponse </t>
</list></t>
</list></t>
<t>Reports the success or failure of a UpdateGroup request. The operation either succeeds or fails, there are no returned parameters </t>
<t>[None] </t>
</section>
</section>
<section title="Transaction: AddMember " anchor="Section_4_9">
<t>Request: AddMemberRequest </t>
<t>Response:AddMemberResponse </t>
<t>Add a member or members to an existing recryption group. </t>
<section title="Message: AddMemberRequest " anchor="Section_4_9_1">
<t><list style="symbols">
<t><list style="symbols">
<t> Inherits: RecryptRequest </t>
</list></t>
</list></t>
<t>RecryptionGroup: String (Optional) </t>
<t><list style="hanging">
<t><list style="hanging">
<t hangText="The UDF fingerprint of the recryption group to add the member to. "> </t>
</list></t>
</list></t>
<t>MemberEntry: MemberEntry [0..Many] </t>
<t><list style="hanging">
<t><list style="hanging">
<t hangText="Describes the member(s) to add "> </t>
</list></t>
</list></t>
</section>
<section title="Message: AddMemberResponse " anchor="Section_4_9_2">
<t><list style="symbols">
<t><list style="symbols">
<t> Inherits: RecryptResponse </t>
</list></t>
</list></t>
<t>Reports the success or failure of a AddMember request. The operation either succeeds or fails, there are no returned parameters </t>
<t>[None] </t>
</section>
</section>
<section title="Transaction: UpdateMember " anchor="Section_4_10">
<t>Request: UpdateMemberRequest </t>
<t>Response:UpdateMemberResponse </t>
<t>Update a one or more member entries </t>
<t>This transaction may be used to make member entries inactive by  posting REVOKED or SUSPENDED status to their member entry. </t>
<section title="Message: UpdateMemberRequest " anchor="Section_4_10_1">
<t><list style="symbols">
<t><list style="symbols">
<t> Inherits: RecryptRequest </t>
</list></t>
</list></t>
<t>RecryptionGroup: String (Optional) </t>
<t><list style="hanging">
<t><list style="hanging">
<t hangText="The UDF fingerprint of the recryption group in which the member entries is to be updated "> </t>
</list></t>
</list></t>
<t>MemberEntry: MemberEntry [0..Many] </t>
<t><list style="hanging">
<t><list style="hanging">
<t hangText="Describes the member(s) to add "> </t>
</list></t>
</list></t>
</section>
<section title="Message: UpdateMemberResponse " anchor="Section_4_10_2">
<t><list style="symbols">
<t><list style="symbols">
<t> Inherits: RecryptResponse </t>
</list></t>
</list></t>
<t>Reports the success or failure of a UpdateMember request. The operation either succeeds or fails, there are no returned parameters </t>
<t>[None] </t>
</section>
</section>
<section title="Future work " anchor="Section_4_11">
<t>At present the protocol does not provide a mechanism for  modifying administrator privileges or requesting statistics on use of recryption services. These are obviously important. Whether these should be part of the base protocol or a separate protocol is another matter. </t>
</section>
</section>
<section title="User Service " anchor="Section_5">
<t>The only transaction supported by the user facing service at this point is the ability to request a recryption operation. </t>
<section title="Transaction: RecryptData " anchor="Section_5_1">
<t>Request: RecryptDataRequest </t>
<t>Response:RecryptDataResponse </t>
<t>Request that the service provide a recryption result for the specified encrypted data and return it encrypted under the user's public key. </t>
<section title="Message: RecryptDataRequest " anchor="Section_5_1_1">
<t><list style="symbols">
<t><list style="symbols">
<t> Inherits: RecryptRequest </t>
</list></t>
</list></t>
<t>Request that the service provide a recryption result for the specified encrypted data and return it encrypted under the user's public key. </t>
<t>RecryptionGroup: String (Optional) </t>
<t><list style="hanging">
<t><list style="hanging">
<t hangText="The recryption group in which the member entries is to be updated "> </t>
</list></t>
</list></t>
<t>Recipient: Recipient (Optional) </t>
<t><list style="hanging">
<t><list style="hanging">
<t hangText="The Jose Web Encryption recipient information to be partially decrypted. "> </t>
</list></t>
</list></t>
</section>
<section title="Message: RecryptDataResponse " anchor="Section_5_1_2">
<t><list style="symbols">
<t><list style="symbols">
<t> Inherits: RecryptResponse </t>
</list></t>
</list></t>
<t>Partial: JoseWebEncryption (Optional) </t>
<t><list style="hanging">
<t><list style="hanging">
<t hangText="The partial decryption information to use to complete the decryption encrypted under the user's key. "> </t>
</list></t>
</list></t>
<t>UserDecryptionEntry: JoseWebEncryption (Optional) </t>
<t><list style="hanging">
<t><list style="hanging">
<t hangText="The decryption key to use to complete the decryption encrypted under the user's key. "> </t>
</list></t>
</list></t>
</section>
</section>
</section>
<section title="Security Considerations" anchor="Section_6">
<section title="Confidentiality" anchor="Section_6_1">
<t>The use of recryption techniques provides a limited form of end-to-end protection of confidentiality. Specifically, a message encrypted under the group encryption key cannot be decrypted by an unauthorized party unless either the encryption algorithm is broken or there is collusion between the key service and at least one party whose authorization has been either deleted or suspended.</t>
<t>Mesh/Recrypt messages may reveal information through traffic analysis. Thus all Mesh/Recrypt messages SHOULD be protected using TLS in addition to the authentication and encryption services afforded by the service binding.</t>
</section>
<section title="Integrity" anchor="Section_6_2">
<t>The Mesh/Recrypt protocol does not provide data integrity services.</t>
<t>In applications where an audit trail of which parties requested access or were granted access to material is required, the Mesh/Recrypt service MAY require all transaction messages to be digitally signed to provide non-repudiation. Further integrity protections MAY be afforded by enrolling messages in a linked notary log.</t>
</section>
<section title="Availability" anchor="Section_6_3">
<t>Access to data encrypted under a recryption group will be impaired if the key service is unavailable. Use of fault tolerant approaches to service implementation SHOULD be considered in cases where high availability is required.</t>
</section>
</section>
<section title="Acknowledgements" anchor="Section_7">
<t>Comodo Group: Egemen Tas, Melhi Abdulhayo?lu, Rob Stradling, Robin Alden.</t>
</section>
</middle>
<back>
<references title="Normative References">
<reference anchor="RFC2119">
<front>
<title>Key words for use in RFCs to Indicate Requirement Levels</title>
<author fullname="S. Bradner" initials="S." surname="Bradner">
<organization/>
<address>
</address>
</author>
<date month="March" year="1997"/>
</front>
<seriesInfo name="BCP" value="14"/>
<seriesInfo name="RFC" value="2119"/>
<seriesInfo name="DOI" value="10.17487/RFC2119"/>
</reference>
<reference anchor="RFC7159">
<front>
<title>The JavaScript Object Notation (JSON) Data Interchange Format</title>
<author fullname="T. Bray" initials="T." surname="Bray">
<organization/>
<address>
</address>
</author>
<date month="March" year="2014"/>
</front>
<seriesInfo name="RFC" value="7159"/>
<seriesInfo name="DOI" value="10.17487/RFC7159"/>
</reference>
<reference anchor="RFC7515">
<front>
<title>JSON Web Signature (JWS)</title>
<author fullname="M. Jones" initials="M." surname="Jones">
<organization/>
<address>
</address>
</author>
<author fullname="J. Bradley" initials="J." surname="Bradley">
<organization/>
<address>
</address>
</author>
<author fullname="N. Sakimura" initials="N." surname="Sakimura">
<organization/>
<address>
</address>
</author>
<date month="May" year="2015"/>
</front>
<seriesInfo name="RFC" value="7515"/>
<seriesInfo name="DOI" value="10.17487/RFC7515"/>
</reference>
<reference anchor="RFC7516">
<front>
<title>JSON Web Encryption (JWE)</title>
<author fullname="M. Jones" initials="M." surname="Jones">
<organization/>
<address>
</address>
</author>
<author fullname="J. Hildebrand" initials="J." surname="Hildebrand">
<organization/>
<address>
</address>
</author>
<date month="May" year="2015"/>
</front>
<seriesInfo name="RFC" value="7516"/>
<seriesInfo name="DOI" value="10.17487/RFC7516"/>
</reference>
<reference anchor="RFC7518">
<front>
<title>JSON Web Algorithms (JWA)</title>
<author fullname="M. Jones" initials="M." surname="Jones">
<organization/>
<address>
</address>
</author>
<date month="May" year="2015"/>
</front>
<seriesInfo name="RFC" value="7518"/>
<seriesInfo name="DOI" value="10.17487/RFC7518"/>
</reference>
<reference anchor="RFC5246">
<front>
<title>The Transport Layer Security (TLS) Protocol Version 1.2</title>
<author fullname="T. Dierks" initials="T." surname="Dierks">
<organization/>
<address>
</address>
</author>
<author fullname="E. Rescorla" initials="E." surname="Rescorla">
<organization/>
<address>
</address>
</author>
<date month="August" year="2008"/>
</front>
<seriesInfo name="RFC" value="5246"/>
<seriesInfo name="DOI" value="10.17487/RFC5246"/>
</reference>
<reference anchor="RFC7748">
<front>
<title>Elliptic Curves for Security</title>
<author fullname="A. Langley" initials="A." surname="Langley">
<organization/>
<address>
</address>
</author>
<author fullname="M. Hamburg" initials="M." surname="Hamburg">
<organization/>
<address>
</address>
</author>
<author fullname="S. Turner" initials="S." surname="Turner">
<organization/>
<address>
</address>
</author>
<date month="January" year="2016"/>
</front>
<seriesInfo name="RFC" value="7748"/>
<seriesInfo name="DOI" value="10.17487/RFC7748"/>
</reference>
<reference anchor="draft-hallambaker-json-web-service-04">
<front>
<title>[Reference Not Found!]</title>
<author initials="" surname="">
<organization/>
<address>
</address>
</author>
<date/>
</front>
</reference>
<reference anchor="draft-hallambaker-udf-05">
<front>
<title>[Reference Not Found!]</title>
<author initials="" surname="">
<organization/>
<address>
</address>
</author>
<date/>
</front>
</reference>
<reference anchor="draft-hallambaker-mesh-architecture-03">
<front>
<title>[Reference Not Found!]</title>
<author initials="" surname="">
<organization/>
<address>
</address>
</author>
<date/>
</front>
</reference>
<reference anchor="draft-hallambaker-mesh-reference-04">
<front>
<title>[Reference Not Found!]</title>
<author initials="" surname="">
<organization/>
<address>
</address>
</author>
<date/>
</front>
</reference>
<reference anchor="draft-hallambaker-jsonbcd-06">
<front>
<title>[Reference Not Found!]</title>
<author initials="" surname="">
<organization/>
<address>
</address>
</author>
<date/>
</front>
</reference>
</references>
</back>
</rfc>
