package org.asamk.signal.manager;
+import org.asamk.signal.manager.api.InvalidDeviceLinkException;
import org.whispersystems.libsignal.InvalidKeyException;
import org.whispersystems.libsignal.ecc.Curve;
import org.whispersystems.libsignal.ecc.ECPublicKey;
import static org.whispersystems.signalservice.internal.util.Util.isEmpty;
-public class DeviceLinkInfo {
+public record DeviceLinkInfo(String deviceIdentifier, ECPublicKey deviceKey) {
- final String deviceIdentifier;
- final ECPublicKey deviceKey;
-
- public static DeviceLinkInfo parseDeviceLinkUri(URI linkUri) throws InvalidKeyException {
+ public static DeviceLinkInfo parseDeviceLinkUri(URI linkUri) throws InvalidDeviceLinkException {
final var rawQuery = linkUri.getRawQuery();
if (isEmpty(rawQuery)) {
throw new RuntimeException("Invalid device link uri");
var publicKeyEncoded = query.get("pub_key");
if (isEmpty(deviceIdentifier) || isEmpty(publicKeyEncoded)) {
- throw new RuntimeException("Invalid device link uri");
+ throw new InvalidDeviceLinkException("Invalid device link uri");
}
final byte[] publicKeyBytes;
try {
publicKeyBytes = Base64.getDecoder().decode(publicKeyEncoded);
} catch (IllegalArgumentException e) {
- throw new RuntimeException("Invalid device link uri", e);
+ throw new InvalidDeviceLinkException("Invalid device link uri", e);
+ }
+ ECPublicKey deviceKey;
+ try {
+ deviceKey = Curve.decodePoint(publicKeyBytes, 0);
+ } catch (InvalidKeyException e) {
+ throw new InvalidDeviceLinkException("Invalid device link", e);
}
- var deviceKey = Curve.decodePoint(publicKeyBytes, 0);
return new DeviceLinkInfo(deviceIdentifier, deviceKey);
}
return map;
}
- public DeviceLinkInfo(final String deviceIdentifier, final ECPublicKey deviceKey) {
- this.deviceIdentifier = deviceIdentifier;
- this.deviceKey = deviceKey;
- }
-
public URI createDeviceLinkUri() {
final var deviceKeyString = Base64.getEncoder().encodeToString(deviceKey.serialize()).replace("=", "");
try {