Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/iNPUTmice/Conversations.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Gultsch <daniel@gultsch.de>2022-09-06 18:01:57 +0300
committerDaniel Gultsch <daniel@gultsch.de>2022-09-06 18:01:57 +0300
commit789d1dc2259fa930c3751647c60526841f68abb6 (patch)
treee84d3d69fc5d2ee6c9dfacdd80319e5f62c5de3b
parent6d3d9dfe26a83fb49cbc12009bc5dfe1bea09704 (diff)
support tls-unique for TLSv1.2
-rw-r--r--src/main/java/eu/siacs/conversations/crypto/sasl/ChannelBinding.java12
-rw-r--r--src/main/java/eu/siacs/conversations/crypto/sasl/SaslMechanism.java6
-rw-r--r--src/main/java/eu/siacs/conversations/crypto/sasl/ScramPlusMechanism.java16
3 files changed, 30 insertions, 4 deletions
diff --git a/src/main/java/eu/siacs/conversations/crypto/sasl/ChannelBinding.java b/src/main/java/eu/siacs/conversations/crypto/sasl/ChannelBinding.java
index 847c50e9d..81bd12705 100644
--- a/src/main/java/eu/siacs/conversations/crypto/sasl/ChannelBinding.java
+++ b/src/main/java/eu/siacs/conversations/crypto/sasl/ChannelBinding.java
@@ -4,6 +4,8 @@ import android.util.Log;
import com.google.common.base.CaseFormat;
+import java.util.Collection;
+
import eu.siacs.conversations.Config;
public enum ChannelBinding {
@@ -24,4 +26,14 @@ public enum ChannelBinding {
return null;
}
}
+
+ public static ChannelBinding best(final Collection<ChannelBinding> bindings) {
+ if (bindings.contains(TLS_EXPORTER)) {
+ return TLS_EXPORTER;
+ } else if (bindings.contains(TLS_UNIQUE)) {
+ return TLS_UNIQUE;
+ } else {
+ return null;
+ }
+ }
}
diff --git a/src/main/java/eu/siacs/conversations/crypto/sasl/SaslMechanism.java b/src/main/java/eu/siacs/conversations/crypto/sasl/SaslMechanism.java
index 4380ad93c..829a4e6ea 100644
--- a/src/main/java/eu/siacs/conversations/crypto/sasl/SaslMechanism.java
+++ b/src/main/java/eu/siacs/conversations/crypto/sasl/SaslMechanism.java
@@ -103,11 +103,11 @@ public abstract class SaslMechanism {
public SaslMechanism of(
final Collection<String> mechanisms, final Collection<ChannelBinding> bindings) {
+ final ChannelBinding channelBinding = ChannelBinding.best(bindings);
if (mechanisms.contains(External.MECHANISM) && account.getPrivateKeyAlias() != null) {
return new External(account);
- } else if (mechanisms.contains(ScramSha1Plus.MECHANISM)
- && bindings.contains(ChannelBinding.TLS_EXPORTER)) {
- return new ScramSha1Plus(account, ChannelBinding.TLS_EXPORTER);
+ } else if (mechanisms.contains(ScramSha1Plus.MECHANISM) && channelBinding != null) {
+ return new ScramSha1Plus(account, channelBinding);
} else if (mechanisms.contains(ScramSha512.MECHANISM)) {
return new ScramSha512(account);
} else if (mechanisms.contains(ScramSha256.MECHANISM)) {
diff --git a/src/main/java/eu/siacs/conversations/crypto/sasl/ScramPlusMechanism.java b/src/main/java/eu/siacs/conversations/crypto/sasl/ScramPlusMechanism.java
index 3b0dbb6e1..8f6dec20e 100644
--- a/src/main/java/eu/siacs/conversations/crypto/sasl/ScramPlusMechanism.java
+++ b/src/main/java/eu/siacs/conversations/crypto/sasl/ScramPlusMechanism.java
@@ -22,11 +22,25 @@ abstract class ScramPlusMechanism extends ScramMechanism {
throw new AuthenticationException("Channel binding attempt on non secure socket");
}
if (this.channelBinding == ChannelBinding.TLS_EXPORTER) {
+ final byte[] keyingMaterial;
try {
- return Conscrypt.exportKeyingMaterial(sslSocket, EXPORTER_LABEL, new byte[0], 32);
+ keyingMaterial =
+ Conscrypt.exportKeyingMaterial(sslSocket, EXPORTER_LABEL, new byte[0], 32);
} catch (final SSLException e) {
throw new AuthenticationException("Could not export keying material");
}
+ if (keyingMaterial == null) {
+ throw new AuthenticationException(
+ "Could not export keying material. Socket not ready");
+ }
+ return keyingMaterial;
+ } else if (this.channelBinding == ChannelBinding.TLS_UNIQUE) {
+ final byte[] unique = Conscrypt.getTlsUnique(sslSocket);
+ if (unique == null) {
+ throw new AuthenticationException(
+ "Could not retrieve tls unique. Socket not ready");
+ }
+ return unique;
} else {
throw new AuthenticationException(
String.format("%s is not a valid channel binding", ChannelBinding.NONE));