Refactor to utilize Kotlin features

This commit is contained in:
2018-02-16 17:04:08 +01:00
parent b93f382ccd
commit fab1c06135
7 changed files with 92 additions and 53 deletions

View File

@ -42,19 +42,21 @@ import java.io.OutputStream
*/
class CryptoCustomMessage<T : Streamable> : CustomMessage {
private val dataReader: Reader<T>?
private val dataReader: (BitmessageAddress, InputStream) -> T
private var container: CryptoBox? = null
var sender: BitmessageAddress? = null
private set
private var data: T? = null
private set
constructor(data: T) : super(COMMAND, null) {
this.data = data
this.dataReader = null
this.dataReader = { _, _ -> data }
}
private constructor(container: CryptoBox, dataReader: Reader<T>) : super(COMMAND, null) {
private constructor(container: CryptoBox, dataReader: (BitmessageAddress, InputStream) -> T) : super(
COMMAND,
null
) {
this.container = container
this.dataReader = dataReader
}
@ -81,8 +83,9 @@ class CryptoCustomMessage<T : Streamable> : CustomMessage {
@Throws(DecryptionFailedException::class)
fun decrypt(privateKey: ByteArray): T {
val input = SignatureCheckingInputStream(container?.decrypt(privateKey) ?: throw IllegalStateException("no encrypted data available"))
if (dataReader == null) throw IllegalStateException("no data reader available")
val input = SignatureCheckingInputStream(
container?.decrypt(privateKey) ?: throw IllegalStateException("no encrypted data available")
)
val addressVersion = varInt(input)
val stream = varInt(input)
@ -92,18 +95,20 @@ class CryptoCustomMessage<T : Streamable> : CustomMessage {
val nonceTrialsPerByte = if (addressVersion >= 3) varInt(input) else 0
val extraBytes = if (addressVersion >= 3) varInt(input) else 0
val sender = BitmessageAddress(Factory.createPubkey(
addressVersion,
stream,
publicSigningKey,
publicEncryptionKey,
nonceTrialsPerByte,
extraBytes,
behaviorBitfield
))
val sender = BitmessageAddress(
Factory.createPubkey(
addressVersion,
stream,
publicSigningKey,
publicEncryptionKey,
nonceTrialsPerByte,
extraBytes,
behaviorBitfield
)
)
this.sender = sender
data = dataReader.read(sender, input)
data = dataReader.invoke(sender, input)
input.checkSignature(sender.pubkey!!)
@ -127,7 +132,8 @@ class CryptoCustomMessage<T : Streamable> : CustomMessage {
fun read(sender: BitmessageAddress, input: InputStream): T
}
private inner class SignatureCheckingInputStream internal constructor(private val wrapped: InputStream) : InputStream() {
private inner class SignatureCheckingInputStream internal constructor(private val wrapped: InputStream) :
InputStream() {
private val out = ByteArrayOutputStream()
override fun read(): Int {
@ -145,13 +151,24 @@ class CryptoCustomMessage<T : Streamable> : CustomMessage {
}
companion object {
@JvmField
val COMMAND = "ENCRYPTED"
const val COMMAND = "ENCRYPTED"
@JvmStatic
fun <T : Streamable> read(data: CustomMessage, dataReader: Reader<T>): CryptoCustomMessage<T> {
val cryptoBox = CryptoBox.read(ByteArrayInputStream(data.getData()), data.getData().size)
return CryptoCustomMessage(cryptoBox, dataReader)
}
fun <T : Streamable> read(data: CustomMessage, dataReader: Reader<T>): CryptoCustomMessage<T> =
CryptoCustomMessage(
CryptoBox.read(ByteArrayInputStream(data.getData()), data.getData().size)
) { address, input ->
dataReader.read(address, input)
}
@JvmSynthetic
fun <T : Streamable> read(
data: CustomMessage,
dataReader: (BitmessageAddress, InputStream) -> T
): CryptoCustomMessage<T> =
CryptoCustomMessage(
CryptoBox.read(ByteArrayInputStream(data.getData()), data.getData().size),
dataReader
)
}
}