From e3d66733712e161d9287ea3f0116e5b57477b0d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Sun, 8 Jul 2018 12:19:16 +0200 Subject: python: Import improved python bindings. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This commit imports the python bindings from: https://github.com/poljar/python-olm The bindings are imported at commit c44b145818520d69eaaa350fb95afcb846125e0f Minor modifications were made while importing: - Removed travis config - Removed Arch Linux PKGBUILD - Removed the html docs, they can be rebuild by running make html in the docs folder - Slightly modified the README The new bindings feature some improvements over the old ones: - Python 2 and 3 support - Automatic memory management - Automatic memory clearing before it is freed - Type signatures via the python typing module - Full test coverage - Properties are utilized where it makes sense (e.g. account.id) Signed-off-by: Damir Jelić --- python/olm/utility.py | 91 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 python/olm/utility.py (limited to 'python/olm/utility.py') diff --git a/python/olm/utility.py b/python/olm/utility.py new file mode 100644 index 0000000..838cf3f --- /dev/null +++ b/python/olm/utility.py @@ -0,0 +1,91 @@ +# -*- coding: utf-8 -*- +# libolm python bindings +# Copyright © 2015-2017 OpenMarket Ltd +# Copyright © 2018 Damir Jelić +"""libolm Utility module. + +This module contains utilities for olm. +It only contains the ed25519_verify function for signature verification. + +Examples: + >>> alice = Account() + + >>> message = "Test" + >>> signature = alice.sign(message) + >>> signing_key = alice.identity_keys["ed25519"] + + >>> ed25519_verify(signing_key, message, signature) + +""" + +# pylint: disable=redefined-builtin,unused-import +from typing import AnyStr, Type + +# pylint: disable=no-name-in-module +from _libolm import ffi, lib # type: ignore + +from ._compat import to_bytes +from ._finalize import track_for_finalization + + +def _clear_utility(utility): # pragma: no cover + # type: (ffi.cdata) -> None + lib.olm_clear_utility(utility) + + +class OlmVerifyError(Exception): + """libolm signature verification exception.""" + + +class _Utility(object): + # pylint: disable=too-few-public-methods + """libolm Utility class.""" + + _buf = None + _utility = None + + @classmethod + def _allocate(cls): + # type: (Type[_Utility]) -> None + cls._buf = ffi.new("char[]", lib.olm_utility_size()) + cls._utility = lib.olm_utility(cls._buf) + track_for_finalization(cls, cls._utility, _clear_utility) + + @classmethod + def _check_error(cls, ret): + # type: (int) -> None + if ret != lib.olm_error(): + return + + raise OlmVerifyError("{}".format( + ffi.string(lib.olm_utility_last_error( + cls._utility)).decode("utf-8"))) + + @classmethod + def _ed25519_verify(cls, key, message, signature): + # type: (Type[_Utility], AnyStr, AnyStr, AnyStr) -> None + if not cls._utility: + cls._allocate() + + byte_key = to_bytes(key) + byte_message = to_bytes(message) + byte_signature = to_bytes(signature) + + cls._check_error( + lib.olm_ed25519_verify(cls._utility, byte_key, len(byte_key), + byte_message, len(byte_message), + byte_signature, len(byte_signature))) + + +def ed25519_verify(key, message, signature): + # type: (AnyStr, AnyStr, AnyStr) -> None + """Verify an ed25519 signature. + + Raises an OlmVerifyError if verification fails. + + Args: + key(str): The ed25519 public key used for signing. + message(str): The signed message. + signature(bytes): The message signature. + """ + return _Utility._ed25519_verify(key, message, signature) -- cgit v1.2.3