Open-source multiplayer game server compatible with the RuneScape client https://www.openrs2.org/
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
openrs2/crypto/src/test/java/dev/openrs2/crypto/XteaTest.kt

74 lines
2.7 KiB

package dev.openrs2.crypto
import dev.openrs2.buffer.use
import io.netty.buffer.ByteBufUtil
import io.netty.buffer.Unpooled
import kotlin.test.Test
import kotlin.test.assertEquals
object XteaTest {
private class TestVector(key: String, plaintext: String, ciphertext: String) {
val key = XteaKey.fromHex(key)
val plaintext: ByteArray = ByteBufUtil.decodeHexDump(plaintext)
val ciphertext: ByteArray = ByteBufUtil.decodeHexDump(ciphertext)
}
private val TEST_VECTORS = listOf(
// empty
TestVector("00000000000000000000000000000000", "", ""),
// standard single block test vectors
TestVector("000102030405060708090a0b0c0d0e0f", "4142434445464748", "497df3d072612cb5"),
TestVector("000102030405060708090a0b0c0d0e0f", "4141414141414141", "e78f2d13744341d8"),
TestVector("000102030405060708090a0b0c0d0e0f", "5a5b6e278948d77f", "4141414141414141"),
TestVector("00000000000000000000000000000000", "4142434445464748", "a0390589f8b8efa5"),
TestVector("00000000000000000000000000000000", "4141414141414141", "ed23375a821a8c2d"),
TestVector("00000000000000000000000000000000", "70e1225d6e4e7655", "4141414141414141"),
// two blocks
TestVector(
"00000000000000000000000000000000", "70e1225d6e4e76554141414141414141",
"4141414141414141ed23375a821a8c2d"
)
)
@Test
fun testEncrypt() {
for (vector in TEST_VECTORS) {
for (i in 0..7) {
for (j in 0..7) {
val header = ByteArray(i) { it.toByte() }
val trailer = ByteArray(j) { it.toByte() }
Unpooled.copiedBuffer(header, vector.plaintext, trailer).use { buffer ->
buffer.xteaEncrypt(i, vector.plaintext.size, vector.key)
Unpooled.wrappedBuffer(header, vector.ciphertext, trailer).use { expected ->
assertEquals(expected, buffer)
}
}
}
}
}
}
@Test
fun testDecrypt() {
for (vector in TEST_VECTORS) {
for (i in 0..7) {
for (j in 0..7) {
val header = ByteArray(i) { it.toByte() }
val trailer = ByteArray(j) { it.toByte() }
Unpooled.copiedBuffer(header, vector.ciphertext, trailer).use { buffer ->
buffer.xteaDecrypt(i, vector.ciphertext.size, vector.key)
Unpooled.wrappedBuffer(header, vector.plaintext, trailer).use { expected ->
assertEquals(expected, buffer)
}
}
}
}
}
}
}