Signal-Android/app/src/main/java/org/thoughtcrime/securesms/payments/MobileCoinPublicAddressProf...

53 wiersze
2.4 KiB
Java

package org.thoughtcrime.securesms.payments;
import androidx.annotation.NonNull;
import com.google.protobuf.ByteString;
import org.signal.libsignal.protocol.IdentityKey;
import org.signal.libsignal.protocol.IdentityKeyPair;
import org.whispersystems.signalservice.internal.push.SignalServiceProtos;
public final class MobileCoinPublicAddressProfileUtil {
private MobileCoinPublicAddressProfileUtil() {}
/**
* Signs the supplied address bytes with the {@link IdentityKeyPair}'s private key and returns a proto that includes it and it's signature.
*/
public static @NonNull SignalServiceProtos.PaymentAddress signPaymentsAddress(@NonNull byte[] publicAddressBytes,
@NonNull IdentityKeyPair identityKeyPair)
{
byte[] signature = identityKeyPair.getPrivateKey().calculateSignature(publicAddressBytes);
return SignalServiceProtos.PaymentAddress.newBuilder()
.setMobileCoinAddress(SignalServiceProtos.PaymentAddress.MobileCoinAddress.newBuilder()
.setAddress(ByteString.copyFrom(publicAddressBytes))
.setSignature(ByteString.copyFrom(signature)))
.build();
}
/**
* Verifies that the payments address is signed with the supplied {@link IdentityKey}.
* <p>
* Returns the validated bytes if so, otherwise throws.
*/
public static @NonNull byte[] verifyPaymentsAddress(@NonNull SignalServiceProtos.PaymentAddress paymentAddress,
@NonNull IdentityKey identityKey)
throws PaymentsAddressException
{
if (!paymentAddress.hasMobileCoinAddress()) {
throw new PaymentsAddressException(PaymentsAddressException.Code.NO_ADDRESS);
}
byte[] bytes = paymentAddress.getMobileCoinAddress().getAddress().toByteArray();
byte[] signature = paymentAddress.getMobileCoinAddress().getSignature().toByteArray();
if (signature.length != 64 || !identityKey.getPublicKey().verifySignature(bytes, signature)) {
throw new PaymentsAddressException(PaymentsAddressException.Code.INVALID_ADDRESS_SIGNATURE);
}
return bytes;
}
}