aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaul Kehrer <paul.l.kehrer@gmail.com>2016-11-20 12:02:43 +0800
committerAlex Gaynor <alex.gaynor@gmail.com>2016-11-19 23:02:43 -0500
commit6f32974b0635dbabb1d6e201ddb461d5fd20e0b4 (patch)
tree0c719862cc216af5979d405afaa5a150f922298a
parent756255103c0c6b6f0a7215682489257661a42782 (diff)
downloadcryptography-6f32974b0635dbabb1d6e201ddb461d5fd20e0b4.tar.gz
cryptography-6f32974b0635dbabb1d6e201ddb461d5fd20e0b4.tar.bz2
cryptography-6f32974b0635dbabb1d6e201ddb461d5fd20e0b4.zip
refactor ecdsa sign/verify for prehash (#3263)
-rw-r--r--src/cryptography/hazmat/backends/openssl/ec.py65
1 files changed, 31 insertions, 34 deletions
diff --git a/src/cryptography/hazmat/backends/openssl/ec.py b/src/cryptography/hazmat/backends/openssl/ec.py
index aa5267b4..0c8716f5 100644
--- a/src/cryptography/hazmat/backends/openssl/ec.py
+++ b/src/cryptography/hazmat/backends/openssl/ec.py
@@ -82,6 +82,29 @@ def _sn_to_elliptic_curve(backend, sn):
)
+def _ecdsa_sig_sign(backend, private_key, data):
+ max_size = backend._lib.ECDSA_size(private_key._ec_key)
+ backend.openssl_assert(max_size > 0)
+
+ sigbuf = backend._ffi.new("unsigned char[]", max_size)
+ siglen_ptr = backend._ffi.new("unsigned int[]", 1)
+ res = backend._lib.ECDSA_sign(
+ 0, data, len(data), sigbuf, siglen_ptr, private_key._ec_key
+ )
+ backend.openssl_assert(res == 1)
+ return backend._ffi.buffer(sigbuf)[:siglen_ptr[0]]
+
+
+def _ecdsa_sig_verify(backend, public_key, signature, data):
+ res = backend._lib.ECDSA_verify(
+ 0, data, len(data), signature, len(signature), public_key._ec_key
+ )
+ if res != 1:
+ backend._consume_errors()
+ raise InvalidSignature
+ return True
+
+
@utils.register_interface(AsymmetricSignatureContext)
class _ECDSASignatureContext(object):
def __init__(self, backend, private_key, algorithm):
@@ -93,27 +116,12 @@ class _ECDSASignatureContext(object):
self._digest.update(data)
def finalize(self):
- ec_key = self._private_key._ec_key
-
digest = self._digest.finalize()
- digest = _truncate_digest_for_ecdsa(ec_key, digest, self._backend)
-
- max_size = self._backend._lib.ECDSA_size(ec_key)
- self._backend.openssl_assert(max_size > 0)
-
- sigbuf = self._backend._ffi.new("unsigned char[]", max_size)
- siglen_ptr = self._backend._ffi.new("unsigned int[]", 1)
- res = self._backend._lib.ECDSA_sign(
- 0,
- digest,
- len(digest),
- sigbuf,
- siglen_ptr,
- ec_key
+ digest = _truncate_digest_for_ecdsa(
+ self._private_key._ec_key, digest, self._backend
)
- self._backend.openssl_assert(res == 1)
- return self._backend._ffi.buffer(sigbuf)[:siglen_ptr[0]]
+ return _ecdsa_sig_sign(self._backend, self._private_key, digest)
@utils.register_interface(AsymmetricVerificationContext)
@@ -128,24 +136,13 @@ class _ECDSAVerificationContext(object):
self._digest.update(data)
def verify(self):
- ec_key = self._public_key._ec_key
-
digest = self._digest.finalize()
-
- digest = _truncate_digest_for_ecdsa(ec_key, digest, self._backend)
-
- res = self._backend._lib.ECDSA_verify(
- 0,
- digest,
- len(digest),
- self._signature,
- len(self._signature),
- ec_key
+ digest = _truncate_digest_for_ecdsa(
+ self._public_key._ec_key, digest, self._backend
+ )
+ return _ecdsa_sig_verify(
+ self._backend, self._public_key, self._signature, digest
)
- if res != 1:
- self._backend._consume_errors()
- raise InvalidSignature
- return True
@utils.register_interface(ec.EllipticCurvePrivateKeyWithSerialization)