diff --git a/python/olm/utility.py b/python/olm/utility.py new file mode 100644 index 0000000..dac0225 --- /dev/null +++ b/python/olm/utility.py @@ -0,0 +1,56 @@ +from ._base import lib, c_void_p, c_size_t, c_char_p, \ + create_string_buffer, ERR, OlmError + +lib.olm_utility_size.argtypes = [] +lib.olm_utility_size.restype = c_size_t + +lib.olm_utility.argtypes = [c_void_p] +lib.olm_utility.restype = c_void_p + +lib.olm_utility_last_error.argtypes = [c_void_p] +lib.olm_utility_last_error.restype = c_char_p + + +def utility_errcheck(res, func, args): + if res == ERR: + raise OlmError("%s: %s" % ( + func.__name__, lib.olm_utility_last_error(args[0]) + )) + return res + + +def utility_function(func, *types): + func.argtypes = (c_void_p,) + types + func.restypes = c_size_t + func.errcheck = utility_errcheck + +utility_function( + lib.olm_ed25519_verify, + c_void_p, c_size_t, # key, key_length + c_void_p, c_size_t, # message, message_length + c_void_p, c_size_t, # signature, signature_length +) + + +class Utility(object): + def __init__(self): + self.buf = create_string_buffer(lib.olm_utility_size()) + self.ptr = lib.olm_utility(self.buf) + +_utility = None + + +def ed25519_verify(key, message, signature): + """ Verify an ed25519 signature. Raises an OlmError if verification fails. + Args: + key(bytes): The ed25519 public key used for signing. + message(bytes): The signed message. + signature(bytes): The message signature. + """ + global _utility + if not _utility: + _utility = Utility() + lib.olm_ed25519_verify(_utility.ptr, + key, len(key), + message, len(message), + signature, len(signature))