]> nmode's Git Repositories - signal-cli/blob - lib/src/main/java/org/asamk/signal/manager/api/DeviceLinkUrl.java
Update libsignal-service-java
[signal-cli] / lib / src / main / java / org / asamk / signal / manager / api / DeviceLinkUrl.java
1 package org.asamk.signal.manager.api;
2
3 import org.asamk.signal.manager.util.Utils;
4 import org.signal.libsignal.protocol.InvalidKeyException;
5 import org.signal.libsignal.protocol.ecc.ECPublicKey;
6
7 import java.net.URI;
8 import java.net.URISyntaxException;
9 import java.net.URLEncoder;
10 import java.nio.charset.StandardCharsets;
11 import java.util.Base64;
12
13 import static org.whispersystems.signalservice.internal.util.Util.isEmpty;
14
15 public record DeviceLinkUrl(String deviceIdentifier, ECPublicKey deviceKey) {
16
17 public static DeviceLinkUrl parseDeviceLinkUri(URI linkUri) throws InvalidDeviceLinkException {
18 final var rawQuery = linkUri.getRawQuery();
19 if (isEmpty(rawQuery)) {
20 throw new RuntimeException("Invalid device link uri");
21 }
22
23 var query = Utils.getQueryMap(rawQuery);
24 var deviceIdentifier = query.get("uuid");
25 var publicKeyEncoded = query.get("pub_key");
26
27 if (isEmpty(deviceIdentifier) || isEmpty(publicKeyEncoded)) {
28 throw new InvalidDeviceLinkException("Invalid device link uri");
29 }
30
31 final byte[] publicKeyBytes;
32 try {
33 publicKeyBytes = Base64.getDecoder().decode(publicKeyEncoded);
34 } catch (IllegalArgumentException e) {
35 throw new InvalidDeviceLinkException("Invalid device link uri", e);
36 }
37 ECPublicKey deviceKey;
38 try {
39 deviceKey = new ECPublicKey(publicKeyBytes);
40 } catch (InvalidKeyException e) {
41 throw new InvalidDeviceLinkException("Invalid device link", e);
42 }
43
44 return new DeviceLinkUrl(deviceIdentifier, deviceKey);
45 }
46
47 public URI createDeviceLinkUri() {
48 final var deviceKeyString = Base64.getEncoder().encodeToString(deviceKey.serialize()).replace("=", "");
49 try {
50 return new URI("sgnl://linkdevice?uuid="
51 + URLEncoder.encode(deviceIdentifier, StandardCharsets.UTF_8)
52 + "&pub_key="
53 + URLEncoder.encode(deviceKeyString, StandardCharsets.UTF_8));
54 } catch (URISyntaxException e) {
55 throw new AssertionError(e);
56 }
57 }
58 }