diff options
author | Philipp Hörist <forenjunkie@chello.at> | 2017-06-10 00:32:42 +0300 |
---|---|---|
committer | Philipp Hörist <forenjunkie@chello.at> | 2017-06-10 00:35:32 +0300 |
commit | 3e287d2a4639b98d8da377de620ade2521cbd8cd (patch) | |
tree | 7c77a12c4f8df9a5c0ba0f039a26735ea6b02921 /omemo | |
parent | c4f2c658d7b98c28f1ef38df37d0460989b573dc (diff) |
[omemo] Add encrypt_file method
The HTTPUploadPlugin calls that if encryption is enabled
Diffstat (limited to 'omemo')
-rw-r--r-- | omemo/omemo/state.py | 9 | ||||
-rw-r--r-- | omemo/omemoplugin.py | 20 |
2 files changed, 29 insertions, 0 deletions
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 |