import org.signal.libsignal.protocol.InvalidKeyException;
import org.signal.libsignal.protocol.ecc.Curve;
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.KyberPreKeyRecord;
import org.signal.libsignal.protocol.state.PreKeyRecord;
import org.signal.libsignal.protocol.state.SignedPreKeyRecord;
-import org.signal.libsignal.protocol.util.Medium;
import org.signal.libsignal.zkgroup.InvalidInputException;
import org.signal.libsignal.zkgroup.profiles.ProfileKey;
import org.whispersystems.signalservice.api.kbs.MasterKey;
import java.util.Base64;
import java.util.List;
+import static org.asamk.signal.manager.config.ServiceConfig.PREKEY_MAXIMUM_ID;
+
public class KeyUtils {
private static final SecureRandom secureRandom = new SecureRandom();
public static List<PreKeyRecord> generatePreKeyRecords(final int offset, final int batchSize) {
var records = new ArrayList<PreKeyRecord>(batchSize);
for (var i = 0; i < batchSize; i++) {
- var preKeyId = (offset + i) % Medium.MAX_VALUE;
+ var preKeyId = (offset + i) % PREKEY_MAXIMUM_ID;
var keyPair = Curve.generateKeyPair();
var record = new PreKeyRecord(preKeyId, keyPair);
return new SignedPreKeyRecord(signedPreKeyId, System.currentTimeMillis(), keyPair, signature);
}
+ public static List<KyberPreKeyRecord> generateKyberPreKeyRecords(
+ final int offset, final int batchSize, final ECPrivateKey privateKey
+ ) {
+ var records = new ArrayList<KyberPreKeyRecord>(batchSize);
+ for (var i = 0; i < batchSize; i++) {
+ var preKeyId = (offset + i) % PREKEY_MAXIMUM_ID;
+ records.add(generateKyberPreKeyRecord(preKeyId, privateKey));
+ }
+ return records;
+ }
+
+ public static KyberPreKeyRecord generateKyberPreKeyRecord(final int preKeyId, final ECPrivateKey privateKey) {
+ KEMKeyPair keyPair = KEMKeyPair.generate(KEMKeyType.KYBER_1024);
+ byte[] signature = privateKey.calculateSignature(keyPair.getPublicKey().serialize());
+
+ return new KyberPreKeyRecord(preKeyId, System.currentTimeMillis(), keyPair, signature);
+ }
+
public static ProfileKey createProfileKey() {
try {
return new ProfileKey(getSecretBytes(32));