]> nmode's Git Repositories - signal-cli/blob - lib/src/main/java/org/asamk/signal/manager/util/PaymentUtils.java
36275d8f0168db11aae13fe2da050680b8835f06
[signal-cli] / lib / src / main / java / org / asamk / signal / manager / util / PaymentUtils.java
1 package org.asamk.signal.manager.util;
2
3 import org.signal.libsignal.protocol.IdentityKey;
4 import org.signal.libsignal.protocol.IdentityKeyPair;
5 import org.signal.libsignal.protocol.ecc.ECPrivateKey;
6 import org.signal.libsignal.protocol.ecc.ECPublicKey;
7 import org.slf4j.Logger;
8 import org.slf4j.LoggerFactory;
9 import org.whispersystems.signalservice.internal.push.PaymentAddress;
10
11 import okio.ByteString;
12
13 public class PaymentUtils {
14
15 private static final Logger logger = LoggerFactory.getLogger(PaymentUtils.class);
16
17 private PaymentUtils() {
18 }
19
20 /**
21 * Signs the supplied address bytes with the {@link IdentityKeyPair}'s private key and returns a proto that includes it, and it's signature.
22 */
23 public static PaymentAddress signPaymentsAddress(byte[] publicAddressBytes, ECPrivateKey privateKey) {
24 byte[] signature = privateKey.calculateSignature(publicAddressBytes);
25
26 return new PaymentAddress.Builder().mobileCoinAddress(new PaymentAddress.MobileCoinAddress.Builder().address(
27 ByteString.of(publicAddressBytes)).signature(ByteString.of(signature)).build()).build();
28 }
29
30 /**
31 * Verifies that the payments address is signed with the supplied {@link IdentityKey}.
32 * <p>
33 * Returns the validated bytes if so, otherwise returns null.
34 */
35 public static byte[] verifyPaymentsAddress(PaymentAddress paymentAddress, ECPublicKey publicKey) {
36 final var mobileCoinAddress = paymentAddress.mobileCoinAddress;
37 if (mobileCoinAddress == null || mobileCoinAddress.address == null || mobileCoinAddress.signature == null) {
38 logger.debug("Got payment address without mobile coin address, ignoring.");
39 return null;
40 }
41
42 byte[] bytes = mobileCoinAddress.address.toByteArray();
43 byte[] signature = mobileCoinAddress.signature.toByteArray();
44
45 if (signature.length != 64 || !publicKey.verifySignature(bytes, signature)) {
46 logger.debug("Got mobile coin address with invalid signature, ignoring.");
47 return null;
48 }
49
50 return bytes;
51 }
52 }