]> nmode's Git Repositories - signal-cli/blob - src/main/java/org/asamk/signal/manager/helper/PinHelper.java
Convert gradle scripts to kotlin
[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.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.HashedPin;
10 import org.whispersystems.signalservice.api.kbs.MasterKey;
11 import org.whispersystems.signalservice.internal.contacts.crypto.UnauthenticatedResponseException;
12 import org.whispersystems.signalservice.internal.contacts.entities.TokenResponse;
13 import org.whispersystems.signalservice.internal.push.LockedException;
14
15 import java.io.IOException;
16
17 public class PinHelper {
18
19 private final KeyBackupService keyBackupService;
20
21 public PinHelper(final KeyBackupService keyBackupService) {
22 this.keyBackupService = keyBackupService;
23 }
24
25 public void setRegistrationLockPin(
26 String pin, MasterKey masterKey
27 ) throws IOException, UnauthenticatedResponseException {
28 final KeyBackupService.PinChangeSession pinChangeSession = keyBackupService.newPinChangeSession();
29 final HashedPin hashedPin = PinHashing.hashPin(pin, pinChangeSession);
30
31 pinChangeSession.setPin(hashedPin, masterKey);
32 pinChangeSession.enableRegistrationLock(masterKey);
33 }
34
35 public void removeRegistrationLockPin() throws IOException, UnauthenticatedResponseException {
36 final KeyBackupService.PinChangeSession pinChangeSession = keyBackupService.newPinChangeSession();
37 pinChangeSession.disableRegistrationLock();
38 pinChangeSession.removePin();
39 }
40
41 public KbsPinData getRegistrationLockData(
42 String pin, LockedException e
43 ) throws IOException, KeyBackupSystemNoDataException, KeyBackupServicePinException {
44 String basicStorageCredentials = e.getBasicStorageCredentials();
45 if (basicStorageCredentials == null) {
46 return null;
47 }
48
49 return getRegistrationLockData(pin, basicStorageCredentials);
50 }
51
52 private KbsPinData getRegistrationLockData(
53 String pin, 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 | InvalidKeyException e) {
87 throw new IOException(e);
88 }
89 }
90 }