[omemo] Add encrypt_file method

The HTTPUploadPlugin calls that if encryption is enabled
This commit is contained in:
Philipp Hörist
2017-06-09 23:32:42 +02:00
parent c4f2c658d7
commit 3e287d2a46
2 changed files with 29 additions and 0 deletions

View File

@@ -19,6 +19,7 @@
import logging import logging
import time import time
import os
from base64 import b64encode from base64 import b64encode
from axolotl.ecc.djbec import DjbECPublicKey from axolotl.ecc.djbec import DjbECPublicKey
@@ -216,6 +217,14 @@ class OmemoState:
log.debug("Decrypted Message => " + result) log.debug("Decrypted Message => " + result)
return 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): def create_msg(self, from_jid, jid, plaintext):
key = get_random_bytes(16) key = get_random_bytes(16)
iv = get_random_bytes(16) iv = get_random_bytes(16)

View File

@@ -25,7 +25,10 @@ import os
import sqlite3 import sqlite3
import shutil import shutil
import nbxmpp import nbxmpp
import binascii
import threading
from gi.repository import GLib
from nbxmpp.simplexml import Node from nbxmpp.simplexml import Node
from nbxmpp import NS_ADDRESS from nbxmpp import NS_ADDRESS
@@ -201,6 +204,23 @@ class OmemoPlugin(GajimPlugin):
def file_decryption(self, url, kind, instance, window): def file_decryption(self, url, kind, instance, window):
FileDecryption(self).hyperlink_handler(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): def signed_in(self, event):
""" Method called on SignIn """ Method called on SignIn