Refactor to utilize Kotlin features
This commit is contained in:
@ -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
|
||||
)
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user