diff --git a/libsignal-protocol-dotnet/DecryptionCallback.cs b/libsignal-protocol-dotnet/DecryptionCallback.cs
index b72b20d..d974872 100644
--- a/libsignal-protocol-dotnet/DecryptionCallback.cs
+++ b/libsignal-protocol-dotnet/DecryptionCallback.cs
@@ -1,24 +1,25 @@
-/**
- * Copyright (C) 2016 smndtrl, langboost
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
+using libsignal.state;
+using System.Threading.Tasks;
+/**
+* Copyright (C) 2016 smndtrl, langboost
+*
+* This program is free software: you can redistribute it and/or modify
+* it under the terms of the GNU General Public License as published by
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program. If not, see .
+*/
namespace libsignal
{
public interface DecryptionCallback
{
- void handlePlaintext(byte[] plaintext);
+ Task handlePlaintext(byte[] plaintext, SessionRecord sessionRecord);
}
}
diff --git a/libsignal-protocol-dotnet/SessionCipher.cs b/libsignal-protocol-dotnet/SessionCipher.cs
index 36f9977..c4edef1 100644
--- a/libsignal-protocol-dotnet/SessionCipher.cs
+++ b/libsignal-protocol-dotnet/SessionCipher.cs
@@ -24,6 +24,7 @@
using Strilanc.Value;
using System;
using System.Collections.Generic;
+using System.Threading.Tasks;
namespace libsignal
{
@@ -141,7 +142,9 @@ public CiphertextMessage encrypt(byte[] paddedMessage)
*/
public byte[] decrypt(PreKeySignalMessage ciphertext)
{
- return decrypt(ciphertext, new NullDecryptionCallback());
+ var tsk = (decrypt(ciphertext, new NullDecryptionCallback()));
+ tsk.Wait();
+ return tsk.Result;
}
/**
@@ -165,7 +168,7 @@ public byte[] decrypt(PreKeySignalMessage ciphertext)
* @throws InvalidKeyException when the message is formatted incorrectly.
* @throws UntrustedIdentityException when the {@link IdentityKey} of the sender is untrusted.
*/
- public byte[] decrypt(PreKeySignalMessage ciphertext, DecryptionCallback callback)
+ public Task decrypt(PreKeySignalMessage ciphertext, DecryptionCallback callback)
{
lock (SESSION_LOCK)
{
@@ -175,7 +178,7 @@ public byte[] decrypt(PreKeySignalMessage ciphertext, DecryptionCallback callbac
identityKeyStore.SaveIdentity(remoteAddress, sessionRecord.getSessionState().getRemoteIdentityKey());
- callback.handlePlaintext(plaintext);
+ callback.handlePlaintext(plaintext, sessionRecord).Wait();
sessionStore.StoreSession(remoteAddress, sessionRecord);
@@ -184,7 +187,7 @@ public byte[] decrypt(PreKeySignalMessage ciphertext, DecryptionCallback callbac
preKeyStore.RemovePreKey(unsignedPreKeyId.ForceGetValue());
}
- return plaintext;
+ return Task.FromResult(plaintext);
}
}
@@ -202,7 +205,9 @@ public byte[] decrypt(PreKeySignalMessage ciphertext, DecryptionCallback callbac
*/
public byte[] decrypt(SignalMessage ciphertext)
{
- return decrypt(ciphertext, new NullDecryptionCallback());
+ var tsk = decrypt(ciphertext, new NullDecryptionCallback());
+ tsk.Wait();
+ return tsk.Result;
}
/**
@@ -223,7 +228,7 @@ public byte[] decrypt(SignalMessage ciphertext)
* is no longer supported.
* @throws NoSessionException if there is no established session for this contact.
*/
- public byte[] decrypt(SignalMessage ciphertext, DecryptionCallback callback)
+ public Task decrypt(SignalMessage ciphertext, DecryptionCallback callback)
{
lock (SESSION_LOCK)
{
@@ -241,11 +246,11 @@ public byte[] decrypt(SignalMessage ciphertext, DecryptionCallback callback)
throw new UntrustedIdentityException(remoteAddress.Name, sessionRecord.getSessionState().getRemoteIdentityKey());
}
- callback.handlePlaintext(plaintext);
+ callback.handlePlaintext(plaintext, sessionRecord).Wait();//no async in a lock
sessionStore.StoreSession(remoteAddress, sessionRecord);
- return plaintext;
+ return Task.FromResult(plaintext);
}
}
@@ -425,7 +430,7 @@ private byte[] getPlaintext(MessageKeys messageKeys, byte[] cipherText)
private class NullDecryptionCallback : DecryptionCallback
{
- public void handlePlaintext(byte[] plaintext) { }
+ public Task handlePlaintext(byte[] plaintext, SessionRecord sessionRecord) => Task.CompletedTask;
}
}
}
diff --git a/libsignal-protocol-dotnet/groups/GroupCipher.cs b/libsignal-protocol-dotnet/groups/GroupCipher.cs
index 8c0f977..f7de31d 100644
--- a/libsignal-protocol-dotnet/groups/GroupCipher.cs
+++ b/libsignal-protocol-dotnet/groups/GroupCipher.cs
@@ -18,8 +18,10 @@
using libsignal.groups.ratchet;
using libsignal.groups.state;
using libsignal.protocol;
+using libsignal.state;
using libsignal.util;
using System;
+using System.Threading.Tasks;
namespace libsignal.groups
{
@@ -134,7 +136,7 @@ public byte[] decrypt(byte[] senderKeyMessageBytes, DecryptionCallback callback)
byte[] plaintext = getPlainText(senderKey.getIv(), senderKey.getCipherKey(), senderKeyMessage.getCipherText());
- callback.handlePlaintext(plaintext);
+ callback.handlePlaintext(plaintext, null).Wait();
senderKeyStore.storeSenderKey(senderKeyId, record);
@@ -217,8 +219,9 @@ private byte[] getCipherText(byte[] iv, byte[] key, byte[] plaintext)
private class NullDecryptionCallback : DecryptionCallback
{
- public void handlePlaintext(byte[] plaintext) { }
- }
+ public Task handlePlaintext(byte[] plaintext, SessionRecord sessionRecord) => Task.CompletedTask;
+
+ }
}
}