Refactored to use StreamableWriter

Bumped the msgpack library to 2.0.1 (the 2.0.0 build was fubar)
This commit is contained in:
2017-11-21 10:44:41 +01:00
parent ece9cd8667
commit 8cbdce6eac
51 changed files with 1004 additions and 625 deletions

View File

@ -19,6 +19,7 @@ package ch.dissem.bitmessage.extensions
import ch.dissem.bitmessage.entity.BitmessageAddress
import ch.dissem.bitmessage.entity.CustomMessage
import ch.dissem.bitmessage.entity.Streamable
import ch.dissem.bitmessage.entity.StreamableWriter
import ch.dissem.bitmessage.entity.payload.CryptoBox
import ch.dissem.bitmessage.entity.payload.Pubkey
import ch.dissem.bitmessage.exception.DecryptionFailedException
@ -73,7 +74,7 @@ class CryptoCustomMessage<T : Streamable> : CustomMessage {
Encode.varInt(privateKey.pubkey.extraBytes, out)
}
data?.write(out) ?: throw IllegalStateException("no unencrypted data available")
data?.writer()?.write(out) ?: throw IllegalStateException("no unencrypted data available")
Encode.varBytes(cryptography().getSignature(out.toByteArray(), privateKey), out)
container = CryptoBox(out.toByteArray(), publicKey)
}
@ -109,9 +110,17 @@ class CryptoCustomMessage<T : Streamable> : CustomMessage {
return data!!
}
override fun write(out: OutputStream) {
Encode.varString(COMMAND, out)
container?.write(out) ?: throw IllegalStateException("not encrypted yet")
override fun writer(): StreamableWriter = Writer(this)
private class Writer(
private val item: CryptoCustomMessage<*>
) : CustomMessage.Writer(item) {
override fun write(out: OutputStream) {
Encode.varString(COMMAND, out)
item.container?.writer()?.write(out) ?: throw IllegalStateException("not encrypted yet")
}
}
interface Reader<out T> {
@ -136,9 +145,11 @@ class CryptoCustomMessage<T : Streamable> : CustomMessage {
}
companion object {
@JvmField val COMMAND = "ENCRYPTED"
@JvmField
val COMMAND = "ENCRYPTED"
@JvmStatic fun <T : Streamable> read(data: CustomMessage, dataReader: Reader<T>): CryptoCustomMessage<T> {
@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)
}

View File

@ -18,6 +18,7 @@ package ch.dissem.bitmessage.extensions.pow
import ch.dissem.bitmessage.entity.BitmessageAddress
import ch.dissem.bitmessage.entity.Streamable
import ch.dissem.bitmessage.entity.StreamableWriter
import ch.dissem.bitmessage.extensions.CryptoCustomMessage
import ch.dissem.bitmessage.utils.Decode.bytes
import ch.dissem.bitmessage.utils.Decode.varBytes
@ -33,16 +34,24 @@ import java.util.*
*/
data class ProofOfWorkRequest @JvmOverloads constructor(val sender: BitmessageAddress, val initialHash: ByteArray, val request: ProofOfWorkRequest.Request, val data: ByteArray = ByteArray(0)) : Streamable {
override fun write(out: OutputStream) {
out.write(initialHash)
Encode.varString(request.name, out)
Encode.varBytes(data, out)
}
override fun writer(): StreamableWriter = Writer(this)
private class Writer(
private val item: ProofOfWorkRequest
) : StreamableWriter {
override fun write(out: OutputStream) {
out.write(item.initialHash)
Encode.varString(item.request.name, out)
Encode.varBytes(item.data, out)
}
override fun write(buffer: ByteBuffer) {
buffer.put(item.initialHash)
Encode.varString(item.request.name, buffer)
Encode.varBytes(item.data, buffer)
}
override fun write(buffer: ByteBuffer) {
buffer.put(initialHash)
Encode.varString(request.name, buffer)
Encode.varBytes(data, buffer)
}
class Reader(private val identity: BitmessageAddress) : CryptoCustomMessage.Reader<ProofOfWorkRequest> {

View File

@ -43,7 +43,7 @@ class CryptoCustomMessageTest : TestBase() {
messageBefore.signAndEncrypt(sendingIdentity, cryptography().createPublicKey(sendingIdentity.publicDecryptionKey))
val out = ByteArrayOutputStream()
messageBefore.write(out)
messageBefore.writer().write(out)
val `in` = ByteArrayInputStream(out.toByteArray())
val customMessage = CustomMessage.read(`in`, out.size())
@ -71,7 +71,7 @@ class CryptoCustomMessageTest : TestBase() {
val out = ByteArrayOutputStream()
messageBefore.write(out)
messageBefore.writer().write(out)
val `in` = ByteArrayInputStream(out.toByteArray())
val customMessage = CustomMessage.read(`in`, out.size())