MessaageSender: use of session protocol for closed groups

This commit is contained in:
Brice 2021-01-14 13:20:18 +11:00
parent 6f22c3d6e3
commit 3357672516
4 changed files with 17 additions and 5 deletions

View File

@ -272,6 +272,10 @@ class Storage(val context: Context): StorageProtocol {
TODO("Not yet implemented") TODO("Not yet implemented")
} }
override fun getLatestClosedGroupEncryptionKeyPair(groupPublicKey: String): ECKeyPair {
TODO("Not yet implemented")
}
override fun setProfileSharing(address: Address, value: Boolean) { override fun setProfileSharing(address: Address, value: Boolean) {
val recipient = Recipient.from(context, address, false) val recipient = Recipient.from(context, address, false)
DatabaseFactory.getRecipientDatabase(context).setProfileSharing(recipient, value) DatabaseFactory.getRecipientDatabase(context).setProfileSharing(recipient, value)

View File

@ -104,6 +104,7 @@ interface StorageProtocol {
members: Collection<String>, admins: Collection<String>, threadID: Long) members: Collection<String>, admins: Collection<String>, threadID: Long)
fun isClosedGroup(publicKey: String): Boolean //TODO fun isClosedGroup(publicKey: String): Boolean //TODO
fun getClosedGroupEncryptionKeyPairs(groupPublicKey: String): MutableList<ECKeyPair> //TODO fun getClosedGroupEncryptionKeyPairs(groupPublicKey: String): MutableList<ECKeyPair> //TODO
fun getLatestClosedGroupEncryptionKeyPair(groupPublicKey: String): ECKeyPair //TODO
// Settings // Settings
fun setProfileSharing(address: Address, value: Boolean) fun setProfileSharing(address: Address, value: Boolean)

View File

@ -23,6 +23,7 @@ import org.session.libsignal.service.api.messages.SignalServiceAttachment
import org.session.libsignal.service.internal.push.SignalServiceProtos import org.session.libsignal.service.internal.push.SignalServiceProtos
import org.session.libsignal.service.internal.util.Base64 import org.session.libsignal.service.internal.util.Base64
import org.session.libsignal.service.loki.api.crypto.ProofOfWork import org.session.libsignal.service.loki.api.crypto.ProofOfWork
import org.session.libsignal.service.loki.utilities.hexEncodedPublicKey
object MessageSender { object MessageSender {
@ -32,7 +33,10 @@ object MessageSender {
object InvalidMessage : Error("Invalid message.") object InvalidMessage : Error("Invalid message.")
object ProtoConversionFailed : Error("Couldn't convert message to proto.") object ProtoConversionFailed : Error("Couldn't convert message to proto.")
object ProofOfWorkCalculationFailed : Error("Proof of work calculation failed.") object ProofOfWorkCalculationFailed : Error("Proof of work calculation failed.")
object NoUserPublicKey : Error("Couldn't find user key pair.") object NoUserX25519KeyPair : Error("Couldn't find user X25519 key pair.")
object NoUserED25519KeyPair : Error("Couldn't find user ED25519 key pair.")
object SigningFailed : Error("Couldn't sign message.")
object EncryptionFailed : Error("Couldn't encrypt message.")
// Closed groups // Closed groups
object NoThread : Error("Couldn't find a thread associated with the given group public key.") object NoThread : Error("Couldn't find a thread associated with the given group public key.")
@ -71,7 +75,7 @@ object MessageSender {
var snodeMessage: SnodeMessage? = null var snodeMessage: SnodeMessage? = null
// Set the timestamp, sender and recipient // Set the timestamp, sender and recipient
message.sentTimestamp ?: run { message.sentTimestamp = System.currentTimeMillis() } /* Visible messages will already have their sent timestamp set */ message.sentTimestamp ?: run { message.sentTimestamp = System.currentTimeMillis() } /* Visible messages will already have their sent timestamp set */
message.sender = storage.getUserPublicKey() message.sender = userPublicKey
try { try {
when (destination) { when (destination) {
is Destination.Contact -> message.recipient = destination.publicKey is Destination.Contact -> message.recipient = destination.publicKey
@ -117,7 +121,10 @@ object MessageSender {
val ciphertext: ByteArray val ciphertext: ByteArray
when (destination) { when (destination) {
is Destination.Contact -> ciphertext = MessageSenderEncryption.encryptWithSessionProtocol(plaintext, destination.publicKey) is Destination.Contact -> ciphertext = MessageSenderEncryption.encryptWithSessionProtocol(plaintext, destination.publicKey)
is Destination.ClosedGroup -> ciphertext = MessageSenderEncryption.encryptWithSharedSenderKeys(plaintext, destination.groupPublicKey) is Destination.ClosedGroup -> {
val encryptionKeyPair = MessagingConfiguration.shared.storage.getLatestClosedGroupEncryptionKeyPair(destination.groupPublicKey)
ciphertext = MessageSenderEncryption.encryptWithSessionProtocol(plaintext, encryptionKeyPair.hexEncodedPublicKey)
}
is Destination.OpenGroup -> throw preconditionFailure is Destination.OpenGroup -> throw preconditionFailure
} }
// Wrap the result // Wrap the result

View File

@ -38,7 +38,7 @@ object MessageSenderEncryption {
return MessagingConfiguration.shared.sessionProtocol.encrypt(plaintext, recipientPublicKey) return MessagingConfiguration.shared.sessionProtocol.encrypt(plaintext, recipientPublicKey)
} }
internal fun encryptWithSharedSenderKeys(plaintext: ByteArray, groupPublicKey: String): ByteArray { /*internal fun encryptWithSharedSenderKeys(plaintext: ByteArray, groupPublicKey: String): ByteArray {
// 1. ) Encrypt the data with the user's sender key // 1. ) Encrypt the data with the user's sender key
val userPublicKey = MessagingConfiguration.shared.storage.getUserPublicKey() ?: throw Error.NoUserPublicKey val userPublicKey = MessagingConfiguration.shared.storage.getUserPublicKey() ?: throw Error.NoUserPublicKey
val ciphertextAndKeyIndex = SharedSenderKeysImplementation.shared.encrypt(plaintext, groupPublicKey, userPublicKey) val ciphertextAndKeyIndex = SharedSenderKeysImplementation.shared.encrypt(plaintext, groupPublicKey, userPublicKey)
@ -52,5 +52,5 @@ object MessageSenderEncryption {
.setCiphertext(ByteString.copyFrom(intermediate.ciphertext)) .setCiphertext(ByteString.copyFrom(intermediate.ciphertext))
.setEphemeralPublicKey(ByteString.copyFrom(intermediate.ephemeralPublicKey)) .setEphemeralPublicKey(ByteString.copyFrom(intermediate.ephemeralPublicKey))
.build().toByteArray() .build().toByteArray()
} }*/
} }