8b1514c0a6
We need to be able to inspect an outbound session so that we can tell our peer how to set up an inbound session.
107 lines
3.9 KiB
Python
107 lines
3.9 KiB
Python
import json
|
|
|
|
from ._base import *
|
|
|
|
lib.olm_outbound_group_session_size.argtypes = []
|
|
lib.olm_outbound_group_session_size.restype = c_size_t
|
|
|
|
lib.olm_outbound_group_session.argtypes = [c_void_p]
|
|
lib.olm_outbound_group_session.restype = c_void_p
|
|
|
|
lib.olm_outbound_group_session_last_error.argtypes = [c_void_p]
|
|
lib.olm_outbound_group_session_last_error.restype = c_char_p
|
|
|
|
def outbound_group_session_errcheck(res, func, args):
|
|
if res == ERR:
|
|
raise OlmError("%s: %s" % (
|
|
func.__name__, lib.olm_outbound_group_session_last_error(args[0])
|
|
))
|
|
return res
|
|
|
|
|
|
def outbound_group_session_function(func, *types):
|
|
func.argtypes = (c_void_p,) + types
|
|
func.restypes = c_size_t
|
|
func.errcheck = outbound_group_session_errcheck
|
|
|
|
|
|
outbound_group_session_function(
|
|
lib.olm_pickle_outbound_group_session, c_void_p, c_size_t, c_void_p, c_size_t
|
|
)
|
|
outbound_group_session_function(
|
|
lib.olm_unpickle_outbound_group_session, c_void_p, c_size_t, c_void_p, c_size_t
|
|
)
|
|
|
|
outbound_group_session_function(lib.olm_init_outbound_group_session_random_length)
|
|
outbound_group_session_function(lib.olm_init_outbound_group_session, c_void_p, c_size_t)
|
|
|
|
lib.olm_outbound_group_session_message_index.argtypes = [c_void_p]
|
|
lib.olm_outbound_group_session_message_index.restype = c_uint32
|
|
|
|
outbound_group_session_function(lib.olm_group_encrypt_message_length, c_size_t)
|
|
outbound_group_session_function(lib.olm_group_encrypt,
|
|
c_void_p, c_size_t, # Plaintext
|
|
c_void_p, c_size_t, # Message
|
|
)
|
|
|
|
outbound_group_session_function(lib.olm_outbound_group_session_id_length)
|
|
outbound_group_session_function(lib.olm_outbound_group_session_id, c_void_p, c_size_t)
|
|
outbound_group_session_function(lib.olm_outbound_group_session_key_length)
|
|
outbound_group_session_function(lib.olm_outbound_group_session_key, c_void_p, c_size_t)
|
|
|
|
|
|
class OutboundGroupSession(object):
|
|
def __init__(self):
|
|
self.buf = create_string_buffer(lib.olm_outbound_group_session_size())
|
|
self.ptr = lib.olm_outbound_group_session(self.buf)
|
|
|
|
random_length = lib.olm_init_outbound_group_session_random_length(self.ptr)
|
|
random = read_random(random_length)
|
|
random_buffer = create_string_buffer(random)
|
|
lib.olm_init_outbound_group_session(self.ptr, random_buffer, random_length)
|
|
|
|
def pickle(self, key):
|
|
key_buffer = create_string_buffer(key)
|
|
pickle_length = lib.olm_pickle_outbound_group_session_length(self.ptr)
|
|
pickle_buffer = create_string_buffer(pickle_length)
|
|
lib.olm_pickle_outbound_group_session(
|
|
self.ptr, key_buffer, len(key), pickle_buffer, pickle_length
|
|
)
|
|
return pickle_buffer.raw
|
|
|
|
def unpickle(self, key, pickle):
|
|
key_buffer = create_string_buffer(key)
|
|
pickle_buffer = create_string_buffer(pickle)
|
|
lib.olm_unpickle_outbound_group_session(
|
|
self.ptr, key_buffer, len(key), pickle_buffer, len(pickle)
|
|
)
|
|
|
|
def encrypt(self, plaintext):
|
|
message_length = lib.olm_group_encrypt_message_length(
|
|
self.ptr, len(plaintext)
|
|
)
|
|
message_buffer = create_string_buffer(message_length)
|
|
|
|
plaintext_buffer = create_string_buffer(plaintext)
|
|
|
|
lib.olm_group_encrypt(
|
|
self.ptr,
|
|
plaintext_buffer, len(plaintext),
|
|
message_buffer, message_length,
|
|
)
|
|
return message_buffer.raw
|
|
|
|
def session_id(self):
|
|
id_length = lib.olm_outbound_group_session_id_length(self.ptr)
|
|
id_buffer = create_string_buffer(id_length)
|
|
lib.olm_outbound_group_session_id(self.ptr, id_buffer, id_length);
|
|
return id_buffer.raw
|
|
|
|
def message_index(self):
|
|
return lib.olm_outbound_group_session_message_index(self.ptr)
|
|
|
|
def session_key(self):
|
|
key_length = lib.olm_outbound_group_session_key_length(self.ptr)
|
|
key_buffer = create_string_buffer(key_length)
|
|
lib.olm_outbound_group_session_key(self.ptr, key_buffer, key_length);
|
|
return key_buffer.raw
|