forked from openrs2/openrs2
parent
09961589e3
commit
3293454c17
@ -0,0 +1,65 @@ |
||||
package org.openrs2.archive.key |
||||
|
||||
import io.netty.buffer.ByteBuf |
||||
import io.netty.buffer.Unpooled |
||||
import org.openrs2.buffer.use |
||||
import org.openrs2.crypto.XteaKey |
||||
import java.io.InputStream |
||||
|
||||
public object BinaryKeyReader : KeyReader { |
||||
override fun read(input: InputStream): Sequence<XteaKey> { |
||||
Unpooled.wrappedBuffer(input.readBytes()).use { buf -> |
||||
val len = buf.readableBytes() |
||||
|
||||
if (len == (128 * 128 * 16)) { |
||||
val keys = read(buf, 0) |
||||
require(XteaKey.ZERO in keys) |
||||
return keys.asSequence() |
||||
} |
||||
|
||||
val maybeShort = (len % 18) == 0 |
||||
val maybeInt = (len % 20) == 0 |
||||
|
||||
if (maybeShort && !maybeInt) { |
||||
val keys = read(buf, 2) |
||||
require(XteaKey.ZERO in keys) |
||||
return keys.asSequence() |
||||
} else if (!maybeShort && maybeInt) { |
||||
val keys = read(buf, 4).asSequence() |
||||
require(XteaKey.ZERO in keys) |
||||
return keys.asSequence() |
||||
} else if (maybeShort && maybeInt) { |
||||
val shortKeys = read(buf, 2) |
||||
val intKeys = read(buf, 4) |
||||
|
||||
return if (XteaKey.ZERO in shortKeys && XteaKey.ZERO !in intKeys) { |
||||
shortKeys.asSequence() |
||||
} else if (XteaKey.ZERO !in shortKeys && XteaKey.ZERO in intKeys) { |
||||
intKeys.asSequence() |
||||
} else { |
||||
throw IllegalArgumentException("Failed to determine if map square IDs are 2 or 4 bytes") |
||||
} |
||||
} else { |
||||
throw IllegalArgumentException( |
||||
"Binary XTEA files must be exactly 256 KiB or a multiple of 18 or 20 bytes long" |
||||
) |
||||
} |
||||
} |
||||
} |
||||
|
||||
private fun read(buf: ByteBuf, mapSquareLen: Int): Set<XteaKey> { |
||||
val keys = mutableSetOf<XteaKey>() |
||||
|
||||
while (buf.isReadable) { |
||||
buf.skipBytes(mapSquareLen) |
||||
|
||||
val k0 = buf.readInt() |
||||
val k1 = buf.readInt() |
||||
val k2 = buf.readInt() |
||||
val k3 = buf.readInt() |
||||
keys += XteaKey(k0, k1, k2, k3) |
||||
} |
||||
|
||||
return keys |
||||
} |
||||
} |
Loading…
Reference in new issue