Mathematical Mesh 3.0 Part VIII: Cryptographic Algorithms
phill@hallambaker.com
The Mathematical Mesh 'The Mesh' is an infrastructure that facilitates the exchange of configuration and credential data between multiple user devices and provides endtoend security. This document describes the cryptographic algorithm suites used in the Mesh and the implementation of MultiParty Encryption and MultiParty Key Generation used in the Mesh.
[Note to Readers]
Discussion of this draft takes place on the MATHMESH mailing list (mathmesh@ietf.org), which is archived at https://mailarchive.ietf.org/arch/search/?email_list=mathmesh.
This document is also available online at .
This document describes the cryptographic algorithm suites used in the Mesh and the implementation of MultiParty Encryption and MultiParty Key Generation used in the Mesh.
To allow use of Mesh capabilities on the least capable computing devices currently in use, separate schedules of recommended and required algorithms are specified for Standard Devices and Constrained Devices.
The Constrained device class may be considered to include most 8bit CPUs equipped with sufficient memory to support the necessary operations. For example an Ardunino Mega 2560 which can perform ECDH key agreement and signature operations in times ranging from 3 to 8 seconds. While such a device is clearly not suited to perform such operations routinely, a onetime connection process that takes several minutes to complete need not be of major concern.
The Standard device class may be considered to include the vast majority of general purpose and personal computing devices manufactured since 2010. Even a Raspberry Pi Zero which currently retails at $5 is capable of performing the cryptographic functions required to implement the Mesh with negligible impact on the user.
This section presents the related specifications and standard, the terms that are used as terms of art within the documents and the terms used as requirements language.
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 .
The terms of art used in this document are described in the Mesh Architecture Guide .
The architecture of the Mathematical Mesh is described in the Mesh Architecture Guide . The Mesh documentation set and related specifications are described in this document.
The implementation status of the reference code base is described in the companion document .
To allow implementation of Mesh capabilities on the widest possible range of devices, separate algorithm requirements and recommendations are specified for four classes of device:
 Administration Device

A generalpurpose computing device that is used for Mesh administration functions.
 Mesh Device

A generalpurpose computing device that is not used for Mesh administration functions with sufficient memory and processing power to perform public key cryptography operations without paying particular attention to the impact on performance.
 Constrained Device

An embedded computing device with limited memory and computing power that offers sufficient processing capabilities to perform occasional public key operations (e.g. during device initialization) but is not suited to repeated operations.
 Bridge Device

A trusted device that enables Mesh Devices to interoperate with Constrained devices.
Since Administration Devices and Mesh Devices MUST support communication with Mesh Devices and Constrained devices, they MUST meet all the REQUIRED algorithms for both types of device.
Support for the following algorithms is REQUIRED:
 SHA2512
 HMACSHA2512
 HMACbased ExtractandExpand Key Derivation Function
 AESCBC256 Encryption
 Advanced Encryption Standard (AES) Key Wrap Algorithm
 Montgomery Curve DiffieHellman Key Agreement X25519 and X448
 EdwardsCurve Digital Signature Algorithm Ed25519 and Ed448
Support for the following algorithms is RECOMMENDED:
 AESGCM256 Encryption
 SHA3512
 KMAC SHA3512
While the use of GCM is generally preferred over CBC mode in IETF security protocols, this mode is not currently supported by the reference implementation platform.
Support for the following algorithms is REQUIRED:
 SHA2512
 HMACSHA2512
 HMACbased ExtractandExpand Key Derivation Function
 Poly1035 Authenticated Encryption
 ChaCha20 Encryption
 Advanced Encryption Standard (AES) Key Wrap Algorithm
 EdwardsCurve Digital Signature Algorithm Ed25519
 EdwardsCurve DiffieHellman Key Agreement Ed25519
Use of the Edwards Curves for Signature and Key Agreement allows both functions to be supported by a single library with no reduction in security.
The multiparty key generation and multiparty decryption mechanisms used in the Mesh protocols are made possible by the fact that Diffie Hellman key agreement and elliptic curve variants thereof support properties we call the Key Combination Law and the Result Combination Law.
Let {X, x}, {Y, y}, {E, e} be {public, private} key pairs.
The Key Combination law states that we can define an operator ? such that there is a keypair {Z, z} such that:
Z = X ? Y and z = (x + y) mod o (where o is the order of the group)
The Result Combination Law states that we can define an operator ? such that:
(x ? E) ? (y ? E) = (z ? E) = (e ? Z).
For the Diffie Hellman system in a modular field p, o = p1 and a ? b = a ? b = a.b mod p.
Proof:
By definition, X = e^{x} mod p, Y = e^{y} mod p, and Z = e^{z }mod p.
Therefore,
Z = e^{z} mod p = e^{x+y} mod p = (e^{x}e^{y}) mod p = e^{x }mod p.e^{y} mod p = X.Y
A similar proof may be constructed for the operator ?.
The Key Combination Law provides the basis for the Key CoGeneration technique used to ensure that the cryptographic keys used in devices connected to a Mesh profile are sufficiently random and have not been compromised by malware or other 'backdoor' compromise to the machine during or after manufacture.
For the Diffie Hellman system, the Key Combination law provides all the mechanism needed to implement a Key CoGeneration mechanism. If the Device key is {X, x}, the administration device can generate a CoGeneration Key Pair {Y, y} and generate a Device Connection Assertion for the final public key E calculated from knowledge of X and Y alone. Passing the value y to the device (using a secure channel) allows it to calculate the corresponding private key e required to make use of the Device Connection Assertion.
This approach ensures that a party with knowledge of either x or y but not both obtains no knowledge of e.
Section REF _Ref5309729 \w \h 5 describes the implementation of these schemes in the Mesh
The Key Combination Law and Result Combination Law provide the basis for the MultiParty Decryption technique used to support Mesh Encryption Groups.
Section REF _Ref5309538 \w \h 6 describes the application of this technique in the Mesh
The Result Combination Law is used to provide a Key Exchange mechanism that provides mutual authentication of the parties while preserving forward secrecy.
For elliptic curve cryptosystems, the operators ? and ? are point addition.
Implementing a robust Key CoGeneration for the Elliptic Curve Cryptography schemes described in and requires some additional considerations to be addressed.
 The secret scalar used in the EdDSA algorithm is calculated from the private key using a digest function. It is therefore necessary to specify the Key CoGeneration mechanism by reference to operations on the secret scalar values rather than operations on the private keys.
 The Montgomery Ladder traditionally used to perform X25519 and X448 point multiplication does not require implementation of a function to add two arbitrary points. While the steps required to create such a function are fully constrained by the specification, the means of satisfying the constraints is not.
The data structures used to implement cogeneration of public keys are defined in the main Mesh Reference Guide. This document describes only the additional implementation details.
Note that the 'private key' described in is in fact a seed used to generate a 'secret scalar' value that is the value that has the function of being the private key in the ECDH algorithm.
To provision a new public key to a device, the provisioning device:
 Obtains the device profile of the device(s) to be provisioned to determine the type of key to perform cogeneration for. Let the device {public, private} key be {D, d}.
 Generates a private key m with the specified number of bytes (32 or 57].
 Calculates the corresponding public key M.
 Calculates the Application public key A = D+M where + is point addition.
 Constructs the application device entry containing the private key value m and encrypts under the device encryption key d.
On receipt, the device may at its option use its knowledge of the secret scalar corresponding to d and m to calculate the application secret scalar a or alternatively maintain the two secrets separately and make use of the result combination law to perform private key operations.
While the point addition function can be defined for any elliptic curve system, it is not necessary to implement point addition to support ECDH key agreement.
In particular, point multiplication using the Montgomery ladder technique over Montgomery curves only operate on the x coordinate and only require point doubling operations.
For expediency, the current implementation of the Mesh reference code uses the Edwards curves for both signature and encryption pending announcement of platform support for both algorithms.
MultiParty Key Generation is a capability that is used in the Mesh to enable provisioning of application specific private key pairs to connected devices without revealing any information concerning the application private key of the device.
For example, Alice provisions the confirmation service to her watch. The provisioning device could generate a signature key for the device and encrypt it under the encryption key of the device. But this means that we cannot attribute signatures to the watch with absolute certainty as the provisioning device has had knowledge of the watch signature key. Nor do we wish to use the device signature key for the confirmation service.
MultiParty Key Generation allows an administration device to provision a connected device with an application specific private key that is specific to that application and no other such that the application can determine the public key of the device but has no knowledge of the private key.
Provisioning an application private key to a device requires the administration device to:
 Generate a new application public key for the device.
 Construct and publish whatever application specific credentials the device requires to use the application.
 Providing the information required to make use of the private key to the device.
Note that while the administration device needs to know the device application public key, it does not require knowledge of the device application private key.
For example, Alice provisions the confirmation service to her watch. The device profile of the watch specifies an Ed25519 signature key. Note that for production use, Ed448 is almost certainly prefered but Ed25519 has the advantage of more compact presentation.
Device Key
UDF Seed: ZAAAG4F5G34WHHLC24APSZKIVGO7UHI
Private Key:
B7 48 FF 8A 1B D2 04 BC BA 53 70 80 91 66 08 8E
26 15 B5 52 ED C9 C4 CE 80 D7 75 A6 BD A9 4A 1C
Secret Scalar:
561256512376003542287986996396194037798558214965969766613823935719031
34631504
Public Key:
2B B3 8F D1 93 16 E1 5E 24 44 BA 82 9F 4A D3 7D
F6 7F B5 A0 92 65 A1 7B F4 8C B6 51 6D F3 9F DC
Fingerprint: MANZN7DMBYZHEQIOE7YLC6SXGONP
The provisioning device could generate a signature key for the device and encrypt it under the encryption key of the device. But this means that we cannot attribute signatures to the watch with absolute certainty as the provisioning device has had knowledge of the watch signature key. Nor do we wish to use the device signature key for the confirmation service.
Instead, the provisioning device generates an overlay keypair:
Device Key
UDF Seed: ZAAAHIGJGGBYNTBFYS2TABNO4WT2SIY
Private Key:
F9 44 69 38 A7 E2 52 A1 F6 1D 9D 9B 29 D1 5D 52
77 23 26 0C AF F3 14 A6 4E 95 CB 76 5B 24 B1 67
Secret Scalar:
494374318308300050435542868433885510572653196058722477545726317545719
97461496
Public Key:
C7 EF 8B 19 BE D9 E7 F7 45 17 73 8E B3 92 6E 86
C2 0F A4 06 84 58 BF 3B FE EE 87 A5 B8 EB 62 0A
Fingerprint: MBQOUETOEL5HEQBIPM4YQOE7E6PH
The provisioning device can calculate the public key of the composite keypair by adding the public keys of the device profile and the companion public key:
Composite public key = Device + Overlay:
0A FD 34 5B D7 49 47 BF C3 CC 2E 4B AB A6 BF FE
E1 7A B1 3C 74 C6 49 EE 04 9C FF C0 4B D3 05 F6
Fingerprint: MBAK3KK5F3ANE6AJEIITIIL67KTP
The provisioning device encrypts the private key of the comanion keypair (or the seed from which it was generated) under the encryption key of the device.
The provisioning device calculates the private key of the composite keypair by adding the two private key values modulo the order of the group and verifies that scalar multiplication of the base point returns the composite public key value.
Composite Secret Scalar = Device + Overlay:
369621881521677524799960083359389394685489760249533923273552306952445
5498173
Fingerprint: MBAK3KK5F3ANE6AJEIITIIL67KTP
A key limitation of most deployed messaging systems is that true endtoend confidentiality is only achieved for a limited set of communication patterns. Specifically, bilateral communications (Alice sends a message to Bob) or broadcast communications to a known set of recipients (Alice sends a message to Bob, Carol and Doug). These capabilities do not support communication patterns where the set of recipients changes over time or is confidential. Yet such requirements commonly occur in situations such as sending a message to a mailing list whose membership isn't known to the sender, or creating a spreadsheet whose readership is to be limited to authorized members of the 'accounting' team.
The mathematical approach that makes key cogeneration possible may be applied to support a public key encryption mode in which encryption is performed as usual but decryption requires the use of multiple keys. This approach is variously described in the literature as distributed key generation and proxy reencryption .
The approach specified in this document borrows aspects of both these techniques. This combined approach is called 'recryption'. Using recryption allows a sender to send a message to a group of users whose membership is not known to the sender at the time the message is sent and can change at any time.
Proxy reencryption provides a technical capability that meets the needs of such communication patterns. Conventional symmetric key cryptography uses a single key to encrypt and decrypt data. Public key cryptography uses two keys, the key used to encrypt data is separate from the key used to decrypt. Proxy reencryption introduces a third key (the recryption key) that allows a party to permit an encrypted data packet to be decrypted using a different key without permitting the data to be decrypted.
The introduction of a recryption key permits endtoend confidentiality to be preserved when a communication pattern requires that some part of the communication be supported by a service.
The introduction of a third type of key, the recryption key permits two new roles to be established, that of an administrator and recryption service. There are thus four parties:
 Administrator

Holder of Decryption Key, Creator of Recryption Keys
 Sender

Holder of Encryption Key
 Recryption Service

Holder of Recryption keys
 Receiver

Holder of personal decryption key
The information stored at the recryption service is necessary but not sufficient to decrypt the message. Thus, no disclosure of the message plaintext occurs even in the event that an attacker gains full knowledge of all the information stored by the recryption service.
The mechanism used to support recryption is the same as the mechanism used to support key cogeneration except that this time, instead of combining two keys to create one, the private component of a decryption key (i.e. the private key) is split into two parts, a recryption key and a decryption key.
Recall that the key combination law for Diffie Hellman cryptosystems states that we can add two private keys to get a third. It follows that we can split the private key portion of a keypair {G, g} into two parts by choosing a random number that is less than the order of the DiffieHellman group to be our first key x. Our second key is y = g  r mod o, where o is the order of the group.
Having generated x, y, we can use these to perform private key agreement operations on a public key E and then use the result combination law to obtain the same result that we would have obtained using g.
One means of applying this mechanism to recryption would be to generate a different random value x for each member of the group and store it at the recryption service and communicate the value y to the member via a secure channel. Applying this approach, we can clearly see that the recryption service gains no information about the value of the private key since the only information it holds is a random number which could have been generated without any knowledge of the group private key.
requires that implementations derive the scalar secret by taking a cryptographic digest of the private key. This means that either the client or the service must use a noncompliant implementation. Given this choice, it is preferable to require that the nonstandard implementation be required at the service rather than the client. This limits the scope of the nonconformant key derivation approach to the specialist recryption service and ensures that the client enforce the requirement to generate the private key component by means of a digest.
Implementation of recryption in the Mesh has four parts:
 Creation and management of the recryption group.
 Provisioning of members to a recryption group.
 Message encryption.
 Message decryption.
These operations are all performed using the same catalog and messaging infrastructure provided by the Mesh for other purposes.
Each recryption group has its own independent Mesh account. This has many advantages:
 Administration of the recryption group may be spread across multiple Mesh users or transferred from one user to another without requiring specification of a separate management protocol to support these operations.
 The recryption account address can be used by Mesh applications such as group messaging, conferencing, etc. as a contact address.
 The contact request service can be used to notify members that they have been granted membership in the group.
Creation of a Recryption group requires the steps of:
 Generating the recryption group key pair
 Creating the recryption group account
 Generating administrator record for each administrator.
 Publishing the administrator records to the recryption catalog.
Note that in principle, we could make use of the key combination law to enable separation of duties controls on administrators so that provisioning of members required multiple administrators to participate in the process. This is left to future versions.
To provision a user as a member of the recryption group, the administrator requires their current recryption profile. The administrator MAY obtain this by means of a contact service request. As with any contact service request, this request is subject to access control and MAY require authorization by the intended user before the provisioning can proceed.
Having obtained the user's recryption profile, the administration tool generates a decryption private key for the user and encrypts it under the member's key to create the encrypted decryption key entry.
The administration tool then computes the secret scalar from the private key and uses this together with the secret scalar of the recryption group to compute the recryption key for the member. This value and the encrypted decryption key entry are combined to form the recryption group membership record which is published to the catalog.
Encryption of a messages makes use of DARE Message in exactly the same manner as any other encryption. The sole difference being that the recipient entry for the recryption operation MUST specify the recryption group address an not just the key fingerprint. This allows the recipient to determine which recryption service to contact to perform the recryption operation.
To decrypt a message, the recipient makes an authenticated recryption request to the specified recryption service specifying:
 The recipient entry to be used for decryption
 The fingerprint of the decryption key(s) the device would like to make use of.
 Whether or not the encrypted decryption key entry should be returned.
The recryption service searches the catalog for the corresponding recryption group to find a matching entry. If found and if the recipient and proposed decryption key are dully authorized for the purpose, the service performs the key agreement operation using the recryption key specified in the entry and returns the result to the recipient.
The recipient then decrypts the recryption data entry using its device decryption key and uses the group decryption key to calculate the other half of the result. The two halves of the result are then added to obtain the key agreement value that is then used to decrypt the message.
NB: The current code implements encryption in the Elliptic Curve Ed25519, not the Montgomery Curve X.25519 as it should. This will be lifted in the near future.
Alice creates an encryption keypair.
Group Key:
51 C5 D1 84 5F C3 31 97 D3 80 2A 25 CE 7F 82 AF
F0 30 5B 7D 52 D0 B6 CE 3C 1C 95 A0 33 CB 89 98
Value:
322319593526028683147256399641007608894514778179691781946528967784218
52742616
To verify the proper function of the group, Alice creates a test message and encrypts it under the group key.
Message = This is a test as UTF8:
54 68 69 73 20 69 73 20 61 20 74 65 73 74
[{
"enc": "A256CBC",
"Salt": "KDsofrPkFsnlhRsVaxPvvA",
"recipients": [{
"kid": "MCGRHO5N2FPSVUFQDEKF7TRAJHM6",
"epk": {
"PublicKeyECDH": {
"crv": "Ed25519",
"Public": "wKdpaMbC5sF8moAusBtJlZ9XRetMzOhfb3pnW0F_uIw"}}
,
"wmk": "Z0JQvs1BtVDcRDow6hDV47wPiymwn0ybJEXkteYbaSNByhLxGKf3c
A"}]},
"SUXub3kAgMzly2_HQZjGg"]
Alice decides to add Bob to the group. She creates an encryption key for Bob: The decryption key is specified in the same way as any other Ed25519 private key using the hash of a private key seed value:
Bob's Member Key:
C1 3D 09 F2 D0 46 2B ED 34 43 A2 06 EB C9 C5 6D
68 92 08 3C 31 FC E7 35 EB 3D 65 82 82 66 92 1C
Value:
397652973877671772297984793967578734933293251919295536394239116455044
36683984
The the recryption key is the group secret scalar minus (mod p) the secret scalar of Bob's private key:
Bob's Service Key:
[Not specified as a digest input value]
Value:
694067311950021551287353369342887587783638534479943976723288700948832
4560610
To decrypt:
Member Agreement Value:
B2 DB FC 97 A5 D9 14 FB B9 47 85 A0 DF 74 44 31
0B 28 64 EE 6C C3 97 BF FA 6A 39 05 16 07 70 0F
Service Agreement Value:
74 E2 28 0B FF 65 50 5B A9 10 87 14 0C C8 91 DB
6B FE CF 82 CC C9 10 C0 0E 93 05 14 CD 81 28 39
Key Agreement IKM:
2A 22 97 20 56 77 8D 13 F1 35 C9 5E 5A 5B 93 B0
4A 18 D5 90 B2 C6 40 3F 9F 2A 9E 3D 9E D3 E4 49
This value allows the test message to be decrypted.
Diffie Hellman key agreement using the authenticated public keys of the principals provides mutual authentication of those principals.
For example, if Alice's key pair is {a, A} and Bob's key pair is {b, B}, the Diffie Hellman key agreement value DH (a, B) = DH (b, A) can only be generated from the public information if a or b is known.
The chief disadvantage of this approach is that it only allows Alice and Bob to establish a single shared secret that will never vary and does not provide forward secrecy. To avoid this, cryptographic protocols usually perform the key agreement against an ephemeral key and either accept that the client key is not authenticated or perform multiple key agreements and combine the results.
Using the Result Combination Law allows a key agreement mechanism to combine the benefits of mutual authentication with the use of ephemeral keys without the need for multiple private key operations or additional round trips.
In its simplest form, the key exchange has two parties which we refer to as the client and the server. The client being the party that initiates the protocol exchange and the server being the party that responds. Let the public key pair of the client be {a, A} and that of the server {b, B}.
Two versions of the key agreement mechanism are specified:
 Client ephemeral

The client contributes an ephemeral key pair {n_{A}, N_{A}}. The effective public key of the client is A ? N_{A}.
The server uses its public key B.
The key agreement value is DH (a + n_{A}, B) = DH (b, A ? N_{A})
 Dual ephemeral

The client contributes an ephemeral key pair {n_{A}, N_{A}}. The effective public key of the client is A ? N_{A}.
The server contributes an ephemeral key pair {n_{B}, N_{B}}. The effective public key of the client is B ? N_{B}.
The key agreement value is DH (a + n_{A}, B ? N_{B}) = DH (b + n_{B}, A ? N_{A})
The function of the ephemeral key is effectively that of a nonce but it is shared with the counterparty as a public key value.
The dual ephemeral approach has the advantage that it limits the scope for side channel attacks as both sides have contributed unknown information to the key agreement value. The disadvantage of this approach is that the key agreement value can only be calculated after the server has provided its ephemeral.
Implementations MAY take advantage of the result combination law to enable private key operations involving the authenticated key (or a contribution to it) to be performed in trustworthy hardware.
An advantage of this key exchange mechanism over the traditional TLS key exchange approach is that no signature operation is involved, thus ensuring that either party can repudiate the exchange and thus the claim that they were in communication.
The master secret is calculated from the key agreement value in the usual fashion. For ECDH algorithms, this comprises the steps of converting the key agreement value to an octet string which forms the input to a Key Derivation Function.
The security considerations for use and implementation of Mesh services and applications are described in the Mesh Security Considerations guide .
This document requires no IANA actions.
A list of people who have contributed to the design of the Mesh is presented in .
Key words for use in RFCs to Indicate Requirement Levels
Secure Hash Standard
NIST
HMACbased ExtractandExpand Key Derivation Function (HKDF)
Advanced Encryption Standard (AES)
NIST
Advanced Encryption Standard (AES) Key Wrap Algorithm
Elliptic Curves for Security
EdwardsCurve Digital Signature Algorithm (EdDSA)
Recommendation for Block Cipher Modes of Operation: Galois/Counter Mode (GCM) and GMAC
NIST
SHA3 Standard: PermutationBased Hash and ExtendableOutput Functions
NIST
SHA3 Derived Functions: cSHAKE, KMAC, TupleHash and ParallelHash SHARE
NIST
NIST
NIST
HMAC: KeyedHashing for Message Authentication
ChaCha20 and Poly1305 for IETF Protocols
Mathematical Mesh 3.0 Part I: Architecture Guide
Mathematical Mesh 3.0 Part VII: Security Considerations
Mathematical Mesh: Reference Implementation
[Reference Not Found!]