Merge pull request #8900 from element-hq/feature/bma/testScanEncryptorUtils
Add unit test on ScanEncryptorUtils.
This commit is contained in:
commit
6a8e978204
|
@ -0,0 +1,124 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2024 The Matrix.org Foundation C.I.C.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.matrix.android.sdk.internal.session.contentscanner
|
||||||
|
|
||||||
|
import okio.ByteString.Companion.decodeBase64
|
||||||
|
import org.amshove.kluent.shouldBe
|
||||||
|
import org.amshove.kluent.shouldBeEqualTo
|
||||||
|
import org.amshove.kluent.shouldNotBe
|
||||||
|
import org.junit.Test
|
||||||
|
import org.matrix.android.sdk.api.session.crypto.attachments.ElementToDecrypt
|
||||||
|
import org.matrix.android.sdk.api.session.crypto.model.EncryptedFileInfo
|
||||||
|
import org.matrix.android.sdk.api.session.crypto.model.EncryptedFileKey
|
||||||
|
import org.matrix.android.sdk.internal.crypto.tools.withOlmDecryption
|
||||||
|
import org.matrix.android.sdk.internal.di.MoshiProvider
|
||||||
|
import org.matrix.android.sdk.internal.session.contentscanner.model.DownloadBody
|
||||||
|
import org.matrix.android.sdk.internal.session.contentscanner.model.EncryptedBody
|
||||||
|
import org.matrix.olm.OlmPkMessage
|
||||||
|
|
||||||
|
class ScanEncryptorUtilsTest {
|
||||||
|
private val anMxcUrl = "mxc://matrix.org/123456"
|
||||||
|
private val anElementToDecrypt = ElementToDecrypt(
|
||||||
|
k = "key",
|
||||||
|
iv = "iv",
|
||||||
|
sha256 = "sha256"
|
||||||
|
)
|
||||||
|
private val aPublicKey = "6n3l15JqsNhpM1OwRIoDCL/3c1B5idcwvy07Y5qFRyw="
|
||||||
|
private val aPrivateKey = "CLYwNaeA9d0KHE0DniO1bxGgmNsPJ/pyanF4b4tcK1M="
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun whenNoServerKeyIsProvidedTheContentIsNotEncrypted() {
|
||||||
|
val result = ScanEncryptorUtils.getDownloadBodyAndEncryptIfNeeded(
|
||||||
|
publicServerKey = null,
|
||||||
|
mxcUrl = anMxcUrl,
|
||||||
|
elementToDecrypt = anElementToDecrypt
|
||||||
|
)
|
||||||
|
result shouldBeEqualTo DownloadBody(
|
||||||
|
file = EncryptedFileInfo(
|
||||||
|
url = anMxcUrl,
|
||||||
|
iv = anElementToDecrypt.iv,
|
||||||
|
hashes = mapOf("sha256" to anElementToDecrypt.sha256),
|
||||||
|
key = EncryptedFileKey(
|
||||||
|
k = anElementToDecrypt.k,
|
||||||
|
alg = "A256CTR",
|
||||||
|
keyOps = listOf("encrypt", "decrypt"),
|
||||||
|
kty = "oct",
|
||||||
|
ext = true
|
||||||
|
),
|
||||||
|
v = "v2"
|
||||||
|
),
|
||||||
|
encryptedBody = null
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun whenServerKeyIsProvidedTheContentIsEncrypted() {
|
||||||
|
System.loadLibrary("olm")
|
||||||
|
val result = ScanEncryptorUtils.getDownloadBodyAndEncryptIfNeeded(
|
||||||
|
publicServerKey = aPublicKey,
|
||||||
|
mxcUrl = anMxcUrl,
|
||||||
|
elementToDecrypt = anElementToDecrypt
|
||||||
|
)
|
||||||
|
result.file shouldBe null
|
||||||
|
// Note: we cannot check the members of EncryptedBody because they change on each call.
|
||||||
|
result.encryptedBody shouldNotBe null
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun checkThatTheCodeIsAbleToDecryptContent() {
|
||||||
|
System.loadLibrary("olm")
|
||||||
|
val clearInfo = ScanEncryptorUtils.getDownloadBodyAndEncryptIfNeeded(
|
||||||
|
publicServerKey = null,
|
||||||
|
mxcUrl = anMxcUrl,
|
||||||
|
elementToDecrypt = anElementToDecrypt
|
||||||
|
)
|
||||||
|
// Uncomment to get a new encrypted body
|
||||||
|
// val encryptedBody = ScanEncryptorUtils.getDownloadBodyAndEncryptIfNeeded(
|
||||||
|
// publicServerKey = aPublicKey,
|
||||||
|
// mxcUrl = anMxcUrl,
|
||||||
|
// elementToDecrypt = anElementToDecrypt
|
||||||
|
// ).encryptedBody!!
|
||||||
|
// println("libolmEncryptedBody: $encryptedBody")
|
||||||
|
val libolmEncryptedBody = EncryptedBody(
|
||||||
|
cipherText = "GTnDhm6xe5fPe/QCr6fyGcZXheFhZlPG" +
|
||||||
|
"nJZiCK8Xwq6qTg71vSUGWtLdt3uaTmK7" +
|
||||||
|
"F7fB3PBKchHu2VVv6MMgo8fpUQ7KBbmu" +
|
||||||
|
"NWTrNmf3QdhXuRwUwz/q4GxsbGR2zjSX" +
|
||||||
|
"/UoE5S4ymVtOVhvSfXQfssN56wVIzC6S" +
|
||||||
|
"dy57y6b1IXPihlCUdvb8LMkMvViHYeNf" +
|
||||||
|
"beFrAfMlsyr1+jdZEXZF5Q7iruhsH2iu" +
|
||||||
|
"k7+Ayl9rdILCD5tjE9pezwe1V6uc/Agb",
|
||||||
|
mac = "Wk77HRg50oM",
|
||||||
|
ephemeral = "rMTK6/CGASinfX4USFS5qmD3r4meffxKc/jCSFIBczw"
|
||||||
|
)
|
||||||
|
// Try to decrypt the body
|
||||||
|
val result = withOlmDecryption { olmPkDecryption ->
|
||||||
|
olmPkDecryption.setPrivateKey(aPrivateKey.decodeBase64()!!.toByteArray())
|
||||||
|
olmPkDecryption.decrypt(
|
||||||
|
OlmPkMessage().apply {
|
||||||
|
mCipherText = libolmEncryptedBody.cipherText
|
||||||
|
mMac = libolmEncryptedBody.mac
|
||||||
|
mEphemeralKey = libolmEncryptedBody.ephemeral
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
val parseResult = MoshiProvider.providesMoshi()
|
||||||
|
.adapter(DownloadBody::class.java)
|
||||||
|
.fromJson(result)
|
||||||
|
parseResult shouldBeEqualTo clearInfo
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue