X-Git-Url: https://git.nmode.ca/signal-cli/blobdiff_plain/ce7aa580b6f0580cdcf7fd68fcc8efba737d21ed..f7f882e834f33702e4cc36d9a20e0a89ed76dec8:/lib/src/main/java/org/asamk/signal/manager/DeviceLinkInfo.java diff --git a/lib/src/main/java/org/asamk/signal/manager/DeviceLinkInfo.java b/lib/src/main/java/org/asamk/signal/manager/DeviceLinkInfo.java index 3e35aced..356cb47d 100644 --- a/lib/src/main/java/org/asamk/signal/manager/DeviceLinkInfo.java +++ b/lib/src/main/java/org/asamk/signal/manager/DeviceLinkInfo.java @@ -1,59 +1,51 @@ package org.asamk.signal.manager; -import org.whispersystems.libsignal.InvalidKeyException; -import org.whispersystems.libsignal.ecc.Curve; -import org.whispersystems.libsignal.ecc.ECPublicKey; +import org.asamk.signal.manager.api.InvalidDeviceLinkException; +import org.asamk.signal.manager.util.Utils; +import org.signal.libsignal.protocol.InvalidKeyException; +import org.signal.libsignal.protocol.ecc.Curve; +import org.signal.libsignal.protocol.ecc.ECPublicKey; import java.net.URI; import java.net.URISyntaxException; -import java.net.URLDecoder; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; import java.util.Base64; -import java.util.HashMap; -import java.util.Map; import static org.whispersystems.signalservice.internal.util.Util.isEmpty; public record DeviceLinkInfo(String deviceIdentifier, 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 query = getQueryMap(rawQuery); + var query = Utils.getQueryMap(rawQuery); var deviceIdentifier = query.get("uuid"); 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); } - private static Map getQueryMap(String query) { - var params = query.split("&"); - var map = new HashMap(); - for (var param : params) { - final var paramParts = param.split("="); - var name = URLDecoder.decode(paramParts[0], StandardCharsets.UTF_8); - var value = URLDecoder.decode(paramParts[1], StandardCharsets.UTF_8); - map.put(name, value); - } - return map; - } - public URI createDeviceLinkUri() { final var deviceKeyString = Base64.getEncoder().encodeToString(deviceKey.serialize()).replace("=", ""); try {