Skip to content

Commit 9a2398f

Browse files
author
Robert Henigan
authored
Merge pull request #1724 from smartdevicelink/bugfix/issue_1720
[SDL 0317] Protocol Security Spec
2 parents 470e703 + b890c4e commit 9a2398f

13 files changed

Lines changed: 1010 additions & 11 deletions

File tree

android/sdl_android/src/androidTest/java/com/smartdevicelink/test/Validator.java

Lines changed: 72 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,16 @@
33
import com.smartdevicelink.managers.file.filetypes.SdlFile;
44
import com.smartdevicelink.protocol.enums.FrameDataControlFrameType;
55
import com.smartdevicelink.protocol.enums.FrameType;
6+
import com.smartdevicelink.protocol.enums.SecurityQueryErrorCode;
7+
import com.smartdevicelink.protocol.enums.SecurityQueryID;
8+
import com.smartdevicelink.protocol.enums.SecurityQueryType;
69
import com.smartdevicelink.protocol.enums.SessionType;
710
import com.smartdevicelink.proxy.rpc.*;
811
import com.smartdevicelink.proxy.rpc.enums.AppServiceType;
912
import com.smartdevicelink.proxy.rpc.enums.DefrostZone;
1013
import com.smartdevicelink.proxy.rpc.enums.FileType;
1114
import com.smartdevicelink.proxy.rpc.enums.HMILevel;
1215
import com.smartdevicelink.proxy.rpc.enums.HmiZoneCapabilities;
13-
import com.smartdevicelink.proxy.rpc.enums.KeyboardLayout;
1416
import com.smartdevicelink.proxy.rpc.enums.PRNDL;
1517
import com.smartdevicelink.proxy.rpc.enums.PrerecordedSpeech;
1618
import com.smartdevicelink.proxy.rpc.enums.SpeechCapabilities;
@@ -126,6 +128,75 @@ public static boolean validateSessionTypeArray(SessionType[] array1, SessionType
126128
return true;
127129
}
128130

131+
public static boolean validateQueryTypeArray(SecurityQueryType[] array1, SecurityQueryType[] array2) {
132+
133+
if (array1 == null) {
134+
return (array2 == null);
135+
}
136+
137+
if (array2 == null) {
138+
return (array1 == null);
139+
}
140+
141+
if (array1.length != array2.length) {
142+
return false;
143+
}
144+
145+
for (int i = 0; i < array1.length; i++) {
146+
if (array1[i] != array2[i]) {
147+
return false;
148+
}
149+
}
150+
151+
return true;
152+
}
153+
154+
public static boolean validateQueryIDArray(SecurityQueryID[] array1, SecurityQueryID[] array2) {
155+
156+
if (array1 == null) {
157+
return (array2 == null);
158+
}
159+
160+
if (array2 == null) {
161+
return (array1 == null);
162+
}
163+
164+
if (array1.length != array2.length) {
165+
return false;
166+
}
167+
168+
for (int i = 0; i < array1.length; i++) {
169+
if (array1[i] != array2[i]) {
170+
return false;
171+
}
172+
}
173+
174+
return true;
175+
}
176+
177+
public static boolean validateQueryErrorCodeArray(SecurityQueryErrorCode[] array1, SecurityQueryErrorCode[] array2) {
178+
179+
if (array1 == null) {
180+
return (array2 == null);
181+
}
182+
183+
if (array2 == null) {
184+
return (array1 == null);
185+
}
186+
187+
if (array1.length != array2.length) {
188+
return false;
189+
}
190+
191+
for (int i = 0; i < array1.length; i++) {
192+
if (array1[i] != array2[i]) {
193+
return false;
194+
}
195+
}
196+
197+
return true;
198+
}
199+
129200
public static boolean validateFrameDataControlFrameTypeArray(FrameDataControlFrameType[] array1, FrameDataControlFrameType[] array2) {
130201

131202
if (array1 == null) {
Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
package com.smartdevicelink.test.protocol;
2+
3+
import androidx.test.ext.junit.runners.AndroidJUnit4;
4+
5+
import com.smartdevicelink.protocol.SecurityQueryPayload;
6+
import com.smartdevicelink.protocol.enums.SecurityQueryID;
7+
import com.smartdevicelink.protocol.enums.SecurityQueryType;
8+
import com.smartdevicelink.util.BitConverter;
9+
10+
import org.junit.Test;
11+
import org.junit.runner.RunWith;
12+
13+
import static org.junit.Assert.assertEquals;
14+
import static org.junit.Assert.assertNotEquals;
15+
import static org.junit.Assert.assertNotNull;
16+
import static org.junit.Assert.assertNull;
17+
import static org.junit.Assert.fail;
18+
19+
@RunWith(AndroidJUnit4.class)
20+
public class SecurityQueryPayloadTests {
21+
22+
public static SecurityQueryPayload createDummyBqh() {
23+
SecurityQueryPayload bqh = new SecurityQueryPayload();
24+
bqh.setCorrelationID(123);
25+
bqh.setQueryID(SecurityQueryID.SEND_HANDSHAKE_DATA);
26+
bqh.setQueryType(SecurityQueryType.REQUEST);
27+
bqh.setBulkData(null);
28+
bqh.setJsonSize(0);
29+
return bqh;
30+
}
31+
32+
public SecurityQueryPayload safeParse(byte[] array) {
33+
try {
34+
return SecurityQueryPayload.parseBinaryQueryHeader(array);
35+
} catch (Exception e) {
36+
return null;
37+
}
38+
}
39+
40+
@Test
41+
public void testCorrectParsing() {
42+
byte[] array = new byte[12];
43+
array[0] = 0;
44+
array[1] = 0;
45+
array[2] = 0;
46+
array[3] = 2;
47+
array[4] = 0;
48+
array[5] = 0;
49+
array[6] = 0;
50+
array[7] = 3;
51+
array[8] = 0;
52+
array[9] = 0;
53+
array[10] = 0;
54+
array[11] = 0;
55+
56+
SecurityQueryPayload parsedBqh = SecurityQueryPayload.parseBinaryQueryHeader(array);
57+
assertEquals(parsedBqh.getQueryType(), SecurityQueryType.REQUEST);
58+
assertEquals(parsedBqh.getQueryID(), SecurityQueryID.SEND_INTERNAL_ERROR);
59+
assertEquals(parsedBqh.getCorrelationID(), 3);
60+
assertEquals(parsedBqh.getJsonSize(), 0);
61+
}
62+
63+
@Test
64+
public void testCorrectHeaderAssembly() {
65+
SecurityQueryPayload dummyBqh = new SecurityQueryPayload();
66+
dummyBqh.setQueryType(SecurityQueryType.REQUEST);
67+
dummyBqh.setQueryID(SecurityQueryID.SEND_HANDSHAKE_DATA);
68+
dummyBqh.setCorrelationID(3);
69+
dummyBqh.setJsonSize(0);
70+
71+
byte[] assembledHeader = dummyBqh.assembleHeaderBytes();
72+
assertEquals(dummyBqh.getQueryType(), SecurityQueryType.valueOf(assembledHeader[0]));
73+
byte[] queryIDFromHeader = new byte[3];
74+
System.arraycopy(assembledHeader, 1, queryIDFromHeader, 0, 3);
75+
assertEquals(dummyBqh.getQueryID(), SecurityQueryID.valueOf(queryIDFromHeader));
76+
assertEquals(dummyBqh.getCorrelationID(), BitConverter.intFromByteArray(assembledHeader, 4));
77+
assertEquals(dummyBqh.getJsonSize(), BitConverter.intFromByteArray(assembledHeader, 8));
78+
}
79+
80+
@Test
81+
public void testAssemblyAndParse() {
82+
SecurityQueryPayload bqh = createDummyBqh();
83+
84+
byte[] bqhBytes = bqh.assembleHeaderBytes();
85+
assertNotNull(bqhBytes);
86+
87+
SecurityQueryPayload parsedBqh = SecurityQueryPayload.parseBinaryQueryHeader(bqhBytes);
88+
assertNotNull(parsedBqh);
89+
90+
assertEquals(bqh.getCorrelationID(), parsedBqh.getCorrelationID());
91+
assertEquals(bqh.getQueryID(), parsedBqh.getQueryID());
92+
assertEquals(bqh.getQueryType(), parsedBqh.getQueryType());
93+
assertEquals(bqh.getBulkData(), parsedBqh.getBulkData());
94+
assertEquals(bqh.getJsonData(), parsedBqh.getJsonData());
95+
assertEquals(bqh.getJsonSize(), parsedBqh.getJsonSize());
96+
}
97+
98+
@Test
99+
public void testCorruptHeader() {
100+
SecurityQueryPayload bqh = createDummyBqh();
101+
102+
byte[] bqhBytes = bqh.assembleHeaderBytes();
103+
104+
assertNotNull(safeParse(bqhBytes));
105+
106+
int size = bqhBytes.length;
107+
for (int i = 0; i < size; i++) {
108+
bqhBytes[i] = (byte) 0x99;
109+
}
110+
111+
assertNull(safeParse(bqhBytes));
112+
SecurityQueryPayload head = SecurityQueryPayload.parseBinaryQueryHeader(bqhBytes);
113+
assertNull(head);
114+
}
115+
116+
@Test
117+
public void testJsonSetException() {
118+
try {
119+
SecurityQueryPayload bqh = createDummyBqh();
120+
bqh.setJsonData(null);
121+
fail("Setting JSON data to null should have thrown an exception");
122+
} catch (Exception e) {
123+
//Pass
124+
}
125+
}
126+
}

0 commit comments

Comments
 (0)