changeset 97e5de83e2d4 in /home/hg/repos/gajim-plugins

author: lovetox <[email protected]>
branches: 
details:gajim-plugins?cmd=changeset;node=97e5de83e2d4
description: Add cycling SignedPreKey after timeperiod

diffstat:

 omemo/omemo/liteaxolotlstore.py      |  14 +++++++++++
 omemo/omemo/litesignedprekeystore.py |  34 +++++++++++++++++++++++++--
 omemo/omemo/state.py                 |  43 ++++++++++++++++++++++++++++-------
 3 files changed, 79 insertions(+), 12 deletions(-)

diffs (155 lines):

diff -r cfb14b4cf025 -r 97e5de83e2d4 omemo/omemo/liteaxolotlstore.py
--- a/omemo/omemo/liteaxolotlstore.py   Sat Jul 23 16:15:02 2016 +0200
+++ b/omemo/omemo/liteaxolotlstore.py   Sat Jul 23 21:21:00 2016 +0200
@@ -33,6 +33,8 @@
 
 DEFAULT_PREKEY_AMOUNT = 100
 MIN_PREKEY_AMOUNT = 80
+SPK_ARCHIVE_TIME = 8600 * 15  # 15 Days
+SPK_CYCLE_TIME = 8600         # 24 Hours
 
 
 class LiteAxolotlStore(AxolotlStore):
@@ -137,3 +139,15 @@
 
     def removeSignedPreKey(self, signedPreKeyId):
         self.signedPreKeyStore.removeSignedPreKey(signedPreKeyId)
+
+    def getNextSignedPreKeyId(self):
+        return self.signedPreKeyStore.getNextSignedPreKeyId()
+
+    def getCurrentSignedPreKeyId(self):
+        return self.signedPreKeyStore.getCurrentSignedPreKeyId()
+
+    def getSignedPreKeyTimestamp(self, signedPreKeyId):
+        return self.signedPreKeyStore.getSignedPreKeyTimestamp(signedPreKeyId)
+
+    def removeOldSignedPreKeys(self, timestamp):
+        self.signedPreKeyStore.removeOldSignedPreKeys(timestamp)
diff -r cfb14b4cf025 -r 97e5de83e2d4 omemo/omemo/litesignedprekeystore.py
--- a/omemo/omemo/litesignedprekeystore.py      Sat Jul 23 16:15:02 2016 +0200
+++ b/omemo/omemo/litesignedprekeystore.py      Sat Jul 23 21:21:00 2016 +0200
@@ -20,6 +20,7 @@
 from axolotl.invalidkeyidexception import InvalidKeyIdException
 from axolotl.state.signedprekeyrecord import SignedPreKeyRecord
 from axolotl.state.signedprekeystore import SignedPreKeyStore
+from axolotl.util.medium import Medium
 
 
 class LiteSignedPreKeyStore(SignedPreKeyStore):
@@ -72,9 +73,15 @@
         cursor.execute(q, (signedPreKeyId, ))
         self.dbConn.commit()
 
-    def loadCurrentSignedPreKey(self):
-        q = "SELECT prekey_id FROM signed_prekeys " \
-            "WHERE _id = (SELECT MAX(_id) FROM signed_prekeys)"
+    def getNextSignedPreKeyId(self):
+        result = self.getCurrentSignedPreKeyId()
+        if not result:
+            return 1  # StartId if no SignedPreKeys exist
+        else:
+            return (result % (Medium.MAX_VALUE - 1)) + 1
+
+    def getCurrentSignedPreKeyId(self):
+        q = "SELECT MAX(prekey_id) FROM signed_prekeys"
 
         cursor = self.dbConn.cursor()
         cursor.execute(q)
@@ -83,3 +90,24 @@
             return None
         else:
             return result[0]
+
+    def getSignedPreKeyTimestamp(self, signedPreKeyId):
+        q = "SELECT strftime('%s', timestamp) FROM " \
+            "signed_prekeys WHERE prekey_id = ?"
+
+        cursor = self.dbConn.cursor()
+        cursor.execute(q, (signedPreKeyId, ))
+
+        result = cursor.fetchone()
+        if not result:
+            raise InvalidKeyIdException("No such signedprekeyrecord! %s " %
+                                        signedPreKeyId)
+
+        return result[0]
+
+    def removeOldSignedPreKeys(self, timestamp):
+        q = "DELETE FROM signed_prekeys " \
+            "WHERE timestamp < datetime(?, 'unixepoch')"
+        cursor = self.dbConn.cursor()
+        cursor.execute(q, (timestamp, ))
+        self.dbConn.commit()
diff -r cfb14b4cf025 -r 97e5de83e2d4 omemo/omemo/state.py
--- a/omemo/omemo/state.py      Sat Jul 23 16:15:02 2016 +0200
+++ b/omemo/omemo/state.py      Sat Jul 23 21:21:00 2016 +0200
@@ -18,6 +18,7 @@
 #
 
 import logging
+import time
 from base64 import b64encode
 
 from axolotl.ecc.djbec import DjbECPublicKey
@@ -36,7 +37,8 @@
 
 from .aes_gcm import NoValidSessions, aes_decrypt, aes_encrypt
 from .liteaxolotlstore import (LiteAxolotlStore, DEFAULT_PREKEY_AMOUNT,
-                               MIN_PREKEY_AMOUNT)
+                               MIN_PREKEY_AMOUNT, SPK_CYCLE_TIME,
+                               SPK_ARCHIVE_TIME)
 
 log = logging.getLogger('gajim.plugin_system.omemo')
 
@@ -156,15 +158,10 @@
 
         identityKeyPair = self.store.getIdentityKeyPair()
 
-        signedPreKeyId = self.store.signedPreKeyStore.loadCurrentSignedPreKey()
+        self.cycleSignedPreKey(identityKeyPair)
 
-        if signedPreKeyId is None:
-            signedPreKey = KeyHelper.generateSignedPreKey(
-                identityKeyPair, KeyHelper.getRandomSequence(65536))
-
-            self.store.storeSignedPreKey(signedPreKey.getId(), signedPreKey)
-        else:
-            signedPreKey = self.store.loadSignedPreKey(signedPreKeyId)
+        signedPreKey = self.store.loadSignedPreKey(
+            self.store.getCurrentSignedPreKeyId())
 
         result = {
             'signedPreKeyId': signedPreKey.getId(),
@@ -365,3 +362,31 @@
             self.store.preKeyStore.generateNewPreKeys(newKeys)
             log.info(self.account + ' => ' + str(newKeys) +
                      ' PreKeys created')
+
+    def cycleSignedPreKey(self, identityKeyPair):
+        # Publish every SPK_CYCLE_TIME a new SignedPreKey
+        # Delete all exsiting SignedPreKeys that are older
+        # then SPK_ARCHIVE_TIME
+
+        # Check if SignedPreKey exist and create if not
+        if not self.store.getCurrentSignedPreKeyId():
+            signedPreKey = KeyHelper.generateSignedPreKey(
+                identityKeyPair, self.store.getNextSignedPreKeyId())
+            self.store.storeSignedPreKey(signedPreKey.getId(), signedPreKey)
+            log.debug(self.account +
+                      ' => New SignedPreKey created, because none existed')
+
+        # if SPK_CYCLE_TIME is reached, generate a new SignedPreKey
+        now = int(time.time())
+        timestamp = self.store.getSignedPreKeyTimestamp(
+            self.store.getCurrentSignedPreKeyId())
+
+        if int(timestamp) < now - SPK_CYCLE_TIME:
+            signedPreKey = KeyHelper.generateSignedPreKey(
+                identityKeyPair, self.store.getNextSignedPreKeyId())
+            self.store.storeSignedPreKey(signedPreKey.getId(), signedPreKey)
+            log.debug(self.account + ' => Cycled SignedPreKey')
+
+        # Delete all SignedPreKeys that are older than SPK_ARCHIVE_TIME
+        timestamp = now - SPK_ARCHIVE_TIME
+        self.store.removeOldSignedPreKeys(timestamp)
_______________________________________________
Commits mailing list
[email protected]
https://lists.gajim.org/cgi-bin/listinfo/commits

Reply via email to