use empty message (not key transport) to finish sessions
This commit is contained in:
parent
5e79dd8b68
commit
86ef179c42
|
@ -35,6 +35,8 @@ public class EncryptionBuilder {
|
||||||
|
|
||||||
private byte[] payload;
|
private byte[] payload;
|
||||||
|
|
||||||
|
private KeyTransport keyTransport;
|
||||||
|
|
||||||
public Encrypted build() throws AxolotlEncryptionException {
|
public Encrypted build() throws AxolotlEncryptionException {
|
||||||
try {
|
try {
|
||||||
return buildOrThrow();
|
return buildOrThrow();
|
||||||
|
@ -57,6 +59,8 @@ public class EncryptionBuilder {
|
||||||
final long sourceDeviceId =
|
final long sourceDeviceId =
|
||||||
Preconditions.checkNotNull(this.sourceDeviceId, "Specify a source device id");
|
Preconditions.checkNotNull(this.sourceDeviceId, "Specify a source device id");
|
||||||
final var payloadCleartext = Preconditions.checkNotNull(this.payload, "Specify a payload");
|
final var payloadCleartext = Preconditions.checkNotNull(this.payload, "Specify a payload");
|
||||||
|
Preconditions.checkState(
|
||||||
|
this.keyTransport == null, "A payload message should not have a keyTransport");
|
||||||
Preconditions.checkState(sessions.size() > 0, "Add at least on session");
|
Preconditions.checkState(sessions.size() > 0, "Add at least on session");
|
||||||
final var sessions = ImmutableList.copyOf(this.sessions);
|
final var sessions = ImmutableList.copyOf(this.sessions);
|
||||||
final var key = generateKey();
|
final var key = generateKey();
|
||||||
|
@ -89,14 +93,37 @@ public class EncryptionBuilder {
|
||||||
Preconditions.checkNotNull(this.sourceDeviceId, "Specify a source device id");
|
Preconditions.checkNotNull(this.sourceDeviceId, "Specify a source device id");
|
||||||
Preconditions.checkState(
|
Preconditions.checkState(
|
||||||
this.payload == null, "A key transport message should not have a payload");
|
this.payload == null, "A key transport message should not have a payload");
|
||||||
|
final var keyTransport =
|
||||||
|
Preconditions.checkNotNull(this.keyTransport, "Specify a keyTransport");
|
||||||
// TODO key transport messages in twomemo (omemo:1) use 32 bytes of zeros instead of a key
|
// TODO key transport messages in twomemo (omemo:1) use 32 bytes of zeros instead of a key
|
||||||
// TODO if we are not using this using this for actual key transport we can do this in siacs
|
// TODO if we are not using this using this for actual key transport we can do this in siacs
|
||||||
// omemo too (and get rid of the IV)
|
// omemo too (and get rid of the IV)
|
||||||
final var sessions = ImmutableList.copyOf(this.sessions);
|
final var sessions = ImmutableList.copyOf(this.sessions);
|
||||||
final var key = generateKey();
|
final var header = buildHeader(sessions, keyTransport.key);
|
||||||
final var iv = generateIv();
|
header.addIv(keyTransport.iv);
|
||||||
final var header = buildHeader(sessions, key);
|
header.setSourceDevice(sourceDeviceId);
|
||||||
header.addIv(iv);
|
final var encrypted = new Encrypted();
|
||||||
|
encrypted.addExtension(header);
|
||||||
|
return encrypted;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Encrypted buildEmpty() throws AxolotlEncryptionException {
|
||||||
|
try {
|
||||||
|
return buildEmptyOrThrow();
|
||||||
|
} catch (final UntrustedIdentityException e) {
|
||||||
|
throw new AxolotlEncryptionException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Encrypted buildEmptyOrThrow() throws UntrustedIdentityException {
|
||||||
|
final long sourceDeviceId =
|
||||||
|
Preconditions.checkNotNull(this.sourceDeviceId, "Specify a source device id");
|
||||||
|
Preconditions.checkState(
|
||||||
|
this.payload == null, "An empty message should not have a payload");
|
||||||
|
Preconditions.checkState(
|
||||||
|
this.keyTransport == null, "An empty message should not have a keyTransport");
|
||||||
|
final var sessions = ImmutableList.copyOf(this.sessions);
|
||||||
|
final var header = buildHeader(sessions, new byte[32]);
|
||||||
header.setSourceDevice(sourceDeviceId);
|
header.setSourceDevice(sourceDeviceId);
|
||||||
final var encrypted = new Encrypted();
|
final var encrypted = new Encrypted();
|
||||||
encrypted.addExtension(header);
|
encrypted.addExtension(header);
|
||||||
|
@ -108,6 +135,11 @@ public class EncryptionBuilder {
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public EncryptionBuilder keyTransport(final KeyTransport keyTransport) {
|
||||||
|
this.keyTransport = keyTransport;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
public EncryptionBuilder session(final AxolotlSession session) {
|
public EncryptionBuilder session(final AxolotlSession session) {
|
||||||
this.sessions.add(session);
|
this.sessions.add(session);
|
||||||
return this;
|
return this;
|
||||||
|
@ -182,4 +214,18 @@ public class EncryptionBuilder {
|
||||||
Conversations.SECURE_RANDOM.nextBytes(iv);
|
Conversations.SECURE_RANDOM.nextBytes(iv);
|
||||||
return iv;
|
return iv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static KeyTransport createKeyTransport() {
|
||||||
|
return new KeyTransport(generateKey(), generateIv());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class KeyTransport {
|
||||||
|
public final byte[] key;
|
||||||
|
public final byte[] iv;
|
||||||
|
|
||||||
|
private KeyTransport(byte[] key, byte[] iv) {
|
||||||
|
this.key = key;
|
||||||
|
this.iv = iv;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -525,7 +525,7 @@ public class AxolotlManager extends AbstractManager implements AxolotlService.Po
|
||||||
new EncryptionBuilder()
|
new EncryptionBuilder()
|
||||||
.session(existingSession)
|
.session(existingSession)
|
||||||
.sourceDeviceId(signalProtocolStore().getLocalRegistrationId())
|
.sourceDeviceId(signalProtocolStore().getLocalRegistrationId())
|
||||||
.buildKeyTransport();
|
.buildEmpty();
|
||||||
} catch (final AxolotlEncryptionException e) {
|
} catch (final AxolotlEncryptionException e) {
|
||||||
LOGGER.error("Could not create key transport message to complete session", e);
|
LOGGER.error("Could not create key transport message to complete session", e);
|
||||||
return;
|
return;
|
||||||
|
@ -534,7 +534,7 @@ public class AxolotlManager extends AbstractManager implements AxolotlService.Po
|
||||||
message.setTo(axolotlAddress.getJid());
|
message.setTo(axolotlAddress.getJid());
|
||||||
message.addExtension(encrypted);
|
message.addExtension(encrypted);
|
||||||
LOGGER.info(
|
LOGGER.info(
|
||||||
"Sending KeyTransport Message to {}/{}",
|
"Sending empty axolotl message to {}/{}",
|
||||||
axolotlAddress.getJid(),
|
axolotlAddress.getJid(),
|
||||||
axolotlAddress.getDeviceId());
|
axolotlAddress.getDeviceId());
|
||||||
connection.sendMessagePacket(message);
|
connection.sendMessagePacket(message);
|
||||||
|
|
Loading…
Reference in a new issue