summaryrefslogtreecommitdiffstats
path: root/src/net/gcdc/asn1
diff options
context:
space:
mode:
authorCGantert345 <57003061+CGantert345@users.noreply.github.com>2020-10-29 12:44:07 +0100
committerCGantert345 <57003061+CGantert345@users.noreply.github.com>2020-10-29 12:44:07 +0100
commitca0191d050b3dac6e65815ad5662ed8e796ef9d9 (patch)
tree6690d0d9d771f3033e4106d3b22d025602571cb2 /src/net/gcdc/asn1
parentspecification added, test fixed (diff)
downloadUIC-barcode-ca0191d050b3dac6e65815ad5662ed8e796ef9d9.tar
UIC-barcode-ca0191d050b3dac6e65815ad5662ed8e796ef9d9.tar.gz
UIC-barcode-ca0191d050b3dac6e65815ad5662ed8e796ef9d9.tar.bz2
UIC-barcode-ca0191d050b3dac6e65815ad5662ed8e796ef9d9.tar.lz
UIC-barcode-ca0191d050b3dac6e65815ad5662ed8e796ef9d9.tar.xz
UIC-barcode-ca0191d050b3dac6e65815ad5662ed8e796ef9d9.tar.zst
UIC-barcode-ca0191d050b3dac6e65815ad5662ed8e796ef9d9.zip
Diffstat (limited to 'src/net/gcdc/asn1')
-rw-r--r--src/net/gcdc/asn1/datatypes/FieldOrder.java13
-rw-r--r--src/net/gcdc/asn1/test/UperEncodeBooleanTest.java3
-rw-r--r--src/net/gcdc/asn1/test/UperEncodeChoiceExtensionTest.java3
-rw-r--r--src/net/gcdc/asn1/test/UperEncodeChoiceTest.java3
-rw-r--r--src/net/gcdc/asn1/test/UperEncodeEnumExtensionTest.java2
-rw-r--r--src/net/gcdc/asn1/test/UperEncodeEnumTest.java2
-rw-r--r--src/net/gcdc/asn1/test/UperEncodeExtensionFieldOrderTest.java102
-rw-r--r--src/net/gcdc/asn1/test/UperEncodeFieldOrderTest.java68
-rw-r--r--src/net/gcdc/asn1/test/UperEncodeIntegerConstrainedTest.java4
-rw-r--r--src/net/gcdc/asn1/test/UperEncodeIntegerExtensionTest.java28
-rw-r--r--src/net/gcdc/asn1/test/UperEncodeIntegerSmallTest.java3
-rw-r--r--src/net/gcdc/asn1/test/UperEncodeIntegerTest.java2
-rw-r--r--src/net/gcdc/asn1/test/UperEncodeObjectIdentifierTest.java4
-rw-r--r--src/net/gcdc/asn1/test/UperEncodeOctetStringTest.java2
-rw-r--r--src/net/gcdc/asn1/test/UperEncodeOptionalSequenceExtensionTest.java3
-rw-r--r--src/net/gcdc/asn1/test/UperEncodeRestrictedIntegerTest.java2
-rw-r--r--src/net/gcdc/asn1/test/UperEncodeSequenceExtensionTest.java4
-rw-r--r--src/net/gcdc/asn1/test/UperEncodeSequenceOfIntegerTest.java3
-rw-r--r--src/net/gcdc/asn1/test/UperEncodeSequenceOfRestrictedIntegerTest.java2
-rw-r--r--src/net/gcdc/asn1/test/UperEncodeSequenceOfStringListTest.java2
-rw-r--r--src/net/gcdc/asn1/test/UperEncodeSequenceOfStringTest.java3
-rw-r--r--src/net/gcdc/asn1/test/UperEncodeSequenceOfUtf8StringTest.java3
-rw-r--r--src/net/gcdc/asn1/test/UperEncodeStringDefaultTest.java3
-rw-r--r--src/net/gcdc/asn1/test/UperEncodeStringLengthTest.java2
-rw-r--r--src/net/gcdc/asn1/test/UperEncodeStringTest.java33
-rw-r--r--src/net/gcdc/asn1/uper/UperEncoder.java29
26 files changed, 297 insertions, 31 deletions
diff --git a/src/net/gcdc/asn1/datatypes/FieldOrder.java b/src/net/gcdc/asn1/datatypes/FieldOrder.java
new file mode 100644
index 0000000..23fb8fa
--- /dev/null
+++ b/src/net/gcdc/asn1/datatypes/FieldOrder.java
@@ -0,0 +1,13 @@
+package net.gcdc.asn1.datatypes;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.FIELD)
+public @interface FieldOrder {
+ int order() default -1;
+}
+
diff --git a/src/net/gcdc/asn1/test/UperEncodeBooleanTest.java b/src/net/gcdc/asn1/test/UperEncodeBooleanTest.java
index 9716474..b9ca590 100644
--- a/src/net/gcdc/asn1/test/UperEncodeBooleanTest.java
+++ b/src/net/gcdc/asn1/test/UperEncodeBooleanTest.java
@@ -5,6 +5,7 @@ import static org.junit.Assert.assertEquals;
import java.util.logging.Level;
import net.gcdc.asn1.datatypes.Asn1Optional;
+import net.gcdc.asn1.datatypes.FieldOrder;
import net.gcdc.asn1.datatypes.Sequence;
import net.gcdc.asn1.uper.UperEncoder;
@@ -25,7 +26,7 @@ public class UperEncodeBooleanTest {
@Sequence
public static class TestRecord {
-
+ @FieldOrder(order = 0)
@Asn1Optional() Boolean value;
public TestRecord() {
diff --git a/src/net/gcdc/asn1/test/UperEncodeChoiceExtensionTest.java b/src/net/gcdc/asn1/test/UperEncodeChoiceExtensionTest.java
index acbbd0b..19cdb63 100644
--- a/src/net/gcdc/asn1/test/UperEncodeChoiceExtensionTest.java
+++ b/src/net/gcdc/asn1/test/UperEncodeChoiceExtensionTest.java
@@ -7,6 +7,7 @@ import java.util.logging.Level;
import net.gcdc.asn1.datatypes.Asn1Optional;
import net.gcdc.asn1.datatypes.CharacterRestriction;
import net.gcdc.asn1.datatypes.Choice;
+import net.gcdc.asn1.datatypes.FieldOrder;
import net.gcdc.asn1.datatypes.HasExtensionMarker;
import net.gcdc.asn1.datatypes.IsExtension;
import net.gcdc.asn1.datatypes.RestrictedString;
@@ -30,9 +31,11 @@ public class UperEncodeChoiceExtensionTest {
@HasExtensionMarker
public static class TestRecordExtended {
+ @FieldOrder(order = 0)
@RestrictedString(CharacterRestriction.IA5String)
String value1 = null;
+ @FieldOrder(order = 1)
@IsExtension
@RestrictedString(CharacterRestriction.IA5String)
String value2 = "extension";
diff --git a/src/net/gcdc/asn1/test/UperEncodeChoiceTest.java b/src/net/gcdc/asn1/test/UperEncodeChoiceTest.java
index d35e717..8dc8ce1 100644
--- a/src/net/gcdc/asn1/test/UperEncodeChoiceTest.java
+++ b/src/net/gcdc/asn1/test/UperEncodeChoiceTest.java
@@ -6,6 +6,7 @@ import java.util.logging.Level;
import net.gcdc.asn1.datatypes.CharacterRestriction;
import net.gcdc.asn1.datatypes.Choice;
+import net.gcdc.asn1.datatypes.FieldOrder;
import net.gcdc.asn1.datatypes.RestrictedString;
import net.gcdc.asn1.uper.UperEncoder;
@@ -31,9 +32,11 @@ public class UperEncodeChoiceTest {
@Choice
public static class TestRecord {
+ @FieldOrder(order = 0)
@RestrictedString(CharacterRestriction.UTF8String)
String valueUtf8;
+ @FieldOrder(order = 1)
@RestrictedString(CharacterRestriction.IA5String)
String valueIA5;
diff --git a/src/net/gcdc/asn1/test/UperEncodeEnumExtensionTest.java b/src/net/gcdc/asn1/test/UperEncodeEnumExtensionTest.java
index c098839..4b91f8e 100644
--- a/src/net/gcdc/asn1/test/UperEncodeEnumExtensionTest.java
+++ b/src/net/gcdc/asn1/test/UperEncodeEnumExtensionTest.java
@@ -5,6 +5,7 @@ import static org.junit.Assert.assertEquals;
import java.util.logging.Level;
import net.gcdc.asn1.datatypes.Asn1Optional;
+import net.gcdc.asn1.datatypes.FieldOrder;
import net.gcdc.asn1.datatypes.HasExtensionMarker;
import net.gcdc.asn1.datatypes.IsExtension;
import net.gcdc.asn1.datatypes.Sequence;
@@ -35,6 +36,7 @@ public class UperEncodeEnumExtensionTest {
@Sequence
public static class TestRecord {
+ @FieldOrder(order = 0)
@Asn1Optional EnumType value = EnumType.value1;
public TestRecord() {}
public void setValue(EnumType value) {
diff --git a/src/net/gcdc/asn1/test/UperEncodeEnumTest.java b/src/net/gcdc/asn1/test/UperEncodeEnumTest.java
index 66fbc05..ce41e7a 100644
--- a/src/net/gcdc/asn1/test/UperEncodeEnumTest.java
+++ b/src/net/gcdc/asn1/test/UperEncodeEnumTest.java
@@ -6,6 +6,7 @@ import java.util.logging.Level;
import net.gcdc.asn1.datatypes.Asn1Default;
import net.gcdc.asn1.datatypes.Asn1Optional;
+import net.gcdc.asn1.datatypes.FieldOrder;
import net.gcdc.asn1.datatypes.Sequence;
import net.gcdc.asn1.uper.UperEncoder;
@@ -32,6 +33,7 @@ public class UperEncodeEnumTest {
@Sequence
public static class TestRecord {
+ @FieldOrder(order = 0)
@Asn1Default(value="value2")
@Asn1Optional EnumType value = EnumType.value2;
diff --git a/src/net/gcdc/asn1/test/UperEncodeExtensionFieldOrderTest.java b/src/net/gcdc/asn1/test/UperEncodeExtensionFieldOrderTest.java
new file mode 100644
index 0000000..3c60e9c
--- /dev/null
+++ b/src/net/gcdc/asn1/test/UperEncodeExtensionFieldOrderTest.java
@@ -0,0 +1,102 @@
+package net.gcdc.asn1.test;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.logging.Level;
+
+import net.gcdc.asn1.datatypes.Asn1BigInteger;
+import net.gcdc.asn1.datatypes.FieldOrder;
+import net.gcdc.asn1.datatypes.HasExtensionMarker;
+import net.gcdc.asn1.datatypes.IsExtension;
+import net.gcdc.asn1.datatypes.Sequence;
+
+import net.gcdc.asn1.uper.UperEncoder;
+
+import org.junit.Test;
+
+
+public class UperEncodeExtensionFieldOrderTest {
+
+ /**
+ * Example from the Standard on UPER.
+ <pre>
+ TestRecord ::= [APPLICATION 0] IMPLICIT SEQUENCE {
+ number1 INTEGER,
+ ...,
+ number2 INTEGER,
+ number3 INTEGER
+ }
+
+ value TestRecord ::= {
+ value1 12345678909999899,
+ value2 5555555555,
+ value3 32001
+ }
+
+Encoding to the file 'data.uper' using PER UNALIGNED encoding rule...
+TestRecord SEQUENCE [root fieldcount (not encoded) = 1]
+ value1 INTEGER [length = 7.0]
+ 12345678909999899
+ value2 INTEGER [length = 5.0]
+ 5555555555
+ value3 INTEGER [length = 2.0]
+ 32001
+Total encoded length = 20.2
+Encoded successfully in 21 bytes:
+8395EE2A 2EF8858D 81C18140 52C8C338 C0C09F40 40
+
+
+ </pre>
+ */
+ @Sequence
+ @HasExtensionMarker
+ public static class TestRecord {
+
+ @FieldOrder(order = 0)
+ Asn1BigInteger value1;
+
+ @FieldOrder(order = 1)
+ @IsExtension
+ Asn1BigInteger value2;
+
+ @FieldOrder(order = 2)
+ @IsExtension
+ Asn1BigInteger value3;
+
+ public TestRecord() {
+ value1 = new Asn1BigInteger(12345678909999899L);
+ value2 = new Asn1BigInteger(5555555555L);
+ value3 = new Asn1BigInteger(32001L);
+ }
+
+
+ }
+
+
+ @Test public void test() throws IllegalArgumentException, IllegalAccessException {
+
+ TestRecord record = new TestRecord();
+ byte[] encoded = UperEncoder.encode(record);
+ String hex = UperEncoder.hexStringFromBytes(encoded);
+ UperEncoder.logger.log(Level.FINEST,String.format("data hex: %s", hex));
+ assertEquals("8395EE2A2EF8858D81C1814052C8C338C0C09F4040",hex);
+
+
+ }
+
+ @Test public void testDecode() throws IllegalArgumentException, IllegalAccessException {
+
+ TestRecord record = new TestRecord();
+ byte[] encoded = UperEncoder.encode(record);
+ String hex = UperEncoder.hexStringFromBytes(encoded);
+ UperEncoder.logger.log(Level.FINEST,String.format("data hex: %s", hex));
+ assertEquals("8395EE2A2EF8858D81C1814052C8C338C0C09F4040",hex);
+
+ TestRecord result = UperEncoder.decode(encoded, TestRecord.class);
+ assertEquals(result.value1.longValue(),record.value1.longValue());
+ assertEquals(result.value2.longValue(),record.value2.longValue());
+ assertEquals(result.value3.longValue(),record.value3.longValue());
+
+ }
+
+}
diff --git a/src/net/gcdc/asn1/test/UperEncodeFieldOrderTest.java b/src/net/gcdc/asn1/test/UperEncodeFieldOrderTest.java
new file mode 100644
index 0000000..e535356
--- /dev/null
+++ b/src/net/gcdc/asn1/test/UperEncodeFieldOrderTest.java
@@ -0,0 +1,68 @@
+package net.gcdc.asn1.test;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.logging.Level;
+
+import net.gcdc.asn1.datatypes.Asn1Optional;
+import net.gcdc.asn1.datatypes.CharacterRestriction;
+import net.gcdc.asn1.datatypes.FieldOrder;
+import net.gcdc.asn1.datatypes.RestrictedString;
+import net.gcdc.asn1.datatypes.Sequence;
+
+import net.gcdc.asn1.uper.UperEncoder;
+
+import org.junit.Test;
+
+
+public class UperEncodeFieldOrderTest {
+
+ /**
+ * Example from the Standard on UPER.
+ <pre>
+ World-Schema DEFINITIONS AUTOMATIC TAGS ::=
+ BEGIN
+ TestRecord ::= [APPLICATION 0] IMPLICIT SEQUENCE {
+ testString1 UTF8String OPTIONAL,
+ testString2 IA5String OPTIONAL
+ }
+ END
+ </pre>
+ */
+ @Sequence
+ public static class TestRecord {
+
+ @FieldOrder(order = 1)
+ @RestrictedString(CharacterRestriction.IA5String)
+ @Asn1Optional() String string2;
+
+ @FieldOrder(order = 0)
+ @RestrictedString(CharacterRestriction.UTF8String)
+ @Asn1Optional() String string1;
+
+
+ public TestRecord() {
+ }
+
+ public TestRecord(String utf8, String ia5) {
+ this.string1 = utf8;
+ this.string2 = ia5;
+ }
+ }
+
+
+ @Test public void test() throws IllegalArgumentException, IllegalAccessException {
+
+ TestRecord record = new TestRecord("String1", "String2");
+ byte[] encoded = UperEncoder.encode(record);
+
+ TestRecord result = UperEncoder.decode(encoded, TestRecord.class);
+ assertEquals(result.string1,"String1");
+ assertEquals(result.string2,"String2");
+ }
+
+
+
+
+
+}
diff --git a/src/net/gcdc/asn1/test/UperEncodeIntegerConstrainedTest.java b/src/net/gcdc/asn1/test/UperEncodeIntegerConstrainedTest.java
index 9450406..6c6a4af 100644
--- a/src/net/gcdc/asn1/test/UperEncodeIntegerConstrainedTest.java
+++ b/src/net/gcdc/asn1/test/UperEncodeIntegerConstrainedTest.java
@@ -4,6 +4,7 @@ import static org.junit.Assert.assertEquals;
import java.util.logging.Level;
+import net.gcdc.asn1.datatypes.FieldOrder;
import net.gcdc.asn1.datatypes.IntRange;
import net.gcdc.asn1.datatypes.Sequence;
import net.gcdc.asn1.uper.UperEncoder;
@@ -26,12 +27,15 @@ public class UperEncodeIntegerConstrainedTest {
@Sequence
public static class TestRecord {
+ @FieldOrder(order = 0)
@IntRange(minValue=1, maxValue=999)
public Long value1;
+ @FieldOrder(order = 1)
@IntRange(minValue=0, maxValue=999)
public Long value2;
+ @FieldOrder(order = 2)
@IntRange(minValue=63, maxValue=999)
public Long value3;
diff --git a/src/net/gcdc/asn1/test/UperEncodeIntegerExtensionTest.java b/src/net/gcdc/asn1/test/UperEncodeIntegerExtensionTest.java
index 5a33368..4c87bae 100644
--- a/src/net/gcdc/asn1/test/UperEncodeIntegerExtensionTest.java
+++ b/src/net/gcdc/asn1/test/UperEncodeIntegerExtensionTest.java
@@ -5,6 +5,7 @@ import static org.junit.Assert.assertEquals;
import java.util.logging.Level;
import net.gcdc.asn1.datatypes.Asn1BigInteger;
+import net.gcdc.asn1.datatypes.FieldOrder;
import net.gcdc.asn1.datatypes.HasExtensionMarker;
import net.gcdc.asn1.datatypes.IsExtension;
import net.gcdc.asn1.datatypes.Sequence;
@@ -51,14 +52,17 @@ Encoded successfully in 21 bytes:
@HasExtensionMarker
public static class TestRecord {
-
+ @FieldOrder(order = 0)
Asn1BigInteger value1;
+ @FieldOrder(order = 2)
+ @IsExtension
+ Asn1BigInteger value3;
+
+ @FieldOrder(order = 1)
@IsExtension
Asn1BigInteger value2;
- @IsExtension
- Asn1BigInteger value3;
public TestRecord() {
value1 = new Asn1BigInteger(12345678909999899L);
@@ -74,26 +78,14 @@ Encoded successfully in 21 bytes:
TestRecord record = new TestRecord();
byte[] encoded = UperEncoder.encode(record);
- String hex = UperEncoder.hexStringFromBytes(encoded);
- UperEncoder.logger.log(Level.FINEST,String.format("data hex: %s", hex));
- assertEquals("8395EE2A2EF8858D81C1814052C8C338C0C09F4040",hex);
-
-
- }
-
- @Test public void testDecode() throws IllegalArgumentException, IllegalAccessException {
-
- TestRecord record = new TestRecord();
- byte[] encoded = UperEncoder.encode(record);
- String hex = UperEncoder.hexStringFromBytes(encoded);
- UperEncoder.logger.log(Level.FINEST,String.format("data hex: %s", hex));
- assertEquals("8395EE2A2EF8858D81C1814052C8C338C0C09F4040",hex);
-
TestRecord result = UperEncoder.decode(encoded, TestRecord.class);
assertEquals(result.value1.longValue(),record.value1.longValue());
assertEquals(result.value2.longValue(),record.value2.longValue());
assertEquals(result.value3.longValue(),record.value3.longValue());
+
}
+
+
}
diff --git a/src/net/gcdc/asn1/test/UperEncodeIntegerSmallTest.java b/src/net/gcdc/asn1/test/UperEncodeIntegerSmallTest.java
index 9ad0e63..c34918f 100644
--- a/src/net/gcdc/asn1/test/UperEncodeIntegerSmallTest.java
+++ b/src/net/gcdc/asn1/test/UperEncodeIntegerSmallTest.java
@@ -4,6 +4,7 @@ import static org.junit.Assert.assertEquals;
import java.util.logging.Level;
+import net.gcdc.asn1.datatypes.FieldOrder;
import net.gcdc.asn1.datatypes.Sequence;
import net.gcdc.asn1.uper.UperEncoder;
@@ -25,8 +26,10 @@ public class UperEncodeIntegerSmallTest {
@Sequence
public static class TestRecord {
+ @FieldOrder(order = 0)
public Long value1;
+ @FieldOrder(order = 1)
public Integer value2;
public TestRecord() {
diff --git a/src/net/gcdc/asn1/test/UperEncodeIntegerTest.java b/src/net/gcdc/asn1/test/UperEncodeIntegerTest.java
index 4eab78a..f4f56f6 100644
--- a/src/net/gcdc/asn1/test/UperEncodeIntegerTest.java
+++ b/src/net/gcdc/asn1/test/UperEncodeIntegerTest.java
@@ -5,6 +5,7 @@ import static org.junit.Assert.assertEquals;
import java.util.logging.Level;
import net.gcdc.asn1.datatypes.Asn1BigInteger;
+import net.gcdc.asn1.datatypes.FieldOrder;
import net.gcdc.asn1.datatypes.Sequence;
import net.gcdc.asn1.uper.UperEncoder;
@@ -25,6 +26,7 @@ public class UperEncodeIntegerTest {
@Sequence
public static class TestRecord {
+ @FieldOrder(order = 0)
Asn1BigInteger value;
public TestRecord() {
diff --git a/src/net/gcdc/asn1/test/UperEncodeObjectIdentifierTest.java b/src/net/gcdc/asn1/test/UperEncodeObjectIdentifierTest.java
index c46751d..d36cfe6 100644
--- a/src/net/gcdc/asn1/test/UperEncodeObjectIdentifierTest.java
+++ b/src/net/gcdc/asn1/test/UperEncodeObjectIdentifierTest.java
@@ -7,6 +7,7 @@ import org.junit.jupiter.api.Test;
import net.gcdc.asn1.datatypes.Asn1Optional;
import net.gcdc.asn1.datatypes.CharacterRestriction;
+import net.gcdc.asn1.datatypes.FieldOrder;
import net.gcdc.asn1.datatypes.RestrictedString;
import net.gcdc.asn1.datatypes.Sequence;
import net.gcdc.asn1.uper.UperEncoder;
@@ -34,12 +35,15 @@ class UperEncodeObjectIdentifierTest {
@Sequence
public static class TestRecord {
+ @FieldOrder(order = 0)
@RestrictedString(CharacterRestriction.ObjectIdentifier)
String value1 = "2.16.840.1.101.3.4.3.1"; //DSA SHA224
+ @FieldOrder(order = 1)
@RestrictedString(CharacterRestriction.ObjectIdentifier)
String value2 = "2.16.840.1.101.3.4.3.2"; //DSA SHA248
+ @FieldOrder(order = 2)
@RestrictedString(CharacterRestriction.ObjectIdentifier)
String value3 = "1.2.840.10045.3.1.7"; //ECC
diff --git a/src/net/gcdc/asn1/test/UperEncodeOctetStringTest.java b/src/net/gcdc/asn1/test/UperEncodeOctetStringTest.java
index 7604d6a..eb92373 100644
--- a/src/net/gcdc/asn1/test/UperEncodeOctetStringTest.java
+++ b/src/net/gcdc/asn1/test/UperEncodeOctetStringTest.java
@@ -4,6 +4,7 @@ import static org.junit.Assert.assertEquals;
import java.util.logging.Level;
+import net.gcdc.asn1.datatypes.FieldOrder;
import net.gcdc.asn1.datatypes.Sequence;
import net.gcdc.asn1.datatypesimpl.OctetString;
@@ -39,6 +40,7 @@ public class UperEncodeOctetStringTest {
@Sequence
public static class TestRecord {
+ @FieldOrder(order = 0)
OctetString value;
public TestRecord() {
diff --git a/src/net/gcdc/asn1/test/UperEncodeOptionalSequenceExtensionTest.java b/src/net/gcdc/asn1/test/UperEncodeOptionalSequenceExtensionTest.java
index 1b2fa09..4e82a82 100644
--- a/src/net/gcdc/asn1/test/UperEncodeOptionalSequenceExtensionTest.java
+++ b/src/net/gcdc/asn1/test/UperEncodeOptionalSequenceExtensionTest.java
@@ -6,6 +6,7 @@ import java.util.logging.Level;
import net.gcdc.asn1.datatypes.Asn1Optional;
import net.gcdc.asn1.datatypes.CharacterRestriction;
+import net.gcdc.asn1.datatypes.FieldOrder;
import net.gcdc.asn1.datatypes.HasExtensionMarker;
import net.gcdc.asn1.datatypes.IsExtension;
import net.gcdc.asn1.datatypes.RestrictedString;
@@ -32,9 +33,11 @@ public class UperEncodeOptionalSequenceExtensionTest {
@HasExtensionMarker
public static class TestRecordExtended {
+ @FieldOrder(order = 0)
@RestrictedString(CharacterRestriction.IA5String)
String value1;
+ @FieldOrder(order = 1)
@IsExtension
@RestrictedString(CharacterRestriction.IA5String)
@Asn1Optional() String value2;
diff --git a/src/net/gcdc/asn1/test/UperEncodeRestrictedIntegerTest.java b/src/net/gcdc/asn1/test/UperEncodeRestrictedIntegerTest.java
index 27dc5f4..7463214 100644
--- a/src/net/gcdc/asn1/test/UperEncodeRestrictedIntegerTest.java
+++ b/src/net/gcdc/asn1/test/UperEncodeRestrictedIntegerTest.java
@@ -4,6 +4,7 @@ import static org.junit.Assert.assertEquals;
import java.util.logging.Level;
+import net.gcdc.asn1.datatypes.FieldOrder;
import net.gcdc.asn1.datatypes.IntRange;
import net.gcdc.asn1.datatypes.Sequence;
@@ -25,6 +26,7 @@ TestRecord ::= [APPLICATION 0] IMPLICIT SEQUENCE {
@Sequence
public static class TestRecord {
+ @FieldOrder(order = 0)
@IntRange(maxValue = 63000, minValue = 33000)
Long value;
diff --git a/src/net/gcdc/asn1/test/UperEncodeSequenceExtensionTest.java b/src/net/gcdc/asn1/test/UperEncodeSequenceExtensionTest.java
index 7934354..8c5131b 100644
--- a/src/net/gcdc/asn1/test/UperEncodeSequenceExtensionTest.java
+++ b/src/net/gcdc/asn1/test/UperEncodeSequenceExtensionTest.java
@@ -6,6 +6,7 @@ import java.util.logging.Level;
import net.gcdc.asn1.datatypes.Asn1Optional;
import net.gcdc.asn1.datatypes.CharacterRestriction;
+import net.gcdc.asn1.datatypes.FieldOrder;
import net.gcdc.asn1.datatypes.HasExtensionMarker;
import net.gcdc.asn1.datatypes.IsExtension;
import net.gcdc.asn1.datatypes.RestrictedString;
@@ -29,13 +30,16 @@ public class UperEncodeSequenceExtensionTest {
@HasExtensionMarker
public static class TestRecordExtended {
+ @FieldOrder(order = 0)
@RestrictedString(CharacterRestriction.IA5String)
@Asn1Optional() String value1 = "regular";
+ @FieldOrder(order = 1)
@IsExtension
@RestrictedString(CharacterRestriction.IA5String)
@Asn1Optional() String value2 = "extension";
+
public TestRecordExtended() { }
}
diff --git a/src/net/gcdc/asn1/test/UperEncodeSequenceOfIntegerTest.java b/src/net/gcdc/asn1/test/UperEncodeSequenceOfIntegerTest.java
index 6028a29..40a3772 100644
--- a/src/net/gcdc/asn1/test/UperEncodeSequenceOfIntegerTest.java
+++ b/src/net/gcdc/asn1/test/UperEncodeSequenceOfIntegerTest.java
@@ -6,6 +6,7 @@ import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
+import net.gcdc.asn1.datatypes.FieldOrder;
import net.gcdc.asn1.datatypes.Sequence;
import net.gcdc.asn1.datatypesimpl.SequenceOfUnrestrictedLong;
@@ -27,7 +28,7 @@ TestRecord ::= [APPLICATION 0] IMPLICIT SEQUENCE {
@Sequence
public static class TestRecord {
-
+ @FieldOrder(order = 0)
SequenceOfUnrestrictedLong numbers;
public TestRecord() {
diff --git a/src/net/gcdc/asn1/test/UperEncodeSequenceOfRestrictedIntegerTest.java b/src/net/gcdc/asn1/test/UperEncodeSequenceOfRestrictedIntegerTest.java
index 5ac9834..c1feece 100644
--- a/src/net/gcdc/asn1/test/UperEncodeSequenceOfRestrictedIntegerTest.java
+++ b/src/net/gcdc/asn1/test/UperEncodeSequenceOfRestrictedIntegerTest.java
@@ -4,6 +4,7 @@ import static org.junit.Assert.assertEquals;
import java.util.logging.Level;
+import net.gcdc.asn1.datatypes.FieldOrder;
import net.gcdc.asn1.datatypes.IntRange;
import net.gcdc.asn1.datatypes.Sequence;
@@ -25,6 +26,7 @@ TestRecord ::= [APPLICATION 0] IMPLICIT SEQUENCE {
@Sequence
public static class TestRecord {
+ @FieldOrder(order = 0)
@IntRange(minValue=9500000,maxValue=99900001)
TestSequenceOfLong numbers = null;;
diff --git a/src/net/gcdc/asn1/test/UperEncodeSequenceOfStringListTest.java b/src/net/gcdc/asn1/test/UperEncodeSequenceOfStringListTest.java
index 1a8f68e..4bc0cb9 100644
--- a/src/net/gcdc/asn1/test/UperEncodeSequenceOfStringListTest.java
+++ b/src/net/gcdc/asn1/test/UperEncodeSequenceOfStringListTest.java
@@ -7,6 +7,7 @@ import java.util.List;
import java.util.logging.Level;
import net.gcdc.asn1.datatypes.CharacterRestriction;
+import net.gcdc.asn1.datatypes.FieldOrder;
import net.gcdc.asn1.datatypes.RestrictedString;
import net.gcdc.asn1.datatypes.Sequence;
import net.gcdc.asn1.uper.UperEncoder;
@@ -27,6 +28,7 @@ public class UperEncodeSequenceOfStringListTest {
@Sequence
public static class TestRecord {
+ @FieldOrder(order = 0)
@RestrictedString(CharacterRestriction.IA5String)
ArrayList<String> strings = new ArrayList<String>();
diff --git a/src/net/gcdc/asn1/test/UperEncodeSequenceOfStringTest.java b/src/net/gcdc/asn1/test/UperEncodeSequenceOfStringTest.java
index c7c82f7..3ddf93e 100644
--- a/src/net/gcdc/asn1/test/UperEncodeSequenceOfStringTest.java
+++ b/src/net/gcdc/asn1/test/UperEncodeSequenceOfStringTest.java
@@ -5,6 +5,7 @@ import static org.junit.Assert.assertEquals;
import java.util.logging.Level;
import net.gcdc.asn1.datatypes.CharacterRestriction;
+import net.gcdc.asn1.datatypes.FieldOrder;
import net.gcdc.asn1.datatypes.RestrictedString;
import net.gcdc.asn1.datatypes.Sequence;
import net.gcdc.asn1.datatypesimpl.SequenceOfStringIA5;
@@ -26,7 +27,7 @@ public class UperEncodeSequenceOfStringTest {
@Sequence
public static class TestRecord {
-
+ @FieldOrder(order = 0)
SequenceOfStringIA5 strings = new SequenceOfStringIA5();
public TestRecord() {
diff --git a/src/net/gcdc/asn1/test/UperEncodeSequenceOfUtf8StringTest.java b/src/net/gcdc/asn1/test/UperEncodeSequenceOfUtf8StringTest.java
index b2c855d..88d5050 100644
--- a/src/net/gcdc/asn1/test/UperEncodeSequenceOfUtf8StringTest.java
+++ b/src/net/gcdc/asn1/test/UperEncodeSequenceOfUtf8StringTest.java
@@ -4,6 +4,7 @@ import static org.junit.Assert.assertEquals;
import java.util.logging.Level;
+import net.gcdc.asn1.datatypes.FieldOrder;
import net.gcdc.asn1.datatypes.Sequence;
import net.gcdc.asn1.datatypesimpl.SequenceOfStringUTF8;
import net.gcdc.asn1.uper.UperEncoder;
@@ -46,7 +47,7 @@ Encoded successfully in 19 bytes:
@Sequence
public static class TestRecord {
-
+ @FieldOrder(order = 0)
SequenceOfStringUTF8 strings = new SequenceOfStringUTF8();
public TestRecord() {
diff --git a/src/net/gcdc/asn1/test/UperEncodeStringDefaultTest.java b/src/net/gcdc/asn1/test/UperEncodeStringDefaultTest.java
index e43d76d..5abaa37 100644
--- a/src/net/gcdc/asn1/test/UperEncodeStringDefaultTest.java
+++ b/src/net/gcdc/asn1/test/UperEncodeStringDefaultTest.java
@@ -7,6 +7,7 @@ import java.util.logging.Level;
import net.gcdc.asn1.datatypes.Asn1Default;
import net.gcdc.asn1.datatypes.Asn1Optional;
import net.gcdc.asn1.datatypes.CharacterRestriction;
+import net.gcdc.asn1.datatypes.FieldOrder;
import net.gcdc.asn1.datatypes.RestrictedString;
import net.gcdc.asn1.datatypes.Sequence;
import net.gcdc.asn1.uper.UperEncoder;
@@ -28,9 +29,11 @@ public class UperEncodeStringDefaultTest {
@Sequence
public static class TestRecord {
+ @FieldOrder(order = 0)
@RestrictedString(CharacterRestriction.UTF8String)
@Asn1Optional() String valueUtf8;
+ @FieldOrder(order = 1)
@RestrictedString(CharacterRestriction.IA5String)
@Asn1Default(value="testString") String valueIA5;
diff --git a/src/net/gcdc/asn1/test/UperEncodeStringLengthTest.java b/src/net/gcdc/asn1/test/UperEncodeStringLengthTest.java
index 378bc06..9db6229 100644
--- a/src/net/gcdc/asn1/test/UperEncodeStringLengthTest.java
+++ b/src/net/gcdc/asn1/test/UperEncodeStringLengthTest.java
@@ -6,6 +6,7 @@ import java.util.logging.Level;
import net.gcdc.asn1.datatypes.Asn1Optional;
import net.gcdc.asn1.datatypes.CharacterRestriction;
+import net.gcdc.asn1.datatypes.FieldOrder;
import net.gcdc.asn1.datatypes.RestrictedString;
import net.gcdc.asn1.datatypes.Sequence;
@@ -38,6 +39,7 @@ public class UperEncodeStringLengthTest {
@Sequence
public static class TestRecord {
+ @FieldOrder(order = 0)
@RestrictedString(CharacterRestriction.UTF8String)
@Asn1Optional() String valueUtf8;
diff --git a/src/net/gcdc/asn1/test/UperEncodeStringTest.java b/src/net/gcdc/asn1/test/UperEncodeStringTest.java
index 521075c..29e6c99 100644
--- a/src/net/gcdc/asn1/test/UperEncodeStringTest.java
+++ b/src/net/gcdc/asn1/test/UperEncodeStringTest.java
@@ -6,6 +6,7 @@ import java.util.logging.Level;
import net.gcdc.asn1.datatypes.Asn1Optional;
import net.gcdc.asn1.datatypes.CharacterRestriction;
+import net.gcdc.asn1.datatypes.FieldOrder;
import net.gcdc.asn1.datatypes.RestrictedString;
import net.gcdc.asn1.datatypes.Sequence;
@@ -31,9 +32,11 @@ public class UperEncodeStringTest {
@Sequence
public static class TestRecord {
+ @FieldOrder(order = 0)
@RestrictedString(CharacterRestriction.UTF8String)
@Asn1Optional() String valueUtf8;
+ @FieldOrder(order = 1)
@RestrictedString(CharacterRestriction.IA5String)
@Asn1Optional() String valueIA5;
@@ -48,29 +51,41 @@ public class UperEncodeStringTest {
@Test public void testEncode() throws IllegalArgumentException, IllegalAccessException {
- TestRecord record = new TestRecord("Müller", "Meier");
+
+ //Teststring: AêñüC
+ String original = new String("A" + "\u00ea" + "\u00f1" + "\u00fc" + "C");
+
+ TestRecord record = new TestRecord(original, "Meier");
byte[] encoded = UperEncoder.encode(record);
String hex = UperEncoder.hexStringFromBytes(encoded);
UperEncoder.logger.log(Level.FINEST,String.format("data hex: %s", hex));
- assertEquals("C1D370EF1B1B195C8166E5D39790",hex);
+ assertEquals("C21070EAB0EC70EF10C166E5D39790",hex);
+
}
@Test public void testEncodeUtf8() throws IllegalArgumentException, IllegalAccessException {
- TestRecord record = new TestRecord("你好吗", "Meier");
+
+ //"你好吗"
+ String original = new String("\u00e4" + "\u00bd" + "\u00a0" + "\u00e5" + "\u00a5" + "\u00bd" + "\u00e5" + "\u0090" + "\u0097");
+ TestRecord record = new TestRecord(original, "Meier");
byte[] encoded = UperEncoder.encode(record);
String hex = UperEncoder.hexStringFromBytes(encoded);
UperEncoder.logger.log(Level.FINEST,String.format("data hex: %s", hex));
- assertEquals("C2792F6839696F796425C166E5D39790",hex);
+ assertEquals("C4B0E930AF70A830E970A970AF70E970A430A5C166E5D39790",hex);
}
@Test public void testDecode() throws IllegalArgumentException, IllegalAccessException {
- TestRecord record = new TestRecord("Müller", "Meier");
+
+ //Teststring: AêñüC
+ String original = new String("A" + "\u00ea" + "\u00f1" + "\u00fc" + "C");
+
+ TestRecord record = new TestRecord(original, "Meier");
byte[] encoded = UperEncoder.encode(record);
String hex = UperEncoder.hexStringFromBytes(encoded);
UperEncoder.logger.log(Level.FINEST,String.format("data hex: %s", hex));
- assertEquals("C1D370EF1B1B195C8166E5D39790",hex);
+ assertEquals("C21070EAB0EC70EF10C166E5D39790",hex);
TestRecord result = UperEncoder.decode(encoded, TestRecord.class);
assertEquals(result.valueUtf8,record.valueUtf8);
assertEquals(result.valueIA5,record.valueIA5);
@@ -78,11 +93,13 @@ public class UperEncodeStringTest {
@Test public void testDecodeUtf8() throws IllegalArgumentException, IllegalAccessException {
- TestRecord record = new TestRecord("你好吗", "Meier");
+ //"你好吗"
+ String original = new String("\u00e4" + "\u00bd" + "\u00a0" + "\u00e5" + "\u00a5" + "\u00bd" + "\u00e5" + "\u0090" + "\u0097");
+ TestRecord record = new TestRecord(original, "Meier");
byte[] encoded = UperEncoder.encode(record);
String hex = UperEncoder.hexStringFromBytes(encoded);
UperEncoder.logger.log(Level.FINEST,String.format("data hex: %s", hex));
- assertEquals("C2792F6839696F796425C166E5D39790",hex);
+ assertEquals("C4B0E930AF70A830E970A970AF70E970A430A5C166E5D39790",hex);
TestRecord result = UperEncoder.decode(encoded, TestRecord.class);
assertEquals(result.valueUtf8,record.valueUtf8);
assertEquals(result.valueIA5,record.valueIA5);
diff --git a/src/net/gcdc/asn1/uper/UperEncoder.java b/src/net/gcdc/asn1/uper/UperEncoder.java
index f9c2f2a..30aa82b 100644
--- a/src/net/gcdc/asn1/uper/UperEncoder.java
+++ b/src/net/gcdc/asn1/uper/UperEncoder.java
@@ -7,6 +7,8 @@ import java.lang.reflect.InvocationTargetException;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Collections;
+import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -17,6 +19,7 @@ import logger.LoggerFactory;
import net.gcdc.asn1.datatypes.Asn1Default;
import net.gcdc.asn1.datatypes.Asn1Optional;
+import net.gcdc.asn1.datatypes.FieldOrder;
import net.gcdc.asn1.datatypes.HasExtensionMarker;
import net.gcdc.asn1.datatypes.IntRange;
import net.gcdc.asn1.datatypes.IsExtension;
@@ -405,7 +408,31 @@ public final class UperEncoder {
Map<Field, Boolean> originalAccess = new HashMap<>();
Asn1ContainerFieldSorter(Class<?> type) {
- for (Field f : type.getDeclaredFields()) {
+
+ /*
+ *
+ * sorting of the fields added to compensate the error
+ * in the java SDK on android where getDeclaredFields does
+ * not return the fields in the order of the class definition
+ *
+ */
+ List<Field> fields = Arrays.asList(type.getDeclaredFields());
+ Collections.sort(fields, new Comparator<Field>() {
+ @Override
+ public int compare(Field o1, Field o2) {
+ FieldOrder ao1 = o1.getAnnotation(FieldOrder.class);
+ FieldOrder ao2 = o2.getAnnotation(FieldOrder.class);
+ int order1 = ao1 == null ? Integer.MAX_VALUE : ao1.order();
+ int order2 = ao2 == null ? Integer.MAX_VALUE : ao2.order();
+ if (order1 == Integer.MAX_VALUE || order2 == Integer.MAX_VALUE || order1 < 0 || order2 < 0 || order1 == order2) {
+ logger.debug(String.format("field order error for %s",type.getSimpleName()));
+ }
+ return Integer.compare(order1, order2);
+ }
+ });
+
+
+ for (Field f : fields) {
if (isTestInstrumentation(f) || isNonAsn1Field(f) ) {
continue;
}