aboutsummaryrefslogtreecommitdiffstats
path: root/src/cryptography
diff options
context:
space:
mode:
authorPaul Kehrer <paul.l.kehrer@gmail.com>2018-11-23 09:05:23 +0800
committerAlex Gaynor <alex.gaynor@gmail.com>2018-11-22 19:05:23 -0600
commit579dfcf48f013dddfd3447e6dc38cfdc0b17145c (patch)
tree30668e108a5211cc72f3a2e5af78214d086fcec0 /src/cryptography
parenteda8a4156fbf66b29eb99fecc62cb2f55602d0fa (diff)
downloadcryptography-579dfcf48f013dddfd3447e6dc38cfdc0b17145c.tar.gz
cryptography-579dfcf48f013dddfd3447e6dc38cfdc0b17145c.tar.bz2
cryptography-579dfcf48f013dddfd3447e6dc38cfdc0b17145c.zip
refactor x25519 exchange into utils (#4603)
Diffstat (limited to 'src/cryptography')
-rw-r--r--src/cryptography/hazmat/backends/openssl/utils.py24
-rw-r--r--src/cryptography/hazmat/backends/openssl/x25519.py27
2 files changed, 27 insertions, 24 deletions
diff --git a/src/cryptography/hazmat/backends/openssl/utils.py b/src/cryptography/hazmat/backends/openssl/utils.py
index 05d0fe58..363f3d2c 100644
--- a/src/cryptography/hazmat/backends/openssl/utils.py
+++ b/src/cryptography/hazmat/backends/openssl/utils.py
@@ -11,6 +11,30 @@ from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.asymmetric.utils import Prehashed
+def _evp_pkey_derive(backend, evp_pkey, peer_public_key):
+ ctx = backend._lib.EVP_PKEY_CTX_new(evp_pkey, backend._ffi.NULL)
+ backend.openssl_assert(ctx != backend._ffi.NULL)
+ ctx = backend._ffi.gc(ctx, backend._lib.EVP_PKEY_CTX_free)
+ res = backend._lib.EVP_PKEY_derive_init(ctx)
+ backend.openssl_assert(res == 1)
+ res = backend._lib.EVP_PKEY_derive_set_peer(
+ ctx, peer_public_key._evp_pkey
+ )
+ backend.openssl_assert(res == 1)
+ keylen = backend._ffi.new("size_t *")
+ res = backend._lib.EVP_PKEY_derive(ctx, backend._ffi.NULL, keylen)
+ backend.openssl_assert(res == 1)
+ backend.openssl_assert(keylen[0] > 0)
+ buf = backend._ffi.new("unsigned char[]", keylen[0])
+ res = backend._lib.EVP_PKEY_derive(ctx, buf, keylen)
+ if res != 1:
+ raise ValueError(
+ "Null shared key derived from public/private pair."
+ )
+
+ return backend._ffi.buffer(buf, keylen[0])[:]
+
+
def _calculate_digest_and_algorithm(backend, data, algorithm):
if not isinstance(algorithm, Prehashed):
hash_ctx = hashes.Hash(algorithm, backend)
diff --git a/src/cryptography/hazmat/backends/openssl/x25519.py b/src/cryptography/hazmat/backends/openssl/x25519.py
index 983ece6a..06f3985d 100644
--- a/src/cryptography/hazmat/backends/openssl/x25519.py
+++ b/src/cryptography/hazmat/backends/openssl/x25519.py
@@ -5,6 +5,7 @@
from __future__ import absolute_import, division, print_function
from cryptography import utils
+from cryptography.hazmat.backends.openssl.utils import _evp_pkey_derive
from cryptography.hazmat.primitives.asymmetric.x25519 import (
X25519PrivateKey, X25519PublicKey
)
@@ -52,28 +53,6 @@ class _X25519PrivateKey(object):
if not isinstance(peer_public_key, X25519PublicKey):
raise TypeError("peer_public_key must be X25519PublicKey.")
- ctx = self._backend._lib.EVP_PKEY_CTX_new(
- self._evp_pkey, self._backend._ffi.NULL
+ return _evp_pkey_derive(
+ self._backend, self._evp_pkey, peer_public_key
)
- self._backend.openssl_assert(ctx != self._backend._ffi.NULL)
- ctx = self._backend._ffi.gc(ctx, self._backend._lib.EVP_PKEY_CTX_free)
- res = self._backend._lib.EVP_PKEY_derive_init(ctx)
- self._backend.openssl_assert(res == 1)
- res = self._backend._lib.EVP_PKEY_derive_set_peer(
- ctx, peer_public_key._evp_pkey
- )
- self._backend.openssl_assert(res == 1)
- keylen = self._backend._ffi.new("size_t *")
- res = self._backend._lib.EVP_PKEY_derive(
- ctx, self._backend._ffi.NULL, keylen
- )
- self._backend.openssl_assert(res == 1)
- self._backend.openssl_assert(keylen[0] > 0)
- buf = self._backend._ffi.new("unsigned char[]", keylen[0])
- res = self._backend._lib.EVP_PKEY_derive(ctx, buf, keylen)
- if res != 1:
- raise ValueError(
- "Null shared key derived from public/private pair."
- )
-
- return self._backend._ffi.buffer(buf, keylen[0])[:]