diff --git a/src/org/thoughtcrime/securesms/crypto/PreKeyUtil.java b/src/org/thoughtcrime/securesms/crypto/PreKeyUtil.java index 4644701b62..400a96147d 100644 --- a/src/org/thoughtcrime/securesms/crypto/PreKeyUtil.java +++ b/src/org/thoughtcrime/securesms/crypto/PreKeyUtil.java @@ -23,6 +23,7 @@ import org.thoughtcrime.securesms.crypto.storage.TextSecurePreKeyStore; import org.thoughtcrime.securesms.util.TextSecurePreferences; import org.whispersystems.libsignal.IdentityKeyPair; import org.whispersystems.libsignal.InvalidKeyException; +import org.whispersystems.libsignal.InvalidKeyIdException; import org.whispersystems.libsignal.ecc.Curve; import org.whispersystems.libsignal.ecc.ECKeyPair; import org.whispersystems.libsignal.state.PreKeyRecord; @@ -89,4 +90,39 @@ public class PreKeyUtil { return TextSecurePreferences.getActiveSignedPreKeyId(context); } + // region - Loki + + public synchronized static List generatePreKeys(Context context, int amount) { + PreKeyStore preKeyStore = new TextSecurePreKeyStore(context); + List records = new LinkedList<>(); + int preKeyIdOffset = TextSecurePreferences.getNextPreKeyId(context); + + for (int i = 0; i < amount; i++) { + int preKeyId = (preKeyIdOffset + i) % Medium.MAX_VALUE; + ECKeyPair keyPair = Curve.generateKeyPair(); + PreKeyRecord record = new PreKeyRecord(preKeyId, keyPair); + + preKeyStore.storePreKey(preKeyId, record); + records.add(record); + } + + TextSecurePreferences.setNextPreKeyId(context, (preKeyIdOffset + BATCH_SIZE + 1) % Medium.MAX_VALUE); + + return records; + } + + public synchronized static void storePreKeyRecords(Context context, List records) { + PreKeyStore preKeyStore = new TextSecurePreKeyStore(context); + for (PreKeyRecord record : records) { + preKeyStore.storePreKey(record.getId(), record); + } + } + + public synchronized static PreKeyRecord loadPreKey(Context context, int preKeyId) throws InvalidKeyIdException { + PreKeyStore preKeyStore = new TextSecurePreKeyStore(context); + return preKeyStore.loadPreKey(preKeyId); + } + + // endregion + }