]> nmode's Git Repositories - signal-cli/blob - src/main/java/org/asamk/signal/manager/helper/PinHelper.java
Improve user status command
[signal-cli] / src / main / java / org / asamk / signal / manager / helper / PinHelper.java
1 package org.asamk.signal.manager.helper;
2
3 import org.asamk.signal.manager.util.PinHashing;
4 import org.whispersystems.signalservice.api.KbsPinData;
5 import org.whispersystems.signalservice.api.KeyBackupService;
6 import org.whispersystems.signalservice.api.KeyBackupServicePinException;
7 import org.whispersystems.signalservice.api.KeyBackupSystemNoDataException;
8 import org.whispersystems.signalservice.api.kbs.HashedPin;
9 import org.whispersystems.signalservice.api.kbs.MasterKey;
10 import org.whispersystems.signalservice.internal.contacts.crypto.UnauthenticatedResponseException;
11 import org.whispersystems.signalservice.internal.contacts.entities.TokenResponse;
12 import org.whispersystems.signalservice.internal.push.LockedException;
13
14 import java.io.IOException;
15
16 public class PinHelper {
17
18 private final KeyBackupService keyBackupService;
19
20 public PinHelper(final KeyBackupService keyBackupService) {
21 this.keyBackupService = keyBackupService;
22 }
23
24 public void setRegistrationLockPin(
25 String pin, MasterKey masterKey
26 ) throws IOException, UnauthenticatedResponseException {
27 final KeyBackupService.PinChangeSession pinChangeSession = keyBackupService.newPinChangeSession();
28 final HashedPin hashedPin = PinHashing.hashPin(pin, pinChangeSession);
29
30 pinChangeSession.setPin(hashedPin, masterKey);
31 pinChangeSession.enableRegistrationLock(masterKey);
32 }
33
34 public void removeRegistrationLockPin() throws IOException, UnauthenticatedResponseException {
35 final KeyBackupService.PinChangeSession pinChangeSession = keyBackupService.newPinChangeSession();
36 pinChangeSession.removePin();
37 }
38
39 public KbsPinData getRegistrationLockData(
40 String pin,
41 LockedException e
42 ) throws IOException, KeyBackupSystemNoDataException, KeyBackupServicePinException {
43 String basicStorageCredentials = e.getBasicStorageCredentials();
44 if (basicStorageCredentials == null) {
45 return null;
46 }
47
48 return getRegistrationLockData(pin, basicStorageCredentials);
49 }
50
51 private KbsPinData getRegistrationLockData(
52 String pin,
53 String basicStorageCredentials
54 ) throws IOException, KeyBackupSystemNoDataException, KeyBackupServicePinException {
55 TokenResponse tokenResponse = keyBackupService.getToken(basicStorageCredentials);
56 if (tokenResponse == null || tokenResponse.getTries() == 0) {
57 throw new IOException("KBS Account locked");
58 }
59
60 KbsPinData registrationLockData = restoreMasterKey(pin, basicStorageCredentials, tokenResponse);
61 if (registrationLockData == null) {
62 throw new AssertionError("Failed to restore master key");
63 }
64 return registrationLockData;
65 }
66
67 private KbsPinData restoreMasterKey(
68 String pin, String basicStorageCredentials, TokenResponse tokenResponse
69 ) throws IOException, KeyBackupSystemNoDataException, KeyBackupServicePinException {
70 if (pin == null) return null;
71
72 if (basicStorageCredentials == null) {
73 throw new AssertionError("Cannot restore KBS key, no storage credentials supplied");
74 }
75
76 KeyBackupService.RestoreSession session = keyBackupService.newRegistrationSession(basicStorageCredentials,
77 tokenResponse);
78
79 try {
80 HashedPin hashedPin = PinHashing.hashPin(pin, session);
81 KbsPinData kbsData = session.restorePin(hashedPin);
82 if (kbsData == null) {
83 throw new AssertionError("Null not expected");
84 }
85 return kbsData;
86 } catch (UnauthenticatedResponseException e) {
87 throw new IOException(e);
88 }
89 }
90 }