blob: dba3560b5bc56edb6fbe9868937df9d593cdbde5 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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
*
* https://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 org.apache.directory.api.asn1.util;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.fail;
import java.util.Arrays;
import org.apache.directory.api.asn1.DecoderException;
import org.junit.jupiter.api.Test;
/**
* A test class for the Oid class
*
* @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
*/
public class OidTest
{
@Test
public void fromBytes() throws DecoderException
{
// first byte
for ( int i = 0; i < 2; i++ )
{ // [0..2]
for ( int j = 0; j < 40; j++ )
{ // [0..39]
assertEquals( i + "." + j,
Oid.fromBytes( new byte[]
{ ( byte ) ( i * 40 + j ) } )
.toString() );
}
}
assertEquals( "1.2.840.113554.1.2.2",
Oid.fromBytes( new byte[]
{
0x2A, ( byte ) 0x86, 0x48, ( byte ) 0x86, ( byte ) 0xF7, 0x12, 0x01, 0x02, 0x02
} ).toString() );
assertEquals( "2.123456",
Oid.fromBytes( new byte[]
{ ( byte ) 0x87, ( byte ) 0xC5, 0x10 } ).toString() );
}
@Test
public void fromBytesLongValues() throws DecoderException
{
// 2.0 -> expected 0x02
assertEquals( "2.0", Oid.fromBytes( new byte[] { 0x50 } ).toString() );
// 2.40 -> expected 0x78
assertEquals( "2.40", Oid.fromBytes( new byte[] { 0x78 } ).toString() );
// 2.48 -> expected 0x81 0x00
assertEquals( "2.48", Oid.fromBytes( new byte[] { (byte)0x81, 0x00 } ).toString() );
// The second arc is below and equal to 16304 : 0x4000 - 0x50
assertEquals( "2.16303", Oid.fromBytes( new byte[] { (byte)0xFF, 0x7F } ).toString() );
assertEquals( "2.16304", Oid.fromBytes( new byte[] { (byte)0x81, (byte)0x80, 0x00 } ).toString() );
// The second arc is below and equal to 2097072 : 0x200000 - 0x50
assertEquals( "2.2097071", Oid.fromBytes( new byte[] { (byte)0xFF, (byte)0xFF, 0x7F } ).toString() );
assertEquals( "2.2097072", Oid.fromBytes( new byte[] { (byte)0x81, (byte)0x80, (byte)0x80, 0x00 } ).toString() );
// The second arc is below and equal to 268435376 : 0x10000000 - 0x50
assertEquals( "2.268435375", Oid.fromBytes( new byte[] { (byte)0xFF, (byte)0xFF, (byte)0xFF, 0x7F } ).toString() );
assertEquals( "2.268435376",
Oid.fromBytes( new byte[]
{
(byte)0x81, (byte)0x80, (byte)0x80, (byte)0x80,
0x00
} ).toString() );
// The second arc is below and equal to 34359738288 : 0x800000000 - 0x50
Oid oid = Oid.fromBytes( new byte[]
{
(byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, 0x7F
} );
assertEquals( "2.34359738287", oid.toString() );
Oid oid1 = Oid.fromString( oid.toString() );
assertEquals( oid, oid1 );
oid = Oid.fromBytes( new byte[]
{
(byte)0x81, (byte)0x80, (byte)0x80, (byte)0x80,
(byte)0x80, 0x00
} );
assertEquals( "2.34359738288", oid.toString() );
oid1 = Oid.fromString( oid.toString() );
assertEquals( oid, oid1 );
// The second arc is below and equal to 4398046511024 : 0x40000000000 - 0x50
oid = Oid.fromBytes( new byte[]
{
(byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF,
(byte)0xFF, 0x7F
} );
assertEquals( "2.4398046511023", oid.toString() );
oid1 = Oid.fromString( oid.toString() );
assertEquals( oid, oid1 );
oid = Oid.fromBytes( new byte[]
{
(byte)0x81, (byte)0x80, (byte)0x80, (byte)0x80,
(byte)0x80, (byte)0x80, 0x00
} );
assertEquals( "2.4398046511024", oid.toString() );
oid1 = Oid.fromString( oid.toString() );
assertEquals( oid, oid1 );
// The second arc is below and equal to 562949953421232 : 0x2000000000000 - 0x50
oid = Oid.fromBytes( new byte[]
{
(byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF,
(byte)0xFF, (byte)0xFF, 0x7F
} );
assertEquals( "2.562949953421231", oid.toString() );
oid1 = Oid.fromString( oid.toString() );
assertEquals( oid, oid1 );
oid = Oid.fromBytes( new byte[]
{
(byte)0x81, (byte)0x80, (byte)0x80, (byte)0x80,
(byte)0x80, (byte)0x80, (byte)0x80, 0x00
} );
assertEquals( "2.562949953421232", oid.toString() );
oid1 = Oid.fromString( oid.toString() );
assertEquals( oid, oid1 );
// The second arc is below and equal to 72057594037927856 : 0x100000000000000 - 0x50
oid = Oid.fromBytes( new byte[]
{
(byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF,
(byte)0xFF, (byte)0xFF, (byte)0xFF, 0x7F
} );
assertEquals( "2.72057594037927855", oid.toString() );
oid1 = Oid.fromString( oid.toString() );
assertEquals( oid, oid1 );
oid = Oid.fromBytes( new byte[]
{
(byte)0x81, (byte)0x80, (byte)0x80, (byte)0x80,
(byte)0x80, (byte)0x80, (byte)0x80, (byte)0x80,
0x00
} );
assertEquals( "2.72057594037927856", oid.toString() );
oid1 = Oid.fromString( oid.toString() );
assertEquals( oid, oid1 );
// The second arc is below and equal to 9223372036854775728 : 0x8000000000000000 - 0x50
oid = Oid.fromBytes( new byte[]
{
(byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF,
(byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF,
0x7F
} );
assertEquals( "2.9223372036854775727", oid.toString() );
oid1 = Oid.fromString( oid.toString() );
assertEquals( oid, oid1 );
oid = Oid.fromBytes( new byte[]
{
(byte)0x81, (byte)0x80, (byte)0x80, (byte)0x80,
(byte)0x80, (byte)0x80, (byte)0x80, (byte)0x80,
(byte)0x80, 0x00
} );
assertEquals( "2.9223372036854775728", oid.toString() );
oid1 = Oid.fromString( oid.toString() );
assertEquals( oid, oid1 );
// Check for 9999999999999999999 which is higher than Long.MAX_VALUE
oid = Oid.fromBytes( new byte[]
{
(byte)0x81, (byte)0x8A, (byte)0xE3, (byte)0xC8,
(byte)0xE0, (byte)0xC8, (byte)0xCF, (byte)0xA0,
(byte)0x80, 0x4F
} );
assertEquals( "2.9999999999999999999", oid.toString() ) ;
oid1 = Oid.fromString( oid.toString() );
assertEquals( oid, oid1 );
// A bigger one
oid = Oid.fromBytes( new byte[]
{
(byte)0xFA, (byte)0xBE, (byte)0xB7, (byte)0xA2,
(byte)0x8E, (byte)0xF4, (byte)0xC0, (byte)0xC7,
(byte)0xCB, (byte)0x9F, (byte)0xA0, (byte)0xC5,
(byte)0xEA, (byte)0xDA, (byte)0x92, (byte)0x9D,
(byte)0x9E, 0x0C
} );
assertEquals( "2.81407072025111374527560065493494091452", oid.toString() );
oid1 = Oid.fromString( oid.toString() );
assertEquals( oid, oid1 );
}
@Test
public void test2dot123456() throws DecoderException
{
String expectedString = "2.123456";
byte[] expectedBytes = new byte[]
{ ( byte ) 0x87, ( byte ) 0xC5, 0x10 };
assertTrue( Arrays.equals( expectedBytes, Oid.fromBytes( expectedBytes ).toBytes() ) );
assertTrue( Arrays.equals( expectedBytes, Oid.fromString( expectedString ).toBytes() ) );
assertEquals( expectedString, Oid.fromBytes( expectedBytes ).toString() );
assertEquals( expectedString, Oid.fromString( expectedString ).toString() );
}
/** Hex chars */
private static final byte[] HEX_CHAR = new byte[]
{ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
/**
* Helper function that dump an array of bytes in hex form
*
* @param buffer The bytes array to dump
* @return A string representation of the array of bytes
*/
public static String dumpBytes( byte[] buffer )
{
if ( buffer == null )
{
return "";
}
StringBuffer sb = new StringBuffer();
for ( int i = 0; i < buffer.length; i++ )
{
sb.append( "0x" ).append( ( char ) ( HEX_CHAR[( buffer[i] & 0x00F0 ) >> 4] ) ).append(
( char ) ( HEX_CHAR[buffer[i] & 0x000F] ) ).append( " " );
}
return sb.toString();
}
@Test
public void fromString() throws DecoderException
{
// first byte
for ( int i = 0; i < 2; i++ )
{ // [0..2]
for ( int j = 0; j < 40; j++ )
{ // [0..39]
String oidStr = i + "." + j;
byte[] expected = new byte[]{ ( byte ) ( i * 40 + j ) };
byte[] oidBytes = Oid.fromString( oidStr ).toBytes();
assertTrue( Arrays.equals( expected, oidBytes ) );
}
}
assertTrue( Arrays.equals(
new byte[]
{ 0x2A, ( byte ) 0x86, 0x48, ( byte ) 0x86, ( byte ) 0xF7, 0x12, 0x01, 0x02, 0x02 },
Oid.fromString( "1.2.840.113554.1.2.2" ).toBytes() ) );
}
/**
* Test a null NewOid
*/
@Test
public void testNewOidNull()
{
try
{
Oid.fromBytes( ( byte[] ) null );
fail( "Should not reach this point ..." );
}
catch ( DecoderException de )
{
assertTrue( true );
}
}
/**
* Test an empty NewOid
*/
@Test
public void testNewOidEmpty()
{
try
{
Oid.fromBytes( new byte[]
{} );
fail( "Should not reach this point ..." );
}
catch ( DecoderException de )
{
assertTrue( true );
}
}
/**
* Test itu-t NewOid tree
*/
@Test
public void testNewOidItuT()
{
try
{
Oid oid = null;
// itu-t(0), recommendation(0), series a-z (0..26)
for ( int i = 1; i < 27; i++ )
{
oid = Oid.fromBytes( new byte[]
{ 0x00, ( byte ) i } );
assertEquals( "0.0." + i, oid.toString() );
}
// itu-t(0), question(1)
oid = Oid.fromBytes( new byte[]
{ 0x01 } );
assertEquals( "0.1", oid.toString() );
// itu-t(0), administration(2), country(202 .. 748)
for ( int i = 202; i < 748; i++ )
{
oid = Oid.fromBytes( new byte[]
{ 0x02, ( byte ) ( ( i / 128 ) | 0x0080 ), ( byte ) ( i % 128 ) } );
assertEquals( "0.2." + i, oid.toString() );
}
// itu-t(0), network-operator(3), operator(2023 .. 41363)
for ( int i = 2023; i < 41363; i++ )
{
if ( i < ( 128 * 128 ) )
{
oid = Oid.fromBytes( new byte[]
{ 0x03, ( byte ) ( ( i / 128 ) | 0x0080 ), ( byte ) ( i % 128 ) } );
assertEquals( "0.3." + i, oid.toString() );
}
else
{
oid = Oid.fromBytes( new byte[]
{ 0x03, ( byte ) ( ( i / ( 128 * 128 ) ) | 0x0080 ),
( byte ) ( ( ( i / 128 ) % 128 ) | 0x0080 ), ( byte ) ( i % 128 ) } );
assertEquals( "0.3." + i, oid.toString() );
}
}
}
catch ( DecoderException de )
{
fail();
}
}
/**
* Test iso NewOid tree
*/
@Test
public void testNewOidIso()
{
Oid oid = null;
try
{
// iso(1), standard(0)
oid = Oid.fromBytes( new byte[]
{ 40 + 0 } );
assertEquals( "1.0", oid.toString() );
// iso(1), registration-authority(1)
oid = Oid.fromBytes( new byte[]
{ 40 + 1 } );
assertEquals( "1.1", oid.toString() );
// iso(1), member-body(2)
oid = Oid.fromBytes( new byte[]
{ 40 + 2 } );
assertEquals( "1.2", oid.toString() );
// iso(1), identified-organization(3) | org(3) | organization(3)
oid = Oid.fromBytes( new byte[]
{ 40 + 3 } );
assertEquals( "1.3", oid.toString() );
}
catch ( DecoderException de )
{
fail();
}
}
/**
* Test joint-iso-itu-t NewOid tree
*/
@Test
public void testNewOidJointIsoItuT()
{
Oid oid = null;
try
{
// joint-iso-itu-t(2), presentation(0)
oid = Oid.fromBytes( new byte[]
{ 80 + 0 } );
assertEquals( "2.0", oid.toString() );
// joint-iso-itu-t(2), asn1(1)
oid = Oid.fromBytes( new byte[]
{ 80 + 1 } );
assertEquals( "2.1", oid.toString() );
// joint-iso-itu-t(2), association-control(2)
oid = Oid.fromBytes( new byte[]
{ 80 + 2 } );
assertEquals( "2.2", oid.toString() );
// joint-iso-itu-t(2), reliable-transfer(3)
oid = Oid.fromBytes( new byte[]
{ 80 + 3 } );
assertEquals( "2.3", oid.toString() );
// ...
// joint-iso-itu-t(2), upu(40)
oid = Oid.fromBytes( new byte[]
{ 80 + 40 } );
assertEquals( "2.40", oid.toString() );
// ...
// joint-iso-itu-t(2), xxx(100)
oid = Oid.fromBytes( new byte[]
{ ( byte ) ( 0x81 ), 0x34 } );
assertEquals( "2.100", oid.toString() );
}
catch ( DecoderException de )
{
fail();
}
}
/**
* Test valid String NewOids
*/
@Test
public void testNewOidStringGood()
{
Oid oid = null;
try
{
oid = Oid.fromString( "0.0" );
assertEquals( "0.0", oid.toString() );
oid = Oid.fromString( "0.0.0.0.0" );
assertEquals( "0.0.0.0.0", oid.toString() );
oid = Oid.fromString( "0.1.2.3.4" );
assertEquals( "0.1.2.3.4", oid.toString() );
oid = Oid.fromString( "2.123456" );
assertEquals( "2.123456", oid.toString() );
oid = Oid.fromString( "1.2.840.113554.1.2.2" );
assertEquals( "1.2.840.113554.1.2.2", oid.toString() );
}
catch ( DecoderException de )
{
fail();
}
}
/**
* Test invalid String NewOids
*/
@Test
public void testNewOidStringBad()
{
assertFalse( Oid.isOid( "0" ) );
assertFalse( Oid.isOid( "1" ) );
assertFalse( Oid.isOid( "0." ) );
assertFalse( Oid.isOid( "1." ) );
assertFalse( Oid.isOid( "2." ) );
assertFalse( Oid.isOid( "2." ) );
assertFalse( Oid.isOid( "." ) );
assertFalse( Oid.isOid( "0.1.2." ) );
assertFalse( Oid.isOid( "3.1" ) );
assertFalse( Oid.isOid( "0..1" ) );
assertFalse( Oid.isOid( "0..12" ) );
assertFalse( Oid.isOid( "0.a.2" ) );
assertFalse( Oid.isOid( "0.40" ) );
assertFalse( Oid.isOid( "0.51" ) );
assertFalse( Oid.isOid( "0.01" ) );
assertFalse( Oid.isOid( "0.123456" ) );
assertFalse( Oid.isOid( "1.123456" ) );
}
/**
* Test Spnego NewOid
*/
@Test
public void testNewOidSpnego()
{
Oid oid = null;
try
{
oid = Oid.fromBytes( new byte[]
{ 0x2b, 0x06, 0x01, 0x05, 0x05, 0x02 } );
assertEquals( "1.3.6.1.5.5.2", oid.toString() );
}
catch ( DecoderException de )
{
fail();
}
}
/**
* Test an OID with a node which does not fit in a long
* @throws DecoderException
*/
@Test
public void testOidLongValue() throws DecoderException
{
// 2.0 -> expected 0x02
Oid oid = Oid.fromString( "2.0" );
byte[] oidBytes = oid.toBytes();
assertEquals( 1, oidBytes.length );
assertEquals( 80, oidBytes[0] );
Oid oid1 = Oid.fromBytes( oidBytes );
assertEquals( oid, oid1 );
// 2.40 -> expected 0x78
oid = Oid.fromString( "2.40" );
oidBytes = oid.toBytes();
assertEquals( 1, oidBytes.length );
assertEquals( 0x78, oidBytes[0] );
oid1 = Oid.fromBytes( oidBytes );
assertEquals( oid, oid1 );
// 2.48 -> expected 0x80
oid = Oid.fromString( "2.48" );
oidBytes = oid.toBytes();
assertEquals( 2, oidBytes.length );
assertEquals( (byte)0x81, oidBytes[0] );
assertEquals( 0x00, oidBytes[1] );
oid1 = Oid.fromBytes( oidBytes );
assertEquals( oid, oid1 );
// The second arc is below and equal to 16304 : 0x4000 - 0x50
oid = Oid.fromString( "2.16303" );
oidBytes = oid.toBytes();
assertEquals( 2, oidBytes.length );
assertEquals( (byte)0xFF, oidBytes[0] );
assertEquals( 0x7F, oidBytes[1] );
oid1 = Oid.fromBytes( oidBytes );
assertEquals( oid, oid1 );
oid = Oid.fromString( "2.16304" );
oidBytes = oid.toBytes();
assertEquals( 3, oidBytes.length );
assertEquals( (byte)0x81, oidBytes[0] );
assertEquals( (byte)0x80, oidBytes[1] );
assertEquals( 0x00, oidBytes[2] );
oid1 = Oid.fromBytes( oidBytes );
assertEquals( oid, oid1 );
// The second arc is below and equal to 2097072 : 0x200000 - 0x50
oid = Oid.fromString( "2.2097071" );
oidBytes = oid.toBytes();
assertEquals( 3, oidBytes.length );
assertEquals( (byte)0xFF, oidBytes[0] );
assertEquals( (byte)0xFF, oidBytes[1] );
assertEquals( 0x7F, oidBytes[2] );
oid1 = Oid.fromBytes( oidBytes );
assertEquals( oid, oid1 );
oid = Oid.fromString( "2.2097072" );
oidBytes = oid.toBytes();
assertEquals( 4, oidBytes.length );
assertEquals( (byte)0x81, oidBytes[0] );
assertEquals( (byte)0x80, oidBytes[1] );
assertEquals( (byte)0x80, oidBytes[2] );
assertEquals( 0x00, oidBytes[3] );
oid1 = Oid.fromBytes( oidBytes );
assertEquals( oid, oid1 );
// The second arc is below and equal to 268435376 : 0x10000000 - 0x50
oid = Oid.fromString( "2.268435375" );
oidBytes = oid.toBytes();
assertEquals( 4, oidBytes.length );
assertEquals( (byte)0xFF, oidBytes[0] );
assertEquals( (byte)0xFF, oidBytes[1] );
assertEquals( (byte)0xFF, oidBytes[2] );
assertEquals( 0x7F, oidBytes[3] );
oid1 = Oid.fromBytes( oidBytes );
assertEquals( oid, oid1 );
oid = Oid.fromString( "2.268435376" );
oidBytes = oid.toBytes();
assertEquals( 5, oidBytes.length );
assertEquals( (byte)0x81, oidBytes[0] );
assertEquals( (byte)0x80, oidBytes[1] );
assertEquals( (byte)0x80, oidBytes[2] );
assertEquals( (byte)0x80, oidBytes[3] );
assertEquals( 0x00, oidBytes[4] );
oid1 = Oid.fromBytes( oidBytes );
assertEquals( oid, oid1 );
// The second arc is below and equal to 34359738288 : 0x800000000 - 0x50
oid = Oid.fromString( "2.34359738287" );
oidBytes = oid.toBytes();
assertEquals( 5, oidBytes.length );
assertEquals( (byte)0xFF, oidBytes[0] );
assertEquals( (byte)0xFF, oidBytes[1] );
assertEquals( (byte)0xFF, oidBytes[2] );
assertEquals( (byte)0xFF, oidBytes[3] );
assertEquals( 0x7F, oidBytes[4] );
oid1 = Oid.fromBytes( oidBytes );
assertEquals( oid, oid1 );
oid = Oid.fromString( "2.34359738288" );
oidBytes = oid.toBytes();
assertEquals( 6, oidBytes.length );
assertEquals( (byte)0x81, oidBytes[0] );
assertEquals( (byte)0x80, oidBytes[1] );
assertEquals( (byte)0x80, oidBytes[2] );
assertEquals( (byte)0x80, oidBytes[3] );
assertEquals( (byte)0x80, oidBytes[4] );
assertEquals( 0x00, oidBytes[5] );
oid1 = Oid.fromBytes( oidBytes );
assertEquals( oid, oid1 );
// The second arc is below and equal to 4398046511024 : 0x40000000000 - 0x50
oid = Oid.fromString( "2.4398046511023" );
oidBytes = oid.toBytes();
assertEquals( 6, oidBytes.length );
assertEquals( (byte)0xFF, oidBytes[0] );
assertEquals( (byte)0xFF, oidBytes[1] );
assertEquals( (byte)0xFF, oidBytes[2] );
assertEquals( (byte)0xFF, oidBytes[3] );
assertEquals( (byte)0xFF, oidBytes[4] );
assertEquals( 0x7F, oidBytes[5] );
oid1 = Oid.fromBytes( oidBytes );
assertEquals( oid, oid1 );
oid = Oid.fromString( "2.4398046511024" );
oidBytes = oid.toBytes();
assertEquals( 7, oidBytes.length );
assertEquals( (byte)0x81, oidBytes[0] );
assertEquals( (byte)0x80, oidBytes[1] );
assertEquals( (byte)0x80, oidBytes[2] );
assertEquals( (byte)0x80, oidBytes[3] );
assertEquals( (byte)0x80, oidBytes[4] );
assertEquals( (byte)0x80, oidBytes[5] );
assertEquals( 0x00, oidBytes[6] );
oid1 = Oid.fromBytes( oidBytes );
assertEquals( oid, oid1 );
// The second arc is below and equal to 562949953421232 : 0x2000000000000 - 0x50
oid = Oid.fromString( "2.562949953421231" );
oidBytes = oid.toBytes();
assertEquals( 7, oidBytes.length );
assertEquals( (byte)0xFF, oidBytes[0] );
assertEquals( (byte)0xFF, oidBytes[1] );
assertEquals( (byte)0xFF, oidBytes[2] );
assertEquals( (byte)0xFF, oidBytes[3] );
assertEquals( (byte)0xFF, oidBytes[4] );
assertEquals( (byte)0xFF, oidBytes[5] );
assertEquals( 0x7F, oidBytes[6] );
oid1 = Oid.fromBytes( oidBytes );
assertEquals( oid, oid1 );
oid = Oid.fromString( "2.562949953421232" );
oidBytes = oid.toBytes();
assertEquals( 8, oidBytes.length );
assertEquals( (byte)0x81, oidBytes[0] );
assertEquals( (byte)0x80, oidBytes[1] );
assertEquals( (byte)0x80, oidBytes[2] );
assertEquals( (byte)0x80, oidBytes[3] );
assertEquals( (byte)0x80, oidBytes[4] );
assertEquals( (byte)0x80, oidBytes[5] );
assertEquals( (byte)0x80, oidBytes[6] );
assertEquals( 0x00, oidBytes[7] );
oid1 = Oid.fromBytes( oidBytes );
assertEquals( oid, oid1 );
// The second arc is below and equal to 72057594037927856 : 0x100000000000000 - 0x50
oid = Oid.fromString( "2.72057594037927855" );
oidBytes = oid.toBytes();
assertEquals( 8, oidBytes.length );
assertEquals( (byte)0xFF, oidBytes[0] );
assertEquals( (byte)0xFF, oidBytes[1] );
assertEquals( (byte)0xFF, oidBytes[2] );
assertEquals( (byte)0xFF, oidBytes[3] );
assertEquals( (byte)0xFF, oidBytes[4] );
assertEquals( (byte)0xFF, oidBytes[5] );
assertEquals( (byte)0xFF, oidBytes[6] );
assertEquals( 0x7F, oidBytes[7] );
oid1 = Oid.fromBytes( oidBytes );
assertEquals( oid, oid1 );
oid = Oid.fromString( "2.72057594037927856" );
oidBytes = oid.toBytes();
assertEquals( 9, oidBytes.length );
assertEquals( (byte)0x81, oidBytes[0] );
assertEquals( (byte)0x80, oidBytes[1] );
assertEquals( (byte)0x80, oidBytes[2] );
assertEquals( (byte)0x80, oidBytes[3] );
assertEquals( (byte)0x80, oidBytes[4] );
assertEquals( (byte)0x80, oidBytes[5] );
assertEquals( (byte)0x80, oidBytes[6] );
assertEquals( (byte)0x80, oidBytes[7] );
assertEquals( 0x00, oidBytes[8] );
oid1 = Oid.fromBytes( oidBytes );
assertEquals( oid, oid1 );
// The second arc is below and equal to 9223372036854775728 : 0x8000000000000000 - 0x50
oid = Oid.fromString( "2.9223372036854775727" );
oidBytes = oid.toBytes();
assertEquals( 9, oidBytes.length );
assertEquals( (byte)0xFF, oidBytes[0] );
assertEquals( (byte)0xFF, oidBytes[1] );
assertEquals( (byte)0xFF, oidBytes[2] );
assertEquals( (byte)0xFF, oidBytes[3] );
assertEquals( (byte)0xFF, oidBytes[4] );
assertEquals( (byte)0xFF, oidBytes[5] );
assertEquals( (byte)0xFF, oidBytes[6] );
assertEquals( (byte)0xFF, oidBytes[6] );
assertEquals( (byte)0xFF, oidBytes[7] );
assertEquals( 0x7F, oidBytes[8] );
oid1 = Oid.fromBytes( oidBytes );
assertEquals( oid, oid1 );
oid = Oid.fromString( "2.9223372036854775728" );
oidBytes = oid.toBytes();
assertEquals( 10, oidBytes.length );
assertEquals( (byte)0x81, oidBytes[0] );
assertEquals( (byte)0x80, oidBytes[1] );
assertEquals( (byte)0x80, oidBytes[2] );
assertEquals( (byte)0x80, oidBytes[3] );
assertEquals( (byte)0x80, oidBytes[4] );
assertEquals( (byte)0x80, oidBytes[5] );
assertEquals( (byte)0x80, oidBytes[6] );
assertEquals( (byte)0x80, oidBytes[7] );
assertEquals( (byte)0x80, oidBytes[8] );
assertEquals( 0x00, oidBytes[9] );
oid1 = Oid.fromBytes( oidBytes );
assertEquals( oid, oid1 );
// Check for 9999999999999999999 which is higher than Long.MAX_VALUE
oid = Oid.fromString( "2.9999999999999999999" );
oidBytes = oid.toBytes();
assertEquals( 10, oidBytes.length );
assertEquals( (byte)0x81, oidBytes[0] );
assertEquals( (byte)0x8A, oidBytes[1] );
assertEquals( (byte)0xE3, oidBytes[2] );
assertEquals( (byte)0xC8, oidBytes[3] );
assertEquals( (byte)0xE0, oidBytes[4] );
assertEquals( (byte)0xC8, oidBytes[5] );
assertEquals( (byte)0xCF, oidBytes[6] );
assertEquals( (byte)0xA0, oidBytes[7] );
assertEquals( (byte)0x80, oidBytes[8] );
assertEquals( (byte)0x4F, oidBytes[9] );
oid1 = Oid.fromBytes( oidBytes );
assertEquals( oid, oid1 );
// A bigger one
oid = Oid.fromString( "2.81407072025111374527560065493494091452" );
oidBytes = oid.toBytes();
assertEquals( 18, oidBytes.length );
assertEquals( (byte)0xFA, oidBytes[0] );
assertEquals( (byte)0xBE, oidBytes[1] );
assertEquals( (byte)0xB7, oidBytes[2] );
assertEquals( (byte)0xA2, oidBytes[3] );
assertEquals( (byte)0x8E, oidBytes[4] );
assertEquals( (byte)0xF4, oidBytes[5] );
assertEquals( (byte)0xC0, oidBytes[6] );
assertEquals( (byte)0xC7, oidBytes[7] );
assertEquals( (byte)0xCB, oidBytes[8] );
assertEquals( (byte)0x9F, oidBytes[9] );
assertEquals( (byte)0xA0, oidBytes[10] );
assertEquals( (byte)0xC5, oidBytes[11] );
assertEquals( (byte)0xEA, oidBytes[12] );
assertEquals( (byte)0xDA, oidBytes[13] );
assertEquals( (byte)0x92, oidBytes[14] );
assertEquals( (byte)0x9D, oidBytes[15] );
assertEquals( (byte)0x9E, oidBytes[16] );
assertEquals( (byte)0x0C, oidBytes[17] );
oid1 = Oid.fromBytes( oidBytes );
assertEquals( oid, oid1 );
}
/**
* Test an OID with 2 at the first position and a second node > 39
* @throws DecoderException
*/
@Test
public void testOidNode2() throws DecoderException
{
Oid oid = Oid.fromString( "2.12345" );
Oid oid2 = Oid.fromBytes( oid.toBytes() );
assertEquals( oid, oid2 );
}
/**
* Test Kerberos V5 NewOid
*/
@Test
public void testNewOidKerberosV5()
{
Oid oid = null;
try
{
oid = Oid.fromBytes( new byte[]
{ 0x2a, ( byte ) 0x86, 0x48, ( byte ) 0x86, ( byte ) 0xf7, 0x12, 0x01, 0x02, 0x02 } );
assertEquals( "1.2.840.113554.1.2.2", oid.toString() );
}
catch ( DecoderException de )
{
fail();
}
}
/**
* Test NewOids bytes
*/
@Test
public void testNewOidBytes()
{
Oid oid = null;
Oid oid2 = null;
try
{
oid = Oid.fromString( "0.0" );
oid2 = Oid.fromBytes( oid.toBytes() );
assertEquals( oid.toString(), oid2.toString() );
oid = Oid.fromString( "1.2.3.4.5" );
oid2 = Oid.fromBytes( oid.toBytes() );
assertEquals( oid.toString(), oid2.toString() );
oid = Oid.fromString( "0.1.2.3.4" );
assertTrue( Arrays.equals( new byte[]
{ 0x01, 0x02, 0x03, 0x04 }, oid.toBytes() ) );
oid2 = Oid.fromBytes( oid.toBytes() );
assertEquals( oid.toString(), oid2.toString() );
oid = Oid.fromString( "2.123456" );
oid2 = Oid.fromBytes( oid.toBytes() );
assertEquals( oid.toString(), oid2.toString() );
oid = Oid.fromString( "1.2.840.113554.1.2.2" );
oid2 = Oid.fromBytes( oid.toBytes() );
assertEquals( oid.toString(), oid2.toString() );
}
catch ( DecoderException de )
{
fail();
}
}
/**
* Test NewOid Equals
*/
@Test
public void testNewOidEqualsPerf() throws DecoderException
{
String s1 = "1.2.840.113554.1.2.2.1.2.840.113554.1.2.2.1.2.840.113554.1.2.2";
String s2 = "1.2.840.113554.1.2.2.1.2.840.113554.1.2.2.1.2.840.113554.1.2.2";
String s3 = "1.3.6.1.5.5.2";
Oid oid1 = Oid.fromString( s1 );
Oid oid2 = Oid.fromString( s2 );
Oid oid3 = Oid.fromString( s3 );
assertTrue( oid1.equals( oid2 ) );
assertFalse( oid1.equals( oid3 ) );
assertFalse( oid2.equals( oid3 ) );
}
}