package org.asamk.signal.manager.util;
+import org.asamk.signal.manager.storage.SignalAccount;
import org.signal.libsignal.protocol.IdentityKey;
import org.signal.libsignal.protocol.IdentityKeyPair;
import org.signal.libsignal.protocol.InvalidKeyException;
-import org.signal.libsignal.protocol.ecc.Curve;
+import org.signal.libsignal.protocol.ecc.ECKeyPair;
import org.signal.libsignal.protocol.ecc.ECPrivateKey;
import org.signal.libsignal.protocol.kem.KEMKeyPair;
import org.signal.libsignal.protocol.kem.KEMKeyType;
import org.signal.libsignal.protocol.state.SignedPreKeyRecord;
import org.signal.libsignal.zkgroup.InvalidInputException;
import org.signal.libsignal.zkgroup.profiles.ProfileKey;
-import org.whispersystems.signalservice.api.kbs.MasterKey;
+import org.whispersystems.signalservice.api.account.PreKeyCollection;
+import org.whispersystems.signalservice.api.backup.MediaRootBackupKey;
import java.security.SecureRandom;
import java.util.ArrayList;
public static IdentityKeyPair getIdentityKeyPair(byte[] publicKeyBytes, byte[] privateKeyBytes) {
try {
- IdentityKey publicKey = new IdentityKey(publicKeyBytes);
- ECPrivateKey privateKey = Curve.decodePrivatePoint(privateKeyBytes);
+ final var publicKey = new IdentityKey(publicKeyBytes);
+ final var privateKey = new ECPrivateKey(privateKeyBytes);
return new IdentityKeyPair(publicKey, privateKey);
} catch (InvalidKeyException e) {
}
public static IdentityKeyPair generateIdentityKeyPair() {
- var djbKeyPair = Curve.generateKeyPair();
+ var djbKeyPair = ECKeyPair.generate();
var djbIdentityKey = new IdentityKey(djbKeyPair.getPublicKey());
var djbPrivateKey = djbKeyPair.getPrivateKey();
var records = new ArrayList<PreKeyRecord>(PREKEY_BATCH_SIZE);
for (var i = 0; i < PREKEY_BATCH_SIZE; i++) {
var preKeyId = (offset + i) % PREKEY_MAXIMUM_ID;
- var keyPair = Curve.generateKeyPair();
+ var keyPair = ECKeyPair.generate();
var record = new PreKeyRecord(preKeyId, keyPair);
records.add(record);
}
public static SignedPreKeyRecord generateSignedPreKeyRecord(
- final int signedPreKeyId, final IdentityKeyPair identityKeyPair
+ final int signedPreKeyId,
+ final ECPrivateKey privateKey
) {
- var keyPair = Curve.generateKeyPair();
+ var keyPair = ECKeyPair.generate();
byte[] signature;
- try {
- signature = Curve.calculateSignature(identityKeyPair.getPrivateKey(), keyPair.getPublicKey().serialize());
- } catch (InvalidKeyException e) {
- throw new AssertionError(e);
- }
+ signature = privateKey.calculateSignature(keyPair.getPublicKey().serialize());
return new SignedPreKeyRecord(signedPreKeyId, System.currentTimeMillis(), keyPair, signature);
}
- public static List<KyberPreKeyRecord> generateKyberPreKeyRecords(
- final int offset, final ECPrivateKey privateKey
- ) {
+ public static List<KyberPreKeyRecord> generateKyberPreKeyRecords(final int offset, final ECPrivateKey privateKey) {
var records = new ArrayList<KyberPreKeyRecord>(PREKEY_BATCH_SIZE);
for (var i = 0; i < PREKEY_BATCH_SIZE; i++) {
var preKeyId = (offset + i) % PREKEY_MAXIMUM_ID;
return getSecretBytes(32);
}
- public static MasterKey createMasterKey() {
- return MasterKey.createNew(secureRandom);
+ public static MediaRootBackupKey createMediaRootBackupKey() {
+ return new MediaRootBackupKey(getSecretBytes(32));
+ }
+
+ public static byte[] createRawStorageId() {
+ return getSecretBytes(16);
}
private static String getSecret(int size) {
public static int getRandomInt(int bound) {
return secureRandom.nextInt(bound);
}
+
+ public static PreKeyCollection generatePreKeysForType(final SignalAccount.AccountData<?> accountData) {
+ final var keyPair = accountData.getIdentityKeyPair();
+ final var preKeyMetadata = accountData.getPreKeyMetadata();
+
+ final var nextSignedPreKeyId = preKeyMetadata.getNextSignedPreKeyId();
+ final var signedPreKey = generateSignedPreKeyRecord(nextSignedPreKeyId, keyPair.getPrivateKey());
+
+ final var privateKey = keyPair.getPrivateKey();
+ final var kyberPreKeyIdOffset = preKeyMetadata.getNextKyberPreKeyId();
+ final var lastResortKyberPreKey = generateKyberPreKeyRecord(kyberPreKeyIdOffset, privateKey);
+
+ return new PreKeyCollection(keyPair.getPublicKey(), signedPreKey, lastResortKyberPreKey);
+ }
}