X-Git-Url: https://git.nmode.ca/signal-cli/blobdiff_plain/bbdd6a89102f200f284a01a41ac2809c0759ae50..5a2c4b8dfdbda71d6932998c48c9ffa633bb227c:/src/main/java/org/asamk/signal/manager/DeviceLinkInfo.java diff --git a/src/main/java/org/asamk/signal/manager/DeviceLinkInfo.java b/src/main/java/org/asamk/signal/manager/DeviceLinkInfo.java index 5b9fbe28..b8b27eaa 100644 --- a/src/main/java/org/asamk/signal/manager/DeviceLinkInfo.java +++ b/src/main/java/org/asamk/signal/manager/DeviceLinkInfo.java @@ -3,13 +3,12 @@ package org.asamk.signal.manager; import org.whispersystems.libsignal.InvalidKeyException; import org.whispersystems.libsignal.ecc.Curve; import org.whispersystems.libsignal.ecc.ECPublicKey; -import org.whispersystems.util.Base64; -import java.io.IOException; import java.net.URI; 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; @@ -20,8 +19,13 @@ public class DeviceLinkInfo { final String deviceIdentifier; final ECPublicKey deviceKey; - public static DeviceLinkInfo parseDeviceLinkUri(URI linkUri) throws IOException, InvalidKeyException { - Map query = getQueryMap(linkUri.getRawQuery()); + public static DeviceLinkInfo parseDeviceLinkUri(URI linkUri) throws InvalidKeyException { + final String rawQuery = linkUri.getRawQuery(); + if (isEmpty(rawQuery)) { + throw new RuntimeException("Invalid device link uri"); + } + + Map query = getQueryMap(rawQuery); String deviceIdentifier = query.get("uuid"); String publicKeyEncoded = query.get("pub_key"); @@ -29,7 +33,13 @@ public class DeviceLinkInfo { throw new RuntimeException("Invalid device link uri"); } - ECPublicKey deviceKey = Curve.decodePoint(Base64.decode(publicKeyEncoded), 0); + final byte[] publicKeyBytes; + try { + publicKeyBytes = Base64.getDecoder().decode(publicKeyEncoded); + } catch (IllegalArgumentException e) { + throw new RuntimeException("Invalid device link uri", e); + } + ECPublicKey deviceKey = Curve.decodePoint(publicKeyBytes, 0); return new DeviceLinkInfo(deviceIdentifier, deviceKey); } @@ -52,9 +62,10 @@ public class DeviceLinkInfo { } public String createDeviceLinkUri() { + final String deviceKeyString = Base64.getEncoder().encodeToString(deviceKey.serialize()).replace("=", ""); return "tsdevice:/?uuid=" + URLEncoder.encode(deviceIdentifier, StandardCharsets.UTF_8) + "&pub_key=" - + URLEncoder.encode(Base64.encodeBytesWithoutPadding(deviceKey.serialize()), StandardCharsets.UTF_8); + + URLEncoder.encode(deviceKeyString, StandardCharsets.UTF_8); } }