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)
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)
def _cycle_signed_pre_key(self, ik_pair): # 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._storage.getCurrentSignedPreKeyId(): spk = KeyHelper.generateSignedPreKey( ik_pair, self._storage.getNextSignedPreKeyId()) self._storage.storeSignedPreKey(spk.getId(), spk) self._log.debug('New SignedPreKey created, because none existed') # if SPK_CYCLE_TIME is reached, generate a new SignedPreKey now = int(time.time()) timestamp = self._storage.getSignedPreKeyTimestamp( self._storage.getCurrentSignedPreKeyId()) if int(timestamp) < now - SPK_CYCLE_TIME: spk = KeyHelper.generateSignedPreKey( ik_pair, self._storage.getNextSignedPreKeyId()) self._storage.storeSignedPreKey(spk.getId(), spk) self._log.debug('Cycled SignedPreKey') # Delete all SignedPreKeys that are older than SPK_ARCHIVE_TIME timestamp = now - SPK_ARCHIVE_TIME self._storage.removeOldSignedPreKeys(timestamp)
def sendKeys(self, fresh=True, countPreKeys=_COUNT_PREKEYS): identityKeyPair = KeyHelper.generateIdentityKeyPair( ) if fresh else self.store.getIdentityKeyPair() registrationId = KeyHelper.generateRegistrationId( ) if fresh else self.store.getLocalRegistrationId() preKeys = KeyHelper.generatePreKeys(KeyHelper.getRandomSequence(), countPreKeys) signedPreKey = KeyHelper.generateSignedPreKey( identityKeyPair, KeyHelper.getRandomSequence(65536)) preKeysDict = {} for preKey in preKeys: keyPair = preKey.getKeyPair() preKeysDict[self.adjustId(preKey.getId())] = self.adjustArray( keyPair.getPublicKey().serialize()[1:]) signedKeyTuple = ( self.adjustId(signedPreKey.getId()), self.adjustArray( signedPreKey.getKeyPair().getPublicKey().serialize()[1:]), self.adjustArray(signedPreKey.getSignature())) setKeysIq = SetKeysIqProtocolEntity( self.adjustArray(identityKeyPair.getPublicKey().serialize()[1:]), signedKeyTuple, preKeysDict, Curve.DJB_TYPE, self.adjustId(registrationId)) onResult = lambda _, __: self.persistKeys( registrationId, identityKeyPair, preKeys, signedPreKey, fresh) self._sendIq(setKeysIq, onResult, self.onSentKeysError)
def bundle(self): prekeys = [(k.getId(), b64encode(k.getKeyPair().getPublicKey().serialize())) for k in self.store.loadPreKeys()] identityKeyPair = self.store.getIdentityKeyPair() signedPreKey = KeyHelper.generateSignedPreKey( identityKeyPair, KeyHelper.getRandomSequence(65536)) self.store.storeSignedPreKey(signedPreKey.getId(), signedPreKey) result = { 'signedPreKeyId': signedPreKey.getId(), 'signedPreKeyPublic': b64encode(signedPreKey.getKeyPair().getPublicKey().serialize()), 'signedPreKeySignature': b64encode(signedPreKey.getSignature()), 'identityKey': b64encode(identityKeyPair.getPublicKey().serialize()), 'prekeys': prekeys } return result
def setUp(self): super(ResultIqProtocolEntityTest, self).setUp() self.ProtocolEntity = ResultGetKeysIqProtocolEntity listNode = ProtocolTreeNode("list") self.node.addChild(listNode) for i in range(0, 1): userNode = ProtocolTreeNode( "user", {"jid": "user_%s@%s" % (i, YowConstants.WHATSAPP_SERVER)}) listNode.addChild(userNode) registrationNode = ProtocolTreeNode( "registration", data=ResultGetKeysIqProtocolEntity._intToBytes( KeyHelper.generateRegistrationId())) typeNode = ProtocolTreeNode( "type", data=ResultGetKeysIqProtocolEntity._intToBytes(Curve.DJB_TYPE)) identityKeyPair = KeyHelper.generateIdentityKeyPair() identityNode = ProtocolTreeNode("identity", data=identityKeyPair.getPublicKey( ).getPublicKey().getPublicKey()) signedPreKey = KeyHelper.generateSignedPreKey(identityKeyPair, i) signedPreKeyNode = ProtocolTreeNode("skey") signedPreKeyNode_idNode = ProtocolTreeNode( "id", data=ResultGetKeysIqProtocolEntity._intToBytes( signedPreKey.getId())) signedPreKeyNode_valueNode = ProtocolTreeNode( "value", data=signedPreKey.getKeyPair().getPublicKey().getPublicKey()) signedPreKeyNode_sigNode = ProtocolTreeNode( "signature", data=signedPreKey.getSignature()) signedPreKeyNode.addChildren([ signedPreKeyNode_idNode, signedPreKeyNode_valueNode, signedPreKeyNode_sigNode ]) preKey = KeyHelper.generatePreKeys(i * 10, 1)[0] preKeyNode = ProtocolTreeNode("key") preKeyNode_idNode = ProtocolTreeNode( "id", data=ResultGetKeysIqProtocolEntity._intToBytes(preKey.getId())) preKeyNode_valNode = ProtocolTreeNode( "value", data=preKey.getKeyPair().getPublicKey().getPublicKey()) preKeyNode.addChildren([preKeyNode_idNode, preKeyNode_valNode]) userNode.addChildren([ registrationNode, typeNode, identityNode, signedPreKeyNode, preKeyNode ])
def generate_signed_prekey(self): logger.debug("generate_signed_prekey") latest_signed_prekey = self.load_latest_signed_prekey(generate=False) if latest_signed_prekey is not None: if latest_signed_prekey.getId() == self.MAX_SIGNED_PREKEY_ID: new_signed_prekey_id = (self.MAX_SIGNED_PREKEY_ID / 2) + 1 else: new_signed_prekey_id = latest_signed_prekey.getId() + 1 else: new_signed_prekey_id = 0 signed_prekey = KeyHelper.generateSignedPreKey(self._identity, new_signed_prekey_id) self._store.storeSignedPreKey(signed_prekey.getId(), signed_prekey) return signed_prekey
def _generate_axolotl_keys(self): identityKeyPair = KeyHelper.generateIdentityKeyPair() registrationId = KeyHelper.generateRegistrationId() preKeys = KeyHelper.generatePreKeys(KeyHelper.getRandomSequence(), DEFAULT_PREKEY_AMOUNT) self.storeLocalData(registrationId, identityKeyPair) signedPreKey = KeyHelper.generateSignedPreKey( identityKeyPair, KeyHelper.getRandomSequence(65536)) self.storeSignedPreKey(signedPreKey.getId(), signedPreKey) for preKey in preKeys: self.storePreKey(preKey.getId(), preKey)
def _generate_axolotl_keys(self): identityKeyPair = KeyHelper.generateIdentityKeyPair() registrationId = KeyHelper.generateRegistrationId() preKeys = KeyHelper.generatePreKeys(KeyHelper.getRandomSequence(), DEFAULT_PREKEY_AMOUNT) self.storeLocalData(registrationId, identityKeyPair) signedPreKey = KeyHelper.generateSignedPreKey( identityKeyPair, KeyHelper.getRandomSequence(65536)) self.storeSignedPreKey(signedPreKey.getId(), signedPreKey) for preKey in preKeys: self.storePreKey(preKey.getId(), preKey)
def init_store(self): """Create new identity key pair and initialize database""" logger.info('Creating new identity...') identityKeyPair = KeyHelper.generateIdentityKeyPair() registrationId = KeyHelper.generateRegistrationId() preKeys = KeyHelper.generatePreKeys(KeyHelper.getRandomSequence(), self.COUNT_PREKEYS) signedPreKey = KeyHelper.generateSignedPreKey(identityKeyPair, KeyHelper.getRandomSequence(65536)) self.store.storeLocalData(registrationId, identityKeyPair) self.store.storeSignedPreKey(signedPreKey.getId(), signedPreKey) for preKey in preKeys: self.store.storePreKey(preKey.getId(), preKey)
def init_store(self): """Create new identity key pair and initialize database""" logger.info('Creating new identity...') identityKeyPair = KeyHelper.generateIdentityKeyPair() registrationId = KeyHelper.generateRegistrationId() preKeys = KeyHelper.generatePreKeys(KeyHelper.getRandomSequence(), self.COUNT_PREKEYS) signedPreKey = KeyHelper.generateSignedPreKey( identityKeyPair, KeyHelper.getRandomSequence(65536)) self.store.storeLocalData(registrationId, identityKeyPair) self.store.storeSignedPreKey(signedPreKey.getId(), signedPreKey) for preKey in preKeys: self.store.storePreKey(preKey.getId(), preKey)
def setUp(self): super(ResultIqProtocolEntityTest, self).setUp() self.ProtocolEntity = ResultGetKeysIqProtocolEntity listNode = ProtocolTreeNode("list") self.node.addChild(listNode) for i in range(0, 1): userNode = ProtocolTreeNode("user", {"jid": "user_%s@%s" % (i, YowConstants.WHATSAPP_SERVER)}) listNode.addChild(userNode) registrationNode = ProtocolTreeNode("registration", data = ResultGetKeysIqProtocolEntity._intToBytes( KeyHelper.generateRegistrationId())) typeNode = ProtocolTreeNode("type", data = ResultGetKeysIqProtocolEntity._intToBytes(Curve.DJB_TYPE)) identityKeyPair = KeyHelper.generateIdentityKeyPair() identityNode = ProtocolTreeNode("identity", data=identityKeyPair.getPublicKey().getPublicKey().getPublicKey()) signedPreKey = KeyHelper.generateSignedPreKey(identityKeyPair, i) signedPreKeyNode = ProtocolTreeNode("skey") signedPreKeyNode_idNode = ProtocolTreeNode("id", data = ResultGetKeysIqProtocolEntity._intToBytes( signedPreKey.getId())) signedPreKeyNode_valueNode = ProtocolTreeNode("value", data = signedPreKey.getKeyPair().getPublicKey().getPublicKey()) signedPreKeyNode_sigNode = ProtocolTreeNode("signature", data = signedPreKey.getSignature()) signedPreKeyNode.addChildren([signedPreKeyNode_idNode, signedPreKeyNode_valueNode, signedPreKeyNode_sigNode]) preKey = KeyHelper.generatePreKeys(i * 10, 1)[0] preKeyNode = ProtocolTreeNode("key") preKeyNode_idNode = ProtocolTreeNode("id", data = ResultGetKeysIqProtocolEntity._intToBytes(preKey.getId())) preKeyNode_valNode = ProtocolTreeNode("value", data = preKey.getKeyPair().getPublicKey().getPublicKey()) preKeyNode.addChildren([preKeyNode_idNode, preKeyNode_valNode]) userNode.addChildren([ registrationNode, typeNode, identityNode, signedPreKeyNode, preKeyNode ])
def sendKeys(self, fresh = True, countPreKeys = _COUNT_PREKEYS): identityKeyPair = KeyHelper.generateIdentityKeyPair() if fresh else self.store.getIdentityKeyPair() registrationId = KeyHelper.generateRegistrationId() if fresh else self.store.getLocalRegistrationId() preKeys = KeyHelper.generatePreKeys(KeyHelper.getRandomSequence(), countPreKeys) signedPreKey = KeyHelper.generateSignedPreKey(identityKeyPair, KeyHelper.getRandomSequence(65536)) preKeysDict = {} for preKey in preKeys: keyPair = preKey.getKeyPair() preKeysDict[self.adjustId(preKey.getId())] = self.adjustArray(keyPair.getPublicKey().serialize()[1:]) signedKeyTuple = (self.adjustId(signedPreKey.getId()), self.adjustArray(signedPreKey.getKeyPair().getPublicKey().serialize()[1:]), self.adjustArray(signedPreKey.getSignature())) setKeysIq = SetKeysIqProtocolEntity(self.adjustArray(identityKeyPair.getPublicKey().serialize()[1:]), signedKeyTuple, preKeysDict, Curve.DJB_TYPE, self.adjustId(registrationId)) onResult = lambda _, __: self.persistKeys(registrationId, identityKeyPair, preKeys, signedPreKey, fresh) self._sendIq(setKeysIq, onResult, self.onSentKeysError)
def bundle(self): """ .. highlight: python Returns all data needed to announce bundle information. :: bundle_dict = { 'signedPreKeyPublic': bytes, 'prekeys': [(int, bytes) (int, bytes)], 'identityKey': bytes, 'signedPreKeyId': int, 'signedPreKeySignature': bytes } """ prekeys = [(k.getId(), b64encode(k.getKeyPair().getPublicKey().serialize())) for k in self.store.loadPreKeys()] identityKeyPair = self.store.getIdentityKeyPair() signedPreKey = KeyHelper.generateSignedPreKey( identityKeyPair, KeyHelper.getRandomSequence(65536)) self.store.storeSignedPreKey(signedPreKey.getId(), signedPreKey) result = { 'signedPreKeyId': signedPreKey.getId(), 'signedPreKeyPublic': b64encode(signedPreKey.getKeyPair().getPublicKey().serialize()), 'signedPreKeySignature': b64encode(signedPreKey.getSignature()), 'identityKey': b64encode(identityKeyPair.getPublicKey().serialize()), 'prekeys': prekeys } return result
def bundle(self): prekeys = [ (k.getId(), b64encode(k.getKeyPair().getPublicKey().serialize())) for k in self.store.loadPreKeys() ] identityKeyPair = self.store.getIdentityKeyPair() signedPreKey = KeyHelper.generateSignedPreKey( identityKeyPair, KeyHelper.getRandomSequence(65536)) self.store.storeSignedPreKey(signedPreKey.getId(), signedPreKey) result = { 'signedPreKeyId': signedPreKey.getId(), 'signedPreKeyPublic': b64encode(signedPreKey.getKeyPair().getPublicKey().serialize()), 'signedPreKeySignature': b64encode(signedPreKey.getSignature()), 'identityKey': b64encode(identityKeyPair.getPublicKey().serialize()), 'prekeys': prekeys } return result
def bundle(self): """ .. highlight: python Returns all data needed to announce bundle information. :: bundle_dict = { 'signedPreKeyPublic': bytes, 'prekeys': [(int, bytes) (int, bytes)], 'identityKey': bytes, 'signedPreKeyId': int, 'signedPreKeySignature': bytes } """ prekeys = [ (k.getId(), b64encode(k.getKeyPair().getPublicKey().serialize())) for k in self.store.loadPreKeys() ] identityKeyPair = self.store.getIdentityKeyPair() signedPreKey = KeyHelper.generateSignedPreKey( identityKeyPair, KeyHelper.getRandomSequence(65536)) self.store.storeSignedPreKey(signedPreKey.getId(), signedPreKey) result = { 'signedPreKeyId': signedPreKey.getId(), 'signedPreKeyPublic': b64encode(signedPreKey.getKeyPair().getPublicKey().serialize()), 'signedPreKeySignature': b64encode(signedPreKey.getSignature()), 'identityKey': b64encode(identityKeyPair.getPublicKey().serialize()), 'prekeys': prekeys } return result
def test_gensig(self): identityKeyPair = KeyHelper.generateIdentityKeyPair() KeyHelper.generateSignedPreKey(identityKeyPair, 0)