aboutsummaryrefslogtreecommitdiffstats
path: root/cryptography/hazmat/bindings/openssl/backend.py
diff options
context:
space:
mode:
Diffstat (limited to 'cryptography/hazmat/bindings/openssl/backend.py')
-rw-r--r--cryptography/hazmat/bindings/openssl/backend.py40
1 files changed, 40 insertions, 0 deletions
diff --git a/cryptography/hazmat/bindings/openssl/backend.py b/cryptography/hazmat/bindings/openssl/backend.py
index 494430ba..300495cb 100644
--- a/cryptography/hazmat/bindings/openssl/backend.py
+++ b/cryptography/hazmat/bindings/openssl/backend.py
@@ -96,6 +96,7 @@ class Backend(object):
self.ciphers = Ciphers(self)
self.hashes = Hashes(self)
+ self.hmacs = HMACs(self)
def openssl_version_text(self):
"""
@@ -259,4 +260,43 @@ class Hashes(object):
return copied_ctx
+class HMACs(object):
+ def __init__(self, backend):
+ super(HMACs, self).__init__()
+ self._backend = backend
+
+ def create_ctx(self, key, hash_cls):
+ ctx = self._backend.ffi.new("HMAC_CTX *")
+ self._backend.lib.HMAC_CTX_init(ctx)
+ ctx = self._backend.ffi.gc(ctx, self._backend.lib.HMAC_CTX_cleanup)
+ evp_md = self._backend.lib.EVP_get_digestbyname(
+ hash_cls.name.encode('ascii'))
+ assert evp_md != self._backend.ffi.NULL
+ res = self._backend.lib.HMAC_Init_ex(ctx, key, len(key), evp_md,
+ self._backend.ffi.NULL)
+ assert res != 0
+ return ctx
+
+ def update_ctx(self, ctx, data):
+ res = self._backend.lib.HMAC_Update(ctx, data, len(data))
+ assert res != 0
+
+ def finalize_ctx(self, ctx, digest_size):
+ buf = self._backend.ffi.new("unsigned char[]", digest_size)
+ buflen = self._backend.ffi.new("unsigned int *")
+ buflen[0] = digest_size
+ res = self._backend.lib.HMAC_Final(ctx, buf, buflen)
+ assert res != 0
+ return self._backend.ffi.buffer(buf)[:digest_size]
+
+ def copy_ctx(self, ctx):
+ copied_ctx = self._backend.ffi.new("HMAC_CTX *")
+ self._backend.lib.HMAC_CTX_init(copied_ctx)
+ copied_ctx = self._backend.ffi.gc(copied_ctx,
+ self._backend.lib.HMAC_CTX_cleanup)
+ res = self._backend.lib.HMAC_CTX_copy(copied_ctx, ctx)
+ assert res != 0
+ return copied_ctx
+
+
backend = Backend()