Skip to content
Snippets Groups Projects
Commit 41bb1aa5 authored by Volker Richert's avatar Volker Richert
Browse files

fixing wrong encoding due to combine two classes

fix handling channel negotaion
parent c0589d50
No related branches found
No related tags found
No related merge requests found
Showing
with 117 additions and 54 deletions
...@@ -152,8 +152,6 @@ public class MedtronicCnlReader { ...@@ -152,8 +152,6 @@ public class MedtronicCnlReader {
if (response.getRadioChannel() == mPumpSession.getRadioChannel()) { if (response.getRadioChannel() == mPumpSession.getRadioChannel()) {
break; break;
} else {
throw new IOException(String.format(Locale.getDefault(), "Expected to get a message for channel %d. Got %d", mPumpSession.getRadioChannel(), response.getRadioChannel()));
} }
} }
......
...@@ -11,7 +11,7 @@ import info.nightscout.android.medtronic.exception.EncryptionException; ...@@ -11,7 +11,7 @@ import info.nightscout.android.medtronic.exception.EncryptionException;
/** /**
* Created by lgoedhart on 26/03/2016. * Created by lgoedhart on 26/03/2016.
*/ */
public class BeginEHSMMessage extends MedtronicRequestMessage { public class BeginEHSMMessage extends MedtronicSendMessageRequestMessage {
public BeginEHSMMessage(MedtronicCnlSession pumpSession) throws EncryptionException, ChecksumException { public BeginEHSMMessage(MedtronicCnlSession pumpSession) throws EncryptionException, ChecksumException {
super(SendMessageType.BEGIN_EHSM_SESSION, pumpSession, buildPayload()); super(SendMessageType.BEGIN_EHSM_SESSION, pumpSession, buildPayload());
} }
......
...@@ -2,6 +2,9 @@ package info.nightscout.android.medtronic.message; ...@@ -2,6 +2,9 @@ package info.nightscout.android.medtronic.message;
import android.util.Log; import android.util.Log;
import java.io.IOException;
import java.util.Locale;
import info.nightscout.android.medtronic.MedtronicCnlSession; import info.nightscout.android.medtronic.MedtronicCnlSession;
import info.nightscout.android.medtronic.exception.ChecksumException; import info.nightscout.android.medtronic.exception.ChecksumException;
import info.nightscout.android.medtronic.exception.EncryptionException; import info.nightscout.android.medtronic.exception.EncryptionException;
...@@ -14,7 +17,7 @@ public class ChannelNegotiateResponseMessage extends ContourNextLinkBinaryRespon ...@@ -14,7 +17,7 @@ public class ChannelNegotiateResponseMessage extends ContourNextLinkBinaryRespon
private byte radioChannel = 0; private byte radioChannel = 0;
protected ChannelNegotiateResponseMessage(MedtronicCnlSession pumpSession, byte[] payload) throws EncryptionException, ChecksumException { protected ChannelNegotiateResponseMessage(MedtronicCnlSession pumpSession, byte[] payload) throws EncryptionException, ChecksumException, IOException {
super(payload); super(payload);
byte[] responseBytes = this.encode(); byte[] responseBytes = this.encode();
...@@ -22,6 +25,9 @@ public class ChannelNegotiateResponseMessage extends ContourNextLinkBinaryRespon ...@@ -22,6 +25,9 @@ public class ChannelNegotiateResponseMessage extends ContourNextLinkBinaryRespon
Log.d(TAG, "negotiateChannel: Check response length"); Log.d(TAG, "negotiateChannel: Check response length");
if (responseBytes.length > 46) { if (responseBytes.length > 46) {
radioChannel = responseBytes[76]; radioChannel = responseBytes[76];
if (responseBytes[76] != pumpSession.getRadioChannel()) {
throw new IOException(String.format(Locale.getDefault(), "Expected to get a message for channel %d. Got %d", pumpSession.getRadioChannel(), responseBytes[76]));
}
} else { } else {
radioChannel = ((byte) 0); radioChannel = ((byte) 0);
} }
......
...@@ -11,7 +11,7 @@ import info.nightscout.android.medtronic.exception.EncryptionException; ...@@ -11,7 +11,7 @@ import info.nightscout.android.medtronic.exception.EncryptionException;
/** /**
* Created by lgoedhart on 26/03/2016. * Created by lgoedhart on 26/03/2016.
*/ */
public class EndEHSMMessage extends MedtronicRequestMessage { public class EndEHSMMessage extends MedtronicSendMessageRequestMessage {
public EndEHSMMessage(MedtronicCnlSession pumpSession) throws EncryptionException, ChecksumException { public EndEHSMMessage(MedtronicCnlSession pumpSession) throws EncryptionException, ChecksumException {
super(SendMessageType.END_EHSM_SESSION, pumpSession, buildPayload()); super(SendMessageType.END_EHSM_SESSION, pumpSession, buildPayload());
} }
......
...@@ -17,18 +17,13 @@ import info.nightscout.android.medtronic.exception.EncryptionException; ...@@ -17,18 +17,13 @@ import info.nightscout.android.medtronic.exception.EncryptionException;
* Created by lgoedhart on 26/03/2016. * Created by lgoedhart on 26/03/2016.
*/ */
public class MedtronicRequestMessage extends ContourNextLinkBinaryRequestMessage { public class MedtronicRequestMessage extends ContourNextLinkBinaryRequestMessage {
static int ENVELOPE_SIZE = 11; static int ENVELOPE_SIZE = 2;
static int ENCRYPTED_ENVELOPE_SIZE = 3;
static int CRC_SIZE = 2; static int CRC_SIZE = 2;
protected MedtronicRequestMessage(CommandType commandType, CommandAction commandAction, MedtronicCnlSession pumpSession, byte[] payload) throws ChecksumException { protected MedtronicRequestMessage(CommandType commandType, CommandAction commandAction, MedtronicCnlSession pumpSession, byte[] payload) throws ChecksumException {
super(commandType, pumpSession, buildPayload(commandAction, payload)); super(commandType, pumpSession, buildPayload(commandAction, payload));
} }
protected MedtronicRequestMessage(SendMessageType sendMessageType, MedtronicCnlSession pumpSession, byte[] payload) throws EncryptionException, ChecksumException {
this(CommandType.SEND_MESSAGE, CommandAction.PUMP_REQUEST, pumpSession, buildPayload(sendMessageType, pumpSession, payload));
}
public enum SendMessageType { public enum SendMessageType {
NO_TYPE(0x0), NO_TYPE(0x0),
BEGIN_EHSM_SESSION(0x412), BEGIN_EHSM_SESSION(0x412),
...@@ -76,43 +71,6 @@ public class MedtronicRequestMessage extends ContourNextLinkBinaryRequestMessage ...@@ -76,43 +71,6 @@ public class MedtronicRequestMessage extends ContourNextLinkBinaryRequestMessage
} }
/**
* MedtronicSendMessage:
* +-----------------+------------------------------+--------------+-------------------+--------------------------------+
* | LE long pumpMAC | byte medtronicSequenceNumber | byte unknown | byte Payload size | byte[] Encrypted Payload bytes |
* +-----------------+------------------------------+--------------+-------------------+--------------------------------+
* <p/>
* MedtronicSendMessage (decrypted payload):
* +-------------------------+----------------------+----------------------+--------------------+
* | byte sendSequenceNumber | BE short sendMessageType | byte[] Payload bytes | BE short CCITT CRC |
* +-------------------------+----------------------+----------------------+--------------------+
*/
protected static byte[] buildPayload(SendMessageType sendMessageType, MedtronicCnlSession pumpSession, byte[] payload) throws EncryptionException {
byte payloadLength = (byte) (payload == null ? 0 : payload.length);
ByteBuffer sendPayloadBuffer = ByteBuffer.allocate(ENCRYPTED_ENVELOPE_SIZE + payloadLength + CRC_SIZE);
sendPayloadBuffer.order(ByteOrder.BIG_ENDIAN); // I know, this is the default - just being explicit
sendPayloadBuffer.put(sendSequenceNumber(sendMessageType));
sendPayloadBuffer.putShort(sendMessageType.value);
if (payloadLength != 0) {
sendPayloadBuffer.put(payload);
}
sendPayloadBuffer.putShort((short) MessageUtils.CRC16CCITT(sendPayloadBuffer.array(), 0xffff, 0x1021, ENCRYPTED_ENVELOPE_SIZE + payloadLength));
ByteBuffer payloadBuffer = ByteBuffer.allocate( ENVELOPE_SIZE + sendPayloadBuffer.capacity() );
payloadBuffer.order(ByteOrder.LITTLE_ENDIAN);
payloadBuffer.putLong(pumpSession.getPumpMAC());
payloadBuffer.put((byte) pumpSession.getMedtronicSequenceNumber());
payloadBuffer.put((byte) 0x10);
payloadBuffer.put((byte) sendPayloadBuffer.capacity());
payloadBuffer.put(encrypt( pumpSession.getKey(), pumpSession.getIV(), sendPayloadBuffer.array()));
return payloadBuffer.array();
}
// TODO - maybe move the SecretKeySpec, IvParameterSpec and Cipher construction into the PumpSession? // TODO - maybe move the SecretKeySpec, IvParameterSpec and Cipher construction into the PumpSession?
protected static byte[] encrypt(byte[] key, byte[] iv, byte[] clear) throws EncryptionException { protected static byte[] encrypt(byte[] key, byte[] iv, byte[] clear) throws EncryptionException {
SecretKeySpec secretKeySpec = new SecretKeySpec(key, "AES"); SecretKeySpec secretKeySpec = new SecretKeySpec(key, "AES");
......
package info.nightscout.android.medtronic.message;
import info.nightscout.android.medtronic.MedtronicCnlSession;
import info.nightscout.android.medtronic.exception.ChecksumException;
import info.nightscout.android.medtronic.exception.EncryptionException;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
/**
* Created by volker on 18.12.2016.
*/
public class MedtronicSendMessageRequestMessage extends MedtronicRequestMessage {
static int ENVELOPE_SIZE = 11;
static int ENCRYPTED_ENVELOPE_SIZE = 3;
static int CRC_SIZE = 2;
public enum SendMessageType {
NO_TYPE(0x0),
BEGIN_EHSM_SESSION(0x412),
TIME_REQUEST(0x0403),
READ_PUMP_STATUS_REQUEST(0x0112),
READ_BASAL_PATTERN_REQUEST(0x0112),
END_EHSM_SESSION(0x412);
private short value;
SendMessageType(int messageType) {
value = (short) messageType;
}
}
protected MedtronicSendMessageRequestMessage(SendMessageType sendMessageType, MedtronicCnlSession pumpSession, byte[] payload) throws EncryptionException, ChecksumException {
super(CommandType.SEND_MESSAGE, CommandAction.PUMP_REQUEST, pumpSession, buildPayload(sendMessageType, pumpSession, payload));
}
/**
* MedtronicSendMessage:
* +-----------------+------------------------------+--------------+-------------------+--------------------------------+
* | LE long pumpMAC | byte medtronicSequenceNumber | byte unknown | byte Payload size | byte[] Encrypted Payload bytes |
* +-----------------+------------------------------+--------------+-------------------+--------------------------------+
* <p/>
* MedtronicSendMessage (decrypted payload):
* +-------------------------+----------------------+----------------------+--------------------+
* | byte sendSequenceNumber | BE short sendMessageType | byte[] Payload bytes | BE short CCITT CRC |
* +-------------------------+----------------------+----------------------+--------------------+
*/
protected static byte[] buildPayload(SendMessageType sendMessageType, MedtronicCnlSession pumpSession, byte[] payload) throws EncryptionException {
byte payloadLength = (byte) (payload == null ? 0 : payload.length);
ByteBuffer sendPayloadBuffer = ByteBuffer.allocate(ENCRYPTED_ENVELOPE_SIZE + payloadLength + CRC_SIZE);
sendPayloadBuffer.order(ByteOrder.BIG_ENDIAN); // I know, this is the default - just being explicit
sendPayloadBuffer.put(sendSequenceNumber(sendMessageType));
sendPayloadBuffer.putShort(sendMessageType.value);
if (payloadLength != 0) {
sendPayloadBuffer.put(payload);
}
sendPayloadBuffer.putShort((short) MessageUtils.CRC16CCITT(sendPayloadBuffer.array(), 0xffff, 0x1021, ENCRYPTED_ENVELOPE_SIZE + payloadLength));
ByteBuffer payloadBuffer = ByteBuffer.allocate( ENVELOPE_SIZE + sendPayloadBuffer.capacity() );
payloadBuffer.order(ByteOrder.LITTLE_ENDIAN);
payloadBuffer.putLong(pumpSession.getPumpMAC());
payloadBuffer.put((byte) pumpSession.getMedtronicSequenceNumber());
payloadBuffer.put((byte) 0x10);
payloadBuffer.put((byte) sendPayloadBuffer.capacity());
payloadBuffer.put(encrypt( pumpSession.getKey(), pumpSession.getIV(), sendPayloadBuffer.array()));
return payloadBuffer.array();
}
protected static byte sendSequenceNumber(SendMessageType sendMessageType) {
switch (sendMessageType) {
case BEGIN_EHSM_SESSION:
return (byte) 0x80;
case TIME_REQUEST:
return (byte) 0x02;
case READ_PUMP_STATUS_REQUEST:
return (byte) 0x03;
default:
return 0x00;
}
}
}
package info.nightscout.android.medtronic.message;
import info.nightscout.android.medtronic.MedtronicCnlSession;
import info.nightscout.android.medtronic.exception.ChecksumException;
import info.nightscout.android.medtronic.exception.EncryptionException;
/**
* Created by volker on 18.12.2016.
*/
public class MedtronicSendMessageResponseMessage extends MedtronicResponseMessage {
protected MedtronicSendMessageResponseMessage(MedtronicCnlSession pumpSession, byte[] payload) throws EncryptionException, ChecksumException {
super(pumpSession, payload);
}
}
...@@ -11,7 +11,7 @@ import info.nightscout.android.medtronic.exception.EncryptionException; ...@@ -11,7 +11,7 @@ import info.nightscout.android.medtronic.exception.EncryptionException;
/** /**
* Created by lgoedhart on 26/03/2016. * Created by lgoedhart on 26/03/2016.
*/ */
public class PumpBasalPatternRequestMessage extends MedtronicRequestMessage { public class PumpBasalPatternRequestMessage extends MedtronicSendMessageRequestMessage {
public PumpBasalPatternRequestMessage(MedtronicCnlSession pumpSession) throws EncryptionException, ChecksumException { public PumpBasalPatternRequestMessage(MedtronicCnlSession pumpSession) throws EncryptionException, ChecksumException {
super(SendMessageType.READ_BASAL_PATTERN_REQUEST, pumpSession, null); super(SendMessageType.READ_BASAL_PATTERN_REQUEST, pumpSession, null);
} }
......
...@@ -10,7 +10,7 @@ import info.nightscout.android.medtronic.exception.EncryptionException; ...@@ -10,7 +10,7 @@ import info.nightscout.android.medtronic.exception.EncryptionException;
/** /**
* Created by lgoedhart on 27/03/2016. * Created by lgoedhart on 27/03/2016.
*/ */
public class PumpBasalPatternResponseMessage extends MedtronicResponseMessage { public class PumpBasalPatternResponseMessage extends MedtronicSendMessageResponseMessage {
protected PumpBasalPatternResponseMessage(MedtronicCnlSession pumpSession, byte[] payload) throws EncryptionException, ChecksumException { protected PumpBasalPatternResponseMessage(MedtronicCnlSession pumpSession, byte[] payload) throws EncryptionException, ChecksumException {
super(pumpSession, payload); super(pumpSession, payload);
......
...@@ -11,7 +11,7 @@ import info.nightscout.android.medtronic.exception.EncryptionException; ...@@ -11,7 +11,7 @@ import info.nightscout.android.medtronic.exception.EncryptionException;
/** /**
* Created by lgoedhart on 26/03/2016. * Created by lgoedhart on 26/03/2016.
*/ */
public class PumpStatusRequestMessage extends MedtronicRequestMessage { public class PumpStatusRequestMessage extends MedtronicSendMessageRequestMessage {
public PumpStatusRequestMessage(MedtronicCnlSession pumpSession) throws EncryptionException, ChecksumException { public PumpStatusRequestMessage(MedtronicCnlSession pumpSession) throws EncryptionException, ChecksumException {
super(SendMessageType.READ_PUMP_STATUS_REQUEST, pumpSession, null); super(SendMessageType.READ_PUMP_STATUS_REQUEST, pumpSession, null);
} }
......
...@@ -15,7 +15,7 @@ import info.nightscout.android.model.medtronicNg.PumpStatusEvent; ...@@ -15,7 +15,7 @@ import info.nightscout.android.model.medtronicNg.PumpStatusEvent;
/** /**
* Created by lgoedhart on 27/03/2016. * Created by lgoedhart on 27/03/2016.
*/ */
public class PumpStatusResponseMessage extends MedtronicResponseMessage { public class PumpStatusResponseMessage extends MedtronicSendMessageResponseMessage {
private static final String TAG = PumpStatusResponseMessage.class.getSimpleName(); private static final String TAG = PumpStatusResponseMessage.class.getSimpleName();
// Data from the Medtronic Pump Status message // Data from the Medtronic Pump Status message
......
...@@ -11,7 +11,7 @@ import info.nightscout.android.medtronic.exception.EncryptionException; ...@@ -11,7 +11,7 @@ import info.nightscout.android.medtronic.exception.EncryptionException;
/** /**
* Created by lgoedhart on 26/03/2016. * Created by lgoedhart on 26/03/2016.
*/ */
public class PumpTimeRequestMessage extends MedtronicRequestMessage { public class PumpTimeRequestMessage extends MedtronicSendMessageRequestMessage {
public PumpTimeRequestMessage(MedtronicCnlSession pumpSession) throws EncryptionException, ChecksumException { public PumpTimeRequestMessage(MedtronicCnlSession pumpSession) throws EncryptionException, ChecksumException {
super(SendMessageType.TIME_REQUEST, pumpSession, null); super(SendMessageType.TIME_REQUEST, pumpSession, null);
} }
......
...@@ -13,7 +13,7 @@ import info.nightscout.android.medtronic.exception.EncryptionException; ...@@ -13,7 +13,7 @@ import info.nightscout.android.medtronic.exception.EncryptionException;
/** /**
* Created by lgoedhart on 27/03/2016. * Created by lgoedhart on 27/03/2016.
*/ */
public class PumpTimeResponseMessage extends MedtronicResponseMessage { public class PumpTimeResponseMessage extends MedtronicSendMessageResponseMessage {
private static final String TAG = PumpTimeResponseMessage.class.getSimpleName(); private static final String TAG = PumpTimeResponseMessage.class.getSimpleName();
private Date pumpTime; private Date pumpTime;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment