diff options
Diffstat (limited to 'core/src/test/java/org/spongycastle/asn1/test/ASN1SequenceParserTest.java')
-rw-r--r-- | core/src/test/java/org/spongycastle/asn1/test/ASN1SequenceParserTest.java | 372 |
1 files changed, 372 insertions, 0 deletions
diff --git a/core/src/test/java/org/spongycastle/asn1/test/ASN1SequenceParserTest.java b/core/src/test/java/org/spongycastle/asn1/test/ASN1SequenceParserTest.java new file mode 100644 index 00000000..4c93a888 --- /dev/null +++ b/core/src/test/java/org/spongycastle/asn1/test/ASN1SequenceParserTest.java @@ -0,0 +1,372 @@ +package org.spongycastle.asn1.test; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.math.BigInteger; +import java.util.Arrays; + +import junit.framework.Test; +import junit.framework.TestCase; +import junit.framework.TestSuite; +import org.spongycastle.asn1.ASN1Integer; +import org.spongycastle.asn1.ASN1Null; +import org.spongycastle.asn1.ASN1ObjectIdentifier; +import org.spongycastle.asn1.ASN1SequenceParser; +import org.spongycastle.asn1.ASN1StreamParser; +import org.spongycastle.asn1.BERSequenceGenerator; +import org.spongycastle.asn1.DERSequenceGenerator; +import org.spongycastle.util.encoders.Hex; + +public class ASN1SequenceParserTest + extends TestCase +{ + private static final byte[] seqData = Hex.decode("3006020100060129"); + private static final byte[] nestedSeqData = Hex.decode("300b0201000601293003020101"); + private static final byte[] expTagSeqData = Hex.decode("a1083006020100060129"); + private static final byte[] implTagSeqData = Hex.decode("a106020100060129"); + private static final byte[] nestedSeqExpTagData = Hex.decode("300d020100060129a1053003020101"); + private static final byte[] nestedSeqImpTagData = Hex.decode("300b020100060129a103020101"); + + private static final byte[] berSeqData = Hex.decode("30800201000601290000"); + private static final byte[] berDERNestedSeqData = Hex.decode("308002010006012930030201010000"); + private static final byte[] berNestedSeqData = Hex.decode("3080020100060129308002010100000000"); + private static final byte[] berExpTagSeqData = Hex.decode("a180308002010006012900000000"); + + private static final byte[] berSeqWithDERNullData = Hex.decode("308005000201000601290000"); + + public void testDERWriting() + throws Exception + { + ByteArrayOutputStream bOut = new ByteArrayOutputStream(); + DERSequenceGenerator seqGen = new DERSequenceGenerator(bOut); + + seqGen.addObject(new ASN1Integer(BigInteger.valueOf(0))); + + seqGen.addObject(new ASN1ObjectIdentifier("1.1")); + + seqGen.close(); + + assertTrue("basic DER writing test failed.", Arrays.equals(seqData, bOut.toByteArray())); + } + + public void testNestedDERWriting() + throws Exception + { + ByteArrayOutputStream bOut = new ByteArrayOutputStream(); + DERSequenceGenerator seqGen1 = new DERSequenceGenerator(bOut); + + seqGen1.addObject(new ASN1Integer(BigInteger.valueOf(0))); + + seqGen1.addObject(new ASN1ObjectIdentifier("1.1")); + + DERSequenceGenerator seqGen2 = new DERSequenceGenerator(seqGen1.getRawOutputStream()); + + seqGen2.addObject(new ASN1Integer(BigInteger.valueOf(1))); + + seqGen2.close(); + + seqGen1.close(); + + assertTrue("nested DER writing test failed.", Arrays.equals(nestedSeqData, bOut.toByteArray())); + } + + public void testDERExplicitTaggedSequenceWriting() + throws Exception + { + ByteArrayOutputStream bOut = new ByteArrayOutputStream(); + DERSequenceGenerator seqGen = new DERSequenceGenerator(bOut, 1, true); + + seqGen.addObject(new ASN1Integer(BigInteger.valueOf(0))); + + seqGen.addObject(new ASN1ObjectIdentifier("1.1")); + + seqGen.close(); + + assertTrue("explicit tag writing test failed.", Arrays.equals(expTagSeqData, bOut.toByteArray())); + } + + public void testDERImplicitTaggedSequenceWriting() + throws Exception + { + ByteArrayOutputStream bOut = new ByteArrayOutputStream(); + DERSequenceGenerator seqGen = new DERSequenceGenerator(bOut, 1, false); + + seqGen.addObject(new ASN1Integer(BigInteger.valueOf(0))); + + seqGen.addObject(new ASN1ObjectIdentifier("1.1")); + + seqGen.close(); + + assertTrue("implicit tag writing test failed.", Arrays.equals(implTagSeqData, bOut.toByteArray())); + } + + public void testNestedExplicitTagDERWriting() + throws Exception + { + ByteArrayOutputStream bOut = new ByteArrayOutputStream(); + DERSequenceGenerator seqGen1 = new DERSequenceGenerator(bOut); + + seqGen1.addObject(new ASN1Integer(BigInteger.valueOf(0))); + + seqGen1.addObject(new ASN1ObjectIdentifier("1.1")); + + DERSequenceGenerator seqGen2 = new DERSequenceGenerator(seqGen1.getRawOutputStream(), 1, true); + + seqGen2.addObject(new ASN1Integer(BigInteger.valueOf(1))); + + seqGen2.close(); + + seqGen1.close(); + + assertTrue("nested explicit tagged DER writing test failed.", Arrays.equals(nestedSeqExpTagData, bOut.toByteArray())); + } + + public void testNestedImplicitTagDERWriting() + throws Exception + { + ByteArrayOutputStream bOut = new ByteArrayOutputStream(); + DERSequenceGenerator seqGen1 = new DERSequenceGenerator(bOut); + + seqGen1.addObject(new ASN1Integer(BigInteger.valueOf(0))); + + seqGen1.addObject(new ASN1ObjectIdentifier("1.1")); + + DERSequenceGenerator seqGen2 = new DERSequenceGenerator(seqGen1.getRawOutputStream(), 1, false); + + seqGen2.addObject(new ASN1Integer(BigInteger.valueOf(1))); + + seqGen2.close(); + + seqGen1.close(); + + assertTrue("nested implicit tagged DER writing test failed.", Arrays.equals(nestedSeqImpTagData, bOut.toByteArray())); + } + + public void testBERWriting() + throws Exception + { + ByteArrayOutputStream bOut = new ByteArrayOutputStream(); + BERSequenceGenerator seqGen = new BERSequenceGenerator(bOut); + + seqGen.addObject(new ASN1Integer(BigInteger.valueOf(0))); + + seqGen.addObject(new ASN1ObjectIdentifier("1.1")); + + seqGen.close(); + + assertTrue("basic BER writing test failed.", Arrays.equals(berSeqData, bOut.toByteArray())); + } + + public void testNestedBERDERWriting() + throws Exception + { + ByteArrayOutputStream bOut = new ByteArrayOutputStream(); + BERSequenceGenerator seqGen1 = new BERSequenceGenerator(bOut); + + seqGen1.addObject(new ASN1Integer(BigInteger.valueOf(0))); + + seqGen1.addObject(new ASN1ObjectIdentifier("1.1")); + + DERSequenceGenerator seqGen2 = new DERSequenceGenerator(seqGen1.getRawOutputStream()); + + seqGen2.addObject(new ASN1Integer(BigInteger.valueOf(1))); + + seqGen2.close(); + + seqGen1.close(); + + assertTrue("nested BER/DER writing test failed.", Arrays.equals(berDERNestedSeqData, bOut.toByteArray())); + } + + public void testNestedBERWriting() + throws Exception + { + ByteArrayOutputStream bOut = new ByteArrayOutputStream(); + BERSequenceGenerator seqGen1 = new BERSequenceGenerator(bOut); + + seqGen1.addObject(new ASN1Integer(BigInteger.valueOf(0))); + + seqGen1.addObject(new ASN1ObjectIdentifier("1.1")); + + BERSequenceGenerator seqGen2 = new BERSequenceGenerator(seqGen1.getRawOutputStream()); + + seqGen2.addObject(new ASN1Integer(BigInteger.valueOf(1))); + + seqGen2.close(); + + seqGen1.close(); + + assertTrue("nested BER writing test failed.", Arrays.equals(berNestedSeqData, bOut.toByteArray())); + } + + public void testDERReading() + throws Exception + { + ASN1StreamParser aIn = new ASN1StreamParser(seqData); + + ASN1SequenceParser seq = (ASN1SequenceParser)aIn.readObject(); + Object o; + int count = 0; + + assertNotNull("null sequence returned", seq); + + while ((o = seq.readObject()) != null) + { + switch (count) + { + case 0: + assertTrue(o instanceof ASN1Integer); + break; + case 1: + assertTrue(o instanceof ASN1ObjectIdentifier); + break; + } + count++; + } + + assertEquals("wrong number of objects in sequence", 2, count); + } + + private void testNestedReading( + byte[] data) + throws Exception + { + ASN1StreamParser aIn = new ASN1StreamParser(data); + + ASN1SequenceParser seq = (ASN1SequenceParser)aIn.readObject(); + Object o; + int count = 0; + + assertNotNull("null sequence returned", seq); + + while ((o = seq.readObject()) != null) + { + switch (count) + { + case 0: + assertTrue(o instanceof ASN1Integer); + break; + case 1: + assertTrue(o instanceof ASN1ObjectIdentifier); + break; + case 2: + assertTrue(o instanceof ASN1SequenceParser); + + ASN1SequenceParser s = (ASN1SequenceParser)o; + + // NB: Must exhaust the nested parser + while (s.readObject() != null) + { + // Nothing + } + + break; + } + count++; + } + + assertEquals("wrong number of objects in sequence", 3, count); + } + + public void testNestedDERReading() + throws Exception + { + testNestedReading(nestedSeqData); + } + + public void testBERReading() + throws Exception + { + ASN1StreamParser aIn = new ASN1StreamParser(berSeqData); + + ASN1SequenceParser seq = (ASN1SequenceParser)aIn.readObject(); + Object o; + int count = 0; + + assertNotNull("null sequence returned", seq); + + while ((o = seq.readObject()) != null) + { + switch (count) + { + case 0: + assertTrue(o instanceof ASN1Integer); + break; + case 1: + assertTrue(o instanceof ASN1ObjectIdentifier); + break; + } + count++; + } + + assertEquals("wrong number of objects in sequence", 2, count); + } + + public void testNestedBERDERReading() + throws Exception + { + testNestedReading(berDERNestedSeqData); + } + + public void testNestedBERReading() + throws Exception + { + testNestedReading(berNestedSeqData); + } + + public void testBERExplicitTaggedSequenceWriting() + throws Exception + { + ByteArrayOutputStream bOut = new ByteArrayOutputStream(); + BERSequenceGenerator seqGen = new BERSequenceGenerator(bOut, 1, true); + + seqGen.addObject(new ASN1Integer(BigInteger.valueOf(0))); + + seqGen.addObject(new ASN1ObjectIdentifier("1.1")); + + seqGen.close(); + + assertTrue("explicit BER tag writing test failed.", Arrays.equals(berExpTagSeqData, bOut.toByteArray())); + } + + public void testSequenceWithDERNullReading() + throws Exception + { + testParseWithNull(berSeqWithDERNullData); + } + + private void testParseWithNull(byte[] data) + throws IOException + { + ASN1StreamParser aIn = new ASN1StreamParser(data); + ASN1SequenceParser seq = (ASN1SequenceParser)aIn.readObject(); + Object o; + int count = 0; + + assertNotNull("null sequence returned", seq); + + while ((o = seq.readObject()) != null) + { + switch (count) + { + case 0: + assertTrue(o instanceof ASN1Null); + break; + case 1: + assertTrue(o instanceof ASN1Integer); + break; + case 2: + assertTrue(o instanceof ASN1ObjectIdentifier); + break; + } + count++; + } + + assertEquals("wrong number of objects in sequence", 3, count); + } + + public static Test suite() + { + return new TestSuite(ASN1SequenceParserTest.class); + } +} |