diff options
author | Cody Kesting <ckesting@google.com> | 2019-10-14 18:55:39 -0700 |
---|---|---|
committer | Cody Kesting <ckesting@google.com> | 2019-10-19 15:15:48 -0700 |
commit | e3b80f61c6576c4d9468aa1ba1d8a73af30fbc41 (patch) | |
tree | 840d44b46db7be96a997e86058f57551a0bab3be | |
parent | 18c38919407daad2df547918ebe4fddd3934a121 (diff) | |
download | ike-e3b80f61c6576c4d9468aa1ba1d8a73af30fbc41.tar.gz |
Define EAP_AT_KDF attribute for EAP-AKA'.
Bug: 142663198
Test: added AtKdfTest.
Test: atest FrameworksIkeTests
Change-Id: I6b9f6e1fe98c10f4a20f1525409a8340ccfaebdf
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"); } |