mirror of
https://github.com/haveno-dex/haveno.git
synced 2025-08-13 17:05:40 -04:00
use byte[] for signatures instead of strings
This commit is contained in:
parent
ead70751dc
commit
4650003838
23 changed files with 265 additions and 255 deletions
|
@ -23,6 +23,7 @@ import com.google.common.base.CaseFormat;
|
|||
import com.google.common.base.Charsets;
|
||||
import haveno.common.config.Config;
|
||||
import haveno.common.crypto.Hash;
|
||||
import haveno.common.crypto.KeyRing;
|
||||
import haveno.common.crypto.PubKeyRing;
|
||||
import haveno.common.crypto.Sig;
|
||||
import haveno.common.util.Utilities;
|
||||
|
@ -39,7 +40,7 @@ import java.text.DecimalFormat;
|
|||
import java.text.SimpleDateFormat;
|
||||
|
||||
import java.net.URI;
|
||||
|
||||
import java.security.PrivateKey;
|
||||
import java.math.BigDecimal;
|
||||
import java.math.BigInteger;
|
||||
|
||||
|
@ -236,6 +237,170 @@ public class HavenoUtils {
|
|||
return feePerXmrAsDecimal.multiply(amountMultiplier).toBigInteger();
|
||||
}
|
||||
|
||||
// ------------------------ SIGNING AND VERIFYING -------------------------
|
||||
|
||||
public static byte[] sign(KeyRing keyRing, String message) {
|
||||
return sign(keyRing.getSignatureKeyPair().getPrivate(), message);
|
||||
}
|
||||
|
||||
public static byte[] sign(PrivateKey privateKey, String message) {
|
||||
return sign(privateKey, message.getBytes(Charsets.UTF_8));
|
||||
}
|
||||
|
||||
public static byte[] sign(PrivateKey privateKey, byte[] bytes) {
|
||||
try {
|
||||
return Sig.sign(privateKey, bytes);
|
||||
} catch (Exception e) {
|
||||
throw new IllegalArgumentException(e);
|
||||
}
|
||||
}
|
||||
|
||||
public static void verifySignature(PubKeyRing pubKeyRing, String message, byte[] signature) {
|
||||
verifySignature(pubKeyRing, message.getBytes(Charsets.UTF_8), signature);
|
||||
}
|
||||
|
||||
public static void verifySignature(PubKeyRing pubKeyRing, byte[] bytes, byte[] signature) {
|
||||
try {
|
||||
Sig.verify(pubKeyRing.getSignaturePubKey(), bytes, signature);
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
public static boolean isSignatureValid(PubKeyRing pubKeyRing, String message, byte[] signature) {
|
||||
return isSignatureValid(pubKeyRing, message.getBytes(Charsets.UTF_8), signature);
|
||||
}
|
||||
|
||||
public static boolean isSignatureValid(PubKeyRing pubKeyRing, byte[] bytes, byte[] signature) {
|
||||
try {
|
||||
verifySignature(pubKeyRing, bytes, signature);
|
||||
return true;
|
||||
} catch (Exception e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if the arbitrator signature is valid for an offer.
|
||||
*
|
||||
* @param offer is a signed offer with payload
|
||||
* @param arbitrator is the original signing arbitrator
|
||||
* @return true if the arbitrator's signature is valid for the offer
|
||||
*/
|
||||
public static boolean isArbitratorSignatureValid(Offer offer, Arbitrator arbitrator) {
|
||||
|
||||
// copy offer payload
|
||||
OfferPayload offerPayloadCopy = OfferPayload.fromProto(offer.toProtoMessage().getOfferPayload());
|
||||
|
||||
// remove arbitrator signature from signed payload
|
||||
byte[] signature = offerPayloadCopy.getArbitratorSignature();
|
||||
offerPayloadCopy.setArbitratorSignature(null);
|
||||
|
||||
// get unsigned offer payload as json string
|
||||
String unsignedOfferAsJson = JsonUtil.objectToJson(offerPayloadCopy);
|
||||
|
||||
// verify signature
|
||||
return isSignatureValid(arbitrator.getPubKeyRing(), unsignedOfferAsJson, signature);
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if the maker signature for a trade request is valid.
|
||||
*
|
||||
* @param request is the trade request to check
|
||||
* @return true if the maker's signature is valid for the trade request
|
||||
*/
|
||||
public static boolean isMakerSignatureValid(InitTradeRequest request, byte[] signature, PubKeyRing makerPubKeyRing) {
|
||||
|
||||
// re-create trade request with signed fields
|
||||
InitTradeRequest signedRequest = new InitTradeRequest(
|
||||
request.getTradeId(),
|
||||
request.getSenderNodeAddress(),
|
||||
request.getPubKeyRing(),
|
||||
request.getTradeAmount(),
|
||||
request.getTradePrice(),
|
||||
request.getTradeFee(),
|
||||
request.getAccountId(),
|
||||
request.getPaymentAccountId(),
|
||||
request.getPaymentMethodId(),
|
||||
request.getUid(),
|
||||
request.getMessageVersion(),
|
||||
request.getAccountAgeWitnessSignatureOfOfferId(),
|
||||
request.getCurrentDate(),
|
||||
request.getMakerNodeAddress(),
|
||||
request.getTakerNodeAddress(),
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
request.getPayoutAddress(),
|
||||
null
|
||||
);
|
||||
|
||||
// get trade request as string
|
||||
String tradeRequestAsJson = JsonUtil.objectToJson(signedRequest);
|
||||
|
||||
// verify maker signature
|
||||
return isSignatureValid(makerPubKeyRing, tradeRequestAsJson, signature);
|
||||
}
|
||||
|
||||
/**
|
||||
* Verify the buyer signature for a PaymentSentMessage.
|
||||
*
|
||||
* @param trade - the trade to verify
|
||||
* @param message - signed payment sent message to verify
|
||||
* @return true if the buyer's signature is valid for the message
|
||||
*/
|
||||
public static void verifyPaymentSentMessage(Trade trade, PaymentSentMessage message) {
|
||||
|
||||
// remove signature from message
|
||||
byte[] signature = message.getBuyerSignature();
|
||||
message.setBuyerSignature(null);
|
||||
|
||||
// get unsigned message as json string
|
||||
String unsignedMessageAsJson = JsonUtil.objectToJson(message);
|
||||
|
||||
// replace signature
|
||||
message.setBuyerSignature(signature);
|
||||
|
||||
// verify signature
|
||||
if (!isSignatureValid(trade.getBuyer().getPubKeyRing(), unsignedMessageAsJson, signature)) {
|
||||
throw new IllegalArgumentException("The buyer signature is invalid for the " + message.getClass().getSimpleName() + " for " + trade.getClass().getSimpleName() + " " + trade.getId());
|
||||
}
|
||||
|
||||
// verify trade id
|
||||
if (!trade.getId().equals(message.getTradeId())) throw new IllegalArgumentException("The " + message.getClass().getSimpleName() + " has the wrong trade id, expected " + trade.getId() + " but was " + message.getTradeId());
|
||||
}
|
||||
|
||||
/**
|
||||
* Verify the seller signature for a PaymentReceivedMessage.
|
||||
*
|
||||
* @param trade - the trade to verify
|
||||
* @param message - signed payment received message to verify
|
||||
* @return true if the seller's signature is valid for the message
|
||||
*/
|
||||
public static void verifyPaymentReceivedMessage(Trade trade, PaymentReceivedMessage message) {
|
||||
|
||||
// remove signature from message
|
||||
byte[] signature = message.getSellerSignature();
|
||||
message.setSellerSignature(null);
|
||||
|
||||
// get unsigned message as json string
|
||||
String unsignedMessageAsJson = JsonUtil.objectToJson(message);
|
||||
|
||||
// replace signature
|
||||
message.setSellerSignature(signature);
|
||||
|
||||
// verify signature
|
||||
if (!isSignatureValid(trade.getSeller().getPubKeyRing(), unsignedMessageAsJson, signature)) {
|
||||
throw new IllegalArgumentException("The seller signature is invalid for the " + message.getClass().getSimpleName() + " for " + trade.getClass().getSimpleName() + " " + trade.getId());
|
||||
}
|
||||
|
||||
// verify trade id
|
||||
if (!trade.getId().equals(message.getTradeId())) throw new IllegalArgumentException("The " + message.getClass().getSimpleName() + " has the wrong trade id, expected " + trade.getId() + " but was " + message.getTradeId());
|
||||
|
||||
// verify buyer signature of payment sent message
|
||||
verifyPaymentSentMessage(trade, message.getPaymentSentMessage());
|
||||
}
|
||||
|
||||
// ----------------------------- OTHER UTILS ------------------------------
|
||||
|
||||
|
@ -282,144 +447,6 @@ public class HavenoUtils {
|
|||
return Utilities.bytesAsHexString(Hash.getSha256Ripemd160hash(uniqueId.getBytes(Charsets.UTF_8)));
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if the arbitrator signature is valid for an offer.
|
||||
*
|
||||
* @param offer is a signed offer with payload
|
||||
* @param arbitrator is the original signing arbitrator
|
||||
* @return true if the arbitrator's signature is valid for the offer
|
||||
*/
|
||||
public static boolean isArbitratorSignatureValid(Offer offer, Arbitrator arbitrator) {
|
||||
|
||||
// copy offer payload
|
||||
OfferPayload offerPayloadCopy = OfferPayload.fromProto(offer.toProtoMessage().getOfferPayload());
|
||||
|
||||
// remove arbitrator signature from signed payload
|
||||
String signature = offerPayloadCopy.getArbitratorSignature();
|
||||
offerPayloadCopy.setArbitratorSignature(null);
|
||||
|
||||
// get unsigned offer payload as json string
|
||||
String unsignedOfferAsJson = JsonUtil.objectToJson(offerPayloadCopy);
|
||||
|
||||
// verify arbitrator signature
|
||||
try {
|
||||
return Sig.verify(arbitrator.getPubKeyRing().getSignaturePubKey(), unsignedOfferAsJson, signature);
|
||||
} catch (Exception e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if the maker signature for a trade request is valid.
|
||||
*
|
||||
* @param request is the trade request to check
|
||||
* @return true if the maker's signature is valid for the trade request
|
||||
*/
|
||||
public static boolean isMakerSignatureValid(InitTradeRequest request, String signature, PubKeyRing makerPubKeyRing) {
|
||||
|
||||
// re-create trade request with signed fields
|
||||
InitTradeRequest signedRequest = new InitTradeRequest(
|
||||
request.getTradeId(),
|
||||
request.getSenderNodeAddress(),
|
||||
request.getPubKeyRing(),
|
||||
request.getTradeAmount(),
|
||||
request.getTradePrice(),
|
||||
request.getTradeFee(),
|
||||
request.getAccountId(),
|
||||
request.getPaymentAccountId(),
|
||||
request.getPaymentMethodId(),
|
||||
request.getUid(),
|
||||
request.getMessageVersion(),
|
||||
request.getAccountAgeWitnessSignatureOfOfferId(),
|
||||
request.getCurrentDate(),
|
||||
request.getMakerNodeAddress(),
|
||||
request.getTakerNodeAddress(),
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
request.getPayoutAddress(),
|
||||
null
|
||||
);
|
||||
|
||||
// get trade request as string
|
||||
String tradeRequestAsJson = JsonUtil.objectToJson(signedRequest);
|
||||
|
||||
// verify maker signature
|
||||
try {
|
||||
return Sig.verify(makerPubKeyRing.getSignaturePubKey(),
|
||||
tradeRequestAsJson,
|
||||
signature);
|
||||
} catch (Exception e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Verify the buyer signature for a PaymentSentMessage.
|
||||
*
|
||||
* @param trade - the trade to verify
|
||||
* @param message - signed payment sent message to verify
|
||||
* @return true if the buyer's signature is valid for the message
|
||||
*/
|
||||
public static void verifyPaymentSentMessage(Trade trade, PaymentSentMessage message) {
|
||||
|
||||
// remove signature from message
|
||||
byte[] signature = message.getBuyerSignature();
|
||||
message.setBuyerSignature(null);
|
||||
|
||||
// get unsigned message as json string
|
||||
String unsignedMessageAsJson = JsonUtil.objectToJson(message);
|
||||
|
||||
// replace signature
|
||||
message.setBuyerSignature(signature);
|
||||
|
||||
// verify signature
|
||||
String errMessage = "The buyer signature is invalid for the " + message.getClass().getSimpleName() + " for " + trade.getClass().getSimpleName() + " " + trade.getId();
|
||||
try {
|
||||
if (!Sig.verify(trade.getBuyer().getPubKeyRing().getSignaturePubKey(), unsignedMessageAsJson.getBytes(Charsets.UTF_8), signature)) throw new IllegalArgumentException(errMessage);
|
||||
} catch (Exception e) {
|
||||
throw new IllegalArgumentException(errMessage);
|
||||
}
|
||||
|
||||
// verify trade id
|
||||
if (!trade.getId().equals(message.getTradeId())) throw new IllegalArgumentException("The " + message.getClass().getSimpleName() + " has the wrong trade id, expected " + trade.getId() + " but was " + message.getTradeId());
|
||||
}
|
||||
|
||||
/**
|
||||
* Verify the seller signature for a PaymentReceivedMessage.
|
||||
*
|
||||
* @param trade - the trade to verify
|
||||
* @param message - signed payment received message to verify
|
||||
* @return true if the seller's signature is valid for the message
|
||||
*/
|
||||
public static void verifyPaymentReceivedMessage(Trade trade, PaymentReceivedMessage message) {
|
||||
|
||||
// remove signature from message
|
||||
byte[] signature = message.getSellerSignature();
|
||||
message.setSellerSignature(null);
|
||||
|
||||
// get unsigned message as json string
|
||||
String unsignedMessageAsJson = JsonUtil.objectToJson(message);
|
||||
|
||||
// replace signature
|
||||
message.setSellerSignature(signature);
|
||||
|
||||
// verify signature
|
||||
String errMessage = "The seller signature is invalid for the " + message.getClass().getSimpleName() + " for " + trade.getClass().getSimpleName() + " " + trade.getId();
|
||||
try {
|
||||
if (!Sig.verify(trade.getSeller().getPubKeyRing().getSignaturePubKey(), unsignedMessageAsJson.getBytes(Charsets.UTF_8), signature)) throw new IllegalArgumentException(errMessage);
|
||||
} catch (Exception e) {
|
||||
throw new IllegalArgumentException(errMessage);
|
||||
}
|
||||
|
||||
// verify trade id
|
||||
if (!trade.getId().equals(message.getTradeId())) throw new IllegalArgumentException("The " + message.getClass().getSimpleName() + " has the wrong trade id, expected " + trade.getId() + " but was " + message.getTradeId());
|
||||
|
||||
// verify buyer signature of payment sent message
|
||||
verifyPaymentSentMessage(trade, message.getPaymentSentMessage());
|
||||
}
|
||||
|
||||
public static void awaitLatch(CountDownLatch latch) {
|
||||
try {
|
||||
latch.await();
|
||||
|
|
|
@ -19,6 +19,7 @@ package haveno.core.trade.messages;
|
|||
|
||||
import com.google.protobuf.ByteString;
|
||||
import haveno.common.proto.ProtoUtil;
|
||||
import haveno.common.util.Utilities;
|
||||
import haveno.core.proto.CoreProtoResolver;
|
||||
import haveno.network.p2p.DirectMessage;
|
||||
import java.util.Optional;
|
||||
|
@ -30,7 +31,7 @@ import lombok.Value;
|
|||
@Value
|
||||
public final class DepositRequest extends TradeMessage implements DirectMessage {
|
||||
private final long currentDate;
|
||||
private final String contractSignature;
|
||||
private final byte[] contractSignature;
|
||||
private final String depositTxHex;
|
||||
private final String depositTxKey;
|
||||
@Nullable
|
||||
|
@ -40,7 +41,7 @@ public final class DepositRequest extends TradeMessage implements DirectMessage
|
|||
String uid,
|
||||
String messageVersion,
|
||||
long currentDate,
|
||||
String contractSignature,
|
||||
byte[] contractSignature,
|
||||
String depositTxHex,
|
||||
String depositTxKey,
|
||||
@Nullable byte[] paymentAccountKey) {
|
||||
|
@ -62,11 +63,11 @@ public final class DepositRequest extends TradeMessage implements DirectMessage
|
|||
protobuf.DepositRequest.Builder builder = protobuf.DepositRequest.newBuilder()
|
||||
.setTradeId(tradeId)
|
||||
.setUid(uid)
|
||||
.setContractSignature(contractSignature)
|
||||
.setDepositTxHex(depositTxHex)
|
||||
.setDepositTxKey(depositTxKey);
|
||||
builder.setCurrentDate(currentDate);
|
||||
Optional.ofNullable(paymentAccountKey).ifPresent(e -> builder.setPaymentAccountKey(ByteString.copyFrom(e)));
|
||||
Optional.ofNullable(contractSignature).ifPresent(e -> builder.setContractSignature(ByteString.copyFrom(e)));
|
||||
|
||||
return getNetworkEnvelopeBuilder().setDepositRequest(builder).build();
|
||||
}
|
||||
|
@ -78,7 +79,7 @@ public final class DepositRequest extends TradeMessage implements DirectMessage
|
|||
proto.getUid(),
|
||||
messageVersion,
|
||||
proto.getCurrentDate(),
|
||||
proto.getContractSignature(),
|
||||
ProtoUtil.byteArrayOrNullFromProto(proto.getContractSignature()),
|
||||
proto.getDepositTxHex(),
|
||||
proto.getDepositTxKey(),
|
||||
ProtoUtil.byteArrayOrNullFromProto(proto.getPaymentAccountKey()));
|
||||
|
@ -88,7 +89,7 @@ public final class DepositRequest extends TradeMessage implements DirectMessage
|
|||
public String toString() {
|
||||
return "DepositRequest {" +
|
||||
",\n currentDate=" + currentDate +
|
||||
",\n contractSignature=" + contractSignature +
|
||||
",\n contractSignature=" + Utilities.bytesAsHexString(contractSignature) +
|
||||
",\n depositTxHex='" + depositTxHex +
|
||||
",\n depositTxKey='" + depositTxKey +
|
||||
",\n paymentAccountKey='" + paymentAccountKey +
|
||||
|
|
|
@ -62,7 +62,7 @@ public final class InitTradeRequest extends TradeMessage implements DirectMessag
|
|||
@Nullable
|
||||
private final String payoutAddress;
|
||||
@Nullable
|
||||
private final String makerSignature;
|
||||
private final byte[] makerSignature;
|
||||
|
||||
public InitTradeRequest(String tradeId,
|
||||
NodeAddress senderNodeAddress,
|
||||
|
@ -84,7 +84,7 @@ public final class InitTradeRequest extends TradeMessage implements DirectMessag
|
|||
@Nullable String reserveTxHex,
|
||||
@Nullable String reserveTxKey,
|
||||
@Nullable String payoutAddress,
|
||||
@Nullable String makerSignature) {
|
||||
@Nullable byte[] makerSignature) {
|
||||
super(messageVersion, tradeId, uid);
|
||||
this.senderNodeAddress = senderNodeAddress;
|
||||
this.pubKeyRing = pubKeyRing;
|
||||
|
@ -133,7 +133,7 @@ public final class InitTradeRequest extends TradeMessage implements DirectMessag
|
|||
Optional.ofNullable(reserveTxKey).ifPresent(e -> builder.setReserveTxKey(reserveTxKey));
|
||||
Optional.ofNullable(payoutAddress).ifPresent(e -> builder.setPayoutAddress(payoutAddress));
|
||||
Optional.ofNullable(accountAgeWitnessSignatureOfOfferId).ifPresent(e -> builder.setAccountAgeWitnessSignatureOfOfferId(ByteString.copyFrom(e)));
|
||||
Optional.ofNullable(makerSignature).ifPresent(e -> builder.setMakerSignature(makerSignature));
|
||||
Optional.ofNullable(makerSignature).ifPresent(e -> builder.setMakerSignature(ByteString.copyFrom(e)));
|
||||
builder.setCurrentDate(currentDate);
|
||||
|
||||
return getNetworkEnvelopeBuilder().setInitTradeRequest(builder).build();
|
||||
|
@ -162,7 +162,7 @@ public final class InitTradeRequest extends TradeMessage implements DirectMessag
|
|||
ProtoUtil.stringOrNullFromProto(proto.getReserveTxHex()),
|
||||
ProtoUtil.stringOrNullFromProto(proto.getReserveTxKey()),
|
||||
ProtoUtil.stringOrNullFromProto(proto.getPayoutAddress()),
|
||||
ProtoUtil.stringOrNullFromProto(proto.getMakerSignature()));
|
||||
ProtoUtil.byteArrayOrNullFromProto(proto.getMakerSignature()));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -183,7 +183,7 @@ public final class InitTradeRequest extends TradeMessage implements DirectMessag
|
|||
",\n reserveTxHex=" + reserveTxHex +
|
||||
",\n reserveTxKey=" + reserveTxKey +
|
||||
",\n payoutAddress=" + payoutAddress +
|
||||
",\n makerSignature=" + makerSignature +
|
||||
",\n makerSignature=" + Utilities.byteArrayToInteger(makerSignature) +
|
||||
"\n} " + super.toString();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -18,11 +18,10 @@
|
|||
package haveno.core.trade.messages;
|
||||
|
||||
import com.google.protobuf.ByteString;
|
||||
import haveno.common.crypto.PubKeyRing;
|
||||
import haveno.common.proto.ProtoUtil;
|
||||
import haveno.common.util.Utilities;
|
||||
import haveno.core.proto.CoreProtoResolver;
|
||||
import haveno.network.p2p.DirectMessage;
|
||||
import haveno.network.p2p.NodeAddress;
|
||||
import java.util.Optional;
|
||||
import javax.annotation.Nullable;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
@ -33,7 +32,7 @@ import lombok.Value;
|
|||
public final class SignContractResponse extends TradeMessage implements DirectMessage {
|
||||
private final long currentDate;
|
||||
private final String contractAsJson;
|
||||
private final String contractSignature;
|
||||
private final byte[] contractSignature;
|
||||
private final byte[] encryptedPaymentAccountPayload;
|
||||
|
||||
public SignContractResponse(String tradeId,
|
||||
|
@ -41,7 +40,7 @@ public final class SignContractResponse extends TradeMessage implements DirectMe
|
|||
String messageVersion,
|
||||
long currentDate,
|
||||
String contractAsJson,
|
||||
String contractSignature,
|
||||
byte[] contractSignature,
|
||||
@Nullable byte[] encryptedPaymentAccountPayload) {
|
||||
super(messageVersion, tradeId, uid);
|
||||
this.currentDate = currentDate;
|
||||
|
@ -62,7 +61,7 @@ public final class SignContractResponse extends TradeMessage implements DirectMe
|
|||
.setUid(uid);
|
||||
|
||||
Optional.ofNullable(contractAsJson).ifPresent(e -> builder.setContractAsJson(contractAsJson));
|
||||
Optional.ofNullable(contractSignature).ifPresent(e -> builder.setContractSignature(contractSignature));
|
||||
Optional.ofNullable(contractSignature).ifPresent(e -> builder.setContractSignature(ByteString.copyFrom(e)));
|
||||
Optional.ofNullable(encryptedPaymentAccountPayload).ifPresent(e -> builder.setEncryptedPaymentAccountPayload(ByteString.copyFrom(e)));
|
||||
|
||||
builder.setCurrentDate(currentDate);
|
||||
|
@ -78,7 +77,7 @@ public final class SignContractResponse extends TradeMessage implements DirectMe
|
|||
messageVersion,
|
||||
proto.getCurrentDate(),
|
||||
ProtoUtil.stringOrNullFromProto(proto.getContractAsJson()),
|
||||
ProtoUtil.stringOrNullFromProto(proto.getContractSignature()),
|
||||
ProtoUtil.byteArrayOrNullFromProto(proto.getContractSignature()),
|
||||
proto.getEncryptedPaymentAccountPayload().toByteArray());
|
||||
}
|
||||
|
||||
|
@ -87,7 +86,7 @@ public final class SignContractResponse extends TradeMessage implements DirectMe
|
|||
return "SignContractResponse {" +
|
||||
",\n currentDate=" + currentDate +
|
||||
",\n contractAsJson='" + contractAsJson +
|
||||
",\n contractSignature='" + contractSignature +
|
||||
",\n contractSignature='" + Utilities.bytesAsHexString(contractSignature) +
|
||||
"\n} " + super.toString();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -137,7 +137,7 @@ public class ProcessModel implements Model, PersistablePayload {
|
|||
transient private TradeMessage tradeMessage;
|
||||
@Getter
|
||||
@Setter
|
||||
private String makerSignature;
|
||||
private byte[] makerSignature;
|
||||
@Nullable
|
||||
@Getter
|
||||
@Setter
|
||||
|
@ -220,7 +220,8 @@ public class ProcessModel implements Model, PersistablePayload {
|
|||
Optional.ofNullable(takeOfferFeeTxId).ifPresent(builder::setTakeOfferFeeTxId);
|
||||
Optional.ofNullable(payoutTxSignature).ifPresent(e -> builder.setPayoutTxSignature(ByteString.copyFrom(payoutTxSignature)));
|
||||
Optional.ofNullable(tempTradePeerNodeAddress).ifPresent(e -> builder.setTempTradePeerNodeAddress(tempTradePeerNodeAddress.toProtoMessage()));
|
||||
Optional.ofNullable(makerSignature).ifPresent(e -> builder.setMakerSignature(makerSignature));
|
||||
Optional.ofNullable(mediatedPayoutTxSignature).ifPresent(e -> builder.setMediatedPayoutTxSignature(ByteString.copyFrom(e)));
|
||||
Optional.ofNullable(makerSignature).ifPresent(e -> builder.setMakerSignature(ByteString.copyFrom(e)));
|
||||
Optional.ofNullable(multisigAddress).ifPresent(e -> builder.setMultisigAddress(multisigAddress));
|
||||
Optional.ofNullable(paymentSentMessage).ifPresent(e -> builder.setPaymentSentMessage(paymentSentMessage.toProtoNetworkEnvelope().getPaymentSentMessage()));
|
||||
Optional.ofNullable(paymentReceivedMessage).ifPresent(e -> builder.setPaymentReceivedMessage(paymentReceivedMessage.toProtoNetworkEnvelope().getPaymentReceivedMessage()));
|
||||
|
@ -245,7 +246,7 @@ public class ProcessModel implements Model, PersistablePayload {
|
|||
processModel.setPayoutTxSignature(ProtoUtil.byteArrayOrNullFromProto(proto.getPayoutTxSignature()));
|
||||
processModel.setTempTradePeerNodeAddress(proto.hasTempTradePeerNodeAddress() ? NodeAddress.fromProto(proto.getTempTradePeerNodeAddress()) : null);
|
||||
processModel.setMediatedPayoutTxSignature(ProtoUtil.byteArrayOrNullFromProto(proto.getMediatedPayoutTxSignature()));
|
||||
processModel.setMakerSignature(proto.getMakerSignature());
|
||||
processModel.setMakerSignature(ProtoUtil.byteArrayOrNullFromProto(proto.getMakerSignature()));
|
||||
processModel.setMultisigAddress(ProtoUtil.stringOrNullFromProto(proto.getMultisigAddress()));
|
||||
|
||||
String paymentSentMessageStateString = ProtoUtil.stringOrNullFromProto(proto.getPaymentSentMessageState());
|
||||
|
|
|
@ -79,7 +79,7 @@ public final class TradePeer implements PersistablePayload {
|
|||
@Nullable
|
||||
private String contractAsJson;
|
||||
@Nullable
|
||||
private String contractSignature;
|
||||
private byte[] contractSignature;
|
||||
|
||||
// added in v 0.6
|
||||
@Nullable
|
||||
|
@ -146,7 +146,7 @@ public final class TradePeer implements PersistablePayload {
|
|||
Optional.ofNullable(paymentAccountPayload).ifPresent(e -> builder.setPaymentAccountPayload((protobuf.PaymentAccountPayload) e.toProtoMessage()));
|
||||
Optional.ofNullable(payoutAddressString).ifPresent(builder::setPayoutAddressString);
|
||||
Optional.ofNullable(contractAsJson).ifPresent(builder::setContractAsJson);
|
||||
Optional.ofNullable(contractSignature).ifPresent(builder::setContractSignature);
|
||||
Optional.ofNullable(contractSignature).ifPresent(e -> builder.setContractSignature(ByteString.copyFrom(e)));
|
||||
Optional.ofNullable(pubKeyRing).ifPresent(e -> builder.setPubKeyRing(e.toProtoMessage()));
|
||||
Optional.ofNullable(accountAgeWitnessNonce).ifPresent(e -> builder.setAccountAgeWitnessNonce(ByteString.copyFrom(e)));
|
||||
Optional.ofNullable(accountAgeWitnessSignature).ifPresent(e -> builder.setAccountAgeWitnessSignature(ByteString.copyFrom(e)));
|
||||
|
@ -185,7 +185,7 @@ public final class TradePeer implements PersistablePayload {
|
|||
tradePeer.setPaymentAccountPayload(proto.hasPaymentAccountPayload() ? coreProtoResolver.fromProto(proto.getPaymentAccountPayload()) : null);
|
||||
tradePeer.setPayoutAddressString(ProtoUtil.stringOrNullFromProto(proto.getPayoutAddressString()));
|
||||
tradePeer.setContractAsJson(ProtoUtil.stringOrNullFromProto(proto.getContractAsJson()));
|
||||
tradePeer.setContractSignature(ProtoUtil.stringOrNullFromProto(proto.getContractSignature()));
|
||||
tradePeer.setContractSignature(ProtoUtil.byteArrayOrNullFromProto(proto.getContractSignature()));
|
||||
tradePeer.setPubKeyRing(proto.hasPubKeyRing() ? PubKeyRing.fromProto(proto.getPubKeyRing()) : null);
|
||||
tradePeer.setAccountAgeWitnessNonce(ProtoUtil.byteArrayOrNullFromProto(proto.getAccountAgeWitnessNonce()));
|
||||
tradePeer.setAccountAgeWitnessSignature(ProtoUtil.byteArrayOrNullFromProto(proto.getAccountAgeWitnessSignature()));
|
||||
|
|
|
@ -24,6 +24,7 @@ import haveno.common.crypto.PubKeyRing;
|
|||
import haveno.common.crypto.Sig;
|
||||
import haveno.common.taskrunner.TaskRunner;
|
||||
import haveno.core.offer.Offer;
|
||||
import haveno.core.trade.HavenoUtils;
|
||||
import haveno.core.trade.Trade;
|
||||
import haveno.core.trade.messages.DepositRequest;
|
||||
import haveno.core.trade.messages.DepositResponse;
|
||||
|
@ -58,7 +59,7 @@ public class ArbitratorProcessDepositRequest extends TradeTask {
|
|||
// get contract and signature
|
||||
String contractAsJson = trade.getContractAsJson();
|
||||
DepositRequest request = (DepositRequest) processModel.getTradeMessage(); // TODO (woodser): verify response
|
||||
String signature = request.getContractSignature();
|
||||
byte[] signature = request.getContractSignature();
|
||||
|
||||
// get trader info
|
||||
TradePeer trader = trade.getTradePeer(processModel.getTempTradePeerNodeAddress());
|
||||
|
@ -66,7 +67,9 @@ public class ArbitratorProcessDepositRequest extends TradeTask {
|
|||
PubKeyRing peerPubKeyRing = trader.getPubKeyRing();
|
||||
|
||||
// verify signature
|
||||
if (!Sig.verify(peerPubKeyRing.getSignaturePubKey(), contractAsJson, signature)) throw new RuntimeException("Peer's contract signature is invalid");
|
||||
if (!HavenoUtils.isSignatureValid(peerPubKeyRing, contractAsJson, signature)) {
|
||||
throw new RuntimeException("Peer's contract signature is invalid");
|
||||
}
|
||||
|
||||
// set peer's signature
|
||||
trader.setContractSignature(signature);
|
||||
|
|
|
@ -17,10 +17,8 @@
|
|||
|
||||
package haveno.core.trade.protocol.tasks;
|
||||
|
||||
import com.google.common.base.Charsets;
|
||||
import haveno.common.Timer;
|
||||
import haveno.common.crypto.PubKeyRing;
|
||||
import haveno.common.crypto.Sig;
|
||||
import haveno.common.taskrunner.TaskRunner;
|
||||
import haveno.core.network.MessageState;
|
||||
import haveno.core.trade.HavenoUtils;
|
||||
|
@ -94,7 +92,7 @@ public abstract class BuyerSendPaymentSentMessage extends SendMailboxMessageTask
|
|||
// sign message
|
||||
try {
|
||||
String messageAsJson = JsonUtil.objectToJson(message);
|
||||
byte[] sig = Sig.sign(processModel.getP2PService().getKeyRing().getSignatureKeyPair().getPrivate(), messageAsJson.getBytes(Charsets.UTF_8));
|
||||
byte[] sig = HavenoUtils.sign(processModel.getP2PService().getKeyRing(), messageAsJson);
|
||||
message.setBuyerSignature(sig);
|
||||
processModel.setPaymentSentMessage(message);
|
||||
trade.requestPersistence();
|
||||
|
|
|
@ -22,11 +22,10 @@ import java.util.Date;
|
|||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
|
||||
import com.google.common.base.Charsets;
|
||||
import haveno.common.app.Version;
|
||||
import haveno.common.crypto.Sig;
|
||||
import haveno.common.taskrunner.TaskRunner;
|
||||
import haveno.core.trade.ArbitratorTrade;
|
||||
import haveno.core.trade.HavenoUtils;
|
||||
import haveno.core.trade.MakerTrade;
|
||||
import haveno.core.trade.Trade;
|
||||
import haveno.core.trade.Trade.State;
|
||||
|
@ -90,7 +89,7 @@ public class MaybeSendSignContractRequest extends TradeTask {
|
|||
// maker signs deposit hash nonce to avoid challenge protocol
|
||||
byte[] sig = null;
|
||||
if (trade instanceof MakerTrade) {
|
||||
sig = Sig.sign(processModel.getP2PService().getKeyRing().getSignatureKeyPair().getPrivate(), depositTx.getHash().getBytes(Charsets.UTF_8));
|
||||
sig = HavenoUtils.sign(processModel.getP2PService().getKeyRing(), depositTx.getHash());
|
||||
}
|
||||
|
||||
// create request for peer and arbitrator to sign contract
|
||||
|
|
|
@ -30,10 +30,10 @@ import haveno.common.crypto.Encryption;
|
|||
import haveno.common.crypto.Hash;
|
||||
import haveno.common.crypto.PubKeyRing;
|
||||
import haveno.common.crypto.ScryptUtil;
|
||||
import haveno.common.crypto.Sig;
|
||||
import haveno.common.taskrunner.TaskRunner;
|
||||
import haveno.core.trade.ArbitratorTrade;
|
||||
import haveno.core.trade.Contract;
|
||||
import haveno.core.trade.HavenoUtils;
|
||||
import haveno.core.trade.Trade;
|
||||
import haveno.core.trade.Trade.State;
|
||||
import haveno.core.trade.messages.SignContractRequest;
|
||||
|
@ -85,7 +85,7 @@ public class ProcessSignContractRequest extends TradeTask {
|
|||
// create and sign contract
|
||||
Contract contract = trade.createContract();
|
||||
String contractAsJson = JsonUtil.objectToJson(contract);
|
||||
String signature = Sig.sign(processModel.getKeyRing().getSignatureKeyPair().getPrivate(), contractAsJson);
|
||||
byte[] signature = HavenoUtils.sign(processModel.getKeyRing(), contractAsJson);
|
||||
|
||||
// save contract and signature
|
||||
trade.setContract(contract);
|
||||
|
|
|
@ -20,8 +20,8 @@ package haveno.core.trade.protocol.tasks;
|
|||
|
||||
import haveno.common.app.Version;
|
||||
import haveno.common.crypto.PubKeyRing;
|
||||
import haveno.common.crypto.Sig;
|
||||
import haveno.common.taskrunner.TaskRunner;
|
||||
import haveno.core.trade.HavenoUtils;
|
||||
import haveno.core.trade.Trade;
|
||||
import haveno.core.trade.messages.DepositRequest;
|
||||
import haveno.core.trade.messages.SignContractResponse;
|
||||
|
@ -63,8 +63,8 @@ public class ProcessSignContractResponse extends TradeTask {
|
|||
|
||||
// verify signature
|
||||
// TODO (woodser): transfer contract for convenient comparison?
|
||||
String signature = response.getContractSignature();
|
||||
if (!Sig.verify(peerPubKeyRing.getSignaturePubKey(), contractAsJson, signature)) throw new RuntimeException("Peer's contract signature is invalid");
|
||||
byte[] signature = response.getContractSignature();
|
||||
if (!HavenoUtils.isSignatureValid(peerPubKeyRing, contractAsJson, signature)) throw new RuntimeException("Peer's contract signature is invalid");
|
||||
|
||||
// set peer's signature
|
||||
peer.setContractSignature(signature);
|
||||
|
|
|
@ -22,9 +22,7 @@ import lombok.extern.slf4j.Slf4j;
|
|||
|
||||
import static com.google.common.base.Preconditions.checkNotNull;
|
||||
|
||||
import com.google.common.base.Charsets;
|
||||
import haveno.common.crypto.PubKeyRing;
|
||||
import haveno.common.crypto.Sig;
|
||||
import haveno.common.taskrunner.TaskRunner;
|
||||
import haveno.core.account.sign.SignedWitness;
|
||||
import haveno.core.account.witness.AccountAgeWitnessService;
|
||||
|
@ -92,7 +90,7 @@ public abstract class SellerSendPaymentReceivedMessage extends SendMailboxMessag
|
|||
// sign message
|
||||
try {
|
||||
String messageAsJson = JsonUtil.objectToJson(message);
|
||||
byte[] sig = Sig.sign(processModel.getP2PService().getKeyRing().getSignatureKeyPair().getPrivate(), messageAsJson.getBytes(Charsets.UTF_8));
|
||||
byte[] sig = HavenoUtils.sign(processModel.getP2PService().getKeyRing(), messageAsJson);
|
||||
message.setSellerSignature(sig);
|
||||
processModel.setPaymentReceivedMessage(message);
|
||||
trade.requestPersistence();
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue