package model.asn1; import model.asn1.exceptions.ParseException; import model.asn1.parsing.BytesReader; import model.asn1.parsing.BytesReaderTest; 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()); } }