package model.asn1; import model.asn1.exceptions.ParseException; import model.asn1.parsing.BytesReader; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; public class ASN1LengthTest { @Test void testConstructor() { assertEquals(0, new ASN1Length(0).getLength()); assertEquals(1, new ASN1Length(1).getLength()); } @Test void testParse() throws Exception { // TODO: Exception BytesReader reader = new BytesReader(new Byte[]{0x0}); assertEquals(0, new ASN1Length(reader).getLength()); assertEquals(1, reader.getIndex()); reader = new BytesReader(new Byte[]{0x20}); assertEquals(0x20, new ASN1Length(reader).getLength()); assertEquals(1, reader.getIndex()); reader = new BytesReader(new Byte[]{-127, 0x30}); assertEquals(0x30, new ASN1Length(reader).getLength()); assertEquals(2, reader.getIndex()); reader = new BytesReader(new Byte[]{-126, -22, 0x60}); assertEquals(60000, new ASN1Length(reader).getLength()); assertEquals(3, reader.getIndex()); reader = new BytesReader(new Byte[]{-127, 127}); assertEquals(127, new ASN1Length(reader).getLength()); assertEquals(2, reader.getIndex()); reader = new BytesReader(new Byte[]{-124, 1, 1, 1, 1}); assertEquals(16843009, new ASN1Length(reader).getLength()); assertEquals(5, reader.getIndex()); reader = new BytesReader(new Byte[]{-127, -97}); assertEquals(159, new ASN1Length(reader).getLength()); assertEquals(2, reader.getIndex()); } @Test void testParseFail() throws ParseException { // First byte 0b10000000 assertThrows(ParseException.class, () -> new ASN1Length(new BytesReader(new Byte[]{-128})) ); // First byte 0b11111111 assertThrows(ParseException.class, () -> new ASN1Length(new BytesReader(new Byte[]{-1})) ); // Multibyte, requested 2 bytes but have none. assertThrows(ParseException.class, () -> new ASN1Length(new BytesReader(new Byte[]{-126})) ); // Multibyte, requested 2 bytes but have one. assertThrows(ParseException.class, () -> new ASN1Length(new BytesReader(new Byte[]{-126, 0x1})) ); // But this one should work (0b01111111) new ASN1Length(new BytesReader(new Byte[]{-127, 127})); // Multibyte, too long. assertThrows(ParseException.class, () -> new ASN1Length(new BytesReader(new Byte[]{-124, -1, -1, -1, -1})) ); // But this one should work, except for it is too large new ASN1Length(new BytesReader(new Byte[]{-125, -1, -1, -1})); } @Test void testEncode() { // Short form assertArrayEquals(new Byte[]{0x0}, new ASN1Length(0).encodeDER()); assertArrayEquals(new Byte[]{0x1}, new ASN1Length(1).encodeDER()); assertArrayEquals(new Byte[]{127}, new ASN1Length(127).encodeDER()); // Long form // 0b10000001, 0b10000000 assertArrayEquals(new Byte[]{-127, -128}, new ASN1Length(128).encodeDER()); // 0b10000010, 0b11111111, 0b11111111 assertArrayEquals(new Byte[]{-126, -1, -1}, new ASN1Length(65535).encodeDER()); } }