Elliptic curve interfaces
diff --git a/cryptography/hazmat/primitives/interfaces.py b/cryptography/hazmat/primitives/interfaces.py
index 810a67a..ef8566b 100644
--- a/cryptography/hazmat/primitives/interfaces.py
+++ b/cryptography/hazmat/primitives/interfaces.py
@@ -489,3 +489,81 @@
         """
         Return a CMACContext that is a copy of the current context.
         """
+
+
+class EllipticCurve(six.with_metaclass(abc.ABCMeta)):
+    @abc.abstractproperty
+    def name(self):
+        """
+        The name of the curve. e.g. secp256r1.
+        """
+
+    @abc.abstractproperty
+    def key_size(self):
+        """
+        The bit length of the base point of the curve.
+        """
+
+
+class EllipticCurvePrivateKey(six.with_metaclass(abc.ABCMeta)):
+    @abc.abstractproperty
+    def curve(self):
+        """
+        The EllipticCurve that this key is on.
+        """
+
+    @abc.abstractproperty
+    def private_key(self):
+        """
+        The private value used for signing.
+        """
+
+    @abc.abstractproperty
+    def key_size(self):
+        """
+        The bit length of the base point of the curve.
+        """
+
+    @abc.abstractproperty
+    def x(self):
+        """
+        The affine x component of the public point used for verifying.
+        """
+
+    @abc.abstractproperty
+    def y(self):
+        """
+        The affine y component of the public point used for verifying.
+        """
+
+    @abc.abstractmethod
+    def public_key(self):
+        """
+        The ECDSAPublicKey for this private key.
+        """
+
+
+class EllipticCurvePublicKey(six.with_metaclass(abc.ABCMeta)):
+    @abc.abstractproperty
+    def curve(self):
+        """
+        The EllipticCurve that this key is on.
+        """
+
+    @abc.abstractproperty
+    def x(self):
+        """
+        The affine x component of the public point used for verifying.
+        """
+
+    @abc.abstractproperty
+    def y(self):
+        """
+        The affine y component of the public point used for verifying.
+        """
+
+    @abc.abstractproperty
+    def key_size(self):
+        """
+        The bit length of the base point of the curve.
+        """
diff --git a/docs/hazmat/primitives/interfaces.rst b/docs/hazmat/primitives/interfaces.rst
index dc09a26..6ec6de6 100644
--- a/docs/hazmat/primitives/interfaces.rst
+++ b/docs/hazmat/primitives/interfaces.rst
@@ -463,6 +463,101 @@
             :class:`~cryptography.hazmat.primitives.interfaces.AsymmetricVerificationContext`
 
 
+.. class:: EllipticCurve
+
+    .. versionadded:: 0.4
+
+    A named elliptic curve.
+
+    .. attribute:: name
+
+        :type: string
+
+        The name of the curve. Usually the name used for the ASN.1 OID such as
+        "secp256k1".
+
+    .. attribute:: key_size
+
+        :type: int
+
+        The bit length of the curves base point.
+
+
+.. class:: EllipticCurvePrivateKey
+
+    .. versionadded:: 0.4
+
+    An elliptic curve private key for use with an algorithm such as `ECDSA`_ or
+    `EdDSA`_.
+
+    .. attribute:: curve
+
+        :type: :class:`~cryptography.hazmat.primitives.interfaces.EllipticCurve`
+
+        The elliptic curve for this key.
+
+    .. attribute:: private_key
+
+        :type: int
+
+        The private key.
+
+    .. attribute:: key_size
+
+        :type: int
+
+        The bit length of the curves base point.
+
+    .. attribute:: x
+
+        :type: int
+
+        The affine x component of the public point used for verifying.
+
+    .. attribute:: y
+
+        :type: int
+
+        The affine y component of the public point used for verifying.
+
+    .. method:: public_key()
+
+        :return: :class:`~cryptography.hazmat.primitives.interfaces.EllipticCurvePublicKey`
+
+        The EllipticCurvePublicKey object for this private key.
+
+
+.. class:: EllipticCurvePublicKey
+
+    .. versionadded:: 0.4
+
+    An elliptic curve public key.
+
+     .. attribute:: curve
+
+        :type: :class:`~cryptography.hazmat.primitives.interfaces.EllipticCurve`
+
+        The elliptic curve for this key.
+
+    .. attribute:: x
+
+        :type: int
+
+        The affine x component of the public point used for verifying.
+
+    .. attribute:: y
+
+        :type: int
+
+        The affine y component of the public point used for verifying.
+
+    .. attribute:: key_size
+
+        :type: int
+
+        The bit length of the curves base point.
+
+
 .. class:: AsymmetricSignatureContext
 
     .. versionadded:: 0.2
@@ -612,3 +707,5 @@
 .. _`Chinese remainder theorem`: https://en.wikipedia.org/wiki/Chinese_remainder_theorem
 .. _`DSA`: https://en.wikipedia.org/wiki/Digital_Signature_Algorithm
 .. _`CMAC`: https://en.wikipedia.org/wiki/CMAC
+.. _`ECDSA`: http://en.wikipedia.org/wiki/ECDSA
+.. _`EdDSA`: http://en.wikipedia.org/wiki/EdDSA
diff --git a/docs/spelling_wordlist.txt b/docs/spelling_wordlist.txt
index b589615..81acb67 100644
--- a/docs/spelling_wordlist.txt
+++ b/docs/spelling_wordlist.txt
@@ -1,3 +1,4 @@
+affine
 backend
 backends
 Backends
@@ -32,6 +33,7 @@
 pseudorandom
 Schneier
 scrypt
+secp
 testability
 unencrypted
 unpadded