mirror of
https://github.com/signalapp/Signal-Android.git
synced 2026-04-27 04:04:43 +01:00
Create a new manage profile screen.
This commit is contained in:
@@ -639,7 +639,7 @@ public class SignalServiceAccountManager {
|
||||
{
|
||||
if (name == null) name = "";
|
||||
|
||||
byte[] ciphertextName = new ProfileCipher(profileKey).encryptName(name.getBytes(StandardCharsets.UTF_8), ProfileCipher.NAME_PADDED_LENGTH);
|
||||
byte[] ciphertextName = new ProfileCipher(profileKey).encryptName(name.getBytes(StandardCharsets.UTF_8), ProfileCipher.getTargetNameLength(name));
|
||||
boolean hasAvatar = avatar != null;
|
||||
ProfileAvatarData profileAvatarData = null;
|
||||
|
||||
|
||||
@@ -5,6 +5,7 @@ import org.signal.zkgroup.profiles.ProfileKey;
|
||||
import org.whispersystems.libsignal.util.ByteUtil;
|
||||
import org.whispersystems.signalservice.internal.util.Util;
|
||||
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.security.InvalidAlgorithmParameterException;
|
||||
import java.security.InvalidKeyException;
|
||||
import java.security.MessageDigest;
|
||||
@@ -20,7 +21,10 @@ import javax.crypto.spec.SecretKeySpec;
|
||||
|
||||
public class ProfileCipher {
|
||||
|
||||
public static final int NAME_PADDED_LENGTH = 53;
|
||||
private static final int NAME_PADDED_LENGTH_1 = 53;
|
||||
private static final int NAME_PADDED_LENGTH_2 = 257;
|
||||
|
||||
public static final int MAX_POSSIBLE_NAME_LENGTH = NAME_PADDED_LENGTH_2;
|
||||
|
||||
private final ProfileKey key;
|
||||
|
||||
@@ -99,4 +103,13 @@ public class ProfileCipher {
|
||||
}
|
||||
}
|
||||
|
||||
public static int getTargetNameLength(String name) {
|
||||
int nameLength = name.getBytes(StandardCharsets.UTF_8).length;
|
||||
|
||||
if (nameLength <= NAME_PADDED_LENGTH_1) {
|
||||
return NAME_PADDED_LENGTH_1;
|
||||
} else {
|
||||
return NAME_PADDED_LENGTH_2;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,9 +7,11 @@ import org.conscrypt.Conscrypt;
|
||||
import org.signal.zkgroup.InvalidInputException;
|
||||
import org.signal.zkgroup.profiles.ProfileKey;
|
||||
import org.whispersystems.signalservice.internal.util.Util;
|
||||
import org.whispersystems.util.Base64;
|
||||
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.security.Security;
|
||||
|
||||
public class ProfileCipherTest extends TestCase {
|
||||
@@ -21,7 +23,7 @@ public class ProfileCipherTest extends TestCase {
|
||||
public void testEncryptDecrypt() throws InvalidCiphertextException, InvalidInputException {
|
||||
ProfileKey key = new ProfileKey(Util.getSecretBytes(32));
|
||||
ProfileCipher cipher = new ProfileCipher(key);
|
||||
byte[] name = cipher.encryptName("Clement\0Duval".getBytes(), ProfileCipher.NAME_PADDED_LENGTH);
|
||||
byte[] name = cipher.encryptName("Clement\0Duval".getBytes(), 53);
|
||||
byte[] plaintext = cipher.decryptName(name);
|
||||
assertEquals(new String(plaintext), "Clement\0Duval");
|
||||
}
|
||||
@@ -59,4 +61,29 @@ public class ProfileCipherTest extends TestCase {
|
||||
assertEquals(new String(result.toByteArray()), "This is an avatar");
|
||||
}
|
||||
|
||||
public void testEncryptLengthBucket1() throws InvalidInputException {
|
||||
ProfileKey key = new ProfileKey(Util.getSecretBytes(32));
|
||||
ProfileCipher cipher = new ProfileCipher(key);
|
||||
byte[] name = cipher.encryptName("Peter\0Parker".getBytes(), 53);
|
||||
|
||||
String encoded = Base64.encodeBytes(name);
|
||||
|
||||
assertEquals(108, encoded.length());
|
||||
}
|
||||
|
||||
public void testEncryptLengthBucket2() throws InvalidInputException {
|
||||
ProfileKey key = new ProfileKey(Util.getSecretBytes(32));
|
||||
ProfileCipher cipher = new ProfileCipher(key);
|
||||
byte[] name = cipher.encryptName("Peter\0Parker".getBytes(), 257);
|
||||
|
||||
String encoded = Base64.encodeBytes(name);
|
||||
|
||||
assertEquals(380, encoded.length());
|
||||
}
|
||||
|
||||
public void testTargetNameLength() {
|
||||
assertEquals(53, ProfileCipher.getTargetNameLength("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"));
|
||||
assertEquals(53, ProfileCipher.getTargetNameLength("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1"));
|
||||
assertEquals(257, ProfileCipher.getTargetNameLength("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ12"));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user