From 39408ac53583bfe673a5e62a67f50b90d700c969 Mon Sep 17 00:00:00 2001 From: Andrei Vereha Date: Sat, 27 Feb 2021 13:39:47 +0100 Subject: [PATCH] BLE LTK: define all the steps --- .../dash/driver/comm/ltk/LTKExchanger.kt | 66 +++++++++++++++---- 1 file changed, 53 insertions(+), 13 deletions(-) diff --git a/omnipod-dash/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dash/driver/comm/ltk/LTKExchanger.kt b/omnipod-dash/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dash/driver/comm/ltk/LTKExchanger.kt index 3641435a69..7b7fa8dcb1 100644 --- a/omnipod-dash/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dash/driver/comm/ltk/LTKExchanger.kt +++ b/omnipod-dash/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dash/driver/comm/ltk/LTKExchanger.kt @@ -6,8 +6,10 @@ import info.nightscout.androidaps.logging.LTag import info.nightscout.androidaps.plugins.pump.omnipod.dash.driver.comm.Id import info.nightscout.androidaps.plugins.pump.omnipod.dash.driver.comm.OmnipodDashBleManagerImpl import info.nightscout.androidaps.plugins.pump.omnipod.dash.driver.comm.message.MessageIO +import info.nightscout.androidaps.plugins.pump.omnipod.dash.driver.comm.message.MessagePacket import info.nightscout.androidaps.plugins.pump.omnipod.dash.driver.comm.message.StringLengthPrefixEncoding import info.nightscout.androidaps.utils.extensions.hexStringToByteArray +import info.nightscout.androidaps.utils.extensions.toHex import java.security.SecureRandom internal class LTKExchanger(private val aapsLogger: AAPSLogger, private val msgIO: MessageIO) { @@ -17,6 +19,8 @@ internal class LTKExchanger(private val aapsLogger: AAPSLogger, private val msgI private val controllerId = Id.fromInt(OmnipodDashBleManagerImpl.CONTROLLER_ID) val nodeId = controllerId.increment() private var seq: Byte = 1 + private var ltk = ByteArray(0) + private var noncePrefix = ByteArray(0) init { val random = SecureRandom() @@ -36,28 +40,36 @@ internal class LTKExchanger(private val aapsLogger: AAPSLogger, private val msgI // read SPS1 val podSps1 = msgIO.receiveMessage() aapsLogger.info(LTag.PUMPBTCOMM, "Received message: %s", podSps1) -/* + processSps1FromPod(podSps1) + + seq++ + // send SPS2 - var sps2 = PairMessage() + val sps2 = sps2() msgIO.sendMesssage(sps2.messagePacket) // read SPS2 + val podSps2 = msgIO.receiveMessage() + validatePodSps2(podSps2) // send SP0GP0 - msgIO.sendMesssage(sps2.messagePacket) + msgIO.sendMesssage(sp0gp0().messagePacket) // read P0 + + //TODO: if we fail to read or validate p0 will lead to undefined state + // it could be that: + // - the pod answered with p0 and we did not receive/could not process the answer + // - the pod answered with some sort of error val p0 = msgIO.receiveMessage() -*/ - return null + validateP0(p0) + + return LTK( + ltk = ltk, + noncePrefix = noncePrefix, + ) } - private fun sp2(): ByteArray { - // This is GetPodStatus command, with page 0 parameter. - // We could replace that in the future with the serialized GetPodStatus() - return GET_POD_STATUS_HEX_COMMAND.hexStringToByteArray() - } - - fun sp1sp2(sp1: ByteArray, sp2: ByteArray): PairMessage { + private fun sp1sp2(sp1: ByteArray, sp2: ByteArray): PairMessage { val payload = StringLengthPrefixEncoding.formatKeys( arrayOf("SP1=", ",SP2="), arrayOf(sp1, sp2), @@ -70,7 +82,7 @@ internal class LTKExchanger(private val aapsLogger: AAPSLogger, private val msgI ) } - fun sps1(): PairMessage { + private fun sps1(): PairMessage { val publicKey = X25519.publicFromPrivate(privateKey) val payload = StringLengthPrefixEncoding.formatKeys( arrayOf("SPS1="), @@ -84,6 +96,34 @@ internal class LTKExchanger(private val aapsLogger: AAPSLogger, private val msgI ) } + private fun processSps1FromPod(msg: MessagePacket) { + aapsLogger.debug(LTag.PUMPBTCOMM, "Received SPS1 from pod: ${msg.payload.toHex()}") + + } + + private fun sps2(): PairMessage { + TODO("implement") + } + + private fun validatePodSps2(podSps2: MessagePacket) { + TODO("implement") + + } + + private fun sp2(): ByteArray { + // This is GetPodStatus command, with page 0 parameter. + // We could replace that in the future with the serialized GetPodStatus() + return GET_POD_STATUS_HEX_COMMAND.hexStringToByteArray() + } + + private fun sp0gp0(): PairMessage { + TODO("implement") + } + + private fun validateP0(p0: MessagePacket) { + TODO("implement") + + } companion object { private val GET_POD_STATUS_HEX_COMMAND = "ffc32dbd08030e0100008a" // TODO for now we are assuming this command is build out of constant parameters, use a proper command builder for that.