diff options
Diffstat (limited to 'cryptography/hazmat/bindings/openssl/backend.py')
-rw-r--r-- | cryptography/hazmat/bindings/openssl/backend.py | 40 |
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..635d6a0c 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 *", digest_size) + res = self._backend.lib.HMAC_Final(ctx, buf, buflen) + assert res != 0 + self._backend.lib.HMAC_CTX_cleanup(ctx) + 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() |