From c9fa28d844c372535df24aea057e740a797f7229 Mon Sep 17 00:00:00 2001 From: AsamK Date: Tue, 12 Jan 2021 20:40:17 +0100 Subject: [PATCH] Extract pre key generation to KeyUtils --- .../org/asamk/signal/manager/Manager.java | 89 +++++++------------ .../asamk/signal/manager/util/KeyUtils.java | 32 +++++++ 2 files changed, 62 insertions(+), 59 deletions(-) diff --git a/src/main/java/org/asamk/signal/manager/Manager.java b/src/main/java/org/asamk/signal/manager/Manager.java index d0a9e277..0c7a5e00 100644 --- a/src/main/java/org/asamk/signal/manager/Manager.java +++ b/src/main/java/org/asamk/signal/manager/Manager.java @@ -74,12 +74,9 @@ import org.whispersystems.libsignal.IdentityKeyPair; import org.whispersystems.libsignal.InvalidKeyException; import org.whispersystems.libsignal.InvalidMessageException; import org.whispersystems.libsignal.InvalidVersionException; -import org.whispersystems.libsignal.ecc.Curve; -import org.whispersystems.libsignal.ecc.ECKeyPair; import org.whispersystems.libsignal.ecc.ECPublicKey; import org.whispersystems.libsignal.state.PreKeyRecord; import org.whispersystems.libsignal.state.SignedPreKeyRecord; -import org.whispersystems.libsignal.util.Medium; import org.whispersystems.libsignal.util.Pair; import org.whispersystems.libsignal.util.guava.Optional; import org.whispersystems.signalservice.api.KeyBackupService; @@ -299,21 +296,15 @@ public class Manager implements Closeable { } public void checkAccountState() throws IOException { - if (account.isRegistered()) { - if (accountManager.getPreKeysCount() < ServiceConfig.PREKEY_MINIMUM_COUNT) { - refreshPreKeys(); - account.save(); - } - if (account.getUuid() == null) { - account.setUuid(accountManager.getOwnUuid()); - account.save(); - } - updateAccountAttributes(); + if (accountManager.getPreKeysCount() < ServiceConfig.PREKEY_MINIMUM_COUNT) { + refreshPreKeys(); + account.save(); } - } - - public boolean isRegistered() { - return account.isRegistered(); + if (account.getUuid() == null) { + account.setUuid(accountManager.getOwnUuid()); + account.save(); + } + updateAccountAttributes(); } /** @@ -396,43 +387,6 @@ public class Manager implements Closeable { account.save(); } - private List generatePreKeys() { - List records = new ArrayList<>(ServiceConfig.PREKEY_BATCH_SIZE); - - final int offset = account.getPreKeyIdOffset(); - for (int i = 0; i < ServiceConfig.PREKEY_BATCH_SIZE; i++) { - int preKeyId = (offset + i) % Medium.MAX_VALUE; - ECKeyPair keyPair = Curve.generateKeyPair(); - PreKeyRecord record = new PreKeyRecord(preKeyId, keyPair); - - records.add(record); - } - - account.addPreKeys(records); - account.save(); - - return records; - } - - private SignedPreKeyRecord generateSignedPreKey(IdentityKeyPair identityKeyPair) { - try { - ECKeyPair keyPair = Curve.generateKeyPair(); - byte[] signature = Curve.calculateSignature(identityKeyPair.getPrivateKey(), - keyPair.getPublicKey().serialize()); - SignedPreKeyRecord record = new SignedPreKeyRecord(account.getNextSignedPreKeyId(), - System.currentTimeMillis(), - keyPair, - signature); - - account.addSignedPreKey(record); - account.save(); - - return record; - } catch (InvalidKeyException e) { - throw new AssertionError(e); - } - } - public void setRegistrationLockPin(Optional pin) throws IOException, UnauthenticatedResponseException { if (pin.isPresent()) { final MasterKey masterKey = account.getPinMasterKey() != null @@ -464,6 +418,26 @@ public class Manager implements Closeable { accountManager.setPreKeys(identityKeyPair.getPublicKey(), signedPreKeyRecord, oneTimePreKeys); } + private List generatePreKeys() { + final int offset = account.getPreKeyIdOffset(); + + List records = KeyUtils.generatePreKeyRecords(offset, ServiceConfig.PREKEY_BATCH_SIZE); + account.addPreKeys(records); + account.save(); + + return records; + } + + private SignedPreKeyRecord generateSignedPreKey(IdentityKeyPair identityKeyPair) { + final int signedPreKeyId = account.getNextSignedPreKeyId(); + + SignedPreKeyRecord record = KeyUtils.generateSignedPreKeyRecord(identityKeyPair, signedPreKeyId); + account.addSignedPreKey(record); + account.save(); + + return record; + } + private SignalServiceMessagePipe getOrCreateMessagePipe() { if (messagePipe == null) { messagePipe = messageReceiver.createMessagePipe(); @@ -496,10 +470,6 @@ public class Manager implements Closeable { ServiceConfig.MAX_ENVELOPE_SIZE); } - private SignalServiceProfile getEncryptedRecipientProfile(SignalServiceAddress address) throws IOException { - return profileHelper.retrieveProfileSync(address, SignalServiceProfile.RequestType.PROFILE).getProfile(); - } - private SignalProfile getRecipientProfile( SignalServiceAddress address ) { @@ -560,7 +530,8 @@ public class Manager implements Closeable { private SignalProfile retrieveRecipientProfile( SignalServiceAddress address, ProfileKey profileKey ) throws IOException { - final SignalServiceProfile encryptedProfile = getEncryptedRecipientProfile(address); + final SignalServiceProfile encryptedProfile = profileHelper.retrieveProfileSync(address, + SignalServiceProfile.RequestType.PROFILE).getProfile(); return decryptProfile(address, profileKey, encryptedProfile); } diff --git a/src/main/java/org/asamk/signal/manager/util/KeyUtils.java b/src/main/java/org/asamk/signal/manager/util/KeyUtils.java index d8861b1b..171e7a42 100644 --- a/src/main/java/org/asamk/signal/manager/util/KeyUtils.java +++ b/src/main/java/org/asamk/signal/manager/util/KeyUtils.java @@ -5,12 +5,19 @@ import org.signal.zkgroup.InvalidInputException; import org.signal.zkgroup.profiles.ProfileKey; import org.whispersystems.libsignal.IdentityKey; import org.whispersystems.libsignal.IdentityKeyPair; +import org.whispersystems.libsignal.InvalidKeyException; import org.whispersystems.libsignal.ecc.Curve; import org.whispersystems.libsignal.ecc.ECKeyPair; import org.whispersystems.libsignal.ecc.ECPrivateKey; +import org.whispersystems.libsignal.state.PreKeyRecord; +import org.whispersystems.libsignal.state.SignedPreKeyRecord; +import org.whispersystems.libsignal.util.Medium; import org.whispersystems.signalservice.api.kbs.MasterKey; import org.whispersystems.util.Base64; +import java.util.ArrayList; +import java.util.List; + public class KeyUtils { private KeyUtils() { @@ -24,6 +31,31 @@ public class KeyUtils { return new IdentityKeyPair(djbIdentityKey, djbPrivateKey); } + public static List generatePreKeyRecords(final int offset, final int batchSize) { + List records = new ArrayList<>(batchSize); + for (int i = 0; i < batchSize; i++) { + int preKeyId = (offset + i) % Medium.MAX_VALUE; + ECKeyPair keyPair = Curve.generateKeyPair(); + PreKeyRecord record = new PreKeyRecord(preKeyId, keyPair); + + records.add(record); + } + return records; + } + + public static SignedPreKeyRecord generateSignedPreKeyRecord( + final IdentityKeyPair identityKeyPair, final int signedPreKeyId + ) { + ECKeyPair keyPair = Curve.generateKeyPair(); + byte[] signature; + try { + signature = Curve.calculateSignature(identityKeyPair.getPrivateKey(), keyPair.getPublicKey().serialize()); + } catch (InvalidKeyException e) { + throw new AssertionError(e); + } + return new SignedPreKeyRecord(signedPreKeyId, System.currentTimeMillis(), keyPair, signature); + } + public static String createSignalingKey() { return getSecret(52); } -- 2.50.1