]> nmode's Git Repositories - signal-cli/blob - lib/src/main/java/org/asamk/signal/manager/util/KeyUtils.java
Use var instead of explicit types
[signal-cli] / lib / src / main / java / org / asamk / signal / manager / util / KeyUtils.java
1 package org.asamk.signal.manager.util;
2
3 import org.signal.zkgroup.InvalidInputException;
4 import org.signal.zkgroup.profiles.ProfileKey;
5 import org.whispersystems.libsignal.IdentityKey;
6 import org.whispersystems.libsignal.IdentityKeyPair;
7 import org.whispersystems.libsignal.InvalidKeyException;
8 import org.whispersystems.libsignal.ecc.Curve;
9 import org.whispersystems.libsignal.state.PreKeyRecord;
10 import org.whispersystems.libsignal.state.SignedPreKeyRecord;
11 import org.whispersystems.libsignal.util.Medium;
12 import org.whispersystems.signalservice.api.kbs.MasterKey;
13
14 import java.security.SecureRandom;
15 import java.util.ArrayList;
16 import java.util.Base64;
17 import java.util.List;
18
19 public class KeyUtils {
20
21 private static final SecureRandom secureRandom = new SecureRandom();
22
23 private KeyUtils() {
24 }
25
26 public static IdentityKeyPair generateIdentityKeyPair() {
27 var djbKeyPair = Curve.generateKeyPair();
28 var djbIdentityKey = new IdentityKey(djbKeyPair.getPublicKey());
29 var 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 var records = new ArrayList<PreKeyRecord>(batchSize);
36 for (var i = 0; i < batchSize; i++) {
37 var preKeyId = (offset + i) % Medium.MAX_VALUE;
38 var keyPair = Curve.generateKeyPair();
39 var 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 var 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(secureRandom);
81 }
82
83 private static String getSecret(int size) {
84 var secret = getSecretBytes(size);
85 return Base64.getEncoder().encodeToString(secret);
86 }
87
88 public static byte[] getSecretBytes(int size) {
89 var secret = new byte[size];
90 secureRandom.nextBytes(secret);
91 return secret;
92 }
93 }