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