package org.bouncycastle.asn1.test;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import org.bouncycastle.asn1.ASN1InputStream;
import org.bouncycastle.asn1.ASN1ObjectIdentifier;
import org.bouncycastle.asn1.ASN1OutputStream;
import org.bouncycastle.asn1.DEROutputStream;
import org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers;
import org.bouncycastle.util.encoders.Hex;
import org.bouncycastle.util.test.SimpleTest;
public class OIDTest
extends SimpleTest
{
byte[] req1 = Hex.decode("0603813403");
byte[] req2 = Hex.decode("06082A36FFFFFFDD6311");
public String getName()
{
return "OID";
}
private void recodeCheck(
String oid,
byte[] enc)
throws IOException
{
ByteArrayInputStream bIn = new ByteArrayInputStream(enc);
ASN1InputStream aIn = new ASN1InputStream(bIn);
ASN1ObjectIdentifier o = new ASN1ObjectIdentifier(oid);
ASN1ObjectIdentifier encO = (ASN1ObjectIdentifier)aIn.readObject();
if (!o.equals(encO))
{
fail("oid ID didn't match", o, encO);
}
ByteArrayOutputStream bOut = new ByteArrayOutputStream();
DEROutputStream dOut = new DEROutputStream(bOut);
dOut.writeObject(o);
byte[] bytes = bOut.toByteArray();
if (bytes.length != enc.length)
{
fail("failed length test");
}
for (int i = 0; i != enc.length; i++)
{
if (bytes[i] != enc[i])
{
fail("failed comparison test", new String(Hex.encode(enc)), new String(Hex.encode(bytes)));
}
}
}
private void validOidCheck(
String oid)
throws IOException
{
ASN1ObjectIdentifier o = new ASN1ObjectIdentifier(oid);
ByteArrayOutputStream bOut = new ByteArrayOutputStream();
ASN1OutputStream aOut = new ASN1OutputStream(bOut);
aOut.writeObject(o);
ByteArrayInputStream bIn = new ByteArrayInputStream(bOut.toByteArray());
ASN1InputStream aIn = new ASN1InputStream(bIn);
o = (ASN1ObjectIdentifier)aIn.readObject();
if (!o.getId().equals(oid))
{
fail("failed oid check for " + oid);
}
}
private void invalidOidCheck(
String oid)
{
try
{
new ASN1ObjectIdentifier(oid);
fail("failed to catch bad oid: " + oid);
}
catch (IllegalArgumentException e)
{
}
}
private void branchCheck(String stem, String branch)
{
String expected = stem + "." + branch;
String actual = new ASN1ObjectIdentifier(stem).branch(branch).getId();
if (!expected.equals(actual))
{
fail("failed 'branch' check for " + stem + "/" + branch);
}
}
private void onCheck(String stem, String test, boolean expected)
{
if (expected != new ASN1ObjectIdentifier(test).on(new ASN1ObjectIdentifier(stem)))
{
fail("failed 'on' check for " + stem + "/" + test);
}
}
public void performTest()
throws IOException
{
recodeCheck("2.100.3", req1);
recodeCheck("1.2.54.34359733987.17", req2);
validOidCheck(PKCSObjectIdentifiers.pkcs_9_at_contentType.getId());
validOidCheck("0.1");
validOidCheck("1.1.127.32512.8323072.2130706432.545460846592.139637976727552.35747322042253312.9151314442816847872");
validOidCheck("1.2.123.12345678901.1.1.1");
validOidCheck("2.25.196556539987194312349856245628873852187.1");
invalidOidCheck("0");
invalidOidCheck("1");
invalidOidCheck("2");
invalidOidCheck("3.1");
invalidOidCheck("..1");
invalidOidCheck("192.168.1.1");
invalidOidCheck(".123452");
invalidOidCheck("1.");
invalidOidCheck("1.345.23.34..234");
invalidOidCheck("1.345.23.34.234.");
invalidOidCheck(".12.345.77.234");
invalidOidCheck(".12.345.77.234.");
invalidOidCheck("1.2.3.4.A.5");
invalidOidCheck("1,2");
branchCheck("1.1", "2.2");
onCheck("1.1", "1.1", false);
onCheck("1.1", "1.2", false);
onCheck("1.1", "1.2.1", false);
onCheck("1.1", "2.1", false);
onCheck("1.1", "1.11", false);
onCheck("1.12", "1.1.2", false);
onCheck("1.1", "1.1.1", true);
onCheck("1.1", "1.1.2", true);
}
public static void main(
String[] args)
{
runTest(new OIDTest());
}
}