mirror of
https://github.com/vanitasvitae/Smack.git
synced 2025-12-07 19:41:11 +01:00
Reimplement encryption, solve compiler errors
This commit is contained in:
parent
e5cdd89edc
commit
50f8a4f1fe
20 changed files with 497 additions and 234 deletions
|
|
@ -64,7 +64,7 @@ public abstract class AbstractTwoUsersOmemoIntegrationTest extends AbstractOmemo
|
|||
}
|
||||
|
||||
@AfterClass
|
||||
public void cleanUp() throws SmackException.NotLoggedInException {
|
||||
public void cleanUp() {
|
||||
alice.stopListeners();
|
||||
bob.stopListeners();
|
||||
OmemoManagerSetupHelper.cleanUpPubSub(alice);
|
||||
|
|
|
|||
|
|
@ -22,9 +22,8 @@ import static org.junit.Assert.assertFalse;
|
|||
import org.jivesoftware.smack.SmackException;
|
||||
import org.jivesoftware.smack.XMPPException;
|
||||
import org.jivesoftware.smack.packet.Message;
|
||||
import org.jivesoftware.smack.packet.Stanza;
|
||||
import org.jivesoftware.smackx.omemo.element.OmemoBundleElement;
|
||||
import org.jivesoftware.smackx.omemo.internal.CipherAndAuthTag;
|
||||
import org.jivesoftware.smackx.omemo.internal.OmemoMessageInformation;
|
||||
import org.jivesoftware.smackx.omemo.listener.OmemoMessageListener;
|
||||
|
||||
import org.igniterealtime.smack.inttest.SmackIntegrationTest;
|
||||
|
|
@ -51,13 +50,13 @@ public class MessageEncryptionIntegrationTest extends AbstractTwoUsersOmemoInteg
|
|||
OmemoBundleElement bobsBundle1 = bob.getOmemoService().getOmemoStoreBackend().packOmemoBundle(bob.getOwnDevice());
|
||||
|
||||
final String message1 = "One is greater than zero (for small values of zero).";
|
||||
Message encrypted1 = alice.encrypt(bob.getOwnJid(), message1);
|
||||
OmemoMessage.Sent encrypted1 = alice.encrypt(bob.getOwnJid(), message1);
|
||||
final SimpleResultSyncPoint bobReceivedMessage = new SimpleResultSyncPoint();
|
||||
|
||||
bob.addOmemoMessageListener(new OmemoMessageListener() {
|
||||
@Override
|
||||
public void onOmemoMessageReceived(String decryptedBody, Message encryptedMessage, Message wrappingMessage, OmemoMessageInformation omemoInformation) {
|
||||
if (decryptedBody.equals(message1)) {
|
||||
public void onOmemoMessageReceived(Stanza stanza, OmemoMessage.Received received) {
|
||||
if (received.getMessage().equals(message1)) {
|
||||
bobReceivedMessage.signal();
|
||||
} else {
|
||||
bobReceivedMessage.signalFailure("Received decrypted message was not equal to sent message.");
|
||||
|
|
@ -65,13 +64,16 @@ public class MessageEncryptionIntegrationTest extends AbstractTwoUsersOmemoInteg
|
|||
}
|
||||
|
||||
@Override
|
||||
public void onOmemoKeyTransportReceived(CipherAndAuthTag cipherAndAuthTag, Message message, Message wrappingMessage, OmemoMessageInformation omemoInformation) {
|
||||
// Not used
|
||||
public void onOmemoKeyTransportReceived(Stanza stanza, OmemoMessage.Received decryptedKeyTransportMessage) {
|
||||
// Not needed
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
encrypted1.setTo(bob.getOwnJid());
|
||||
alice.getConnection().sendStanza(encrypted1);
|
||||
Message m1 = new Message();
|
||||
m1.addExtension(encrypted1.getElement());
|
||||
m1.setTo(bob.getOwnJid());
|
||||
alice.getConnection().sendStanza(m1);
|
||||
bobReceivedMessage.waitForResult(10 * 1000);
|
||||
|
||||
OmemoBundleElement aliceBundle2 = alice.getOmemoService().getOmemoStoreBackend().packOmemoBundle(alice.getOwnDevice());
|
||||
|
|
@ -82,13 +84,13 @@ public class MessageEncryptionIntegrationTest extends AbstractTwoUsersOmemoInteg
|
|||
assertFalse(bobsBundle1.equals(bobsBundle2));
|
||||
|
||||
final String message2 = "The german words for 'leek' and 'wimp' are the same.";
|
||||
final Message encrypted2 = bob.encrypt(alice.getOwnJid(), message2);
|
||||
final OmemoMessage.Sent encrypted2 = bob.encrypt(alice.getOwnJid(), message2);
|
||||
final SimpleResultSyncPoint aliceReceivedMessage = new SimpleResultSyncPoint();
|
||||
|
||||
alice.addOmemoMessageListener(new OmemoMessageListener() {
|
||||
@Override
|
||||
public void onOmemoMessageReceived(String decryptedBody, Message encryptedMessage, Message wrappingMessage, OmemoMessageInformation omemoInformation) {
|
||||
if (decryptedBody.equals(message2)) {
|
||||
public void onOmemoMessageReceived(Stanza stanza, OmemoMessage.Received received) {
|
||||
if (received.getMessage().equals(message2)) {
|
||||
aliceReceivedMessage.signal();
|
||||
} else {
|
||||
aliceReceivedMessage.signalFailure("Received decrypted message was not equal to sent message.");
|
||||
|
|
@ -96,13 +98,15 @@ public class MessageEncryptionIntegrationTest extends AbstractTwoUsersOmemoInteg
|
|||
}
|
||||
|
||||
@Override
|
||||
public void onOmemoKeyTransportReceived(CipherAndAuthTag cipherAndAuthTag, Message message, Message wrappingMessage, OmemoMessageInformation omemoInformation) {
|
||||
// Not needed here either.
|
||||
public void onOmemoKeyTransportReceived(Stanza stanza, OmemoMessage.Received decryptedKeyTransportMessage) {
|
||||
// Not needed
|
||||
}
|
||||
});
|
||||
|
||||
encrypted2.setTo(alice.getOwnJid());
|
||||
bob.getConnection().sendStanza(encrypted2);
|
||||
Message m2 = new Message();
|
||||
m2.addExtension(encrypted2.getElement());
|
||||
m2.setTo(alice.getOwnJid());
|
||||
bob.getConnection().sendStanza(m2);
|
||||
aliceReceivedMessage.waitForResult(10 * 1000);
|
||||
|
||||
OmemoBundleElement aliceBundle3 = alice.getOmemoService().getOmemoStoreBackend().packOmemoBundle(alice.getOwnDevice());
|
||||
|
|
|
|||
|
|
@ -25,7 +25,6 @@ import java.util.HashMap;
|
|||
import org.jivesoftware.smack.SmackException;
|
||||
import org.jivesoftware.smack.XMPPConnection;
|
||||
import org.jivesoftware.smack.XMPPException;
|
||||
import org.jivesoftware.smackx.omemo.util.EphemeralTrustCallback;
|
||||
import org.jivesoftware.smack.packet.Presence;
|
||||
import org.jivesoftware.smack.roster.PresenceEventListener;
|
||||
import org.jivesoftware.smack.roster.Roster;
|
||||
|
|
@ -35,6 +34,7 @@ import org.jivesoftware.smackx.omemo.exceptions.CorruptedOmemoKeyException;
|
|||
import org.jivesoftware.smackx.omemo.internal.OmemoCachedDeviceList;
|
||||
import org.jivesoftware.smackx.omemo.internal.OmemoDevice;
|
||||
import org.jivesoftware.smackx.omemo.trust.OmemoFingerprint;
|
||||
import org.jivesoftware.smackx.omemo.util.EphemeralTrustCallback;
|
||||
import org.jivesoftware.smackx.omemo.util.OmemoConstants;
|
||||
import org.jivesoftware.smackx.pubsub.PubSubException;
|
||||
import org.jivesoftware.smackx.pubsub.PubSubManager;
|
||||
|
|
@ -45,6 +45,7 @@ import org.jxmpp.jid.BareJid;
|
|||
import org.jxmpp.jid.FullJid;
|
||||
import org.jxmpp.jid.Jid;
|
||||
|
||||
|
||||
public class OmemoManagerSetupHelper {
|
||||
|
||||
/**
|
||||
|
|
@ -177,14 +178,11 @@ public class OmemoManagerSetupHelper {
|
|||
}
|
||||
}
|
||||
|
||||
public static void cleanUpPubSub(OmemoManager omemoManager)
|
||||
throws SmackException.NotLoggedInException, XMPPException.XMPPErrorException,
|
||||
PubSubException.NotALeafNodeException
|
||||
{
|
||||
public static void cleanUpPubSub(OmemoManager omemoManager) {
|
||||
PubSubManager pm = PubSubManager.getInstance(omemoManager.getConnection(),omemoManager.getOwnJid());
|
||||
try {
|
||||
omemoManager.requestDeviceListUpdateFor(omemoManager.getOwnJid());
|
||||
} catch (SmackException.NotConnectedException | InterruptedException | SmackException.NoResponseException e) {
|
||||
} catch (SmackException.NotConnectedException | InterruptedException | SmackException.NoResponseException | PubSubException.NotALeafNodeException | XMPPException.XMPPErrorException e) {
|
||||
// ignore
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -23,8 +23,7 @@ import java.util.concurrent.TimeoutException;
|
|||
import org.jivesoftware.smack.SmackException;
|
||||
import org.jivesoftware.smack.XMPPException;
|
||||
import org.jivesoftware.smack.packet.Message;
|
||||
import org.jivesoftware.smackx.omemo.internal.CipherAndAuthTag;
|
||||
import org.jivesoftware.smackx.omemo.internal.OmemoMessageInformation;
|
||||
import org.jivesoftware.smack.packet.Stanza;
|
||||
import org.jivesoftware.smackx.omemo.listener.OmemoMessageListener;
|
||||
|
||||
import org.igniterealtime.smack.inttest.SmackIntegrationTest;
|
||||
|
|
@ -41,16 +40,16 @@ public class SessionRenegotiationIntegrationTest extends AbstractTwoUsersOmemoIn
|
|||
super(environment);
|
||||
}
|
||||
|
||||
private static final String m1 = "P = NP is true for all N,P from the set of complex numbers, where P is equal to 0";
|
||||
private static final String body1 = "P = NP is true for all N,P from the set of complex numbers, where P is equal to 0";
|
||||
private final SimpleResultSyncPoint bsp1 = new SimpleResultSyncPoint();
|
||||
private final OmemoMessageListener bml1 = new OmemoTestMessageListener(m1, bsp1);
|
||||
private final OmemoMessageListener bml1 = new OmemoTestMessageListener(body1, bsp1);
|
||||
|
||||
private static final String m2 = "P = NP is also true for all N,P from the set of complex numbers, where N is equal to 1.";
|
||||
private static final String body2 = "P = NP is also true for all N,P from the set of complex numbers, where N is equal to 1.";
|
||||
private final ResultSyncPoint<Boolean, IllegalStateException> bsp2 = new ResultSyncPoint<>();
|
||||
private final OmemoMessageListener bml2 = new OmemoMessageListener() {
|
||||
@Override
|
||||
public void onOmemoMessageReceived(String decryptedBody, Message encryptedMessage, Message wrappingMessage, OmemoMessageInformation omemoInformation) {
|
||||
if (decryptedBody.equals(m2)) {
|
||||
public void onOmemoMessageReceived(Stanza stanza, OmemoMessage.Received received) {
|
||||
if (received.getMessage().equals(body2)) {
|
||||
bsp2.signal(new IllegalStateException("Message MUST NOT be decryptable!"));
|
||||
} else {
|
||||
bsp2.signal(new IllegalStateException("OmemoMessageListener MUST NOT be called for this message."));
|
||||
|
|
@ -58,37 +57,40 @@ public class SessionRenegotiationIntegrationTest extends AbstractTwoUsersOmemoIn
|
|||
}
|
||||
|
||||
@Override
|
||||
public void onOmemoKeyTransportReceived(CipherAndAuthTag cipherAndAuthTag, Message message, Message wrappingMessage, OmemoMessageInformation omemoInformation) {
|
||||
|
||||
public void onOmemoKeyTransportReceived(Stanza stanza, OmemoMessage.Received decryptedKeyTransportMessage) {
|
||||
// Not needed
|
||||
}
|
||||
};
|
||||
private final SimpleResultSyncPoint asp2 = new SimpleResultSyncPoint();
|
||||
private final OmemoMessageListener aml2 = new OmemoMessageListener() {
|
||||
@Override
|
||||
public void onOmemoMessageReceived(String decryptedBody, Message encryptedMessage, Message wrappingMessage, OmemoMessageInformation omemoInformation) {
|
||||
|
||||
@Override
|
||||
public void onOmemoMessageReceived(Stanza stanza, OmemoMessage.Received decryptedMessage) {
|
||||
// Not needed
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onOmemoKeyTransportReceived(CipherAndAuthTag cipherAndAuthTag, Message message, Message wrappingMessage, OmemoMessageInformation omemoInformation) {
|
||||
public void onOmemoKeyTransportReceived(Stanza stanza, OmemoMessage.Received received) {
|
||||
asp2.signal();
|
||||
}
|
||||
};
|
||||
|
||||
private static final String m3 = "P = NP would be a disaster for the world of cryptography.";
|
||||
private static final String body3 = "P = NP would be a disaster for the world of cryptography.";
|
||||
private final SimpleResultSyncPoint bsp3 = new SimpleResultSyncPoint();
|
||||
private final OmemoMessageListener bml3 = new OmemoTestMessageListener(m3, bsp3);
|
||||
private final OmemoMessageListener bml3 = new OmemoTestMessageListener(body3, bsp3);
|
||||
|
||||
@SmackIntegrationTest
|
||||
public void sessionRenegotiationTest() throws Exception {
|
||||
/*
|
||||
Send (PreKey-)message from Alice to Bob to initiate a session.
|
||||
*/
|
||||
Message e1 = alice.encrypt(bob.getOwnJid(), m1);
|
||||
e1.setTo(bob.getOwnJid());
|
||||
OmemoMessage.Sent e1 = alice.encrypt(bob.getOwnJid(), body1);
|
||||
Message m1 = new Message();
|
||||
m1.addExtension(e1.getElement());
|
||||
m1.setTo(bob.getOwnJid());
|
||||
|
||||
bob.addOmemoMessageListener(bml1);
|
||||
alice.getConnection().sendStanza(e1);
|
||||
alice.getConnection().sendStanza(m1);
|
||||
bsp1.waitForResult(10 * 1000);
|
||||
bob.removeOmemoMessageListener(bml1);
|
||||
|
||||
|
|
@ -100,12 +102,14 @@ public class SessionRenegotiationIntegrationTest extends AbstractTwoUsersOmemoIn
|
|||
/*
|
||||
Send normal message from Alice to Bob (Alice assumes, that Bob still has a valid session).
|
||||
*/
|
||||
Message e2 = alice.encrypt(bob.getOwnJid(), m2);
|
||||
e2.setTo(bob.getOwnJid());
|
||||
OmemoMessage.Sent e2 = alice.encrypt(bob.getOwnJid(), body2);
|
||||
Message m2 = new Message();
|
||||
m2.addExtension(e2.getElement());
|
||||
m2.setTo(bob.getOwnJid());
|
||||
|
||||
bob.addOmemoMessageListener(bml2);
|
||||
alice.addOmemoMessageListener(aml2);
|
||||
alice.getConnection().sendStanza(e2);
|
||||
alice.getConnection().sendStanza(m2);
|
||||
|
||||
/*
|
||||
Wait for the timeout on Bobs side, since message decryption will fail now.
|
||||
|
|
@ -127,11 +131,13 @@ public class SessionRenegotiationIntegrationTest extends AbstractTwoUsersOmemoIn
|
|||
Since Bob responded with a PreKeyMessage to repair the broken session, Alice should now be able to send messages
|
||||
which Bob can decrypt successfully again.
|
||||
*/
|
||||
Message e3 = alice.encrypt(bob.getOwnJid(), m3);
|
||||
e3.setTo(bob.getOwnJid());
|
||||
OmemoMessage.Sent e3 = alice.encrypt(bob.getOwnJid(), body3);
|
||||
Message m3 = new Message();
|
||||
m3.addExtension(e3.getElement());
|
||||
m3.setTo(bob.getOwnJid());
|
||||
|
||||
bob.addOmemoMessageListener(bml3);
|
||||
alice.getConnection().sendStanza(e3);
|
||||
alice.getConnection().sendStanza(m3);
|
||||
bsp3.waitForResult(10 * 1000);
|
||||
bob.removeOmemoMessageListener(bml3);
|
||||
}
|
||||
|
|
@ -147,8 +153,8 @@ public class SessionRenegotiationIntegrationTest extends AbstractTwoUsersOmemoIn
|
|||
}
|
||||
|
||||
@Override
|
||||
public void onOmemoMessageReceived(String decryptedBody, Message encryptedMessage, Message wrappingMessage, OmemoMessageInformation omemoInformation) {
|
||||
if (decryptedBody.equals(expectedMessage)) {
|
||||
public void onOmemoMessageReceived(Stanza stanza, OmemoMessage.Received received) {
|
||||
if (received.getMessage().equals(expectedMessage)) {
|
||||
syncPoint.signal();
|
||||
} else {
|
||||
syncPoint.signalFailure("Received decrypted message was not equal to sent message.");
|
||||
|
|
@ -156,8 +162,8 @@ public class SessionRenegotiationIntegrationTest extends AbstractTwoUsersOmemoIn
|
|||
}
|
||||
|
||||
@Override
|
||||
public void onOmemoKeyTransportReceived(CipherAndAuthTag cipherAndAuthTag, Message message, Message wrappingMessage, OmemoMessageInformation omemoInformation) {
|
||||
// Ignored.
|
||||
public void onOmemoKeyTransportReceived(Stanza stanza, OmemoMessage.Received decryptedKeyTransportMessage) {
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue