Refactored to use StreamableWriter
Bumped the msgpack library to 2.0.1 (the 2.0.0 build was fubar)
This commit is contained in:
@ -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)
|
||||
}
|
||||
|
@ -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> {
|
||||
|
@ -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())
|
||||
|
Reference in New Issue
Block a user