X-Git-Url: https://git.nmode.ca/signal-cli/blobdiff_plain/425626ef9475cbc90ef8ada95dee172389baf521..0624d6a808b8b2a247aadd96450319bc94e3729f:/src/main/java/org/asamk/signal/manager/util/KeyUtils.java 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 3f9ec08f..171e7a42 100644 --- a/src/main/java/org/asamk/signal/manager/util/KeyUtils.java +++ b/src/main/java/org/asamk/signal/manager/util/KeyUtils.java @@ -3,14 +3,59 @@ package org.asamk.signal.manager.util; import org.asamk.signal.util.RandomUtils; 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() { } + public static IdentityKeyPair generateIdentityKeyPair() { + ECKeyPair djbKeyPair = Curve.generateKeyPair(); + IdentityKey djbIdentityKey = new IdentityKey(djbKeyPair.getPublicKey()); + ECPrivateKey djbPrivateKey = djbKeyPair.getPrivateKey(); + + 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); }