mirror of
https://github.com/signalapp/Signal-Android.git
synced 2026-04-19 16:19:33 +01:00
Fix prekey generation during registration.
This commit is contained in:
@@ -50,21 +50,21 @@ public class PreKeyUtil {
|
||||
private static final long ARCHIVE_AGE = TimeUnit.DAYS.toMillis(30);
|
||||
|
||||
public synchronized static @NonNull List<PreKeyRecord> generateAndStoreOneTimeEcPreKeys(@NonNull SignalProtocolStore protocolStore, @NonNull PreKeyMetadataStore metadataStore) {
|
||||
int preKeyIdOffset = metadataStore.getNextEcOneTimePreKeyId();
|
||||
final List<PreKeyRecord> records = generateOneTimeEcPreKeys(preKeyIdOffset);
|
||||
int startingId = metadataStore.getNextEcOneTimePreKeyId();
|
||||
final List<PreKeyRecord> records = generateOneTimeEcPreKeys(startingId);
|
||||
|
||||
storeOneTimeEcPreKeys(protocolStore, metadataStore, preKeyIdOffset, records);
|
||||
storeOneTimeEcPreKeys(protocolStore, metadataStore, records);
|
||||
|
||||
return records;
|
||||
}
|
||||
|
||||
public synchronized static List<PreKeyRecord> generateOneTimeEcPreKeys(int preKeyIdOffset) {
|
||||
public synchronized static List<PreKeyRecord> generateOneTimeEcPreKeys(int startingId) {
|
||||
Log.i(TAG, "Generating one-time EC prekeys...");
|
||||
|
||||
List<PreKeyRecord> records = new ArrayList<>(BATCH_SIZE);
|
||||
|
||||
for (int i = 0; i < BATCH_SIZE; i++) {
|
||||
int preKeyId = (preKeyIdOffset + i) % Medium.MAX_VALUE;
|
||||
int preKeyId = (startingId + i) % Medium.MAX_VALUE;
|
||||
ECKeyPair keyPair = Curve.generateKeyPair();
|
||||
PreKeyRecord record = new PreKeyRecord(preKeyId, keyPair);
|
||||
|
||||
@@ -74,47 +74,64 @@ public class PreKeyUtil {
|
||||
return records;
|
||||
}
|
||||
|
||||
public synchronized static void storeOneTimeEcPreKeys(@NonNull SignalProtocolStore protocolStore, PreKeyMetadataStore metadataStore, int preKeyIdOffset, List<PreKeyRecord> prekeys) {
|
||||
public synchronized static void storeOneTimeEcPreKeys(@NonNull SignalProtocolStore protocolStore, PreKeyMetadataStore metadataStore, List<PreKeyRecord> prekeys) {
|
||||
Log.i(TAG, "Storing one-time EC prekeys...");
|
||||
|
||||
if (prekeys.isEmpty()) {
|
||||
Log.w(TAG, "Empty list of one-time EC prekeys! Nothing to store.");
|
||||
return;
|
||||
}
|
||||
|
||||
for (PreKeyRecord record : prekeys) {
|
||||
protocolStore.storePreKey(record.getId(), record);
|
||||
}
|
||||
metadataStore.setNextEcOneTimePreKeyId((preKeyIdOffset + BATCH_SIZE + 1) % Medium.MAX_VALUE);
|
||||
|
||||
int lastId = prekeys.get(prekeys.size() - 1).getId();
|
||||
|
||||
metadataStore.setNextEcOneTimePreKeyId((lastId + 1) % Medium.MAX_VALUE);
|
||||
|
||||
}
|
||||
|
||||
public synchronized static @NonNull List<KyberPreKeyRecord> generateAndStoreOneTimeKyberPreKeys(@NonNull SignalProtocolStore protocolStore, @NonNull PreKeyMetadataStore metadataStore) {
|
||||
int preKeyIdOffset = metadataStore.getNextKyberPreKeyId();
|
||||
List<KyberPreKeyRecord> records = generateOneTimeKyberPreKeyRecords(preKeyIdOffset, protocolStore.getIdentityKeyPair().getPrivateKey());
|
||||
int startingId = metadataStore.getNextKyberPreKeyId();
|
||||
List<KyberPreKeyRecord> records = generateOneTimeKyberPreKeyRecords(startingId, protocolStore.getIdentityKeyPair().getPrivateKey());
|
||||
|
||||
storeOneTimeKyberPreKeys(protocolStore, metadataStore, preKeyIdOffset, records);
|
||||
storeOneTimeKyberPreKeys(protocolStore, metadataStore, records);
|
||||
|
||||
return records;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public static List<KyberPreKeyRecord> generateOneTimeKyberPreKeyRecords(int preKeyIdOffset, @NonNull ECPrivateKey privateKey) {
|
||||
public static List<KyberPreKeyRecord> generateOneTimeKyberPreKeyRecords(int startingId, @NonNull ECPrivateKey privateKey) {
|
||||
Log.i(TAG, "Generating one-time kyber prekeys...");
|
||||
|
||||
List<KyberPreKeyRecord> records = new LinkedList<>();
|
||||
|
||||
for (int i = 0; i < BATCH_SIZE; i++) {
|
||||
int preKeyId = (preKeyIdOffset + i) % Medium.MAX_VALUE;
|
||||
int preKeyId = (startingId + i) % Medium.MAX_VALUE;
|
||||
KyberPreKeyRecord record = generateKyberPreKey(preKeyId, privateKey);
|
||||
|
||||
records.add(record);
|
||||
}
|
||||
|
||||
return records;
|
||||
}
|
||||
|
||||
public synchronized static void storeOneTimeKyberPreKeys(@NonNull SignalProtocolStore protocolStore, PreKeyMetadataStore metadataStore, int preKeyIdOffset, List<KyberPreKeyRecord> prekeys) {
|
||||
public synchronized static void storeOneTimeKyberPreKeys(@NonNull SignalProtocolStore protocolStore, PreKeyMetadataStore metadataStore, List<KyberPreKeyRecord> prekeys) {
|
||||
Log.i(TAG, "Storing one-time kyber prekeys...");
|
||||
|
||||
if (prekeys.isEmpty()) {
|
||||
Log.w(TAG, "Empty list of kyber prekeys! Nothing to store.");
|
||||
return;
|
||||
}
|
||||
|
||||
for (KyberPreKeyRecord record : prekeys) {
|
||||
protocolStore.storeKyberPreKey(record.getId(), record);
|
||||
}
|
||||
metadataStore.setNextKyberPreKeyId((preKeyIdOffset + BATCH_SIZE + 1) % Medium.MAX_VALUE);
|
||||
|
||||
int lastId = prekeys.get(prekeys.size() - 1).getId();
|
||||
|
||||
metadataStore.setNextKyberPreKeyId((lastId + 1) % Medium.MAX_VALUE);
|
||||
}
|
||||
|
||||
public synchronized static @NonNull SignedPreKeyRecord generateAndStoreSignedPreKey(@NonNull SignalProtocolStore protocolStore, @NonNull PreKeyMetadataStore metadataStore) {
|
||||
@@ -127,7 +144,8 @@ public class PreKeyUtil {
|
||||
{
|
||||
int signedPreKeyId = metadataStore.getNextSignedPreKeyId();
|
||||
SignedPreKeyRecord record = generateSignedPreKey(signedPreKeyId, privateKey);
|
||||
storeSignedPreKey(protocolStore, metadataStore, signedPreKeyId, record);
|
||||
|
||||
storeSignedPreKey(protocolStore, metadataStore, record);
|
||||
|
||||
return record;
|
||||
}
|
||||
@@ -145,11 +163,11 @@ public class PreKeyUtil {
|
||||
}
|
||||
}
|
||||
|
||||
public synchronized static void storeSignedPreKey(@NonNull SignalProtocolStore protocolStore, @NonNull PreKeyMetadataStore metadataStore, int signedPreKeyId, SignedPreKeyRecord record) {
|
||||
Log.i(TAG, "Storing signed prekeys...");
|
||||
public synchronized static void storeSignedPreKey(@NonNull SignalProtocolStore protocolStore, @NonNull PreKeyMetadataStore metadataStore, SignedPreKeyRecord record) {
|
||||
Log.i(TAG, "Storing signed prekey...");
|
||||
|
||||
protocolStore.storeSignedPreKey(signedPreKeyId, record);
|
||||
metadataStore.setNextSignedPreKeyId((signedPreKeyId + 1) % Medium.MAX_VALUE);
|
||||
protocolStore.storeSignedPreKey(record.getId(), record);
|
||||
metadataStore.setNextSignedPreKeyId((record.getId() + 1) % Medium.MAX_VALUE);
|
||||
}
|
||||
|
||||
public synchronized static @NonNull KyberPreKeyRecord generateAndStoreLastResortKyberPreKey(@NonNull SignalServiceAccountDataStore protocolStore, @NonNull PreKeyMetadataStore metadataStore) {
|
||||
@@ -162,24 +180,28 @@ public class PreKeyUtil {
|
||||
{
|
||||
int id = metadataStore.getNextKyberPreKeyId();
|
||||
KyberPreKeyRecord record = generateKyberPreKey(id, privateKey);
|
||||
storeLastResortKyberPreKey(protocolStore, metadataStore, id, record);
|
||||
|
||||
storeLastResortKyberPreKey(protocolStore, metadataStore, record);
|
||||
|
||||
return record;
|
||||
}
|
||||
|
||||
public synchronized static @NonNull KyberPreKeyRecord generateKyberPreKey(int id, @NonNull ECPrivateKey privateKey) {
|
||||
Log.i(TAG, "Generating kyber prekeys...");
|
||||
public synchronized static @NonNull KyberPreKeyRecord generateLastRestortKyberPreKey(int id, @NonNull ECPrivateKey privateKey) {
|
||||
Log.i(TAG, "Generating last resort kyber prekey...");
|
||||
return generateKyberPreKey(id, privateKey);
|
||||
}
|
||||
|
||||
private synchronized static @NonNull KyberPreKeyRecord generateKyberPreKey(int id, @NonNull ECPrivateKey privateKey) {
|
||||
KEMKeyPair keyPair = KEMKeyPair.generate(KEMKeyType.KYBER_1024);
|
||||
byte[] signature = privateKey.calculateSignature(keyPair.getPublicKey().serialize());
|
||||
|
||||
return new KyberPreKeyRecord(id, System.currentTimeMillis(), keyPair, signature);
|
||||
}
|
||||
|
||||
public synchronized static void storeLastResortKyberPreKey(@NonNull SignalServiceAccountDataStore protocolStore, @NonNull PreKeyMetadataStore metadataStore, int id, KyberPreKeyRecord record) {
|
||||
public synchronized static void storeLastResortKyberPreKey(@NonNull SignalServiceAccountDataStore protocolStore, @NonNull PreKeyMetadataStore metadataStore, KyberPreKeyRecord record) {
|
||||
Log.i(TAG, "Storing kyber prekeys...");
|
||||
protocolStore.storeKyberPreKey(id, record);
|
||||
metadataStore.setNextKyberPreKeyId((id + 1) % Medium.MAX_VALUE);
|
||||
protocolStore.storeKyberPreKey(record.getId(), record);
|
||||
metadataStore.setNextKyberPreKeyId((record.getId() + 1) % Medium.MAX_VALUE);
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user