]> nmode's Git Repositories - signal-cli/blob - src/main/java/org/asamk/signal/manager/util/KeyUtils.java
3285e65abbb511f487f65fb1d9350bcee32b8057
[signal-cli] / src / main / java / org / asamk / signal / manager / util / KeyUtils.java
1 package org.asamk.signal.manager.util;
2
3 import org.asamk.signal.util.RandomUtils;
4 import org.signal.zkgroup.InvalidInputException;
5 import org.signal.zkgroup.profiles.ProfileKey;
6 import org.whispersystems.libsignal.IdentityKey;
7 import org.whispersystems.libsignal.IdentityKeyPair;
8 import org.whispersystems.libsignal.InvalidKeyException;
9 import org.whispersystems.libsignal.ecc.Curve;
10 import org.whispersystems.libsignal.ecc.ECKeyPair;
11 import org.whispersystems.libsignal.ecc.ECPrivateKey;
12 import org.whispersystems.libsignal.state.PreKeyRecord;
13 import org.whispersystems.libsignal.state.SignedPreKeyRecord;
14 import org.whispersystems.libsignal.util.Medium;
15 import org.whispersystems.signalservice.api.kbs.MasterKey;
16
17 import java.util.ArrayList;
18 import java.util.Base64;
19 import java.util.List;
20
21 public class KeyUtils {
22
23 private KeyUtils() {
24 }
25
26 public static IdentityKeyPair generateIdentityKeyPair() {
27 ECKeyPair djbKeyPair = Curve.generateKeyPair();
28 IdentityKey djbIdentityKey = new IdentityKey(djbKeyPair.getPublicKey());
29 ECPrivateKey djbPrivateKey = djbKeyPair.getPrivateKey();
30
31 return new IdentityKeyPair(djbIdentityKey, djbPrivateKey);
32 }
33
34 public static List<PreKeyRecord> generatePreKeyRecords(final int offset, final int batchSize) {
35 List<PreKeyRecord> records = new ArrayList<>(batchSize);
36 for (int i = 0; i < batchSize; i++) {
37 int preKeyId = (offset + i) % Medium.MAX_VALUE;
38 ECKeyPair keyPair = Curve.generateKeyPair();
39 PreKeyRecord record = new PreKeyRecord(preKeyId, keyPair);
40
41 records.add(record);
42 }
43 return records;
44 }
45
46 public static SignedPreKeyRecord generateSignedPreKeyRecord(
47 final IdentityKeyPair identityKeyPair, final int signedPreKeyId
48 ) {
49 ECKeyPair keyPair = Curve.generateKeyPair();
50 byte[] signature;
51 try {
52 signature = Curve.calculateSignature(identityKeyPair.getPrivateKey(), keyPair.getPublicKey().serialize());
53 } catch (InvalidKeyException e) {
54 throw new AssertionError(e);
55 }
56 return new SignedPreKeyRecord(signedPreKeyId, System.currentTimeMillis(), keyPair, signature);
57 }
58
59 public static String createSignalingKey() {
60 return getSecret(52);
61 }
62
63 public static ProfileKey createProfileKey() {
64 try {
65 return new ProfileKey(getSecretBytes(32));
66 } catch (InvalidInputException e) {
67 throw new AssertionError("Profile key is guaranteed to be 32 bytes here");
68 }
69 }
70
71 public static String createPassword() {
72 return getSecret(18);
73 }
74
75 public static byte[] createStickerUploadKey() {
76 return getSecretBytes(32);
77 }
78
79 public static MasterKey createMasterKey() {
80 return MasterKey.createNew(RandomUtils.getSecureRandom());
81 }
82
83 private static String getSecret(int size) {
84 byte[] secret = getSecretBytes(size);
85 return Base64.getEncoder().encodeToString(secret);
86 }
87
88 public static byte[] getSecretBytes(int size) {
89 byte[] secret = new byte[size];
90 RandomUtils.getSecureRandom().nextBytes(secret);
91 return secret;
92 }
93 }