]> nmode's Git Repositories - signal-cli/blob - lib/src/main/java/org/asamk/signal/manager/util/PaymentUtils.java
Implement username links
[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(
24 byte[] publicAddressBytes, ECPrivateKey privateKey
25 ) {
26 byte[] signature = privateKey.calculateSignature(publicAddressBytes);
27
28 return new PaymentAddress.Builder().mobileCoinAddress(new PaymentAddress.MobileCoinAddress.Builder().address(
29 ByteString.of(publicAddressBytes)).signature(ByteString.of(signature)).build()).build();
30 }
31
32 /**
33 * Verifies that the payments address is signed with the supplied {@link IdentityKey}.
34 * <p>
35 * Returns the validated bytes if so, otherwise returns null.
36 */
37 public static byte[] verifyPaymentsAddress(
38 PaymentAddress paymentAddress, ECPublicKey publicKey
39 ) {
40 final var mobileCoinAddress = paymentAddress.mobileCoinAddress;
41 if (mobileCoinAddress == null || mobileCoinAddress.address == null || mobileCoinAddress.signature == null) {
42 logger.debug("Got payment address without mobile coin address, ignoring.");
43 return null;
44 }
45
46 byte[] bytes = mobileCoinAddress.address.toByteArray();
47 byte[] signature = mobileCoinAddress.signature.toByteArray();
48
49 if (signature.length != 64 || !publicKey.verifySignature(bytes, signature)) {
50 logger.debug("Got mobile coin address with invalid signature, ignoring.");
51 return null;
52 }
53
54 return bytes;
55 }
56 }