mirror of
https://github.com/signalapp/libsignal.git
synced 2024-09-20 03:52:17 +02:00
Java: Add a test for SSv2 with 1000s of recipients
This previously caused the JVM to crash because we ran out of local reference slots.
This commit is contained in:
parent
169d4ca156
commit
72d3c97890
@ -38,6 +38,7 @@ import org.whispersystems.libsignal.util.Hex;
|
||||
import org.whispersystems.libsignal.util.Pair;
|
||||
import org.whispersystems.libsignal.util.guava.Optional;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.UUID;
|
||||
|
||||
@ -226,6 +227,55 @@ public class SealedSessionCipherTest extends TestCase {
|
||||
}
|
||||
}
|
||||
|
||||
public void testEncryptGroupWithManyRecipients() throws UntrustedIdentityException, InvalidKeyException, InvalidCertificateException, InvalidMessageException, InvalidMetadataMessageException, InvalidRegistrationIdException, LegacyMessageException, NoSessionException, ProtocolDuplicateMessageException, ProtocolUntrustedIdentityException, ProtocolLegacyMessageException, ProtocolInvalidKeyException, InvalidMetadataVersionException, ProtocolInvalidVersionException, ProtocolInvalidMessageException, ProtocolInvalidKeyIdException, ProtocolNoSessionException, SelfSendException {
|
||||
TestInMemorySignalProtocolStore aliceStore = new TestInMemorySignalProtocolStore();
|
||||
TestInMemorySignalProtocolStore bobStore = new TestInMemorySignalProtocolStore();
|
||||
TestInMemorySignalProtocolStore carolStore = new TestInMemorySignalProtocolStore();
|
||||
SignalProtocolAddress bobAddress = new SignalProtocolAddress("e80f7bbe-5b94-471e-bd8c-2173654ea3d1", 1);
|
||||
SignalProtocolAddress carolAddress = new SignalProtocolAddress("38381c3b-2606-4ca7-9310-7cb927f2ab4a", 1);
|
||||
|
||||
ECKeyPair bobPreKey = Curve.generateKeyPair();
|
||||
IdentityKeyPair bobIdentityKey = bobStore.getIdentityKeyPair();
|
||||
SignedPreKeyRecord bobSignedPreKey = generateSignedPreKey(bobIdentityKey, 2);
|
||||
|
||||
PreKeyBundle bobBundle = new PreKeyBundle(0x1234, 1, 1, bobPreKey.getPublicKey(), 2, bobSignedPreKey.getKeyPair().getPublicKey(), bobSignedPreKey.getSignature(), bobIdentityKey.getPublicKey());
|
||||
SessionBuilder aliceSessionBuilderForBob = new SessionBuilder(aliceStore, bobAddress);
|
||||
aliceSessionBuilderForBob.process(bobBundle);
|
||||
|
||||
ECKeyPair carolPreKey = Curve.generateKeyPair();
|
||||
IdentityKeyPair carolIdentityKey = carolStore.getIdentityKeyPair();
|
||||
SignedPreKeyRecord carolSignedPreKey = generateSignedPreKey(carolIdentityKey, 2);
|
||||
|
||||
PreKeyBundle carolBundle = new PreKeyBundle(0x1111, 1, 1, carolPreKey.getPublicKey(), 2, carolSignedPreKey.getKeyPair().getPublicKey(), carolSignedPreKey.getSignature(), carolIdentityKey.getPublicKey());
|
||||
SessionBuilder aliceSessionBuilderForCarol = new SessionBuilder(aliceStore, carolAddress);
|
||||
aliceSessionBuilderForCarol.process(carolBundle);
|
||||
|
||||
ECKeyPair trustRoot = Curve.generateKeyPair();
|
||||
SenderCertificate senderCertificate = createCertificateFor(trustRoot, UUID.fromString("9d0652a3-dcc3-4d11-975f-74d61598733f"), "+14151111111", 1, aliceStore.getIdentityKeyPair().getPublicKey().getPublicKey(), 31337);
|
||||
SealedSessionCipher aliceCipher = new SealedSessionCipher(aliceStore, UUID.fromString("9d0652a3-dcc3-4d11-975f-74d61598733f"), "+14151111111", 1);
|
||||
|
||||
SignalProtocolAddress senderAddress = new SignalProtocolAddress("9d0652a3-dcc3-4d11-975f-74d61598733f", 1);
|
||||
UUID distributionId = UUID.fromString("d1d1d1d1-7000-11eb-b32a-33b8a8a487a6");
|
||||
|
||||
GroupSessionBuilder aliceGroupSessionBuilder = new GroupSessionBuilder(aliceStore);
|
||||
SenderKeyDistributionMessage sentAliceDistributionMessage = aliceGroupSessionBuilder.create(senderAddress, distributionId);
|
||||
|
||||
GroupCipher aliceGroupCipher = new GroupCipher(aliceStore, senderAddress);
|
||||
CiphertextMessage ciphertextFromAlice = aliceGroupCipher.encrypt(distributionId, "smert ze smert".getBytes());
|
||||
|
||||
UnidentifiedSenderMessageContent usmcFromAlice = new UnidentifiedSenderMessageContent(ciphertextFromAlice, senderCertificate, UnidentifiedSenderMessageContent.CONTENT_HINT_IMPLICIT, Optional.of(new byte[]{42, 43}));
|
||||
|
||||
ArrayList<SignalProtocolAddress> addresses = new ArrayList<>();
|
||||
for (int i = 0; i < 1000; ++i) {
|
||||
// Alternate between the two to avoid peephole optimizations.
|
||||
addresses.add(bobAddress);
|
||||
addresses.add(carolAddress);
|
||||
}
|
||||
|
||||
// Just check that we don't throw an error or crash.
|
||||
byte[] aliceMessage = aliceCipher.multiRecipientEncrypt(addresses, usmcFromAlice);
|
||||
}
|
||||
|
||||
public void testProtocolException() throws UntrustedIdentityException, InvalidKeyException, InvalidCertificateException, InvalidMessageException, InvalidMetadataMessageException, InvalidRegistrationIdException, LegacyMessageException, NoSessionException, ProtocolDuplicateMessageException, ProtocolUntrustedIdentityException, ProtocolLegacyMessageException, ProtocolInvalidKeyException, InvalidMetadataVersionException, ProtocolInvalidVersionException, ProtocolInvalidMessageException, ProtocolInvalidKeyIdException, ProtocolNoSessionException, SelfSendException {
|
||||
TestInMemorySignalProtocolStore aliceStore = new TestInMemorySignalProtocolStore();
|
||||
TestInMemorySignalProtocolStore bobStore = new TestInMemorySignalProtocolStore();
|
||||
|
Loading…
Reference in New Issue
Block a user