diff --git a/omemo/omemo/state.py b/omemo/omemo/state.py index 49dd7cd..9493b21 100644 --- a/omemo/omemo/state.py +++ b/omemo/omemo/state.py @@ -19,6 +19,7 @@ import logging import time +import os from base64 import b64encode from axolotl.ecc.djbec import DjbECPublicKey @@ -216,6 +217,14 @@ class OmemoState: log.debug("Decrypted Message => " + result) return result + def encrypt_file(self, data): + key = os.urandom(32) + iv = os.urandom(16) + + payload, tag = encrypt(key, iv, data) + encrypted_data = payload + tag + return (encrypted_data, key, iv) + def create_msg(self, from_jid, jid, plaintext): key = get_random_bytes(16) iv = get_random_bytes(16) diff --git a/omemo/omemoplugin.py b/omemo/omemoplugin.py index 4720185..962cb21 100644 --- a/omemo/omemoplugin.py +++ b/omemo/omemoplugin.py @@ -25,7 +25,10 @@ import os import sqlite3 import shutil import nbxmpp +import binascii +import threading +from gi.repository import GLib from nbxmpp.simplexml import Node from nbxmpp import NS_ADDRESS @@ -201,6 +204,23 @@ class OmemoPlugin(GajimPlugin): def file_decryption(self, url, kind, instance, window): FileDecryption(self).hyperlink_handler(url, kind, instance, window) + def encrypt_file(self, file, account, callback): + thread = threading.Thread(target=self._encrypt_file_thread, + args=(file, account, callback)) + thread.daemon = True + thread.start() + + def _encrypt_file_thread(self, file, account, callback): + state = self.get_omemo_state(account) + encrypted_data, key, iv = state.encrypt_file(file.get_data(full=True)) + file.encrypted = True + file.size = len(encrypted_data) + file.user_data = binascii.hexlify(iv + key).decode('utf-8') + file.data = encrypted_data + if file.event.isSet(): + return + GLib.idle_add(callback, file) + def signed_in(self, event): """ Method called on SignIn