aboutsummaryrefslogtreecommitdiff
path: root/src/test/model/asn1/TagTest.java
blob: 02df91f8671c430ad769b08ed58181f5c4913f87 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
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 TagTest {
    @Test
    void testConstructor() {
        assertEquals(ASN1Object.TAG_SEQUENCE.getNumber(),
                new Tag(TagClass.UNIVERSAL, false, ASN1Object.TAG_SEQUENCE.getNumber()).getNumber());
        assertEquals(ASN1Object.TAG_SEQUENCE.getCls(),
                new Tag(TagClass.UNIVERSAL, false, ASN1Object.TAG_SEQUENCE.getNumber()).getCls());
        assertEquals(ASN1Object.TAG_SEQUENCE.isConstructive(),
                new Tag(TagClass.UNIVERSAL,
                        ASN1Object.TAG_SEQUENCE.isConstructive(),
                        ASN1Object.TAG_SEQUENCE.getNumber())
                        .isConstructive());
    }

    @Test
    void testParseSuccess() throws ParseException {
        // Test basic parsing
        assertEquals(0x1,
                new Tag(new BytesReader(new Byte[]{ 0x1 })).getNumber());
        assertEquals(TagClass.UNIVERSAL,
                new Tag(new BytesReader(new Byte[]{ 0x1 })).getCls());
        assertFalse(new Tag(new BytesReader(new Byte[]{ 0x1 })).isConstructive());
        // Test basic parsing with different class
        assertEquals(5,
                new Tag(new BytesReader(new Byte[]{ 101 })).getNumber());
        assertEquals(TagClass.APPLICATION,
                new Tag(new BytesReader(new Byte[]{ 101 })).getCls());
        assertTrue(new Tag(new BytesReader(new Byte[]{ 101 })).isConstructive());
        // Test different classes
        assertEquals(TagClass.UNIVERSAL,
                new Tag(new BytesReader(new Byte[]{ 1 })).getCls()); // 0b00000001
        assertEquals(TagClass.PRIVATE,
                new Tag(new BytesReader(new Byte[]{ -63 })).getCls()); // 0b11000001
        assertEquals(TagClass.CONTEXT_SPECIFIC,
                new Tag(new BytesReader(new Byte[]{ -127 })).getCls()); // 0b10000001
        assertEquals(TagClass.APPLICATION,
                new Tag(new BytesReader(new Byte[]{ 65 })).getCls()); // 0b01000001
        // Test different numbers
        assertEquals(0x10,
                new Tag(new BytesReader(new Byte[]{ 0x10 })).getNumber());
        assertEquals(31,
                new Tag(new BytesReader(new Byte[]{ 31 })).getNumber());
        // Test constructive bit
        assertFalse(new Tag(new BytesReader(new Byte[]{ 0x1 })).isConstructive());
        assertTrue(new Tag(new BytesReader(new Byte[]{ 33 })).isConstructive());
        // Test modification
        BytesReader reader = new BytesReader(new Byte[]{ 33 });
        assertEquals(0, reader.getIndex());
        new Tag(reader);
        assertEquals(1, reader.getIndex());
    }

    @Test
    void testParseFail() {
        // No enough bytes
        assertThrows(ParseException.class, () -> {
            BytesReader reader = new BytesReader(new Byte[]{ 33 });
            reader.require(1, true);
            new Tag(reader);
        });
        // Number zero
        assertThrows(ParseException.class, () -> new Tag(new BytesReader(new Byte[]{ 0 })));
    }

    @Test
    void testEncode() {
        // Basic encoding
        assertArrayEquals(new Byte[]{ 1 }, new Tag(TagClass.UNIVERSAL, false, 1).encodeDER());
        assertArrayEquals(new Byte[]{ 31 }, new Tag(TagClass.UNIVERSAL, false, 31).encodeDER());
        // With different class
        assertArrayEquals(new Byte[]{ -127 }, new Tag(TagClass.CONTEXT_SPECIFIC, false, 1).encodeDER());
        assertArrayEquals(new Byte[]{ -61 }, new Tag(TagClass.PRIVATE, false, 3).encodeDER());
        assertArrayEquals(new Byte[]{ 71 }, new Tag(TagClass.APPLICATION, false, 7).encodeDER());
        // With different constructive bit
        assertArrayEquals(new Byte[]{ 63 }, new Tag(TagClass.UNIVERSAL, true, 31).encodeDER());
    }

    @Test
    void testEnforce() {
        assertThrows(ParseException.class, () ->
                new Tag(TagClass.UNIVERSAL, true, 10)
                        .enforce(new Tag(TagClass.UNIVERSAL, true, 9)));
        assertThrows(ParseException.class, () ->
                new Tag(TagClass.UNIVERSAL, true, 10)
                        .enforce(new Tag(TagClass.UNIVERSAL, true, 11)));
        assertThrows(ParseException.class, () ->
                new Tag(TagClass.UNIVERSAL, true, 10)
                        .enforce(new Tag(TagClass.UNIVERSAL, false, 10)));
        assertThrows(ParseException.class, () ->
                new Tag(TagClass.UNIVERSAL, true, 10)
                        .enforce(new Tag(TagClass.APPLICATION, true, 10)));
        assertThrows(ParseException.class, () ->
                new Tag(TagClass.UNIVERSAL, true, 10)
                        .enforce(new Tag(TagClass.PRIVATE, true, 10)));
        assertThrows(ParseException.class, () ->
                new Tag(TagClass.UNIVERSAL, true, 10)
                        .enforce(new Tag(TagClass.CONTEXT_SPECIFIC, true, 10)));
    }
}