From 22814d15f84b5f2ba05b5fd2506563ab82b74609 Mon Sep 17 00:00:00 2001 From: sqrrm Date: Tue, 16 Jun 2020 20:41:41 +0200 Subject: [PATCH] Publish own witness received as trade message --- .../account/sign/SignedWitnessService.java | 18 +++++++++++++++++- .../witness/AccountAgeWitnessService.java | 4 ++++ .../core/trade/protocol/TradeProtocol.java | 14 ++++++++++++++ 3 files changed, 35 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/bisq/core/account/sign/SignedWitnessService.java b/core/src/main/java/bisq/core/account/sign/SignedWitnessService.java index d5d9b0a828b..a926045df4e 100644 --- a/core/src/main/java/bisq/core/account/sign/SignedWitnessService.java +++ b/core/src/main/java/bisq/core/account/sign/SignedWitnessService.java @@ -204,6 +204,17 @@ public Set getSignedWitnessSetByOwnerPubKey(byte[] ownerPubKey) { .collect(Collectors.toSet()); } + public boolean publishOwnSignedWitness(SignedWitness signedWitness) { + if (!Arrays.equals(signedWitness.getWitnessOwnerPubKey(), keyRing.getPubKeyRing().getSignaturePubKeyBytes()) || + !verifySigner(signedWitness)) { + return false; + } + + log.info("Publish own signedWitness {}", signedWitness); + publishSignedWitness(signedWitness); + return true; + } + // Arbitrators sign with EC key public void signAccountAgeWitness(Coin tradeAmount, AccountAgeWitness accountAgeWitness, @@ -395,6 +406,11 @@ public boolean isSufficientTradeAmountForSigning(Coin tradeAmount) { return !tradeAmount.isLessThan(MINIMUM_TRADE_AMOUNT_FOR_SIGNING); } + private boolean verifySigner(SignedWitness signedWitness) { + return getSignedWitnessSetByOwnerPubKey(signedWitness.getWitnessOwnerPubKey(), new Stack<>()).stream() + .anyMatch(w -> isValidSignerWitnessInternal(w, signedWitness.getDate(), new Stack<>())); + } + /** * Checks whether the accountAgeWitness has a valid signature from a peer/arbitrator and is allowed to sign * other accounts. @@ -419,7 +435,7 @@ private boolean isSignerAccountAgeWitness(AccountAgeWitness accountAgeWitness, l * Helper to isValidAccountAgeWitness(accountAgeWitness) * * @param signedWitness the signedWitness to validate - * @param childSignedWitnessDateMillis the date the child SignedWitness was signed or current time if it is a leave. + * @param childSignedWitnessDateMillis the date the child SignedWitness was signed or current time if it is a leaf. * @param excludedPubKeys stack to prevent recursive loops * @return true if signedWitness is valid, false otherwise. */ diff --git a/core/src/main/java/bisq/core/account/witness/AccountAgeWitnessService.java b/core/src/main/java/bisq/core/account/witness/AccountAgeWitnessService.java index ff2a622f9d9..f4620c7d0e2 100644 --- a/core/src/main/java/bisq/core/account/witness/AccountAgeWitnessService.java +++ b/core/src/main/java/bisq/core/account/witness/AccountAgeWitnessService.java @@ -685,6 +685,10 @@ public Optional traderSignPeersAccountAgeWitness(Trade trade) { return Optional.empty(); } + public boolean publishOwnSignedWitness(SignedWitness signedWitness) { + return signedWitnessService.publishOwnSignedWitness(signedWitness); + } + // Arbitrator signing public List getTraderPaymentAccounts(long safeDate, PaymentMethod paymentMethod, diff --git a/core/src/main/java/bisq/core/trade/protocol/TradeProtocol.java b/core/src/main/java/bisq/core/trade/protocol/TradeProtocol.java index cc2a59c3187..d15e9b1f5d2 100644 --- a/core/src/main/java/bisq/core/trade/protocol/TradeProtocol.java +++ b/core/src/main/java/bisq/core/trade/protocol/TradeProtocol.java @@ -26,6 +26,7 @@ import bisq.core.trade.messages.MediatedPayoutTxSignatureMessage; import bisq.core.trade.messages.PeerPublishedDelayedPayoutTxMessage; import bisq.core.trade.messages.TradeMessage; +import bisq.core.trade.messages.TraderSignedWitnessMessage; import bisq.core.trade.protocol.tasks.ApplyFilter; import bisq.core.trade.protocol.tasks.ProcessPeerPublishedDelayedPayoutTxMessage; import bisq.core.trade.protocol.tasks.mediation.BroadcastMediatedPayoutTx; @@ -228,6 +229,15 @@ private void handle(PeerPublishedDelayedPayoutTxMessage tradeMessage, NodeAddres taskRunner.run(); } + /////////////////////////////////////////////////////////////////////////////////////////// + // Peer has sent a SignedWitness + /////////////////////////////////////////////////////////////////////////////////////////// + + private void handle(TraderSignedWitnessMessage tradeMessage, NodeAddress sender) { + // Publish signed witness, if it is valid and ours + processModel.getAccountAgeWitnessService().publishOwnSignedWitness(tradeMessage.getSignedWitness()); + } + /////////////////////////////////////////////////////////////////////////////////////////// // Dispatcher @@ -240,6 +250,8 @@ protected void doHandleDecryptedMessage(TradeMessage tradeMessage, NodeAddress s handle((MediatedPayoutTxPublishedMessage) tradeMessage, sender); } else if (tradeMessage instanceof PeerPublishedDelayedPayoutTxMessage) { handle((PeerPublishedDelayedPayoutTxMessage) tradeMessage, sender); + } else if (tradeMessage instanceof TraderSignedWitnessMessage) { + handle((TraderSignedWitnessMessage) tradeMessage, sender); } } @@ -287,6 +299,8 @@ protected void doApplyMailboxTradeMessage(TradeMessage tradeMessage, NodeAddress handle((MediatedPayoutTxPublishedMessage) tradeMessage, peerNodeAddress); } else if (tradeMessage instanceof PeerPublishedDelayedPayoutTxMessage) { handle((PeerPublishedDelayedPayoutTxMessage) tradeMessage, peerNodeAddress); + } else if (tradeMessage instanceof TraderSignedWitnessMessage) { + handle((TraderSignedWitnessMessage) tradeMessage, peerNodeAddress); } }