diff --git a/crypto/src/main/java/dev/openrs2/crypto/Xtea.kt b/crypto/src/main/java/dev/openrs2/crypto/Xtea.kt index 77012b55a1..a959a40b99 100644 --- a/crypto/src/main/java/dev/openrs2/crypto/Xtea.kt +++ b/crypto/src/main/java/dev/openrs2/crypto/Xtea.kt @@ -4,11 +4,14 @@ import io.netty.buffer.ByteBuf private const val GOLDEN_RATIO = 0x9e3779b9.toInt() private const val ROUNDS = 32 +private const val BLOCK_SIZE = 8 +private const val BLOCK_SIZE_MASK = BLOCK_SIZE - 1 fun ByteBuf.xteaEncrypt(index: Int, length: Int, key: IntArray) { require(key.size == 4) - for (i in index until index + length step 8) { + val end = (index + length) and BLOCK_SIZE_MASK.inv() + for (i in index until end step BLOCK_SIZE) { var sum = 0 var v0 = getInt(i) var v1 = getInt(i + 4) @@ -27,7 +30,8 @@ fun ByteBuf.xteaEncrypt(index: Int, length: Int, key: IntArray) { fun ByteBuf.xteaDecrypt(index: Int, length: Int, key: IntArray) { require(key.size == 4) - for (i in index until index + length step 8) { + val end = (index + length) and BLOCK_SIZE_MASK.inv() + for (i in index until end step BLOCK_SIZE) { @Suppress("INTEGER_OVERFLOW") var sum = GOLDEN_RATIO * ROUNDS var v0 = getInt(i) diff --git a/crypto/src/test/java/dev/openrs2/crypto/XteaTest.kt b/crypto/src/test/java/dev/openrs2/crypto/XteaTest.kt index ad0ff3653d..a242fdc881 100644 --- a/crypto/src/test/java/dev/openrs2/crypto/XteaTest.kt +++ b/crypto/src/test/java/dev/openrs2/crypto/XteaTest.kt @@ -15,12 +15,27 @@ object XteaTest { } 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") + TestVector("00000000000000000000000000000000", "70e1225d6e4e7655", "4141414141414141"), + + // two blocks + TestVector("00000000000000000000000000000000", "70e1225d6e4e76554141414141414141", + "4141414141414141ed23375a821a8c2d"), + + // not a multiple of the block size + TestVector("00000000000000000000000000000000", "01", "01"), + TestVector("00000000000000000000000000000000", "01020304050607", "01020304050607"), + TestVector("00000000000000000000000000000000", "70e1225d6e4e765501", "414141414141414101"), + TestVector("00000000000000000000000000000000", "70e1225d6e4e765501020304050607", + "414141414141414101020304050607") ) @Test