]>
nmode's Git Repositories - signal-cli/blob - src/main/java/org/asamk/signal/manager/DeviceLinkInfo.java
5b9fbe2809eb581739879882034c88ce61bed76a
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 Map
<String
, String
> query
= getQueryMap(linkUri
.getRawQuery());
25 String deviceIdentifier
= query
.get("uuid");
26 String publicKeyEncoded
= query
.get("pub_key");
28 if (isEmpty(deviceIdentifier
) || isEmpty(publicKeyEncoded
)) {
29 throw new RuntimeException("Invalid device link uri");
32 ECPublicKey deviceKey
= Curve
.decodePoint(Base64
.decode(publicKeyEncoded
), 0);
34 return new DeviceLinkInfo(deviceIdentifier
, deviceKey
);
37 private static Map
<String
, String
> getQueryMap(String query
) {
38 String
[] params
= query
.split("&");
39 Map
<String
, String
> map
= new HashMap
<>();
40 for (String param
: params
) {
41 final String
[] paramParts
= param
.split("=");
42 String name
= URLDecoder
.decode(paramParts
[0], StandardCharsets
.UTF_8
);
43 String value
= URLDecoder
.decode(paramParts
[1], StandardCharsets
.UTF_8
);
49 public DeviceLinkInfo(final String deviceIdentifier
, final ECPublicKey deviceKey
) {
50 this.deviceIdentifier
= deviceIdentifier
;
51 this.deviceKey
= deviceKey
;
54 public String
createDeviceLinkUri() {
55 return "tsdevice:/?uuid="
56 + URLEncoder
.encode(deviceIdentifier
, StandardCharsets
.UTF_8
)
58 + URLEncoder
.encode(Base64
.encodeBytesWithoutPadding(deviceKey
.serialize()), StandardCharsets
.UTF_8
);