summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoey Grover <joeygrover@gmail.com>2021-03-23 15:19:21 -0400
committerJoey Grover <joeygrover@gmail.com>2021-03-23 15:19:21 -0400
commitfa9301e8a1680fbcf9ce4d8dfccf63b10366263c (patch)
tree6ff6c9971b3571fab547de4e3a1d32c632a6d0e8
parente21d19897f12fcdec71455c6c507b03003fbdff2 (diff)
downloadsdl_android-fa9301e8a1680fbcf9ce4d8dfccf63b10366263c.tar.gz
Add PSM fix for already released Core versions
This is added to deal with the case where Core would incorrectly encrypt the first frame which would make the payload length greater than 8 which is a protocol spec violation.
-rw-r--r--base/src/main/java/com/smartdevicelink/transport/SdlPsm.java13
1 files changed, 8 insertions, 5 deletions
diff --git a/base/src/main/java/com/smartdevicelink/transport/SdlPsm.java b/base/src/main/java/com/smartdevicelink/transport/SdlPsm.java
index a142cebad..99510b061 100644
--- a/base/src/main/java/com/smartdevicelink/transport/SdlPsm.java
+++ b/base/src/main/java/com/smartdevicelink/transport/SdlPsm.java
@@ -61,14 +61,14 @@ public class SdlPsm {
private static final byte FIRST_FRAME_DATA_SIZE = 0x08;
private static final int VERSION_MASK = 0xF0; //4 highest bits
- private static final int COMPRESSION_MASK = 0x08; //4th lowest bit
+ private static final int ENCRYPTION_MASK = 0x08; //4th lowest bit
private static final int FRAME_TYPE_MASK = 0x07; //3 lowest bits
int state;
int version;
- boolean compression;
+ boolean encrypted;
int frameType;
int serviceType;
int controlFrameInfo;
@@ -97,7 +97,7 @@ public class SdlPsm {
if (version == 0) { //It should never be 0
return ERROR_STATE;
}
- compression = (1 == ((rawByte & (byte) COMPRESSION_MASK) >> 3));
+ encrypted = (1 == ((rawByte & (byte) ENCRYPTION_MASK) >> 3));
frameType = rawByte & (byte) FRAME_TYPE_MASK;
@@ -194,7 +194,10 @@ public class SdlPsm {
break;
case SdlPacket.FRAME_TYPE_FIRST:
- if (dataLength == FIRST_FRAME_DATA_SIZE) {
+ if (dataLength == FIRST_FRAME_DATA_SIZE || this.encrypted) {
+ //In a few production releases of core the first frame could be
+ //encrypted. Therefore it is not an error state if the first frame data
+ //length is greater than 8 in that case alone.
break;
}
default:
@@ -263,7 +266,7 @@ public class SdlPsm {
public SdlPacket getFormedPacket() {
if (state == FINISHED_STATE) {
//Log.trace(TAG, "Finished packet.");
- return new SdlPacket(version, compression, frameType,
+ return new SdlPacket(version, encrypted, frameType,
serviceType, controlFrameInfo, sessionId,
dataLength, messageId, payload);
} else {