Welcome to mirror list, hosted at ThFree Co, Russian Federation.

dev.gajim.org/gajim/gajim-plugins.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhilipp Hörist <forenjunkie@chello.at>2017-06-10 00:32:42 +0300
committerPhilipp Hörist <forenjunkie@chello.at>2017-06-10 00:35:32 +0300
commit3e287d2a4639b98d8da377de620ade2521cbd8cd (patch)
tree7c77a12c4f8df9a5c0ba0f039a26735ea6b02921
parentc4f2c658d7b98c28f1ef38df37d0460989b573dc (diff)
[omemo] Add encrypt_file method
The HTTPUploadPlugin calls that if encryption is enabled
-rw-r--r--omemo/omemo/state.py9
-rw-r--r--omemo/omemoplugin.py20
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