1 package org
.asamk
.signal
.manager
.helper
;
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
;
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 KeyBackupService
.PinChangeSession pinChangeSession
= keyBackupService
.newPinChangeSession();
28 final HashedPin hashedPin
= PinHashing
.hashPin(pin
, pinChangeSession
);
30 pinChangeSession
.setPin(hashedPin
, masterKey
);
31 pinChangeSession
.enableRegistrationLock(masterKey
);
34 public void removeRegistrationLockPin() throws IOException
, UnauthenticatedResponseException
{
35 final KeyBackupService
.PinChangeSession pinChangeSession
= keyBackupService
.newPinChangeSession();
36 pinChangeSession
.removePin();
39 public KbsPinData
getRegistrationLockData(
42 ) throws IOException
, KeyBackupSystemNoDataException
, KeyBackupServicePinException
{
43 String basicStorageCredentials
= e
.getBasicStorageCredentials();
44 if (basicStorageCredentials
== null) {
48 return getRegistrationLockData(pin
, basicStorageCredentials
);
51 private KbsPinData
getRegistrationLockData(
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");
60 KbsPinData registrationLockData
= restoreMasterKey(pin
, basicStorageCredentials
, tokenResponse
);
61 if (registrationLockData
== null) {
62 throw new AssertionError("Failed to restore master key");
64 return registrationLockData
;
67 private KbsPinData
restoreMasterKey(
68 String pin
, String basicStorageCredentials
, TokenResponse tokenResponse
69 ) throws IOException
, KeyBackupSystemNoDataException
, KeyBackupServicePinException
{
70 if (pin
== null) return null;
72 if (basicStorageCredentials
== null) {
73 throw new AssertionError("Cannot restore KBS key, no storage credentials supplied");
76 KeyBackupService
.RestoreSession session
= keyBackupService
.newRegistrationSession(basicStorageCredentials
,
80 HashedPin hashedPin
= PinHashing
.hashPin(pin
, session
);
81 KbsPinData kbsData
= session
.restorePin(hashedPin
);
82 if (kbsData
== null) {
83 throw new AssertionError("Null not expected");
86 } catch (UnauthenticatedResponseException e
) {
87 throw new IOException(e
);