]>
nmode's Git Repositories - signal-cli/blob - src/main/java/org/asamk/signal/manager/DeviceLinkInfo.java
1 package org
.asamk
.signal
.manager
;
3 import org
.whispersystems
.libsignal
.InvalidKeyException
;
4 import org
.whispersystems
.libsignal
.ecc
.Curve
;
5 import org
.whispersystems
.libsignal
.ecc
.ECPublicKey
;
6 import org
.whispersystems
.util
.Base64
;
8 import java
.io
.IOException
;
10 import java
.net
.URLDecoder
;
11 import java
.net
.URLEncoder
;
12 import java
.nio
.charset
.StandardCharsets
;
13 import java
.util
.HashMap
;
16 import static org
.whispersystems
.signalservice
.internal
.util
.Util
.isEmpty
;
18 public class DeviceLinkInfo
{
20 final String deviceIdentifier
;
21 final ECPublicKey deviceKey
;
23 public static DeviceLinkInfo
parseDeviceLinkUri(URI linkUri
) throws IOException
, InvalidKeyException
{
24 final String rawQuery
= linkUri
.getRawQuery();
25 if (isEmpty(rawQuery
)) {
26 throw new RuntimeException("Invalid device link uri");
29 Map
<String
, String
> query
= getQueryMap(rawQuery
);
30 String deviceIdentifier
= query
.get("uuid");
31 String publicKeyEncoded
= query
.get("pub_key");
33 if (isEmpty(deviceIdentifier
) || isEmpty(publicKeyEncoded
)) {
34 throw new RuntimeException("Invalid device link uri");
37 ECPublicKey deviceKey
= Curve
.decodePoint(Base64
.decode(publicKeyEncoded
), 0);
39 return new DeviceLinkInfo(deviceIdentifier
, deviceKey
);
42 private static Map
<String
, String
> getQueryMap(String query
) {
43 String
[] params
= query
.split("&");
44 Map
<String
, String
> map
= new HashMap
<>();
45 for (String param
: params
) {
46 final String
[] paramParts
= param
.split("=");
47 String name
= URLDecoder
.decode(paramParts
[0], StandardCharsets
.UTF_8
);
48 String value
= URLDecoder
.decode(paramParts
[1], StandardCharsets
.UTF_8
);
54 public DeviceLinkInfo(final String deviceIdentifier
, final ECPublicKey deviceKey
) {
55 this.deviceIdentifier
= deviceIdentifier
;
56 this.deviceKey
= deviceKey
;
59 public String
createDeviceLinkUri() {
60 return "tsdevice:/?uuid="
61 + URLEncoder
.encode(deviceIdentifier
, StandardCharsets
.UTF_8
)
63 + URLEncoder
.encode(Base64
.encodeBytesWithoutPadding(deviceKey
.serialize()), StandardCharsets
.UTF_8
);