Introduce Key Exchange Agreements interface

Signed-off-by: Simo Sorce <simo@redhat.com>
diff --git a/docs/hazmat/primitives/index.rst b/docs/hazmat/primitives/index.rst
index a9ab38a..675111b 100644
--- a/docs/hazmat/primitives/index.rst
+++ b/docs/hazmat/primitives/index.rst
@@ -15,3 +15,4 @@
     constant-time
     interfaces
     twofactor
+    key-exchange-agreements
diff --git a/docs/hazmat/primitives/key-exchange-agreements.rst b/docs/hazmat/primitives/key-exchange-agreements.rst
new file mode 100644
index 0000000..8d79fba
--- /dev/null
+++ b/docs/hazmat/primitives/key-exchange-agreements.rst
@@ -0,0 +1,23 @@
+.. hazmat::
+
+Key Exchange agreements
+=======================
+
+.. module:: cryptography.hazmat.primitives.asymmetric.key_exchange
+
+Key exchange agreements are cryptographic operations, like Diffie-Hellman
+key exchanges, that allow two parties to use their public-private key pairs
+to establish a shared secret key over an insecure channel. Usually the
+negotiated key is further derived before using it for symmetric operations.
+
+Interfaces
+~~~~~~~~~~
+
+.. class:: KeyExchangeContext
+
+    .. versionadded:: 1.1
+
+    .. method:: agree(public_key)
+
+        :param public_key: The peer public key, the type depends on the
+            crypto system used, for example :class:`~cryptography.hazmat.primitives.asymmetric.ec.EllipticCurvePublicKey`
diff --git a/src/cryptography/hazmat/primitives/asymmetric/key_exchange.py b/src/cryptography/hazmat/primitives/asymmetric/key_exchange.py
new file mode 100644
index 0000000..a9846e2
--- /dev/null
+++ b/src/cryptography/hazmat/primitives/asymmetric/key_exchange.py
@@ -0,0 +1,18 @@
+# This file is dual licensed under the terms of the Apache License, Version
+# 2.0, and the BSD License. See the LICENSE file in the root of this repository
+# for complete details.
+
+from __future__ import absolute_import, division, print_function
+
+import abc
+
+import six
+
+
+@six.add_metaclass(abc.ABCMeta)
+class KeyExchangeContext(object):
+    @abc.abstractmethod
+    def agree(self, public_key):
+        """
+        Returns the agreed key material.
+        """