diff --git a/core/src/main/java/io/bitsquare/arbitration/Arbitrator.java b/core/src/main/java/io/bitsquare/arbitration/Arbitrator.java index 828c271af4..7417207612 100644 --- a/core/src/main/java/io/bitsquare/arbitration/Arbitrator.java +++ b/core/src/main/java/io/bitsquare/arbitration/Arbitrator.java @@ -31,7 +31,7 @@ public class Arbitrator implements Serializable { private String id; private String pubKeyAsHex; private byte[] pubKey; - private String messagePubKeyAsHex; + private String p2pSigPubKeyAsHex; private String name; private ID_TYPE idType; private List languages; @@ -48,7 +48,7 @@ public class Arbitrator implements Serializable { } public Arbitrator(byte[] pubKey, - String messagePubKeyAsHex, + String p2pSigPubKeyAsHex, String name, ID_TYPE idType, List languages, @@ -59,7 +59,7 @@ public class Arbitrator implements Serializable { String webUrl, String description) { this.pubKey = pubKey; - this.messagePubKeyAsHex = messagePubKeyAsHex; + this.p2pSigPubKeyAsHex = p2pSigPubKeyAsHex; this.name = name; this.idType = idType; this.languages = languages; @@ -76,7 +76,7 @@ public class Arbitrator implements Serializable { public void applyPersistedArbitrator(Arbitrator persistedArbitrator) { this.pubKeyAsHex = persistedArbitrator.getPubKeyAsHex(); - this.messagePubKeyAsHex = persistedArbitrator.getPubKeyAsHex(); + this.p2pSigPubKeyAsHex = persistedArbitrator.getPubKeyAsHex(); this.name = persistedArbitrator.getName(); this.idType = persistedArbitrator.getIdType(); this.languages = persistedArbitrator.getLanguages(); @@ -126,8 +126,8 @@ public class Arbitrator implements Serializable { return pubKey; } - public String getMessagePubKeyAsHex() { - return messagePubKeyAsHex; + public String getP2pSigPubKeyAsHex() { + return p2pSigPubKeyAsHex; } diff --git a/core/src/main/java/io/bitsquare/common/handlers/FaultHandler.java b/core/src/main/java/io/bitsquare/common/handlers/FaultHandler.java index e288098c01..3d2913dfa5 100644 --- a/core/src/main/java/io/bitsquare/common/handlers/FaultHandler.java +++ b/core/src/main/java/io/bitsquare/common/handlers/FaultHandler.java @@ -21,5 +21,5 @@ package io.bitsquare.common.handlers; * For reporting a description message and throwable */ public interface FaultHandler { - void handleFault(String message, Throwable throwable); + void handleFault(String errorMessage, Throwable throwable); } diff --git a/core/src/main/java/io/bitsquare/crypto/EncryptionService.java b/core/src/main/java/io/bitsquare/crypto/EncryptionService.java index 1e7f74ebbc..5f1e92d6f1 100644 --- a/core/src/main/java/io/bitsquare/crypto/EncryptionService.java +++ b/core/src/main/java/io/bitsquare/crypto/EncryptionService.java @@ -19,6 +19,9 @@ package io.bitsquare.crypto; import io.bitsquare.util.Utilities; +import java.io.Serializable; + +import java.security.Key; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.PrivateKey; @@ -30,8 +33,11 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.crypto.Cipher; +import javax.crypto.KeyGenerator; +import javax.crypto.SecretKey; +import javax.crypto.spec.SecretKeySpec; -public class EncryptionService { +public class EncryptionService { private static final Logger log = LoggerFactory.getLogger(EncryptionService.class); @Inject @@ -51,38 +57,73 @@ public class EncryptionService { return keyPair; } - public byte[] encryptObject(PublicKey publicKey, Object object) { + public Tuple encryptObject(PublicKey publicKey, Object object) { return encrypt(publicKey, Utilities.objectToBytArray(object)); } - public Object decryptObject(PrivateKey privateKey, byte[] cipherMessage) { - return Utilities.byteArrayToObject(decrypt(privateKey, cipherMessage)); + public T decryptToObject(PrivateKey privateKey, Tuple tuple) { + return (T) Utilities.byteArrayToObject(decrypt(privateKey, tuple)); } - public byte[] encrypt(PublicKey publicKey, byte[] data) { - byte[] cipherData = null; + public Tuple encrypt(PublicKey publicKey, byte[] payload) { + byte[] encryptedPayload = null; + byte[] encryptedKey = null; try { - Cipher cipher = Cipher.getInstance("RSA"); + // Create symmetric key and + KeyGenerator keyGenerator = KeyGenerator.getInstance("AES"); + keyGenerator.init(256); + SecretKey secretKey = keyGenerator.generateKey(); + + // Encrypt secretKey with asymmetric key + Cipher cipher = Cipher.getInstance("RSA/NONE/PKCS1Padding"); cipher.init(Cipher.ENCRYPT_MODE, publicKey); - cipherData = cipher.doFinal(data); + encryptedKey = cipher.doFinal(secretKey.getEncoded()); + + // Encrypt payload with symmetric key + SecretKeySpec keySpec = new SecretKeySpec(secretKey.getEncoded(), "AES"); + cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); + cipher.init(Cipher.ENCRYPT_MODE, keySpec); + encryptedPayload = cipher.doFinal(payload); } catch (Exception e) { e.printStackTrace(); log.error("Exception at encrypt " + e.getMessage()); } - return cipherData; + return new Tuple(encryptedKey, encryptedPayload); } - public byte[] decrypt(PrivateKey privateKey, byte[] cipherText) { - byte[] data = null; + public byte[] decrypt(PrivateKey privateKey, Tuple tuple) { + byte[] encryptedPayload = tuple.encryptedPayload; + byte[] encryptedKey = tuple.encryptedKey; + + byte[] payload = null; try { - Cipher cipher = Cipher.getInstance("RSA"); + // Decrypt secretKey key with asymmetric key + Cipher cipher = Cipher.getInstance("RSA/NONE/PKCS1Padding"); cipher.init(Cipher.DECRYPT_MODE, privateKey); - data = cipher.doFinal(cipherText); + byte[] secretKey = cipher.doFinal(encryptedKey); + + // Decrypt payload with symmetric key + Key key = new SecretKeySpec(secretKey, "AES"); + cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); + cipher.init(Cipher.DECRYPT_MODE, key); + payload = cipher.doFinal(encryptedPayload); } catch (Exception e) { e.printStackTrace(); log.error("Exception at decrypt " + e.getMessage()); } - return data; + return payload; } + public class Tuple implements Serializable { + private static final long serialVersionUID = -8709538217388076762L; + + public final byte[] encryptedKey; + public final byte[] encryptedPayload; + + public Tuple(byte[] encryptedKey, byte[] encryptedPayload) { + this.encryptedKey = encryptedKey; + this.encryptedPayload = encryptedPayload; + } + } } + diff --git a/core/src/main/java/io/bitsquare/gui/main/MainViewModel.java b/core/src/main/java/io/bitsquare/gui/main/MainViewModel.java index 49b894d0d5..3bd0b6880f 100644 --- a/core/src/main/java/io/bitsquare/gui/main/MainViewModel.java +++ b/core/src/main/java/io/bitsquare/gui/main/MainViewModel.java @@ -29,10 +29,10 @@ import io.bitsquare.fiat.FiatAccountType; import io.bitsquare.gui.util.BSFormatter; import io.bitsquare.locale.CountryUtil; import io.bitsquare.locale.LanguageUtil; +import io.bitsquare.p2p.BaseP2PService; import io.bitsquare.p2p.BootstrapState; import io.bitsquare.p2p.ClientNode; import io.bitsquare.p2p.MessageService; -import io.bitsquare.p2p.BaseP2PService; import io.bitsquare.persistence.Persistence; import io.bitsquare.trade.Trade; import io.bitsquare.trade.TradeManager; @@ -160,7 +160,7 @@ class MainViewModel implements ViewModel { // Set executor for all P2PServices BaseP2PService.setUserThread(Platform::runLater); - + Observable bootstrapStateAsObservable = clientNode.bootstrap(user.getP2pSigKeyPair()); bootstrapStateAsObservable.publish(); bootstrapStateAsObservable.subscribe( @@ -356,7 +356,7 @@ class MainViewModel implements ViewModel { private void addMockArbitrator() { if (accountSettings.getAcceptedArbitrators().isEmpty() && user.getP2pSigKeyPair() != null) { byte[] pubKey = new ECKey().getPubKey(); - String messagePubKeyAsHex = DSAKeyUtil.getHexStringFromPublicKey(user.getMessagePubKey()); + String p2pSigPubKeyAsHex = DSAKeyUtil.getHexStringFromPublicKey(user.getP2PSigPubKey()); List languages = new ArrayList<>(); languages.add(LanguageUtil.getDefaultLanguageLocale()); List arbitrationMethods = new ArrayList<>(); @@ -366,7 +366,7 @@ class MainViewModel implements ViewModel { idVerifications.add(Arbitrator.ID_VERIFICATION.GOV_ID); Arbitrator arbitrator = new Arbitrator(pubKey, - messagePubKeyAsHex, + p2pSigPubKeyAsHex, "Manfred Karrer", Arbitrator.ID_TYPE.REAL_LIFE_ID, languages, diff --git a/core/src/main/java/io/bitsquare/gui/main/account/arbitrator/registration/ArbitratorRegistrationView.java b/core/src/main/java/io/bitsquare/gui/main/account/arbitrator/registration/ArbitratorRegistrationView.java index dcbcef01c0..5370c7f051 100644 --- a/core/src/main/java/io/bitsquare/gui/main/account/arbitrator/registration/ArbitratorRegistrationView.java +++ b/core/src/main/java/io/bitsquare/gui/main/account/arbitrator/registration/ArbitratorRegistrationView.java @@ -370,14 +370,14 @@ public class ArbitratorRegistrationView extends ActivatableView languages = new ArrayList<>(); languages.add(LanguageUtil.getDefaultLanguageLocale()); List arbitrationMethods = new ArrayList<>(); @@ -134,7 +134,7 @@ class IrcAccountDataModel implements Activatable, DataModel { idVerifications.add(Arbitrator.ID_VERIFICATION.GOV_ID); Arbitrator arbitrator = new Arbitrator(pubKey, - messagePubKeyAsHex, + p2pSigPubKeyAsHex, "Manfred Karrer", Arbitrator.ID_TYPE.REAL_LIFE_ID, languages, diff --git a/core/src/main/java/io/bitsquare/gui/main/account/content/restrictions/RestrictionsDataModel.java b/core/src/main/java/io/bitsquare/gui/main/account/content/restrictions/RestrictionsDataModel.java index e9c64eaa28..ceacd2b93d 100644 --- a/core/src/main/java/io/bitsquare/gui/main/account/content/restrictions/RestrictionsDataModel.java +++ b/core/src/main/java/io/bitsquare/gui/main/account/content/restrictions/RestrictionsDataModel.java @@ -154,7 +154,7 @@ class RestrictionsDataModel implements Activatable, DataModel { private void addMockArbitrator() { if (accountSettings.getAcceptedArbitrators().isEmpty() && user.getP2pSigKeyPair() != null) { byte[] pubKey = new ECKey().getPubKey(); - String messagePubKeyAsHex = DSAKeyUtil.getHexStringFromPublicKey(user.getMessagePubKey()); + String messagePubKeyAsHex = DSAKeyUtil.getHexStringFromPublicKey(user.getP2PSigPubKey()); List languages = new ArrayList<>(); languages.add(LanguageUtil.getDefaultLanguageLocale()); List arbitrationMethods = new ArrayList<>(); diff --git a/core/src/main/java/io/bitsquare/gui/main/portfolio/closed/ClosedTradesDataModel.java b/core/src/main/java/io/bitsquare/gui/main/portfolio/closed/ClosedTradesDataModel.java index 11847ddea5..dd69559c58 100644 --- a/core/src/main/java/io/bitsquare/gui/main/portfolio/closed/ClosedTradesDataModel.java +++ b/core/src/main/java/io/bitsquare/gui/main/portfolio/closed/ClosedTradesDataModel.java @@ -74,7 +74,7 @@ class ClosedTradesDataModel implements Activatable, DataModel { } public Direction getDirection(Offer offer) { - return offer.getMessagePublicKey().equals(user.getMessagePubKey()) ? + return offer.getMessagePublicKey().equals(user.getP2PSigPubKey()) ? offer.getDirection() : offer.getMirroredDirection(); } diff --git a/core/src/main/java/io/bitsquare/gui/main/portfolio/offer/OffersDataModel.java b/core/src/main/java/io/bitsquare/gui/main/portfolio/offer/OffersDataModel.java index 65f34da679..6d3c29888e 100644 --- a/core/src/main/java/io/bitsquare/gui/main/portfolio/offer/OffersDataModel.java +++ b/core/src/main/java/io/bitsquare/gui/main/portfolio/offer/OffersDataModel.java @@ -86,7 +86,7 @@ class OffersDataModel implements Activatable, DataModel { } public Direction getDirection(Offer offer) { - return offer.getMessagePublicKey().equals(user.getMessagePubKey()) ? + return offer.getMessagePublicKey().equals(user.getP2PSigPubKey()) ? offer.getDirection() : offer.getMirroredDirection(); } } diff --git a/core/src/main/java/io/bitsquare/gui/main/portfolio/pending/PendingTradesDataModel.java b/core/src/main/java/io/bitsquare/gui/main/portfolio/pending/PendingTradesDataModel.java index b8beffd8e8..df1ec675cf 100644 --- a/core/src/main/java/io/bitsquare/gui/main/portfolio/pending/PendingTradesDataModel.java +++ b/core/src/main/java/io/bitsquare/gui/main/portfolio/pending/PendingTradesDataModel.java @@ -146,7 +146,7 @@ class PendingTradesDataModel implements Activatable, DataModel { selectedItem = item; if (selectedItem != null) { - isOfferer = getTrade().getOffer().getMessagePublicKey().equals(user.getMessagePubKey()); + isOfferer = getTrade().getOffer().getMessagePublicKey().equals(user.getP2PSigPubKey()); Trade trade = getTrade(); trade.stateProperty().addListener(tradeStateChangeListener); @@ -269,7 +269,7 @@ class PendingTradesDataModel implements Activatable, DataModel { } public Direction getDirection(Offer offer) { - return offer.getMessagePublicKey().equals(user.getMessagePubKey()) ? + return offer.getMessagePublicKey().equals(user.getP2PSigPubKey()) ? offer.getDirection() : offer.getMirroredDirection(); } diff --git a/core/src/main/java/io/bitsquare/gui/main/trade/offerbook/OfferBookDataModel.java b/core/src/main/java/io/bitsquare/gui/main/trade/offerbook/OfferBookDataModel.java index 0df036d57a..3c79b62237 100644 --- a/core/src/main/java/io/bitsquare/gui/main/trade/offerbook/OfferBookDataModel.java +++ b/core/src/main/java/io/bitsquare/gui/main/trade/offerbook/OfferBookDataModel.java @@ -213,7 +213,7 @@ class OfferBookDataModel implements Activatable, DataModel { } boolean isMyOffer(Offer offer) { - return offer.getMessagePublicKey() != null && offer.getMessagePublicKey().equals(user.getMessagePubKey()); + return offer.getMessagePublicKey() != null && offer.getMessagePublicKey().equals(user.getP2PSigPubKey()); } Coin getAmountAsCoin() { diff --git a/core/src/main/java/io/bitsquare/p2p/EncryptedMailboxMessage.java b/core/src/main/java/io/bitsquare/p2p/EncryptedMailboxMessage.java new file mode 100644 index 0000000000..30759335ec --- /dev/null +++ b/core/src/main/java/io/bitsquare/p2p/EncryptedMailboxMessage.java @@ -0,0 +1,43 @@ +/* + * This file is part of Bitsquare. + * + * Bitsquare is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * Bitsquare is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Bitsquare. If not, see . + */ + +package io.bitsquare.p2p; + +import io.bitsquare.crypto.EncryptionService; + +import java.io.Serializable; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/* + Stores a message in encrypted form, so it never leaves the client in plain text. + */ +public class EncryptedMailboxMessage implements MailboxMessage, Serializable { + private static final long serialVersionUID = -3111178895546299769L; + private static final Logger log = LoggerFactory.getLogger(EncryptedMailboxMessage.class); + + private EncryptionService.Tuple tuple; + + public EncryptedMailboxMessage(EncryptionService.Tuple tuple) { + this.tuple = tuple; + } + + public EncryptionService.Tuple getTuple() { + return tuple; + } +} diff --git a/core/src/main/java/io/bitsquare/p2p/MailboxMessage.java b/core/src/main/java/io/bitsquare/p2p/MailboxMessage.java index 9722bbc4bb..0037ec7175 100644 --- a/core/src/main/java/io/bitsquare/p2p/MailboxMessage.java +++ b/core/src/main/java/io/bitsquare/p2p/MailboxMessage.java @@ -19,23 +19,5 @@ package io.bitsquare.p2p; import java.io.Serializable; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/* - Stores a message in encrypted form, so it never leaves the client in plain text. - */ -public class MailboxMessage implements Message, Serializable { - private static final long serialVersionUID = -3111178895546299769L; - private static final Logger log = LoggerFactory.getLogger(MailboxMessage.class); - - private byte[] cipherMessage; - - public MailboxMessage(byte[] cipherMessage) { - this.cipherMessage = cipherMessage; - } - - public byte[] getCipherMessage() { - return cipherMessage; - } +public interface MailboxMessage extends Message, Serializable { } diff --git a/core/src/main/java/io/bitsquare/p2p/MailboxService.java b/core/src/main/java/io/bitsquare/p2p/MailboxService.java index ca4e43efd5..ad5e1168c7 100644 --- a/core/src/main/java/io/bitsquare/p2p/MailboxService.java +++ b/core/src/main/java/io/bitsquare/p2p/MailboxService.java @@ -24,9 +24,9 @@ import io.bitsquare.p2p.tomp2p.TomP2PMailboxService; import java.security.PublicKey; public interface MailboxService { - void addMessage(PublicKey publicKey, MailboxMessage message, ResultHandler resultHandler, FaultHandler faultHandler); + void addMessage(PublicKey publicKey, EncryptedMailboxMessage message, ResultHandler resultHandler, FaultHandler faultHandler); - void removeMessage(PublicKey publicKey, MailboxMessage message, ResultHandler resultHandler, FaultHandler faultHandler); + void removeMessage(PublicKey publicKey, EncryptedMailboxMessage message, ResultHandler resultHandler, FaultHandler faultHandler); void getMessages(PublicKey publicKey, TomP2PMailboxService.MailboxMessagesResultHandler resultHandler); } diff --git a/core/src/main/java/io/bitsquare/p2p/tomp2p/TomP2PMailboxService.java b/core/src/main/java/io/bitsquare/p2p/tomp2p/TomP2PMailboxService.java index 6372f0cdbf..4194e5b4d9 100644 --- a/core/src/main/java/io/bitsquare/p2p/tomp2p/TomP2PMailboxService.java +++ b/core/src/main/java/io/bitsquare/p2p/tomp2p/TomP2PMailboxService.java @@ -20,7 +20,7 @@ package io.bitsquare.p2p.tomp2p; import io.bitsquare.common.handlers.FaultHandler; import io.bitsquare.common.handlers.ResultHandler; import io.bitsquare.offer.OfferBookService; -import io.bitsquare.p2p.MailboxMessage; +import io.bitsquare.p2p.EncryptedMailboxMessage; import io.bitsquare.p2p.MailboxService; import io.bitsquare.user.User; @@ -69,7 +69,7 @@ public class TomP2PMailboxService extends TomP2PDHTService implements MailboxSer } @Override - public void addMessage(PublicKey publicKey, MailboxMessage message, ResultHandler resultHandler, FaultHandler faultHandler) { + public void addMessage(PublicKey publicKey, EncryptedMailboxMessage message, ResultHandler resultHandler, FaultHandler faultHandler) { try { final Data data = new Data(message); data.ttlSeconds(TTL); @@ -101,7 +101,7 @@ public class TomP2PMailboxService extends TomP2PDHTService implements MailboxSer } @Override - public void removeMessage(PublicKey publicKey, MailboxMessage message, ResultHandler resultHandler, FaultHandler faultHandler) { + public void removeMessage(PublicKey publicKey, EncryptedMailboxMessage message, ResultHandler resultHandler, FaultHandler faultHandler) { try { final Data data = new Data(message); log.trace("Remove message from DHT requested. Removed data: [locationKey: " + getLocationKey(publicKey) + @@ -141,13 +141,13 @@ public class TomP2PMailboxService extends TomP2PDHTService implements MailboxSer public void operationComplete(BaseFuture future) throws Exception { if (future.isSuccess()) { final Map dataMap = futureGet.dataMap(); - List messages = new ArrayList<>(); + List messages = new ArrayList<>(); if (dataMap != null) { for (Data messageData : dataMap.values()) { try { Object messageDataObject = messageData.object(); - if (messageDataObject instanceof MailboxMessage) { - messages.add((MailboxMessage) messageDataObject); + if (messageDataObject instanceof EncryptedMailboxMessage) { + messages.add((EncryptedMailboxMessage) messageDataObject); } } catch (ClassNotFoundException | IOException e) { e.printStackTrace(); @@ -183,6 +183,6 @@ public class TomP2PMailboxService extends TomP2PDHTService implements MailboxSer } public interface MailboxMessagesResultHandler { - void handleResult(List messages); + void handleResult(List messages); } } \ No newline at end of file diff --git a/core/src/main/java/io/bitsquare/p2p/tomp2p/TomP2PMessageService.java b/core/src/main/java/io/bitsquare/p2p/tomp2p/TomP2PMessageService.java index 5402b89495..094fe0a245 100644 --- a/core/src/main/java/io/bitsquare/p2p/tomp2p/TomP2PMessageService.java +++ b/core/src/main/java/io/bitsquare/p2p/tomp2p/TomP2PMessageService.java @@ -17,11 +17,16 @@ package io.bitsquare.p2p.tomp2p; +import io.bitsquare.crypto.EncryptionService; +import io.bitsquare.p2p.EncryptedMailboxMessage; +import io.bitsquare.p2p.MailboxMessage; +import io.bitsquare.p2p.MailboxService; import io.bitsquare.p2p.Message; import io.bitsquare.p2p.MessageHandler; import io.bitsquare.p2p.MessageService; import io.bitsquare.p2p.Peer; import io.bitsquare.p2p.listener.SendMessageListener; +import io.bitsquare.user.User; import java.util.concurrent.CopyOnWriteArrayList; @@ -38,6 +43,9 @@ public class TomP2PMessageService extends TomP2PService implements MessageServic private static final Logger log = LoggerFactory.getLogger(TomP2PMessageService.class); private final CopyOnWriteArrayList messageHandlers = new CopyOnWriteArrayList<>(); + private MailboxService mailboxService; + private User user; + private EncryptionService encryptionService; /////////////////////////////////////////////////////////////////////////////////////////// @@ -45,8 +53,11 @@ public class TomP2PMessageService extends TomP2PService implements MessageServic /////////////////////////////////////////////////////////////////////////////////////////// @Inject - public TomP2PMessageService(TomP2PNode tomP2PNode) { + public TomP2PMessageService(TomP2PNode tomP2PNode, MailboxService mailboxService, User user, EncryptionService encryptionService) { super(tomP2PNode); + this.mailboxService = mailboxService; + this.user = user; + this.encryptionService = encryptionService; } @@ -75,19 +86,45 @@ public class TomP2PMessageService extends TomP2PService implements MessageServic executor.execute(listener::handleResult); } else { - log.error("sendMessage failed with reason " + futureDirect.failedReason()); - executor.execute(listener::handleFault); + if (message instanceof MailboxMessage) { + sendMailboxMessage((MailboxMessage) message, listener); + } + else { + log.error("sendMessage failed with reason " + futureDirect.failedReason()); + executor.execute(listener::handleFault); + } } } @Override public void exceptionCaught(Throwable t) throws Exception { - log.error("Exception at sendMessage " + t.toString()); - executor.execute(listener::handleFault); + if (message instanceof MailboxMessage) { + sendMailboxMessage((MailboxMessage) message, listener); + } + else { + log.error("sendMessage failed with exception " + t.getMessage()); + executor.execute(listener::handleFault); + } } }); } + private void sendMailboxMessage(MailboxMessage message, SendMessageListener listener) { + EncryptionService.Tuple tuple = encryptionService.encryptObject(user.getP2pEncryptKeyPair().getPublic(), message); + + EncryptedMailboxMessage encrypted = new EncryptedMailboxMessage(tuple); + mailboxService.addMessage(user.getP2PSigPubKey(), encrypted, + () -> { + log.debug("Message successfully added to peers mailbox."); + executor.execute(listener::handleResult); + }, + (errorMessage, throwable) -> { + log.error("Message failed to add to peers mailbox."); + executor.execute(listener::handleFault); + } + ); + } + @Override public void addMessageHandler(MessageHandler listener) { if (!messageHandlers.add(listener)) diff --git a/core/src/main/java/io/bitsquare/trade/TradeManager.java b/core/src/main/java/io/bitsquare/trade/TradeManager.java index 3853226b55..6bd05aad06 100644 --- a/core/src/main/java/io/bitsquare/trade/TradeManager.java +++ b/core/src/main/java/io/bitsquare/trade/TradeManager.java @@ -164,7 +164,7 @@ public class TradeManager { } public boolean isMyOffer(Offer offer) { - return offer.getMessagePublicKey().equals(user.getMessagePubKey()); + return offer.getMessagePublicKey().equals(user.getP2PSigPubKey()); } @@ -206,7 +206,7 @@ public class TradeManager { FiatAccount currentFiatAccount = user.getCurrentBankAccount().get(); Offer offer = new Offer(id, - user.getMessagePubKey(), + user.getP2PSigPubKey(), direction, price.getValue(), amount, diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/messages/BankTransferStartedMessage.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/messages/BankTransferStartedMessage.java index ede9b6be7f..fc4e0b9bb3 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/trade/messages/BankTransferStartedMessage.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/messages/BankTransferStartedMessage.java @@ -17,11 +17,13 @@ package io.bitsquare.trade.protocol.trade.messages; +import io.bitsquare.p2p.MailboxMessage; + import org.bitcoinj.core.Coin; import java.io.Serializable; -public class BankTransferStartedMessage extends TradeMessage implements Serializable { +public class BankTransferStartedMessage extends TradeMessage implements MailboxMessage, Serializable { private static final long serialVersionUID = -3479634129543632523L; public final byte[] offererSignature; diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/models/BuyerAsOffererModel.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/models/BuyerAsOffererModel.java index ce6ec6d579..e7c138dbaf 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/models/BuyerAsOffererModel.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/models/BuyerAsOffererModel.java @@ -37,7 +37,7 @@ public class BuyerAsOffererModel extends SharedTradeModel implements Serializabl private static final Logger log = LoggerFactory.getLogger(BuyerAsOffererModel.class); transient public final Trade trade; - public final MailboxService mailboxService; + transient public final MailboxService mailboxService; public final TakerModel taker; public final OffererModel offerer; @@ -82,7 +82,7 @@ public class BuyerAsOffererModel extends SharedTradeModel implements Serializabl offerer.addressEntry = walletService.getAddressEntry(id); offerer.fiatAccount = user.getBankAccount(offer.getBankAccountId()); offerer.accountId = user.getAccountId(); - offerer.messagePubKey = user.getMessagePubKey(); + offerer.p2pSigPubKey = user.getP2PSigPubKey(); offerer.pubKey = offerer.addressEntry.getPubKey(); log.debug("BuyerAsOffererModel addressEntry " + offerer.addressEntry); } diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/models/OffererModel.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/models/OffererModel.java index 31a1198223..11c14ed532 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/models/OffererModel.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/models/OffererModel.java @@ -37,7 +37,7 @@ public class OffererModel implements Serializable { // Declared transient as they will be provided in any case at construction time transient public FiatAccount fiatAccount; transient public String accountId; - transient public PublicKey messagePubKey; + transient public PublicKey p2pSigPubKey; transient public byte[] registrationPubKey; transient public DeterministicKey registrationKeyPair; transient public AddressEntry addressEntry; diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/models/TakerModel.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/models/TakerModel.java index ca4f649cf1..c8de735e2f 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/models/TakerModel.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/models/TakerModel.java @@ -37,7 +37,7 @@ public class TakerModel implements Serializable { public Peer peer; public String accountId; public FiatAccount fiatAccount; - public PublicKey messagePublicKey; + public PublicKey p2pSigPublicKey; public String contractAsJson;//TODO only write access now, missing impl. public String contractSignature; public Coin payoutAmount; diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/ProcessRequestOffererPublishDepositTxMessage.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/ProcessRequestOffererPublishDepositTxMessage.java index 6fcfc5a241..68055e08e4 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/ProcessRequestOffererPublishDepositTxMessage.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/ProcessRequestOffererPublishDepositTxMessage.java @@ -43,7 +43,7 @@ public class ProcessRequestOffererPublishDepositTxMessage extends Task { model.taker.accountId, model.offerer.fiatAccount, model.taker.fiatAccount, - model.offerer.messagePubKey, - model.taker.messagePublicKey); + model.offerer.p2pSigPubKey, + model.taker.p2pSigPublicKey); String contractAsJson = Utilities.objectToJson(contract); String signature = model.signatureService.signMessage(model.offerer.registrationKeyPair, contractAsJson); diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/models/SellerAsTakerModel.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/models/SellerAsTakerModel.java index f156ea034d..82eb18d237 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/models/SellerAsTakerModel.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/models/SellerAsTakerModel.java @@ -86,7 +86,7 @@ public class SellerAsTakerModel extends SharedTradeModel implements Serializable taker.addressEntry = walletService.getAddressEntry(id); taker.fiatAccount = user.getBankAccount(offer.getBankAccountId()); taker.accountId = user.getAccountId(); - taker.messagePubKey = user.getMessagePubKey(); + taker.p2pSigPubKey = user.getP2PSigPubKey(); taker.pubKey = taker.addressEntry.getPubKey(); } diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/models/TakerModel.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/models/TakerModel.java index d71e9998d1..20f4e0dcea 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/models/TakerModel.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/models/TakerModel.java @@ -38,7 +38,7 @@ public class TakerModel implements Serializable { // Declared transient as they will be provided in any case at construction time transient public FiatAccount fiatAccount; transient public String accountId; - transient public PublicKey messagePubKey; + transient public PublicKey p2pSigPubKey; transient public byte[] registrationPubKey; // TODO not read yet, missing impl. transient public DeterministicKey registrationKeyPair; transient public AddressEntry addressEntry; diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/CreateAndSignContract.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/CreateAndSignContract.java index 842ade3366..2674f7046d 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/CreateAndSignContract.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/CreateAndSignContract.java @@ -46,7 +46,7 @@ public class CreateAndSignContract extends Task { model.offerer.fiatAccount, model.taker.fiatAccount, model.offer.getMessagePublicKey(), - model.taker.messagePubKey); + model.taker.p2pSigPubKey); String contractAsJson = Utilities.objectToJson(contract); String signature = model.signatureService.signMessage(model.taker.registrationKeyPair, contractAsJson); diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/SendSignedTakerDepositTx.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/SendSignedTakerDepositTx.java index ca012ecdeb..c481fceec3 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/SendSignedTakerDepositTx.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/SendSignedTakerDepositTx.java @@ -39,7 +39,7 @@ public class SendSignedTakerDepositTx extends Task { model.id, model.taker.fiatAccount, model.taker.accountId, - model.taker.messagePubKey, + model.taker.p2pSigPubKey, model.trade.getContractAsJson(), model.trade.getTakerContractSignature(), model.taker.addressEntry.getAddressString(), diff --git a/core/src/main/java/io/bitsquare/user/User.java b/core/src/main/java/io/bitsquare/user/User.java index 84d0042ab9..ebbd0e97f2 100644 --- a/core/src/main/java/io/bitsquare/user/User.java +++ b/core/src/main/java/io/bitsquare/user/User.java @@ -175,7 +175,7 @@ public class User implements Serializable { return p2pSigKeyPair; } - public PublicKey getMessagePubKey() { + public PublicKey getP2PSigPubKey() { return p2pSigKeyPair.getPublic(); } diff --git a/core/src/test/java/io/bitsquare/trade/protocol/placeoffer/PlaceOfferProtocolTest.java b/core/src/test/java/io/bitsquare/trade/protocol/placeoffer/PlaceOfferProtocolTest.java index e702507d51..88522615cd 100644 --- a/core/src/test/java/io/bitsquare/trade/protocol/placeoffer/PlaceOfferProtocolTest.java +++ b/core/src/test/java/io/bitsquare/trade/protocol/placeoffer/PlaceOfferProtocolTest.java @@ -96,7 +96,7 @@ public class PlaceOfferProtocolTest { user.applyPersistedUser(null); bootstrappedPeerBuilder = new BootstrappedPeerBuilder(Node.DEFAULT_PORT, false, bootstrapNode, ""); tomP2PNode = new TomP2PNode(bootstrappedPeerBuilder); - messageService = new TomP2PMessageService(tomP2PNode); + messageService = new TomP2PMessageService(tomP2PNode, null, null, null); Observable messageObservable = tomP2PNode.bootstrap(user.getP2pSigKeyPair()); messageObservable.publish();