tests.asn1.CertTokenTest.java Source code

Java tutorial

Introduction

Here is the source code for tests.asn1.CertTokenTest.java

Source

/*
 * $Id: CertTokenTest.java 268 2012-08-27 18:31:08Z ahto.truu $
 *
 *
 *
 * Copyright 2008-2011 GuardTime AS
 *
 * This file is part of the GuardTime client SDK.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package tests.asn1;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
import java.util.List;

import junit.framework.TestCase;

import org.bouncycastle.asn1.ASN1EncodableVector;
import org.bouncycastle.asn1.ASN1Encoding;
import org.bouncycastle.asn1.ASN1InputStream;
import org.bouncycastle.asn1.ASN1Integer;
import org.bouncycastle.asn1.DEROctetString;
import org.bouncycastle.asn1.DERSequence;
import org.bouncycastle.asn1.DERSet;

import com.guardtime.asn1.Asn1FormatException;
import com.guardtime.asn1.CertToken;
import com.guardtime.util.Base64;
import com.guardtime.util.Log;

/**
 * {@link CertToken} tests.
 */
public class CertTokenTest extends TestCase {
    private static final byte[] CERT_TOKEN = Base64.decode(
            "MIID7QIBAQSCA6gBAAGzeg/wKO9iSMTUBUFi5U3GIVeYjJGos6qe/NCd8xOeKP8BAAF+ustyUHmz8H5nq4WF28UAdI8+DpKE1zU9MDUsfvjlmf8BAAHZamFd99ymBE3rcpr/OPInzmC3goU91VYolzipH2H1mv8BAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8BAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8BAAGmqewLynEEWK7aVDg9g4Mc6gifeevc7Wy7KWpbAN0eVv8BAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8BAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8BAAFrfh7evHzHCTBQs3srR/w379ohduOp5nFxALAS+tFvtP8BAAEsvsilgA4cZZnEYs/OcRPsvG9cUYd1ULrCRZjrPy3Ypf8BAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8BAAHYlop2h0tw9+N58BxwmjOq4eh5XBu79O/LFOeO++Xhf/8BAAF2BMOiOOu/yTzK5WhotPXgSrJobX53iSoV8OH6qTXjo/8BAAEZ//TulQpkcVA/dPyYUW++kmT5EyrR5+oG4YToJte4gf8BAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8BAAEZ5f3N0bL1cfTc3rZ9CBkT4vfp6vqgQLOCP2gc2QRyvv8BAAF8h8h2M6iKFoWSofXcMpMakjHd9ISLODFZcc0s01i85/8BAAEpXiUuAjCp9OumJIrOU7VR7nWSTyVq/EjHkcPqENlfD/8BAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8BAAEbwklVouiqup+QSTLk6NR5QlLrFm3bYsLQmyLoLUlQPP8BAAGxdpDdDIhIx4KhN2s1nl+Zt7BpCDPgMjtWx/rN4p2Obf8BAAEWwtRfKz18xRT//2JDAxtMbCtQvgCZlEM6sYFZYgUVb/8BAAFnYsIWKfRmdhv8t7YUAH11BlrWK5/H83KkqwqfiMxf7f8BAAHIAXxHN6CCYHfJrdR22vg6/h9KFijaXsstplmirqHjaf8BAAEJkT97P28AQdiBdt6I7VF0YlR5P3uPQefCMWrpm4ZHDv8BAAG7RP02pfPN7ntcbfOmCYoJ41MzW2Ap8Ud1AliKfje+AP8wKQIES3SaAAQhAfJM7B2f4kS/iGDiSCOQe59GE58ITP+YDIDJsZFVdpnKMREEA2JhcgQDZm9vBAV4eXp6eQ==");
    private static final Integer VERSION = new Integer(1);
    private static final byte[] HISTORY = Base64.decode(
            "AQABs3oP8CjvYkjE1AVBYuVNxiFXmIyRqLOqnvzQnfMTnij/AQABfrrLclB5s/B+Z6uFhdvFAHSPPg6ShNc1PTA1LH745Zn/AQAB2WphXffcpgRN63Ka/zjyJ85gt4KFPdVWKJc4qR9h9Zr/AQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AQABpqnsC8pxBFiu2lQ4PYODHOoIn3nr3O1suylqWwDdHlb/AQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AQABa34e3rx8xwkwULN7K0f8N+/aIXbjqeZxcQCwEvrRb7T/AQABLL7IpYAOHGWZxGLPznET7LxvXFGHdVC6wkWY6z8t2KX/AQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AQAB2JaKdodLcPfjefAccJozquHoeVwbu/TvyxTnjvvl4X//AQABdgTDojjrv8k8yuVoaLT14EqyaG1+d4kqFfDh+qk146P/AQABGf/07pUKZHFQP3T8mFFvvpJk+RMq0efqBuGE6CbXuIH/AQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AQABGeX9zdGy9XH03N62fQgZE+L36er6oECzgj9oHNkEcr7/AQABfIfIdjOoihaFkqH13DKTGpIx3fSEizgxWXHNLNNYvOf/AQABKV4lLgIwqfTrpiSKzlO1Ue51kk8lavxIx5HD6hDZXw//AQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AQABG8JJVaLoqrqfkEky5OjUeUJS6xZt22LC0Jsi6C1JUDz/AQABsXaQ3QyISMeCoTdrNZ5fmbewaQgz4DI7Vsf6zeKdjm3/AQABFsLUXys9fMUU//9iQwMbTGwrUL4AmZRDOrGBWWIFFW//AQABZ2LCFin0ZnYb/Le2FAB9dQZa1iufx/NypKsKn4jMX+3/AQAByAF8RzeggmB3ya3Udtr4Ov4fShYo2l7LLaZZoq6h42n/AQABCZE/ez9vAEHYgXbeiO1RdGJUeT97j0HnwjFq6ZuGRw7/AQABu0T9NqXzze57XG3zpgmKCeNTM1tgKfFHdQJYin43vgD/");
    private static final byte[] PUBLISHED_DATA = Base64
            .decode("MCkCBEt0mgAEIQHyTOwdn+JEv4hg4kgjkHufRhOfCEz/mAyAybGRVXaZyg==");
    private static final byte[][] PUB_REFERENCES = { "bar".getBytes(), "foo".getBytes(), "xyzzy".getBytes() }; // Strings here should be sorted alphabetically!

    /**
     * Tests {@link CertToken#getInstance(InputStream)} method.
     */
    public void testInit() throws Asn1FormatException, IOException {
        // Make sure illegal arguments are handled correctly
        try {
            CertToken.getInstance(null);
            fail("null accepted as cert token bytes");
        } catch (IllegalArgumentException e) {
            Log.debug("[DBG] (OK) " + e.getMessage());
        }

        try {
            InputStream in = new ByteArrayInputStream(CERT_TOKEN);
            in.skip(1);
            CertToken.getInstance(in);
            fail("rubbish accepted as cert token bytes");
        } catch (Asn1FormatException e) {
            Log.debug("[DBG] (OK) " + e.getMessage());
        }

        // Build signature info from pre-defined bytes
        InputStream in = new ByteArrayInputStream(CERT_TOKEN);
        CertToken.getInstance(in);

        // Build signature info using valid components
        in = getDerStream(VERSION, HISTORY, PUBLISHED_DATA, PUB_REFERENCES);
        CertToken.getInstance(in);
    }

    /**
     * Tests {@link CertToken#getInstance(InputStream)} method with various
     * version numbers.
     */
    public void testInitVersion() throws IOException {
        // Make sure invalid version numbers are NOT accepted
        Integer[] invalidVersions = { null, Integer.valueOf("0"), Integer.valueOf("2") };
        for (int i = 0; i < invalidVersions.length; i++) {
            try {
                InputStream in = getDerStream(invalidVersions[i], HISTORY, PUBLISHED_DATA, PUB_REFERENCES);
                CertToken.getInstance(in);
                fail(invalidVersions[i] + " accepted as version");
            } catch (Asn1FormatException e) {
                Log.debug("[DBG] (OK) " + e.getMessage());
            }
        }
    }

    /**
     * Tests {@link CertToken#getInstance(InputStream)} method with various
     * history values.
     */
    public void testInitHistory() throws IOException {
        // Make sure empty history is NOT accepted
        try {
            InputStream in = getDerStream(VERSION, null, PUBLISHED_DATA, PUB_REFERENCES);
            CertToken.getInstance(in);
            fail("null accepted as history value");
        } catch (Asn1FormatException e) {
            Log.debug("[DBG] (OK) " + e.getMessage());
        }
    }

    /**
     * Tests {@link CertToken#getInstance(InputStream)} method with various
     * published data values.
     */
    public void testInitPublishedData() throws IOException {
        // Make sure empty published data is NOT accepted
        try {
            InputStream in = getDerStream(VERSION, HISTORY, null, PUB_REFERENCES);
            CertToken.getInstance(in);
            fail("null accepted as published data");
        } catch (Asn1FormatException e) {
            Log.debug("[DBG] (OK) " + e.getMessage());
        }
    }

    /**
     * Tests {@link CertToken#getInstance(InputStream)} method with various
     * publication references.
     */
    public void testInitPubReferences() throws IOException {
        // Make sure empty publication references are NOT accepted
        try {
            InputStream in = getDerStream(VERSION, HISTORY, PUBLISHED_DATA, null);
            CertToken.getInstance(in);
            fail("null accepted as publication references");
        } catch (Asn1FormatException e) {
            Log.debug("[DBG] (OK) " + e.getMessage());
        }
    }

    /**
     * Tests {@link CertToken#getDerEncoded()} method.
     */
    public void testGetDerEncoded() throws Asn1FormatException, IOException {
        InputStream in = new ByteArrayInputStream(CERT_TOKEN);
        CertToken certToken = CertToken.getInstance(in);
        assertTrue(Arrays.equals(CERT_TOKEN, certToken.getDerEncoded()));
    }

    /**
     * Tests property getters.
     */
    public void testGetParams() throws Asn1FormatException, IOException {
        InputStream in = new ByteArrayInputStream(CERT_TOKEN);
        CertToken certToken = CertToken.getInstance(in);

        assertEquals(VERSION.intValue(), certToken.getVersion());
        assertTrue(Arrays.equals(HISTORY, certToken.getHistory()));
        assertTrue(Arrays.equals(PUBLISHED_DATA, certToken.getPublishedData().getDerEncoded()));

        List list = certToken.getPubReferences();
        assertEquals(PUB_REFERENCES.length, list.size());
        for (int i = 0; i < PUB_REFERENCES.length; i++) {
            assertTrue(Arrays.equals(PUB_REFERENCES[i], (byte[]) list.get(i)));
        }

        assertNull(certToken.getEncodedExtensions());
    }

    /**
     * Tests if return values are immutable.
     */
    public void testIsImmutable() throws Asn1FormatException, IOException {
        InputStream in = getDerStream(VERSION, HISTORY, PUBLISHED_DATA, PUB_REFERENCES);
        CertToken certToken = CertToken.getInstance(in);

        assertFalse(certToken.getDerEncoded() == certToken.getDerEncoded());

        assertFalse(certToken.getHistory() == certToken.getHistory());

        try {
            certToken.getPubReferences().clear();
            fail("Modifiable list returned as publication references");
        } catch (UnsupportedOperationException e) {
            Log.debug("[DBG] (OK) " + e.getMessage());
        }

        // TODO: check disabled as GuardTime is not currently using this field.
        //try {
        //   certToken.getExtensions().clear();
        //   fail("Modifiable extension list returned");
        //} catch (UnsupportedOperationException e) {
        //   Log.debug("[DBG] (OK) " + e.getMessage());
        //}
    }

    /**
     * Produces input stream containing ASN.1 representation of signature info.
     */
    private InputStream getDerStream(Integer version, byte[] history, byte[] publishedData, byte[][] pubReferences)
            throws IOException {
        ASN1EncodableVector v = new ASN1EncodableVector();

        if (version != null) {
            v.add(new ASN1Integer(version.intValue()));
        }

        if (history != null) {
            v.add(new DEROctetString(history));
        }

        if (publishedData != null) {
            v.add(new ASN1InputStream(publishedData).readObject());
        }

        if (pubReferences != null) {
            DEROctetString[] derRefs = new DEROctetString[pubReferences.length];
            for (int i = 0; i < pubReferences.length; i++) {
                derRefs[i] = new DEROctetString(pubReferences[i]);
            }
            v.add(new DERSet(derRefs));
        }

        // Extensions skipped -- see CertToken code for comments

        byte[] der = new DERSequence(v).getEncoded(ASN1Encoding.DER);

        return new ByteArrayInputStream(der);
    }
}