aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorevitayan <evitayan@google.com>2018-09-18 16:41:12 -0700
committerevitayan <evitayan@google.com>2018-10-02 16:38:51 -0700
commitfe4d632c275499d0512141032b36c9832003765e (patch)
treeb32ca13ef243227fc9cb5d5a25df31b3d6277ddf
parent8206bb73a3b516e009137f1e835cb40e77b8d1e6 (diff)
downloadike-fe4d632c275499d0512141032b36c9832003765e.tar.gz
Encode IKE header
This commit: - Add method for encoding IKE header - Create IkeHeaderTest Bug: 116149910 Test: FrameworksIkeTests IkeIkeHeaderTest Change-Id: Ib5507330183184583a0e82296694dad2e68e9e17
-rw-r--r--src/java/com/android/ike/ikev2/message/IkeHeader.java33
-rw-r--r--tests/iketests/src/java/com/android/ike/ikev2/message/IkeHeaderTest.java95
-rw-r--r--tests/iketests/src/java/com/android/ike/ikev2/message/IkeMessageTest.java38
3 files changed, 125 insertions, 41 deletions
diff --git a/src/java/com/android/ike/ikev2/message/IkeHeader.java b/src/java/com/android/ike/ikev2/message/IkeHeader.java
index 7aa76b25..cd415163 100644
--- a/src/java/com/android/ike/ikev2/message/IkeHeader.java
+++ b/src/java/com/android/ike/ikev2/message/IkeHeader.java
@@ -36,6 +36,13 @@ import java.nio.ByteBuffer;
* Protocol Version 2 (IKEv2).
*/
public final class IkeHeader {
+ private static final byte IKE_HEADER_VERSION_INFO = (byte) 0x20;
+
+ // Indicate whether this message is a response message
+ private static final byte IKE_HEADER_FLAG_IS_RESP_MSG = (byte) 0x20;
+ // Indicate whether this message is sent from the original IKE initiator
+ private static final byte IKE_HEADER_FLAG_FROM_IKE_INITIATOR = (byte) 0x08;
+
public static final int IKE_HEADER_LENGTH = 28;
@Retention(RetentionPolicy.SOURCE)
@@ -58,7 +65,7 @@ public final class IkeHeader {
public final byte majorVersion;
public final byte minorVersion;
@ExchangeType public final int exchangeType;
- public final boolean isResponse;
+ public final boolean isResponseMsg;
public final boolean fromIkeInitiator;
public final int messageId;
public final int messageLength;
@@ -89,7 +96,7 @@ public final class IkeHeader {
ikeResponderSpi = rSpi;
nextPayloadType = nextPType;
exchangeType = eType;
- isResponse = isResp;
+ isResponseMsg = isResp;
fromIkeInitiator = fromInit;
messageId = msgId;
messageLength = length;
@@ -123,7 +130,7 @@ public final class IkeHeader {
exchangeType = Byte.toUnsignedInt(buffer.get());
byte flagsByte = buffer.get();
- isResponse = ((flagsByte & 0x20) != 0);
+ isResponseMsg = ((flagsByte & 0x20) != 0);
fromIkeInitiator = ((flagsByte & 0x08) != 0);
messageId = buffer.getInt();
@@ -148,4 +155,24 @@ public final class IkeHeader {
throw new InvalidSyntaxException("Invalid IKE Exchange Type.");
}
}
+
+ /** Encode IKE header to ByteBuffer */
+ public void encodeToByteBuffer(ByteBuffer byteBuffer) {
+ byteBuffer
+ .putLong(ikeInitiatorSpi)
+ .putLong(ikeResponderSpi)
+ .put((byte) nextPayloadType)
+ .put(IKE_HEADER_VERSION_INFO)
+ .put((byte) exchangeType);
+
+ byte flag = 0;
+ if (isResponseMsg) {
+ flag |= IKE_HEADER_FLAG_IS_RESP_MSG;
+ }
+ if (fromIkeInitiator) {
+ flag |= IKE_HEADER_FLAG_FROM_IKE_INITIATOR;
+ }
+
+ byteBuffer.put(flag).putInt(messageId).putInt(messageLength);
+ }
}
diff --git a/tests/iketests/src/java/com/android/ike/ikev2/message/IkeHeaderTest.java b/tests/iketests/src/java/com/android/ike/ikev2/message/IkeHeaderTest.java
new file mode 100644
index 00000000..fd4ca910
--- /dev/null
+++ b/tests/iketests/src/java/com/android/ike/ikev2/message/IkeHeaderTest.java
@@ -0,0 +1,95 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.ike.ikev2.message;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+
+import java.nio.ByteBuffer;
+
+public final class IkeHeaderTest {
+ private static final String IKE_HEADER_HEX_STRING =
+ "8f54bf6d8b48e6e10000000000000000212022080000000000000150";
+ private static final String IKE_SA_INIT_RAW_PACKET =
+ "8f54bf6d8b48e6e100000000000000002120220800000000"
+ + "00000150220000300000002c010100040300000c0100000c"
+ + "800e00800300000803000002030000080400000200000008"
+ + "020000022800008800020000b4a2faf4bb54878ae21d6385"
+ + "12ece55d9236fc5046ab6cef82220f421f3ce6361faf3656"
+ + "4ecb6d28798a94aad7b2b4b603ddeaaa5630adb9ece8ac37"
+ + "534036040610ebdd92f46bef84f0be7db860351843858f8a"
+ + "cf87056e272377f70c9f2d81e29c7b0ce4f291a3a72476bb"
+ + "0b278fd4b7b0a4c26bbeb08214c707137607958729000024"
+ + "c39b7f368f4681b89fa9b7be6465abd7c5f68b6ed5d3b4c7"
+ + "2cb4240eb5c464122900001c00004004e54f73b7d83f6beb"
+ + "881eab2051d8663f421d10b02b00001c00004005d915368c"
+ + "a036004cb578ae3e3fb268509aeab1900000002069936922"
+ + "8741c6d4ca094c93e242c9de19e7b7c60000000500000500";
+
+ private static final String IKE_INITIATOR_SPI = "8f54bf6d8b48e6e1";
+ private static final String IKE_RESPODNER_SPI = "0000000000000000";
+
+ @IkePayload.PayloadType
+ private static final byte IKE_FIRST_PAYLOAD_TYPE = IkePayload.PAYLOAD_TYPE_SA;
+
+ private static final byte IKE_MAJOR_VERSION = 2;
+ private static final byte IKE_MINOR_VERSION = 0;
+
+ @IkeHeader.ExchangeType
+ private static final int IKE_EXCHANGE_TYPE = IkeHeader.EXCHANGE_TYPE_IKE_INIT_SA;
+
+ private static final int IKE_MSG_ID = 0;
+ private static final int IKE_MSG_LENGTH = 336;
+
+ @Test
+ public void testDecodeIkeHeader() throws Exception {
+ byte[] inputPacket = TestUtils.hexStringToByteArray(IKE_SA_INIT_RAW_PACKET);
+ IkeHeader header = new IkeHeader(inputPacket);
+
+ assertEquals(IKE_MSG_LENGTH, inputPacket.length);
+
+ long initSpi = Long.parseUnsignedLong(IKE_INITIATOR_SPI, 16);
+ assertEquals(initSpi, header.ikeInitiatorSpi);
+ long respSpi = Long.parseUnsignedLong(IKE_RESPODNER_SPI, 16);
+ assertEquals(respSpi, header.ikeResponderSpi);
+
+ assertEquals(IKE_FIRST_PAYLOAD_TYPE, header.nextPayloadType);
+ assertEquals(IKE_MAJOR_VERSION, header.majorVersion);
+ assertEquals(IKE_MINOR_VERSION, header.minorVersion);
+ assertEquals(IKE_EXCHANGE_TYPE, header.exchangeType);
+ assertFalse(header.isResponseMsg);
+ assertTrue(header.fromIkeInitiator);
+ assertEquals(IKE_MSG_ID, header.messageId);
+ assertEquals(IKE_MSG_LENGTH, header.messageLength);
+ }
+
+ @Test
+ public void testEncodeIkeHeader() throws Exception {
+ byte[] inputPacket = TestUtils.hexStringToByteArray(IKE_SA_INIT_RAW_PACKET);
+ IkeHeader header = new IkeHeader(inputPacket);
+
+ ByteBuffer byteBuffer = ByteBuffer.allocate(IkeHeader.IKE_HEADER_LENGTH);
+ header.encodeToByteBuffer(byteBuffer);
+
+ byte[] expectedPacket = TestUtils.hexStringToByteArray(IKE_HEADER_HEX_STRING);
+ assertArrayEquals(expectedPacket, byteBuffer.array());
+ }
+}
diff --git a/tests/iketests/src/java/com/android/ike/ikev2/message/IkeMessageTest.java b/tests/iketests/src/java/com/android/ike/ikev2/message/IkeMessageTest.java
index 05c59607..8978f688 100644
--- a/tests/iketests/src/java/com/android/ike/ikev2/message/IkeMessageTest.java
+++ b/tests/iketests/src/java/com/android/ike/ikev2/message/IkeMessageTest.java
@@ -17,8 +17,6 @@
package com.android.ike.ikev2.message;
import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import com.android.ike.ikev2.exceptions.IkeException;
@@ -47,20 +45,6 @@ public final class IkeMessageTest {
+ "881eab2051d8663f421d10b02b00001c00004005d915368c"
+ "a036004cb578ae3e3fb268509aeab1900000002069936922"
+ "8741c6d4ca094c93e242c9de19e7b7c60000000500000500";
- private static final String IKE_INITIATOR_SPI = "8f54bf6d8b48e6e1";
- private static final String IKE_RESPODNER_SPI = "0000000000000000";
-
- @IkePayload.PayloadType
- private static final byte IKE_FIRST_PAYLOAD_TYPE = IkePayload.PAYLOAD_TYPE_SA;
-
- private static final byte IKE_MAJOR_VERSION = 2;
- private static final byte IKE_MINOR_VERSION = 0;
-
- @IkeHeader.ExchangeType
- private static final int IKE_EXCHANGE_TYPE = IkeHeader.EXCHANGE_TYPE_IKE_INIT_SA;
-
- private static final int IKE_MSG_ID = 0;
- private static final int IKE_MSG_LENGTH = 336;
private static final int FIRST_PAYLOAD_TYPE_POSITION = 16;
private static final int VERSION_POSITION = 17;
@@ -118,28 +102,6 @@ public final class IkeMessageTest {
}
@Test
- public void testDecodeIkeHeader() throws Exception {
- byte[] inputPacket = TestUtils.hexStringToByteArray(IKE_SA_INIT_RAW_PACKET);
- IkeHeader header = new IkeHeader(inputPacket);
-
- assertEquals(IKE_MSG_LENGTH, inputPacket.length);
-
- long initSpi = Long.parseUnsignedLong(IKE_INITIATOR_SPI, 16);
- assertEquals(initSpi, header.ikeInitiatorSpi);
- long respSpi = Long.parseUnsignedLong(IKE_RESPODNER_SPI, 16);
- assertEquals(respSpi, header.ikeResponderSpi);
-
- assertEquals(IKE_FIRST_PAYLOAD_TYPE, header.nextPayloadType);
- assertEquals(IKE_MAJOR_VERSION, header.majorVersion);
- assertEquals(IKE_MINOR_VERSION, header.minorVersion);
- assertEquals(IKE_EXCHANGE_TYPE, header.exchangeType);
- assertFalse(header.isResponse);
- assertTrue(header.fromIkeInitiator);
- assertEquals(IKE_MSG_ID, header.messageId);
- assertEquals(IKE_MSG_LENGTH, header.messageLength);
- }
-
- @Test
public void testDecodeIkeMessage() throws Exception {
byte[] inputPacket = TestUtils.hexStringToByteArray(IKE_SA_INIT_RAW_PACKET);
IkeHeader header = new IkeHeader(inputPacket);