blob: 354c4363e2f20e2a55cc3c0a2d218a3d746c6ae3 [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
*
* 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 org.apache.directory.shared.kerberos.codec;
import static org.junit.Assert.assertTrue;
import java.lang.reflect.Field;
import java.net.InetAddress;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.directory.api.asn1.DecoderException;
import org.apache.directory.api.asn1.ber.Asn1Decoder;
import org.apache.directory.api.util.Strings;
import org.apache.directory.shared.kerberos.KerberosTime;
import org.apache.directory.shared.kerberos.codec.encKrbCredPart.EncKrbCredPartContainer;
import org.apache.directory.shared.kerberos.codec.types.EncryptionType;
import org.apache.directory.shared.kerberos.components.EncKrbCredPart;
import org.apache.directory.shared.kerberos.components.EncryptionKey;
import org.apache.directory.shared.kerberos.components.HostAddress;
import org.apache.directory.shared.kerberos.components.KrbCredInfo;
import org.junit.Before;
import org.junit.Test;
/**
* test cases for EncKrbCredPart codec
*
* @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
*/
public class EncKrbCredPartDecoderTest
{
private List<KrbCredInfo> ticketInfo;
private int nonce;
private KerberosTime timestamp;
private int usec;
private HostAddress senderAddress;
private HostAddress recipientAddress;
private List<FieldValueHolder> optionalFieldValueList;
class FieldValueHolder
{
String fieldName;
Object value;
FieldValueHolder( String fieldName, Object value )
{
this.fieldName = fieldName;
this.value = value;
}
@Override
public String toString()
{
return "FieldValueHolder [fieldName=" + fieldName + ", value=" + value + "]";
}
}
@Before
public void setup() throws Exception
{
optionalFieldValueList = new ArrayList<FieldValueHolder>();
ticketInfo = new ArrayList<KrbCredInfo>();
KrbCredInfo info1 = new KrbCredInfo();
info1.setKey( new EncryptionKey( EncryptionType.DES3_CBC_MD5, new byte[]
{ 0, 1 } ) );
ticketInfo.add( info1 );
KrbCredInfo info2 = new KrbCredInfo();
info2.setKey( new EncryptionKey( EncryptionType.AES128_CTS_HMAC_SHA1_96, new byte[]
{ 2, 3 } ) );
ticketInfo.add( info2 );
nonce = 100;
optionalFieldValueList.add( new FieldValueHolder( "nonce", nonce ) );
timestamp = new KerberosTime( new Date().getTime() );
optionalFieldValueList.add( new FieldValueHolder( "timestamp", timestamp ) );
usec = 1;
optionalFieldValueList.add( new FieldValueHolder( "usec", usec ) );
senderAddress = new HostAddress( InetAddress.getByName( "localhost" ) );
optionalFieldValueList.add( new FieldValueHolder( "senderAddress", senderAddress ) );
recipientAddress = new HostAddress( InetAddress.getByName( "localhost" ) );
optionalFieldValueList.add( new FieldValueHolder( "recipientAddress", recipientAddress ) );
}
@Test
public void testEncKrbCredPart() throws Exception
{
int size = optionalFieldValueList.size();
for ( int i = 0; i < size; i++ )
{
EncKrbCredPart expected = new EncKrbCredPart();
expected.setTicketInfo( ticketInfo );
Map<String, Field> EncKrbCrePartFieldNameMap = getFieldMap( expected );
List<FieldValueHolder> presentFieldList = new ArrayList<FieldValueHolder>();
FieldValueHolder fieldValHolder = optionalFieldValueList.get( i );
presentFieldList.add( fieldValHolder );
Field f = EncKrbCrePartFieldNameMap.get( Strings.toLowerCase( fieldValHolder.fieldName ) );
f.set( expected, fieldValHolder.value );
for ( int j = i + 1; j < size; j++ )
{
fieldValHolder = optionalFieldValueList.get( j );
presentFieldList.add( fieldValHolder );
f = EncKrbCrePartFieldNameMap.get( Strings.toLowerCase( fieldValHolder.fieldName ) );
f.set( expected, fieldValHolder.value );
}
ByteBuffer stream = ByteBuffer.allocate( expected.computeLength() );
expected.encode( stream );
stream.flip();
Asn1Decoder decoder = new Asn1Decoder();
EncKrbCredPartContainer container = new EncKrbCredPartContainer( stream );
try
{
decoder.decode( stream, container );
}
catch ( DecoderException e )
{
// NOTE: keep this sysout for easy debugging (no need to setup a logger)
System.out.println( "failed sequence:\n" + expected );
throw e;
}
EncKrbCredPart actual = container.getEncKrbCredPart();
assertValues( presentFieldList, actual );
}
}
@Test
public void testKrbCredInfoWithEachOptElement() throws Exception
{
// algorithm:
// start from the first mandatory element and add ONLY one OPTIONAL element and then test decoding
int size = optionalFieldValueList.size();
for ( int i = size - 1; i >= 0; i-- )
{
EncKrbCredPart expected = new EncKrbCredPart();
expected.setTicketInfo( ticketInfo );
Map<String, Field> encKrbCredPartFieldNameMap = getFieldMap( expected );
List<FieldValueHolder> presentFieldList = new ArrayList<FieldValueHolder>();
FieldValueHolder fieldValHolder = optionalFieldValueList.get( i );
presentFieldList.add( fieldValHolder );
Field f = encKrbCredPartFieldNameMap.get( Strings.toLowerCase( fieldValHolder.fieldName ) );
f.set( expected, fieldValHolder.value );
ByteBuffer stream = ByteBuffer.allocate( expected.computeLength() );
expected.encode( stream );
stream.flip();
Asn1Decoder decoder = new Asn1Decoder();
EncKrbCredPartContainer container = new EncKrbCredPartContainer( stream );
try
{
decoder.decode( stream, container );
}
catch ( DecoderException e )
{
// NOTE: keep this sysout for easy debugging (no need to setup a logger)
System.out.println( "failed sequence:\n" + expected );
throw e;
}
EncKrbCredPart actual = container.getEncKrbCredPart();
assertValues( presentFieldList, actual );
}
}
/**
* compare the values that are inserted into the EncKrbCredPart objects before encoding to
* those that are obtained from decoded EncKrbCredPart
*
* @param presentFieldList the list of values that were inserted in the EncKrbCredPart class before encoding
* @param decoded the decoded EncKrbCredPart object
*/
private void assertValues( List<FieldValueHolder> presentFieldList, EncKrbCredPart decoded ) throws Exception
{
Map<String, Field> fieldNameMap = getFieldMap( decoded );
for ( FieldValueHolder fh : presentFieldList )
{
Field actualField = fieldNameMap.get( Strings.toLowerCase( fh.fieldName ) );
Object decodedValue = actualField.get( decoded );
//System.out.println( fh.fieldName + " expected: " + fh.value + " , actual: " + decodedValue );
assertTrue( decodedValue.equals( fh.value ) );
}
}
/**
* create a map with the field's name and field objects of the KrbCreInfo
*
* @param source the EncKrbCredPart object
*/
private Map<String, Field> getFieldMap( EncKrbCredPart source )
{
Field[] fields = source.getClass().getDeclaredFields();
Map<String, Field> fieldNameMap = new HashMap<String, Field>();
for ( Field f : fields )
{
f.setAccessible( true );
fieldNameMap.put( Strings.toLowerCase( f.getName() ), f );
}
return fieldNameMap;
}
}