1 package org
.asamk
.signal
.manager
.helper
;
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
;
14 import java
.io
.IOException
;
16 public class PinHelper
{
18 private final KeyBackupService keyBackupService
;
20 public PinHelper(final KeyBackupService keyBackupService
) {
21 this.keyBackupService
= keyBackupService
;
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
);
30 pinChangeSession
.setPin(hashedPin
, masterKey
);
31 pinChangeSession
.enableRegistrationLock(masterKey
);
34 public void removeRegistrationLockPin() throws IOException
, UnauthenticatedResponseException
{
35 final var pinChangeSession
= keyBackupService
.newPinChangeSession();
36 pinChangeSession
.disableRegistrationLock();
37 pinChangeSession
.removePin();
40 public KbsPinData
getRegistrationLockData(
41 String pin
, LockedException e
42 ) throws IOException
, KeyBackupSystemNoDataException
, KeyBackupServicePinException
{
43 var basicStorageCredentials
= e
.getBasicStorageCredentials();
44 if (basicStorageCredentials
== null) {
48 return getRegistrationLockData(pin
, basicStorageCredentials
);
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");
59 var registrationLockData
= restoreMasterKey(pin
, basicStorageCredentials
, tokenResponse
);
60 if (registrationLockData
== null) {
61 throw new AssertionError("Failed to restore master key");
63 return registrationLockData
;
66 private KbsPinData
restoreMasterKey(
67 String pin
, String basicStorageCredentials
, TokenResponse tokenResponse
68 ) throws IOException
, KeyBackupSystemNoDataException
, KeyBackupServicePinException
{
69 if (pin
== null) return null;
71 if (basicStorageCredentials
== null) {
72 throw new AssertionError("Cannot restore KBS key, no storage credentials supplied");
75 var session
= keyBackupService
.newRegistrationSession(basicStorageCredentials
, tokenResponse
);
78 var hashedPin
= PinHashing
.hashPin(pin
, session
);
79 var kbsData
= session
.restorePin(hashedPin
);
80 if (kbsData
== null) {
81 throw new AssertionError("Null not expected");
84 } catch (UnauthenticatedResponseException
| InvalidKeyException e
) {
85 throw new IOException(e
);