]> nmode's Git Repositories - signal-cli/blob - lib/src/main/java/org/asamk/signal/manager/helper/PinHelper.java
Use var instead of explicit types
[signal-cli] / lib / 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.libsignal.InvalidKeyException;
5 import org.whispersystems.signalservice.api.KbsPinData;
6 import org.whispersystems.signalservice.api.KeyBackupService;
7 import org.whispersystems.signalservice.api.KeyBackupServicePinException;
8 import org.whispersystems.signalservice.api.KeyBackupSystemNoDataException;
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 var pinChangeSession = keyBackupService.newPinChangeSession();
28 final var 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 var pinChangeSession = keyBackupService.newPinChangeSession();
36 pinChangeSession.disableRegistrationLock();
37 pinChangeSession.removePin();
38 }
39
40 public KbsPinData getRegistrationLockData(
41 String pin, LockedException e
42 ) throws IOException, KeyBackupSystemNoDataException, KeyBackupServicePinException {
43 var 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, String basicStorageCredentials
53 ) throws IOException, KeyBackupSystemNoDataException, KeyBackupServicePinException {
54 var tokenResponse = keyBackupService.getToken(basicStorageCredentials);
55 if (tokenResponse == null || tokenResponse.getTries() == 0) {
56 throw new IOException("KBS Account locked");
57 }
58
59 var registrationLockData = restoreMasterKey(pin, basicStorageCredentials, tokenResponse);
60 if (registrationLockData == null) {
61 throw new AssertionError("Failed to restore master key");
62 }
63 return registrationLockData;
64 }
65
66 private KbsPinData restoreMasterKey(
67 String pin, String basicStorageCredentials, TokenResponse tokenResponse
68 ) throws IOException, KeyBackupSystemNoDataException, KeyBackupServicePinException {
69 if (pin == null) return null;
70
71 if (basicStorageCredentials == null) {
72 throw new AssertionError("Cannot restore KBS key, no storage credentials supplied");
73 }
74
75 var session = keyBackupService.newRegistrationSession(basicStorageCredentials, tokenResponse);
76
77 try {
78 var hashedPin = PinHashing.hashPin(pin, session);
79 var kbsData = session.restorePin(hashedPin);
80 if (kbsData == null) {
81 throw new AssertionError("Null not expected");
82 }
83 return kbsData;
84 } catch (UnauthenticatedResponseException | InvalidKeyException e) {
85 throw new IOException(e);
86 }
87 }
88 }