aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCody Kesting <ckesting@google.com>2019-10-14 18:55:39 -0700
committerCody Kesting <ckesting@google.com>2019-10-19 15:15:48 -0700
commite3b80f61c6576c4d9468aa1ba1d8a73af30fbc41 (patch)
tree840d44b46db7be96a997e86058f57551a0bab3be
parent18c38919407daad2df547918ebe4fddd3934a121 (diff)
downloadike-e3b80f61c6576c4d9468aa1ba1d8a73af30fbc41.tar.gz
Define EAP_AT_KDF attribute for EAP-AKA'.
Bug: 142663198 Test: added AtKdfTest. Test: atest FrameworksIkeTests Change-Id: I6b9f6e1fe98c10f4a20f1525409a8340ccfaebdf
-rw-r--r--src/java/com/android/ike/eap/message/simaka/EapAkaPrimeAttributeFactory.java4
-rw-r--r--src/java/com/android/ike/eap/message/simaka/EapSimAkaAttribute.java36
-rw-r--r--tests/iketests/src/java/com/android/ike/eap/message/simaka/attributes/AtKdfTest.java78
-rw-r--r--tests/iketests/src/java/com/android/ike/eap/message/simaka/attributes/EapTestAttributeDefinitions.java3
4 files changed, 121 insertions, 0 deletions
diff --git a/src/java/com/android/ike/eap/message/simaka/EapAkaPrimeAttributeFactory.java b/src/java/com/android/ike/eap/message/simaka/EapAkaPrimeAttributeFactory.java
index c33b9359..e9086d76 100644
--- a/src/java/com/android/ike/eap/message/simaka/EapAkaPrimeAttributeFactory.java
+++ b/src/java/com/android/ike/eap/message/simaka/EapAkaPrimeAttributeFactory.java
@@ -16,11 +16,13 @@
package com.android.ike.eap.message.simaka;
+import static com.android.ike.eap.message.simaka.EapSimAkaAttribute.EAP_AT_KDF;
import static com.android.ike.eap.message.simaka.EapSimAkaAttribute.EAP_AT_KDF_INPUT;
import static com.android.ike.eap.message.simaka.EapSimAkaAttribute.LENGTH_SCALING;
import com.android.ike.eap.exceptions.simaka.EapSimAkaInvalidAttributeException;
import com.android.ike.eap.exceptions.simaka.EapSimAkaUnsupportedAttributeException;
+import com.android.ike.eap.message.simaka.EapSimAkaAttribute.AtKdf;
import com.android.ike.eap.message.simaka.EapSimAkaAttribute.AtKdfInput;
import java.nio.ByteBuffer;
@@ -65,6 +67,8 @@ public class EapAkaPrimeAttributeFactory extends EapAkaAttributeFactory {
switch (attributeType) {
case EAP_AT_KDF_INPUT:
return new AtKdfInput(lengthInBytes, byteBuffer);
+ case EAP_AT_KDF:
+ return new AtKdf(lengthInBytes, byteBuffer);
default:
return super.getAttribute(attributeType, lengthInBytes, byteBuffer);
}
diff --git a/src/java/com/android/ike/eap/message/simaka/EapSimAkaAttribute.java b/src/java/com/android/ike/eap/message/simaka/EapSimAkaAttribute.java
index f265d17f..5b6f1726 100644
--- a/src/java/com/android/ike/eap/message/simaka/EapSimAkaAttribute.java
+++ b/src/java/com/android/ike/eap/message/simaka/EapSimAkaAttribute.java
@@ -68,6 +68,7 @@ public abstract class EapSimAkaAttribute {
public static final int EAP_AT_NONCE_S = 21;
public static final int EAP_AT_CLIENT_ERROR_CODE = 22;
public static final int EAP_AT_KDF_INPUT = 23;
+ public static final int EAP_AT_KDF = 24;
// EAP Skippable Attribute values defined by IANA
// https://www.iana.org/assignments/eapsimaka-numbers/eapsimaka-numbers.xhtml
@@ -99,6 +100,7 @@ public abstract class EapSimAkaAttribute {
EAP_ATTRIBUTE_STRING.put(EAP_AT_NONCE_S, "AT_NONCE_S");
EAP_ATTRIBUTE_STRING.put(EAP_AT_CLIENT_ERROR_CODE, "AT_CLIENT_ERROR_CODE");
EAP_ATTRIBUTE_STRING.put(EAP_AT_KDF_INPUT, "AT_KDF_INPUT");
+ EAP_ATTRIBUTE_STRING.put(EAP_AT_KDF, "AT_KDF");
EAP_ATTRIBUTE_STRING.put(EAP_AT_IV, "AT_IV");
EAP_ATTRIBUTE_STRING.put(EAP_AT_ENCR_DATA, "AT_ENCR_DATA");
@@ -1085,4 +1087,38 @@ public abstract class EapSimAkaAttribute {
addPadding(bytesUsed, byteBuffer);
}
}
+
+ /**
+ * AdKdf represents the AT_KDF attribute defined in RFC 5448#3.2
+ */
+ public static class AtKdf extends EapSimAkaAttribute {
+ private static final int ATTR_LENGTH = MIN_ATTR_LENGTH;
+
+ public final int kdf;
+
+ public AtKdf(int lengthInBytes, ByteBuffer buffer)
+ throws EapSimAkaInvalidAttributeException {
+ super(EAP_AT_KDF, lengthInBytes);
+
+ if (lengthInBytes != ATTR_LENGTH) {
+ throw new EapSimAkaInvalidAttributeException("AtKdf length must be 4B");
+ }
+
+ kdf = Short.toUnsignedInt(buffer.getShort());
+ }
+
+ @VisibleForTesting
+ public AtKdf(int kdf) throws EapSimAkaInvalidAttributeException {
+ super(EAP_AT_KDF, ATTR_LENGTH);
+
+ this.kdf = kdf;
+ }
+
+ @Override
+ public void encode(ByteBuffer byteBuffer) {
+ encodeAttributeHeader(byteBuffer);
+
+ byteBuffer.putShort((short) kdf);
+ }
+ }
}
diff --git a/tests/iketests/src/java/com/android/ike/eap/message/simaka/attributes/AtKdfTest.java b/tests/iketests/src/java/com/android/ike/eap/message/simaka/attributes/AtKdfTest.java
new file mode 100644
index 00000000..0a1209c8
--- /dev/null
+++ b/tests/iketests/src/java/com/android/ike/eap/message/simaka/attributes/AtKdfTest.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright (C) 2019 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.eap.message.simaka.attributes;
+
+import static com.android.ike.eap.message.simaka.EapSimAkaAttribute.EAP_AT_KDF;
+import static com.android.ike.eap.message.simaka.attributes.EapTestAttributeDefinitions.AT_KDF;
+import static com.android.ike.eap.message.simaka.attributes.EapTestAttributeDefinitions.AT_KDF_INVALID_LENGTH;
+import static com.android.ike.eap.message.simaka.attributes.EapTestAttributeDefinitions.KDF_VERSION;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.fail;
+
+import com.android.ike.eap.exceptions.simaka.EapSimAkaInvalidAttributeException;
+import com.android.ike.eap.message.simaka.EapAkaPrimeAttributeFactory;
+import com.android.ike.eap.message.simaka.EapSimAkaAttribute;
+import com.android.ike.eap.message.simaka.EapSimAkaAttribute.AtKdf;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import java.nio.ByteBuffer;
+
+public class AtKdfTest {
+ private EapAkaPrimeAttributeFactory mAttributeFactory;
+
+ @Before
+ public void setUp() {
+ mAttributeFactory = EapAkaPrimeAttributeFactory.getInstance();
+ }
+
+ @Test
+ public void testDecode() throws Exception {
+ ByteBuffer input = ByteBuffer.wrap(AT_KDF);
+ EapSimAkaAttribute result = mAttributeFactory.getAttribute(input);
+
+ assertFalse(input.hasRemaining());
+ AtKdf atKdf = (AtKdf) result;
+ assertEquals(EAP_AT_KDF, atKdf.attributeType);
+ assertEquals(AT_KDF.length, atKdf.lengthInBytes);
+ assertEquals(KDF_VERSION, atKdf.kdf);
+ }
+
+ @Test
+ public void testDecodeInvalidLength() throws Exception {
+ ByteBuffer input = ByteBuffer.wrap(AT_KDF_INVALID_LENGTH);
+ try {
+ mAttributeFactory.getAttribute(input);
+ fail("Expected EapSimAkaInvalidAttributeException for invalid length");
+ } catch (EapSimAkaInvalidAttributeException expected) {
+ }
+ }
+
+ @Test
+ public void testEncode() throws Exception {
+ AtKdf atKdf = new AtKdf(KDF_VERSION);
+ ByteBuffer result = ByteBuffer.allocate(AT_KDF.length);
+
+ atKdf.encode(result);
+ assertArrayEquals(AT_KDF, result.array());
+ assertFalse(result.hasRemaining());
+ }
+}
diff --git a/tests/iketests/src/java/com/android/ike/eap/message/simaka/attributes/EapTestAttributeDefinitions.java b/tests/iketests/src/java/com/android/ike/eap/message/simaka/attributes/EapTestAttributeDefinitions.java
index ba30724c..b9007131 100644
--- a/tests/iketests/src/java/com/android/ike/eap/message/simaka/attributes/EapTestAttributeDefinitions.java
+++ b/tests/iketests/src/java/com/android/ike/eap/message/simaka/attributes/EapTestAttributeDefinitions.java
@@ -80,6 +80,8 @@ public class EapTestAttributeDefinitions {
public static final byte[] AT_KDF_INPUT =
hexStringToByteArray("1704000B" + NETWORK_NAME_HEX + "00");
public static final byte[] AT_KDF_INPUT_EMPTY_NETWORK_NAME = hexStringToByteArray("17010000");
+ public static final int KDF_VERSION = 1;
+ public static final byte[] AT_KDF = hexStringToByteArray("18010001");
public static final byte[] AT_VERSION_LIST_INVALID_LENGTH = hexStringToByteArray("0F020003");
public static final byte[] AT_SELECTED_VERSION_INVALID_LENGTH =
@@ -110,4 +112,5 @@ public class EapTestAttributeDefinitions {
public static final byte[] AT_RES_LONG_RES =
hexStringToByteArray("0306008800112233445566778899AABBCCDDEEFF11000000");
public static final byte[] AT_AUTS_INVALID_LENGTH = hexStringToByteArray("03010000");
+ public static final byte[] AT_KDF_INVALID_LENGTH = hexStringToByteArray("18020001");
}